From 5a705ba79faaf464a03fb9465a4b3d3279012c30 Mon Sep 17 00:00:00 2001 From: nsheff Date: Wed, 3 Jul 2019 23:15:08 -0400 Subject: [PATCH 001/207] more ignores --- .gitignore | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/.gitignore b/.gitignore index 39e5657..d2de169 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,26 @@ +# General +*.pyc +.~lock* + +# Tests +.cache/ + +# MkDocs files +site/ + +# Jekyll files +jekyll/ +_site +.DS_store +.jekyll +.bundle +.sass-cache +_site/ +/_site/ +.sass-cache/ +.jekyll-metadata + +# Annotation files # ignore local annotation files anno/hg19_annotations.bed.gz anno/hg19_annotations.bed From 8a63c2b8d6b215d984eea05bb1988e32b5aa2a09 Mon Sep 17 00:00:00 2001 From: nsheff Date: Wed, 3 Jul 2019 23:15:33 -0400 Subject: [PATCH 002/207] update docs --- docs/howto/run_cluster.md | 2 +- docs/howto/use_container.md | 23 ++++++++++-------- docs/install.md | 47 +++++++++++++++++++------------------ mkdocs.yml | 10 ++++---- 4 files changed, 43 insertions(+), 39 deletions(-) diff --git a/docs/howto/run_cluster.md b/docs/howto/run_cluster.md index 8d39c4c..e58b6c1 100644 --- a/docs/howto/run_cluster.md +++ b/docs/howto/run_cluster.md @@ -10,4 +10,4 @@ To use `looper` templates, we must create a `divvy` computing configuration file This enables you to adjust your computing preferences on-the-fly when you run a project. -The complete description of setting up `looper` to use `DIVCFG` is generic to any pipeline. If you want to use looper with containers or clusters, you should consult the complete docs in the looper documentation on [configuring looper to use a cluster](http://code.databio.org/looper/cluster-computing/). +The complete description of setting up `looper` to use `DIVCFG` is generic to any pipeline. If you want to use looper with containers or clusters, you should consult the complete docs in the looper documentation on [configuring looper to use a cluster](http://looper.databio.org/en/latest/cluster-computing/). diff --git a/docs/howto/use_container.md b/docs/howto/use_container.md index 28d78c0..3232b94 100644 --- a/docs/howto/use_container.md +++ b/docs/howto/use_container.md @@ -2,9 +2,13 @@ We have produced both docker and singularity containers that hold all the necessary software for `PEPPRO`. You can run `PEPPRO` as an individual pipeline on a single sample using these containers by directly calling `docker run` or `singularity exec`. Or, you can rely on `looper`, which is already set up to run any pipeline in existing containers using the `divvy` templating system. Instructions for both follow: -First, make sure your environment is set up to run either docker or singularity containers. Then, pull the container image: +## Setting up the container -**Docker**: You can pull the docker [databio/peppro image](https://hub.docker.com/r/databio/peppro/) from dockerhub like this: +First, make sure your environment is set up to run either docker or singularity containers. Then, pull the container image (choose either docker or singularity). If your containers are set up correctly, then you won't need to install any additional software. + +### Docker + +You can pull the docker [databio/peppro image](https://hub.docker.com/r/databio/peppro/) from dockerhub like this: ``` docker pull databio/peppro @@ -16,7 +20,9 @@ cd peppro/ make docker ``` -**Singularity**: You can [download the singularity image](http://big.databio.org/simages/peppro) or build it from the docker image using the Makefile: +### Singularity + +You can [download the singularity image](http://big.databio.org/simages/peppro) or build it from the docker image using the Makefile: ``` cd peppro/ make singularity @@ -24,7 +30,6 @@ make singularity Now you'll need to tell the pipeline where you saved the singularity image. You can either create an environment variable called `$SIMAGES` that points to the folder where your image is stored, or you can tweak the `pipeline_interface.yaml` file so that the `compute.singularity_image` attribute is pointing to the right location on disk. -If your containers are set up correctly, then won't need to install any additional software. ## Running individual samples in a container @@ -37,11 +42,9 @@ With `docker`, you can use: ``` docker run --rm -it databio/peppro pipelines/peppro.py --help ``` -Be sure to mount the volumes you need with `--volume`. If you're utilizing any environment variables (e.g. `$GENOMES`), don't forget to include those in your docker command with the `-e` option. For a more detailed example, check out our guide to learn [how to run peppro in a container](howto/use-container.md). - -### Container details +Be sure to mount the volumes you need with `--volume`. If you're using any environment variables (e.g. `$GENOMES`), don't forget to include those in your docker command with the `-e` option. -#### Using `docker` +### Detailed example using `docker` The pipeline has been successfully run in both a Linux and MacOS environment. With `docker` you need to bind mount your volume that contains the pipeline and your `$GENOMES` location, as well as provide the container the same environment variables your host environment is using. In the first example, we're mounting our home user directory (`/home/jps3ag/`) which contains the parent directories to our `$GENOMES` folder and to the pipeline itself. We'll also provide the pipeline two environment variables, `$GENOMES` and `$HOME`. @@ -82,7 +85,7 @@ docker run --rm -it --volume /Users/jps3ag/:/Users/jps3ag/ \ -O $HOME/peppro_test ``` -#### Using `singularity` +### Detailed example using `singularity` First, build a singularity container from the docker image and create a running instance (be sure to mount your directories containing your `$GENOMES` folder and pipeline. ``` @@ -108,4 +111,4 @@ singularity instance.stop peppro_instance ## Running multiple samples in a container with looper -To run multiple samples in a container, you simply need to configure `looper` to use a container-compatible template. The looper documentation has detailed instructions for [how to run pipelines in containers](http://code.databio.org/looper/containers/). \ No newline at end of file +To run multiple samples in a container, you simply need to configure `looper` to use a container-compatible template. The looper documentation has detailed instructions for [how to run pipelines in containers](http://looper.databio.org/containers/). \ No newline at end of file diff --git a/docs/install.md b/docs/install.md index c6eca22..8dc02f3 100644 --- a/docs/install.md +++ b/docs/install.md @@ -6,10 +6,28 @@ Clone the pipeline: ``` git clone https://github.com/databio/peppro.git ``` +## 2: Download `refgenie` assets -## 2: Install required software +The pipeline relies on [`refgenie` assets](http://refgenie.databio.org/en/dev/install/) for alignment. First, initialize a folder for genome indexes and the `refgenie` config file. -`PEPPRO` uses a series of publicly-available, common bioinformatics tools including: +```console +export REFGENIE=your_genome_folder/genome_config.yaml +refgenie init -c $REFGENIE +``` + +Then, just pull the assets you need. + +```console +refgenie pull -g hg38 -a bowtie2_index +refgenie pull -g rCRSd -a bowtie2_index +refgenie pull -g human_repeats -a bowtie2_index +``` + +(Add `REFGENIE` to your .bashrc or .profile to ensure it persists). Alternatively, you can skip the `REFGENIE` variable and simply change the value of the `resources.genome_config` option in the [`pipeline_config.yaml`](https://github.com/databio/peppro/blob/master/pipelines/peppro.yaml) file to point to the folder where you stored the assemblies. + +## 3: Install required software + +`PEPPRO` uses a series of publicly-available, common bioinformatics tools. If you don't want to install them, you can follow our tutorial on [running PEPPRO directly in a container](howto/use_container.md). If you want to run it natively, you'll need to install the following: * [samtools](http://www.htslib.org/) * [bedtools](https://bedtools.readthedocs.io/en/latest/content/installation.html) @@ -51,31 +69,15 @@ Optionally, `PEPPRO` can mix and match tools for adapter removal, read trimming, * [fastqc](https://www.bioinformatics.babraham.ac.uk/projects/download.html#fastqc) * [pigz (v2.3.4+)](https://zlib.net/pigz/) -## 3: Download `refgenie` assemblies -The pipeline relies on [`refgenie` assemblies](http://refgenie.databio.org/en/dev/install/) for alignment. First, initialize a folder for genome indexes and the `refgenie` config file. - -```console -export REFGENIE=your_genome_folder/genome_config.yaml -refgenie init -c $REFGENIE -``` - -Then, just pull the assets you need. - -```console -refgenie pull -g hg38 -a bowtie2 -refgenie pull -g rCRSd -a bowtie2 -refgenie pull -g human_repeats -a bowtie2 -``` - -(Add `REFGENIE` to your .bashrc or .profile to ensure it persists). Alternatively, you can skip the `REFGENIE` variable and simply change the value of the `resources.genome_config` option in the [`pipeline_config.yaml`](https://github.com/databio/peppro/blob/master/pipelines/peppro.yaml) file to point to the folder where you stored the assemblies. ## 4: Run the pipeline script directly The pipeline at its core is just a python script, and you can run it on the command line for a single sample (see [command-line usage](usage)), which you can also get on the command line by running `pipelines/peppro.py --help`. You just need to pass a few command-line parameters to specify sample name, reference genome, input files, etc. Here's the basic command to run the included small test example through the pipeline: ```console -/pipelines/peppro.py \ +cd peppro +./pipelines/peppro.py \ --sample-name test \ --genome hg38 \ --input examples/data/test_r1.fq.gz \ @@ -89,7 +91,6 @@ This test example takes less than 5 minutes to complete. Read more about how to This is just the beginning. For your next step, take a look at one of these user guides: -- [Extended tutorial for running a single sample](tutorial.md) -- [Running on multiple samples with looper](howto/run-looper.md) -- [Running the pipeline directly in a container](howto/use-container.md) +- [Running on multiple samples with looper](howto/use_looper.md) +- [Running the pipeline directly in a container](howto/use_container.md) - See other detailed user guide links in the side menu diff --git a/mkdocs.yml b/mkdocs.yml index 8361a0e..650c75e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -17,11 +17,11 @@ nav: - Features: 'features.md' - Install and run: 'install.md' - How-to Guides: - - Annotation files: 'howto/annotation_files/' - - Using Looper: 'howto/use_looper/' - - Configuring prealignments: 'howto/prealignments/' - - Running on a cluster: 'howto/run_cluster/' - - Running in a container: 'howto/use_container/' + - Annotation files: 'howto/annotation_files.md' + - Using Looper: 'howto/use_looper.md' + - Configuring prealignments: 'howto/prealignments.md' + - Running on a cluster: 'howto/run_cluster.md' + - Running in a container: 'howto/use_container.md' - Reference: - Usage: 'usage.md' - Changelog: 'changelog.md' From 7dde87ff64574c9e71cb34e62083597d7f0b93a4 Mon Sep 17 00:00:00 2001 From: nsheff Date: Wed, 3 Jul 2019 23:41:56 -0400 Subject: [PATCH 003/207] update looper req to pypi version --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index bf92e93..62d0c53 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ numpy -https://github.com/pepkit/looper/zipball/master +loopercli pararead pandas piper -refgenie \ No newline at end of file +refgenie From 9b000674c007f911208e97a636a75edbf66dfb11 Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 4 Jul 2019 00:21:09 -0400 Subject: [PATCH 004/207] update docs --- docs/faq.md | 5 ++ docs/features.md | 8 +-- ...{use_container.md => configure_compute.md} | 15 +++++ docs/howto/run_cluster.md | 13 ---- docs/howto/run_direct.md | 16 +++++ docs/install.md | 63 ++++++++++++------- examples/meta/peppro_test.yaml | 2 +- mkdocs.yml | 6 +- 8 files changed, 86 insertions(+), 42 deletions(-) create mode 100644 docs/faq.md rename docs/howto/{use_container.md => configure_compute.md} (74%) delete mode 100644 docs/howto/run_cluster.md create mode 100644 docs/howto/run_direct.md diff --git a/docs/faq.md b/docs/faq.md new file mode 100644 index 0000000..f5320fd --- /dev/null +++ b/docs/faq.md @@ -0,0 +1,5 @@ +# FAQ + +## Do I have to use PEPPRO with looper? + +No. `PEPPRO` by itself does not specify any cluster resources, so you could just roll your own and submit individual jobs to a cluster however you choose. But because `PEPPRO` is already `looper`-compatible, the easier way is to use `looper's` built-in template system, which `looper` uses to build flexible shell scripts for job submission. These templates can be used to run jobs in a container, to submit to a cluster resource manager, or both. diff --git a/docs/features.md b/docs/features.md index 2dfb1e3..0f713ba 100644 --- a/docs/features.md +++ b/docs/features.md @@ -2,15 +2,15 @@ Here are a few of the highlights that make `PEPPRO` valuable. -- **Scalability.** Run the pipeline easily on a project with a single sample or a thousand. This pipeline is compatible with [`looper`](https://github.com/pepkit/looper), so it can run locally, in a cloud container engine, or with any cluster resource manager (e.g. SLURM, SGE, or LFS). -- **Restartability.** The pipeline is built using [`pypiper`](https://github.com/databio/pypiper), so it automatically picks up where it left off in case of preemption or crash. +- **Scalability.** Run the pipeline easily on a project with a single sample or a thousand. This pipeline is compatible with [`looper`](https://looper.databio.org), so it can run locally, in a cloud container engine, or with any cluster resource manager (e.g. SLURM, SGE, or LFS). +- **Restartability.** The pipeline is built using [`pypiper`](https://pypiper.databio.org), so it automatically picks up where it left off in case of preemption or crash. - **Copious logging.** The pipeline produces a detailed log file recording all output from every command run, and also records the time and memory use of every process, the version of the pipeline and other software, and other useful run information. - **Flexibility.** The pipeline provides options for multiple peak callers, multiple adapter trimmers, and fully configurable parameterization for many underlying tools. - **Portability.** Run it using `docker` or `singularity` with no other prerequisites, or it can be run natively without containers. The choice is yours. - **Standardized user interface.** The pipeline reads sample metadata formatted in [standard PEP format](http://pepkit.github.io/), so you can use the same sample annotation sheets for your downstream R or python analysis using tools from [pepkit](http://pepkit.github.io/). -- **Standardized reference genome assembly.** The pipeline uses standard reference genome assemblies produced by [`refgenie`](http://github.com/databio/refgenie)], which provides a scripted way to produce a compatible reference assembly for any custom genome. For common genomes, you can either download pre-indexed assemblies or build your own. +- **Standardized reference genome assembly.** The pipeline uses standard reference genome assemblies produced by [`refgenie`](http://refgenie.databio.org)], which provides a scripted way to produce a compatible reference assembly for any custom genome. For common genomes, you can either download pre-indexed assemblies or build your own. - **Prealignments.** The pipeline can (optionally) first align to any number of reference assemblies separately before the primary genome alignment. This increases both speed and accuracy and can be used, for example, to align sequentially to mtDNA, repeats, or spike-ins. - **Fraction of reads in pre-mature mRNA and features (FRiP/FRiF).** By default, the pipeline will calculate the FRiP using annotated pre-mature mRNA. The pipeline will also calculate the fraction of reads in known annotated features if using a common reference genome and may be customized to use any feature set. - **TSS enrichments, Fragment length distributions and more.** The pipeline produces various nice QC plots. -- **Beautiful `HTML` reports.** Your results include an easy-to-navigate `HTML` report with a sample table, job status, summary statistics, and QC plots at your fingertips when run using our [pipeline submission engine, `Looper`](https://looper.readthedocs.io/en/latest/index.html). +- **Beautiful `HTML` reports.** Your results include an easy-to-navigate `HTML` report with a sample table, job status, summary statistics, and QC plots at your fingertips when run using our [pipeline submission engine, `looper`](https://looper.databio.org). diff --git a/docs/howto/use_container.md b/docs/howto/configure_compute.md similarity index 74% rename from docs/howto/use_container.md rename to docs/howto/configure_compute.md index 3232b94..59022a5 100644 --- a/docs/howto/use_container.md +++ b/docs/howto/configure_compute.md @@ -1,3 +1,18 @@ +# Configuring PEPPRO computing settings + +## Cluster computing + +When you run your PEPPRO project using `looper run`, by default it will simply run each sample locally. You can adjust the computing settings using the `--compute` argument to `looper run`. This enables you to adjust your computing preferences on-the-fly when you run a project. You have several built-in options to change this. Some common examples are these: + +- `--compute slurm`. Submit the jobs to a SLURM cluster using `sbatch`. +- `--compute sge`. Submit the jobs to a SGE cluster using `sbatch`. +- `--compute docker`. Submit the jobs locally using the `databio/peppro` docker image. +- `--compute singularity`. Submit the jobs locally using the `peppro` singularity image. +- `--compute singularity_slurm`. Submit the jobs using `sbatch`, but then run them using the `peppro` singularity image. + +These available computing options are actually using a standardized computing system called [divvy](https://divvy.databio.org), and you can view a list of all your available options by typing `divvy list` on the command line. Divvy also allows you to very easily change these templates or add your own, so you can run PEPPRO in any possible computing environment. + +The instructions for changing these computing configuration options are universal for any software that relies on `divvy`. For complete instructions, you should consult the [divvy documentation](https://divvy.databio.org). In a nutshell, you will first create a `divvy` computing configuration file (compute_config.yaml) and point an environment variable (`DIVCFG`) to that file. You then have access to any configured computing packages by using `looper --compute `, where `package` can be any computing system you configure. # Run PEPPRO in a container We have produced both docker and singularity containers that hold all the necessary software for `PEPPRO`. You can run `PEPPRO` as an individual pipeline on a single sample using these containers by directly calling `docker run` or `singularity exec`. Or, you can rely on `looper`, which is already set up to run any pipeline in existing containers using the `divvy` templating system. Instructions for both follow: diff --git a/docs/howto/run_cluster.md b/docs/howto/run_cluster.md deleted file mode 100644 index e58b6c1..0000000 --- a/docs/howto/run_cluster.md +++ /dev/null @@ -1,13 +0,0 @@ -# Run PEPPRO on a cluster - -`PEPPRO` by itself does not specify any cluster resources, so you could just roll your own and submit individual jobs to a cluster however you choose. But because `PEPPRO` is already `looper`-compatible, the easier way is to use `looper's` built-in template system, which `looper` uses to build flexible shell scripts for job submission. These templates can be used to run jobs in a container, to submit to a cluster resource manager, or both. - -To use `looper` templates, we must create a `divvy` computing configuration file (compute_config.yaml) and point an environment variable (`DIVCFG`) to that file. You then have access to any configured computing packages by using `looper --compute `, where `package` can be any computing system you configure. In short, you will need to: - -- Set up a compute configuration file that includes a containerized or cluster compute template (or both). -- Point the environment variable `DIVCFG` to the location of this file. -- Run the pipeline with `looper run --compute PACKAGE` (where `PACKAGE` is specified in your `DIVCFG` file). - -This enables you to adjust your computing preferences on-the-fly when you run a project. - -The complete description of setting up `looper` to use `DIVCFG` is generic to any pipeline. If you want to use looper with containers or clusters, you should consult the complete docs in the looper documentation on [configuring looper to use a cluster](http://looper.databio.org/en/latest/cluster-computing/). diff --git a/docs/howto/run_direct.md b/docs/howto/run_direct.md new file mode 100644 index 0000000..b312dd4 --- /dev/null +++ b/docs/howto/run_direct.md @@ -0,0 +1,16 @@ +# Runing the pipeline script directly + +The pipeline at its core is just a python script, and you can run it on the command line for a single sample (see [command-line usage](usage)), which you can also get on the command line by running `pipelines/peppro.py --help`. You just need to pass a few command-line parameters to specify sample name, reference genome, input files, etc. Here's the basic command to run the included small test example through the pipeline: + +```console +cd peppro +./pipelines/peppro.py \ + --sample-name test \ + --genome hg38 \ + --input examples/data/test_r1.fq.gz \ + --single-or-paired single \ + -O $HOME/peppro_example/ +``` + +This test example takes less than 5 minutes to complete. + diff --git a/docs/install.md b/docs/install.md index 8dc02f3..eb8e902 100644 --- a/docs/install.md +++ b/docs/install.md @@ -2,20 +2,20 @@ ## 1: Clone the `PEPPRO` pipeline -Clone the pipeline: ``` git clone https://github.com/databio/peppro.git ``` ## 2: Download `refgenie` assets -The pipeline relies on [`refgenie` assets](http://refgenie.databio.org/en/dev/install/) for alignment. First, initialize a folder for genome indexes and the `refgenie` config file. +PEPPRO uses [`refgenie`](http://refgenie.databio.org/) assets. If you haven't already set it up, initialize your refgenie config file like this: ```console +pip install --user refgenie export REFGENIE=your_genome_folder/genome_config.yaml refgenie init -c $REFGENIE ``` -Then, just pull the assets you need. +Add the `export REFGENIE` line to your `.bashrc` or `.profile` to ensure it persists. Then, pull the assets you need. By default, that's these for human: ```console refgenie pull -g hg38 -a bowtie2_index @@ -23,11 +23,9 @@ refgenie pull -g rCRSd -a bowtie2_index refgenie pull -g human_repeats -a bowtie2_index ``` -(Add `REFGENIE` to your .bashrc or .profile to ensure it persists). Alternatively, you can skip the `REFGENIE` variable and simply change the value of the `resources.genome_config` option in the [`pipeline_config.yaml`](https://github.com/databio/peppro/blob/master/pipelines/peppro.yaml) file to point to the folder where you stored the assemblies. - ## 3: Install required software -`PEPPRO` uses a series of publicly-available, common bioinformatics tools. If you don't want to install them, you can follow our tutorial on [running PEPPRO directly in a container](howto/use_container.md). If you want to run it natively, you'll need to install the following: +If you don't want to install the prerequisite software used by PEPPRO, you can follow our tutorial on [running PEPPRO directly in a container](howto/use_container.md) and then skip this step. If you want to run it natively, you'll need to install the following: * [samtools](http://www.htslib.org/) * [bedtools](https://bedtools.readthedocs.io/en/latest/content/installation.html) @@ -69,28 +67,51 @@ Optionally, `PEPPRO` can mix and match tools for adapter removal, read trimming, * [fastqc](https://www.bioinformatics.babraham.ac.uk/projects/download.html#fastqc) * [pigz (v2.3.4+)](https://zlib.net/pigz/) +## 4: Run an example project through PEPPRO +Start by running the example project (`peppro_test.yaml`) in the [`examples/meta/`](https://github.com/databio/peppro/tree/master/examples/meta) folder. Let's use `looper`'s `-d` argument to do a *dry run*, which will create job scripts for every sample in a project, but will not execute them: -## 4: Run the pipeline script directly +``` +cd peppro +looper run -d examples/meta/peppro_test.yaml +``` -The pipeline at its core is just a python script, and you can run it on the command line for a single sample (see [command-line usage](usage)), which you can also get on the command line by running `pipelines/peppro.py --help`. You just need to pass a few command-line parameters to specify sample name, reference genome, input files, etc. Here's the basic command to run the included small test example through the pipeline: +If the looper executable is not in your `$PATH`, add the following line to your `.bashrc` or `.profile`: +``` +export PATH=$PATH:~/.local/bin +``` +If that worked, let's actually run the example by taking out the `-d` flag: ```console -cd peppro -./pipelines/peppro.py \ - --sample-name test \ - --genome hg38 \ - --input examples/data/test_r1.fq.gz \ - --single-or-paired single \ - -O $HOME/peppro_example/ +looper run examples/meta/peppro_test.yaml +``` + +You could run it in a container like this: + +```console +looper run examples/meta/peppro_test.yaml --compute docker +looper run examples/meta/peppro_test.yaml --compute singularity ``` -This test example takes less than 5 minutes to complete. Read more about how to [run the test sample using `Looper`](howto/run-looper.md) with the included [example `peppro_test.yaml` file](https://github.com/databio/peppro/blob/master/examples/meta/peppro_test.yaml). +There are lots of other cool things you can do with looper, like dry runs, summarize results, check on pipeline run status, clean intermediate files to save disk space, lump multiple samples into one job, and more. For details, consult the [`looper` docs](http://looper.databio.org/). + +## 5: Configure your project files + +To run your own samples, you'll need to organize them in **PEP format**, which is explained in [how to create a PEP](https://pepkit.github.io/docs/home/) and is universal to all pipelines that read PEPs, including `PEPPRO`. To get you started, there are examples you can adapt in the `examples/` folder (*e.g.* [example test PEP](https://github.com/databio/peppro/tree/master/examples/meta/peppro_test.yaml)). In short, you need two files for your project: + + 1. project config file -- describes output locations, pointers to data, etc. + 2. sample annotation file -- comma-separated value (CSV) list of your samples. + +The sample annotation file must specify these columns: + +- sample_name +- library ('PRO' or 'PROSEQ' or 'PRO-seq') +- organism (e.g. 'human' or 'mouse') +- read1 +- read2 (if paired) +- whatever else you want -# 5. Next steps -This is just the beginning. For your next step, take a look at one of these user guides: +## Next steps -- [Running on multiple samples with looper](howto/use_looper.md) -- [Running the pipeline directly in a container](howto/use_container.md) -- See other detailed user guide links in the side menu +This is just the beginning. For your next step, take a look at one of other detailed user guide links in the side menu. diff --git a/examples/meta/peppro_test.yaml b/examples/meta/peppro_test.yaml index 4554d70..054212d 100644 --- a/examples/meta/peppro_test.yaml +++ b/examples/meta/peppro_test.yaml @@ -3,7 +3,7 @@ name: test metadata: sample_annotation: "peppro_test.csv" - output_dir: "$PROCESSED/peppro_test/" + output_dir: "peppro_test/" pipeline_interfaces: "$CODE/peppro/pipeline_interface.yaml" derived_columns: [read1] diff --git a/mkdocs.yml b/mkdocs.yml index 650c75e..0a7e772 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -18,11 +18,11 @@ nav: - Install and run: 'install.md' - How-to Guides: - Annotation files: 'howto/annotation_files.md' - - Using Looper: 'howto/use_looper.md' + - Run PEPPRO directly: 'howto/run_direct.md' - Configuring prealignments: 'howto/prealignments.md' - - Running on a cluster: 'howto/run_cluster.md' - - Running in a container: 'howto/use_container.md' + - Configuring computing: 'howto/configure_compute.md' - Reference: + - FAQ: 'faq.md' - Usage: 'usage.md' - Changelog: 'changelog.md' - Support: 'https://github.com/databio/peppro/issues' From 107774234ec193aff764bacdfc358cbec9f06f5d Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 4 Jul 2019 00:38:21 -0400 Subject: [PATCH 005/207] docs updates --- docs/howto/configure_compute.md | 118 ++---------------------------- docs/howto/container_reference.md | 79 ++++++++++++++++++++ docs/howto/run_direct.md | 2 +- docs/howto/use_container.md | 30 ++++++++ docs/install.md | 6 +- mkdocs.yml | 2 + 6 files changed, 121 insertions(+), 116 deletions(-) create mode 100644 docs/howto/container_reference.md create mode 100644 docs/howto/use_container.md diff --git a/docs/howto/configure_compute.md b/docs/howto/configure_compute.md index 59022a5..771b7fc 100644 --- a/docs/howto/configure_compute.md +++ b/docs/howto/configure_compute.md @@ -1,6 +1,6 @@ # Configuring PEPPRO computing settings -## Cluster computing +## Default computing options When you run your PEPPRO project using `looper run`, by default it will simply run each sample locally. You can adjust the computing settings using the `--compute` argument to `looper run`. This enables you to adjust your computing preferences on-the-fly when you run a project. You have several built-in options to change this. Some common examples are these: @@ -10,120 +10,14 @@ When you run your PEPPRO project using `looper run`, by default it will simply r - `--compute singularity`. Submit the jobs locally using the `peppro` singularity image. - `--compute singularity_slurm`. Submit the jobs using `sbatch`, but then run them using the `peppro` singularity image. -These available computing options are actually using a standardized computing system called [divvy](https://divvy.databio.org), and you can view a list of all your available options by typing `divvy list` on the command line. Divvy also allows you to very easily change these templates or add your own, so you can run PEPPRO in any possible computing environment. +To use the docker or singularity options, you'll need to make sure you're [set up for using PEPPRO containers](use_container.md). These available computing options are actually using a standardized computing system called [divvy](https://divvy.databio.org), and you can view a list of all your available options with this command: -The instructions for changing these computing configuration options are universal for any software that relies on `divvy`. For complete instructions, you should consult the [divvy documentation](https://divvy.databio.org). In a nutshell, you will first create a `divvy` computing configuration file (compute_config.yaml) and point an environment variable (`DIVCFG`) to that file. You then have access to any configured computing packages by using `looper --compute `, where `package` can be any computing system you configure. -# Run PEPPRO in a container - -We have produced both docker and singularity containers that hold all the necessary software for `PEPPRO`. You can run `PEPPRO` as an individual pipeline on a single sample using these containers by directly calling `docker run` or `singularity exec`. Or, you can rely on `looper`, which is already set up to run any pipeline in existing containers using the `divvy` templating system. Instructions for both follow: - -## Setting up the container - -First, make sure your environment is set up to run either docker or singularity containers. Then, pull the container image (choose either docker or singularity). If your containers are set up correctly, then you won't need to install any additional software. - -### Docker - -You can pull the docker [databio/peppro image](https://hub.docker.com/r/databio/peppro/) from dockerhub like this: - -``` -docker pull databio/peppro -``` - -Or build the image using the included Dockerfile (you can use a recipe in the included Makefile): -``` -cd peppro/ -make docker -``` - -### Singularity - -You can [download the singularity image](http://big.databio.org/simages/peppro) or build it from the docker image using the Makefile: -``` -cd peppro/ -make singularity +```console +divvy list ``` -Now you'll need to tell the pipeline where you saved the singularity image. You can either create an environment variable called `$SIMAGES` that points to the folder where your image is stored, or you can tweak the `pipeline_interface.yaml` file so that the `compute.singularity_image` attribute is pointing to the right location on disk. - - -## Running individual samples in a container - -Individual jobs can be run in a container by simply running the `peppro.py` command through `docker run` or `singularity exec`. You can run containers either on your local computer, or in an HPC environment, as long as you have `docker` or `singularity` installed. For example, run it locally in singularity like this: -``` -singularity exec --bind $GENOMES $SIMAGES/peppro pipelines/peppro.py --help -``` - -With `docker`, you can use: -``` -docker run --rm -it databio/peppro pipelines/peppro.py --help -``` -Be sure to mount the volumes you need with `--volume`. If you're using any environment variables (e.g. `$GENOMES`), don't forget to include those in your docker command with the `-e` option. +## Customizing compute options -### Detailed example using `docker` -The pipeline has been successfully run in both a Linux and MacOS environment. With `docker` you need to bind mount your volume that contains the pipeline and your `$GENOMES` location, as well as provide the container the same environment variables your host environment is using. - -In the first example, we're mounting our home user directory (`/home/jps3ag/`) which contains the parent directories to our `$GENOMES` folder and to the pipeline itself. We'll also provide the pipeline two environment variables, `$GENOMES` and `$HOME`. - -Here's that example command in a Linux environment to run the test example through the pipeline: -``` -docker run --rm -it --volume /home/jps3ag/:/home/jps3ag/ \ - -e GENOMES='/home/jps3ag/genomes/' \ - -e HOME='/home/jps3ag/' \ - databio/peppro \ - /home/jps3ag/src/peppro/pipelines/peppro.py --single-or-paired single \ - --prealignments rCRSd human_repeats \ - --genome hg38 \ - --sample-name test1 \ - --input /home/jps3ag/src/peppro/examples/data/test_r1.fq.gz \ - -O $HOME/peppro_test -``` - -In this second example, we'll perform the same command in a Mac environment using [Docker for Mac](https://docs.docker.com/v17.12/docker-for-mac/install/). - -This necessitates a few minor changes to run that same example: - -- replace `/home/` with `/Users/` format -- e.g. `--volume /Users/jps3ag/:/Users/jps3ag/` - -Remember to [allocate sufficient memory](https://docs.docker.com/docker-for-mac/#advanced) (6-8GB should generally be more than adequate) in Docker for Mac. - -``` -docker run --rm -it --volume /Users/jps3ag/:/Users/jps3ag/ \ - -e GENOMES="/Users/jps3ag/genomes" \ - -e HOME="/Users/jps3ag/" \ - databio/peppro \ - /Users/jps3ag/src/peppro/pipelines/peppro.py --single-or-paired single \ - --prealignments rCRSd human_repeats \ - --genome hg38 \ - --sample-name test1 \ - --input /Users/jps3ag/src/peppro/examples/data/test_r1.fq.gz \ - -O $HOME/peppro_test -``` - -### Detailed example using `singularity` - -First, build a singularity container from the docker image and create a running instance (be sure to mount your directories containing your `$GENOMES` folder and pipeline. -``` -singularity build peppro docker://databio/peppro:latest -singularity instance.start -B /home/jps3ag/:/home/jps3aq/ peppro peppro_instance -``` - -Second, run your command. -``` -singularity exec instance://peppro_instance \ - /home/jps3ag/src/peppro/pipelines/peppro.py --single-or-paired single \ - --prealignments rCRSd human_repeats \ - --genome hg38 \ - --sample-name test1 \ - --input /home/jps3ag/src/peppro/examples/data/test_r1.fq.gz \ - -O $HOME/peppro_test -``` - -Third, close your instance when finished. -``` -singularity instance.stop peppro_instance -``` +Divvy also allows you to very easily change these templates or add your own, so you can run PEPPRO in any possible computing environment. Changing these computing configuration options will work for any software that relies on `divvy`. For complete instructions, you should consult the [divvy documentation](https://divvy.databio.org). In a nutshell, you will first create a `divvy` computing configuration file (compute_config.yaml) and point an environment variable (`DIVCFG`) to that file. You then have access to any configured computing packages by using `looper --compute `, where `package` can be any computing system you configure. -## Running multiple samples in a container with looper -To run multiple samples in a container, you simply need to configure `looper` to use a container-compatible template. The looper documentation has detailed instructions for [how to run pipelines in containers](http://looper.databio.org/containers/). \ No newline at end of file diff --git a/docs/howto/container_reference.md b/docs/howto/container_reference.md new file mode 100644 index 0000000..ff7a1a3 --- /dev/null +++ b/docs/howto/container_reference.md @@ -0,0 +1,79 @@ +# Running individual samples in a container + +We have produced both docker and singularity containers that hold all the necessary software for `PEPPRO`. You can run `PEPPRO` as an individual pipeline on a single sample using these containers by directly calling `docker run` or `singularity exec`. Or, you can rely on `looper`, which is already set up to run any pipeline in existing containers using the `divvy` templating system. + +Individual jobs can be run in a container by simply running the `peppro.py` command through `docker run` or `singularity exec`. You can run containers either on your local computer, or in an HPC environment, as long as you have `docker` or `singularity` installed. For example, run it locally in singularity like this: +``` +singularity exec --bind $GENOMES $SIMAGES/peppro pipelines/peppro.py --help +``` + +With `docker`, you can use: +``` +docker run --rm -it databio/peppro pipelines/peppro.py --help +``` +Be sure to mount the volumes you need with `--volume`. If you're using any environment variables (e.g. `$GENOMES`), don't forget to include those in your docker command with the `-e` option. + +### Detailed example using `docker` +The pipeline has been successfully run in both a Linux and MacOS environment. With `docker` you need to bind mount your volume that contains the pipeline and your `$GENOMES` location, as well as provide the container the same environment variables your host environment is using. + +In the first example, we're mounting our home user directory (`/home/jps3ag/`) which contains the parent directories to our `$GENOMES` folder and to the pipeline itself. We'll also provide the pipeline two environment variables, `$GENOMES` and `$HOME`. + +Here's that example command in a Linux environment to run the test example through the pipeline: +``` +docker run --rm -it --volume /home/jps3ag/:/home/jps3ag/ \ + -e GENOMES='/home/jps3ag/genomes/' \ + -e HOME='/home/jps3ag/' \ + databio/peppro \ + /home/jps3ag/src/peppro/pipelines/peppro.py --single-or-paired single \ + --prealignments rCRSd human_repeats \ + --genome hg38 \ + --sample-name test1 \ + --input /home/jps3ag/src/peppro/examples/data/test_r1.fq.gz \ + -O $HOME/peppro_test +``` + +In this second example, we'll perform the same command in a Mac environment using [Docker for Mac](https://docs.docker.com/v17.12/docker-for-mac/install/). + +This necessitates a few minor changes to run that same example: + +- replace `/home/` with `/Users/` format +- e.g. `--volume /Users/jps3ag/:/Users/jps3ag/` + +Remember to [allocate sufficient memory](https://docs.docker.com/docker-for-mac/#advanced) (6-8GB should generally be more than adequate) in Docker for Mac. + +``` +docker run --rm -it --volume /Users/jps3ag/:/Users/jps3ag/ \ + -e GENOMES="/Users/jps3ag/genomes" \ + -e HOME="/Users/jps3ag/" \ + databio/peppro \ + /Users/jps3ag/src/peppro/pipelines/peppro.py --single-or-paired single \ + --prealignments rCRSd human_repeats \ + --genome hg38 \ + --sample-name test1 \ + --input /Users/jps3ag/src/peppro/examples/data/test_r1.fq.gz \ + -O $HOME/peppro_test +``` + +### Detailed example using `singularity` + +First, build a singularity container from the docker image and create a running instance (be sure to mount your directories containing your `$GENOMES` folder and pipeline. +``` +singularity build peppro docker://databio/peppro:latest +singularity instance.start -B /home/jps3ag/:/home/jps3aq/ peppro peppro_instance +``` + +Second, run your command. +``` +singularity exec instance://peppro_instance \ + /home/jps3ag/src/peppro/pipelines/peppro.py --single-or-paired single \ + --prealignments rCRSd human_repeats \ + --genome hg38 \ + --sample-name test1 \ + --input /home/jps3ag/src/peppro/examples/data/test_r1.fq.gz \ + -O $HOME/peppro_test +``` + +Third, close your instance when finished. +``` +singularity instance.stop peppro_instance +``` diff --git a/docs/howto/run_direct.md b/docs/howto/run_direct.md index b312dd4..c198a75 100644 --- a/docs/howto/run_direct.md +++ b/docs/howto/run_direct.md @@ -1,4 +1,4 @@ -# Runing the pipeline script directly +# Running the pipeline script directly The pipeline at its core is just a python script, and you can run it on the command line for a single sample (see [command-line usage](usage)), which you can also get on the command line by running `pipelines/peppro.py --help`. You just need to pass a few command-line parameters to specify sample name, reference genome, input files, etc. Here's the basic command to run the included small test example through the pipeline: diff --git a/docs/howto/use_container.md b/docs/howto/use_container.md new file mode 100644 index 0000000..274e6af --- /dev/null +++ b/docs/howto/use_container.md @@ -0,0 +1,30 @@ + +## Setting up PEPPRO containers + +First, make sure your environment is set up to run either docker or singularity containers. Then, pull the container image (choose either docker or singularity). If your containers are set up correctly, then you won't need to install any additional software. + +### Docker + +You can pull the docker [databio/peppro image](https://hub.docker.com/r/databio/peppro/) from dockerhub like this: + +``` +docker pull databio/peppro +``` + +Or build the image using the included Dockerfile (you can use a recipe in the included Makefile): +``` +cd peppro/ +make docker +``` + +### Singularity + +You can [download the singularity image](http://big.databio.org/simages/peppro) or build it from the docker image using the Makefile: +``` +cd peppro/ +make singularity +``` + +Now you'll need to tell the pipeline where you saved the singularity image. You can either create an environment variable called `$SIMAGES` that points to the folder where your image is stored, or you can tweak the `pipeline_interface.yaml` file so that the `compute.singularity_image` attribute is pointing to the right location on disk. + + You can now use the containerized [compute packages](configure_compute.md), *e.g.*, `looper run --compute docker` or `looper run --compute singularity`. \ No newline at end of file diff --git a/docs/install.md b/docs/install.md index eb8e902..1a69818 100644 --- a/docs/install.md +++ b/docs/install.md @@ -1,4 +1,4 @@ -# Getting started +# Install and run PEPPRO ## 1: Clone the `PEPPRO` pipeline @@ -69,7 +69,7 @@ Optionally, `PEPPRO` can mix and match tools for adapter removal, read trimming, ## 4: Run an example project through PEPPRO -Start by running the example project (`peppro_test.yaml`) in the [`examples/meta/`](https://github.com/databio/peppro/tree/master/examples/meta) folder. Let's use `looper`'s `-d` argument to do a *dry run*, which will create job scripts for every sample in a project, but will not execute them: +Start by running the example project (`peppro_test.yaml`) in the [`examples/meta/`](https://github.com/databio/peppro/tree/master/examples/meta) folder. PEPPRO uses a project management tool called [looper](https://looper.databio.org) to run the pipeline across samples in a project. Let's use `looper`'s `-d` argument to do a *dry run*, which will create job scripts for every sample in a project, but will not execute them: ``` cd peppro @@ -86,7 +86,7 @@ If that worked, let's actually run the example by taking out the `-d` flag: looper run examples/meta/peppro_test.yaml ``` -You could run it in a container like this: +Or, if you're using containers, adjust the `--compute` argument accordingly: ```console looper run examples/meta/peppro_test.yaml --compute docker diff --git a/mkdocs.yml b/mkdocs.yml index 0a7e772..f4274ca 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -19,11 +19,13 @@ nav: - How-to Guides: - Annotation files: 'howto/annotation_files.md' - Run PEPPRO directly: 'howto/run_direct.md' + - PEPPRO in containers: 'howto/use_container.md' - Configuring prealignments: 'howto/prealignments.md' - Configuring computing: 'howto/configure_compute.md' - Reference: - FAQ: 'faq.md' - Usage: 'usage.md' + - Advanced container reference: 'howto/container_reference.md' - Changelog: 'changelog.md' - Support: 'https://github.com/databio/peppro/issues' From cf02d15a8906eb2605a9a9b1c63237c46c985003 Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 18 Jul 2019 15:34:49 -0400 Subject: [PATCH 006/207] remove py from piface --- docs/img/peppro_logo2.svg | 193 ++++++++++++++++++++++++++++++++++++++ pipeline_interface.yaml | 14 +-- 2 files changed, 200 insertions(+), 7 deletions(-) create mode 100644 docs/img/peppro_logo2.svg diff --git a/docs/img/peppro_logo2.svg b/docs/img/peppro_logo2.svg new file mode 100644 index 0000000..0da2ae5 --- /dev/null +++ b/docs/img/peppro_logo2.svg @@ -0,0 +1,193 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pipeline_interface.yaml b/pipeline_interface.yaml index a0e9725..968202c 100644 --- a/pipeline_interface.yaml +++ b/pipeline_interface.yaml @@ -1,13 +1,13 @@ protocol_mapping: - PRO: peppro.py - pro: peppro.py - PRO-SEQ: peppro.py - PRO-seq: peppro.py - PROSEQ: peppro.py - proseq: peppro.py + PRO: peppro + pro: peppro + PRO-SEQ: peppro + PRO-seq: peppro + PROSEQ: peppro + proseq: peppro pipelines: - peppro.py: + peppro: name: PEPPRO path: pipelines/peppro.py looper_args: True From bb216b4ac655ee8747280dad401979ff87f7c583 Mon Sep 17 00:00:00 2001 From: nsheff Date: Fri, 19 Jul 2019 13:24:03 -0400 Subject: [PATCH 007/207] add GRO and gro to PI --- pipeline_interface.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pipeline_interface.yaml b/pipeline_interface.yaml index 968202c..9b94814 100644 --- a/pipeline_interface.yaml +++ b/pipeline_interface.yaml @@ -1,6 +1,8 @@ protocol_mapping: PRO: peppro pro: peppro + GRO: peppro + gro: peppro PRO-SEQ: peppro PRO-seq: peppro PROSEQ: peppro From 82dc96d90b9c3453d8a88cc6c3269c8252f06765 Mon Sep 17 00:00:00 2001 From: nsheff Date: Fri, 19 Jul 2019 16:10:21 -0400 Subject: [PATCH 008/207] Update bowtie2 index key --- pipelines/peppro.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 84eff7e..ae83e24 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -23,7 +23,7 @@ ADAPTER_REMOVAL = ["fastp", "cutadapt"] DEDUPLICATORS = ["seqkit", "fqdedup"] TRIMMERS = ["seqtk", "fastx"] -BT2_IDX_KEY = "bowtie2" +BT2_IDX_KEY = "bowtie2_index" def parse_arguments(): From ba156c077a6ecf424d1983d1ad55536ad0d0aa1d Mon Sep 17 00:00:00 2001 From: nsheff Date: Wed, 3 Jul 2019 23:15:08 -0400 Subject: [PATCH 009/207] more ignores --- .gitignore | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/.gitignore b/.gitignore index 39e5657..d2de169 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,26 @@ +# General +*.pyc +.~lock* + +# Tests +.cache/ + +# MkDocs files +site/ + +# Jekyll files +jekyll/ +_site +.DS_store +.jekyll +.bundle +.sass-cache +_site/ +/_site/ +.sass-cache/ +.jekyll-metadata + +# Annotation files # ignore local annotation files anno/hg19_annotations.bed.gz anno/hg19_annotations.bed From 16d965d3e2be74cc194584d0ed008b27c076acd4 Mon Sep 17 00:00:00 2001 From: nsheff Date: Wed, 3 Jul 2019 23:15:33 -0400 Subject: [PATCH 010/207] update docs --- docs/howto/run_cluster.md | 2 +- docs/howto/use_container.md | 23 +++++++++++++------- docs/install.md | 42 ++++++++++++++++++------------------- mkdocs.yml | 2 +- 4 files changed, 39 insertions(+), 30 deletions(-) diff --git a/docs/howto/run_cluster.md b/docs/howto/run_cluster.md index 77978a0..1983762 100644 --- a/docs/howto/run_cluster.md +++ b/docs/howto/run_cluster.md @@ -10,4 +10,4 @@ To use `looper` templates, we must create a `divvy` computing configuration file This enables you to adjust your computing preferences on-the-fly when you run a project. -The complete description of setting up `looper` to use `DIVCFG` is generic to any pipeline. If you want to use looper with containers or clusters, you should consult the complete docs in the looper documentation on [configuring looper to use a cluster](http://code.databio.org/looper/cluster-computing/). +The complete description of setting up `looper` to use `DIVCFG` is generic to any pipeline. If you want to use looper with containers or clusters, you should consult the complete docs in the looper documentation on [configuring looper to use a cluster](http://looper.databio.org/en/latest/cluster-computing/). diff --git a/docs/howto/use_container.md b/docs/howto/use_container.md index d752a08..f4656c4 100644 --- a/docs/howto/use_container.md +++ b/docs/howto/use_container.md @@ -2,9 +2,13 @@ We have produced both docker and singularity containers that hold all the necessary software for `PEPPRO`. You can run `PEPPRO` as an individual pipeline on a single sample using these containers by directly calling `docker run` or `singularity exec`. Or, you can rely on `looper`, which is already set up to run any pipeline in existing containers using the `divvy` templating system. Instructions for both follow: -First, make sure your environment is set up to run either docker or singularity containers. Then, pull the container image: +## Setting up the container -**Docker**: You can pull the docker [databio/peppro image](https://hub.docker.com/r/databio/peppro/) from dockerhub like this: +First, make sure your environment is set up to run either docker or singularity containers. Then, pull the container image (choose either docker or singularity). If your containers are set up correctly, then you won't need to install any additional software. + +### Docker + +You can pull the docker [databio/peppro image](https://hub.docker.com/r/databio/peppro/) from dockerhub like this: ``` docker pull databio/peppro @@ -16,7 +20,9 @@ cd peppro/ make docker ``` -**Singularity**: You can [download the singularity image](http://big.databio.org/simages/peppro) or build it from the docker image using the Makefile: +### Singularity + +You can [download the singularity image](http://big.databio.org/simages/peppro) or build it from the docker image using the Makefile: ``` cd peppro/ make singularity @@ -24,7 +30,6 @@ make singularity Now you'll need to tell the pipeline where you saved the singularity image. You can either create an environment variable called `$SIMAGES` that points to the folder where your image is stored, or you can tweak the `pipeline_interface.yaml` file so that the `compute.singularity_image` attribute is pointing to the right location on disk. -If your containers are set up correctly, then won't need to install any additional software. ## Running individual samples in a container @@ -37,13 +42,17 @@ With `docker`, you can use: ``` docker run --rm -it databio/peppro pipelines/peppro.py --help ``` -Be sure to mount the volumes you need with `--volume`. If you're utilizing any environment variables (e.g. `$REFGENIE`), don't forget to include those in your docker command with the `-e` option. ### Container details #### Using `docker` + The pipeline has been successfully run in both a Linux and MacOS environment. With `docker` you need to bind mount your volume that contains the pipeline and your `$REFGENIE` location, as well as provide the container the same environment variables your host environment is using. +Be sure to mount the volumes you need with `--volume`. If you're using any environment variables (e.g. `$REFGENIE`), don't forget to include those in your docker command with the `-e` option. + +### Detailed example using `docker` + In the first example, we're mounting our home user directory (`/home/jps3ag/`) which contains the parent directories to our `$REFGENIE` folder and to the pipeline itself. We'll also provide the pipeline two environment variables, `$REFGENIE` and `$HOME`. Here's that example command in a Linux environment to run the test example through the pipeline: @@ -82,7 +91,7 @@ docker run --rm -it --volume /Users/jps3ag/:/Users/jps3ag/ \ -O $HOME/peppro_test ``` -#### Using `singularity` +### Detailed example using `singularity` First, build a singularity container from the docker image and create a running instance (be sure to mount your directories containing your `$REFGENIE` configuration file, corresponding `refgenie` genomes, and the pipeline. ``` @@ -108,4 +117,4 @@ singularity instance.stop peppro_instance ## Running multiple samples in a container with looper -To run multiple samples in a container, you simply need to configure `looper` to use a container-compatible template. The looper documentation has detailed instructions for [how to run pipelines in containers](http://code.databio.org/looper/containers/). \ No newline at end of file +To run multiple samples in a container, you simply need to configure `looper` to use a container-compatible template. The looper documentation has detailed instructions for [how to run pipelines in containers](http://looper.databio.org/containers/). \ No newline at end of file diff --git a/docs/install.md b/docs/install.md index bc5a6a7..ae00b96 100644 --- a/docs/install.md +++ b/docs/install.md @@ -6,8 +6,26 @@ Clone the pipeline: ``` git clone https://github.com/databio/peppro.git ``` +## 2: Download `refgenie` assets -## 2: Install required software +The pipeline relies on [`refgenie` assets](http://refgenie.databio.org/en/dev/install/) for alignment. First, initialize a folder for genome indexes and the `refgenie` config file. + +```console +export REFGENIE=your_genome_folder/genome_config.yaml +refgenie init -c $REFGENIE +``` + +Then, just pull the assets you need. + +```console +refgenie pull -g hg38 -a bowtie2_index +refgenie pull -g human_rDNA -a bowtie2_index +refgenie pull -g rCRSd -a bowtie2_index +``` + +(Add `REFGENIE` to your .bashrc or .profile to ensure it persists). Alternatively, you can skip the `REFGENIE` variable and simply change the value of the `resources.genome_config` option in the [`pipeline_config.yaml`](https://github.com/databio/peppro/blob/master/pipelines/peppro.yaml) file to point to the folder where you stored the assemblies. + +## 3: Install required software `PEPPRO` requires a series of publicly-available, common bioinformatics tools including: [samtools](http://www.htslib.org/), [bedtools](https://bedtools.readthedocs.io/en/latest/content/installation.html), [bowtie2](http://bowtie-bio.sourceforge.net/bowtie2/index.shtml), [seqkit](https://bioinf.shenwei.me/seqkit/), [fastp](https://github.com/OpenGene/fastp), [seqtk](https://github.com/lh3/seqtk), [preseq](http://smithlabresearch.org/software/preseq/), [fastq-pair](https://github.com/linsalrob/fastq-pair.git), [picard](http://broadinstitute.github.io/picard/), [wigToBigWig](http://hgdownload.soe.ucsc.edu/admin/exe/), and [bigWigCat](http://hgdownload.soe.ucsc.edu/admin/exe/). @@ -35,31 +53,13 @@ Optionally, `PEPPRO` can mix and match tools for adapter removal, read trimming, *Optional tools:* [fqdedup](https://github.com/guertinlab/fqdedup), [fastx toolkit](http://hannonlab.cshl.edu/fastx_toolkit/), [seqOutBias](https://github.com/guertinlab/seqOutBias), [fastqc](https://www.bioinformatics.babraham.ac.uk/projects/download.html#fastqc), and [pigz (v2.3.4+)](https://zlib.net/pigz/). -## 3: Download `refgenie` assemblies - -The pipeline relies on [`refgenie` assemblies](http://refgenie.databio.org/en/dev/install/) for alignment. First, initialize a folder for genome indexes and the `refgenie` config file. - -```console -export REFGENIE=your_genome_folder/genome_config.yaml -refgenie init -c $REFGENIE -``` - -Then, just pull the assets you need. - -```console -refgenie pull -g hg38 -a bowtie2 -refgenie pull -g rCRSd -a bowtie2 -refgenie pull -g human_repeats -a bowtie2 -``` - -(Add `REFGENIE` to your .bashrc or .profile to ensure it persists). Alternatively, you can skip the `REFGENIE` variable and simply change the value of the `resources.genome_config` option in the [`pipeline_config.yaml`](https://github.com/databio/peppro/blob/master/pipelines/peppro.yaml) file to point to the folder where you stored the assemblies. - ## 4: Run the pipeline script directly The pipeline at its core is just a python script, and you can run it on the command line for a single sample (see [command-line usage](usage)), which you can also get on the command line by running `pipelines/peppro.py --help`. You just need to pass a few command-line parameters to specify sample name, reference genome, input files, etc. Here's the basic command to run the included small test example through the pipeline: ```console -/pipelines/peppro.py \ +cd peppro +./pipelines/peppro.py \ --sample-name test \ --genome hg38 \ --input examples/data/test_r1.fq.gz \ diff --git a/mkdocs.yml b/mkdocs.yml index 1ef40ce..4e5663e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -24,7 +24,7 @@ nav: - Running on a cluster: 'howto/run_cluster/' - Running in a container: 'howto/use_container/' - Using looper: 'howto/use_looper/' - - Reference: + - Reference: - Usage: 'usage.md' - Changelog: 'changelog.md' - Support: 'https://github.com/databio/peppro/issues' From 3ee5b3875a0281c57fffad70d5276a101e7a251d Mon Sep 17 00:00:00 2001 From: nsheff Date: Wed, 3 Jul 2019 23:41:56 -0400 Subject: [PATCH 011/207] update looper req to pypi version --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index ad7b76d..d8b2383 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,8 @@ cutadapt loopercli numpy -pararead pandas +pararead piper refgenconf refgenie From fed91336afe5a5086926123c5d2857b427557b96 Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 4 Jul 2019 00:21:09 -0400 Subject: [PATCH 012/207] update docs --- docs/faq.md | 5 ++ docs/features.md | 8 +- ...{use_container.md => configure_compute.md} | 17 +++- docs/howto/run_direct.md | 16 ++++ docs/install.md | 86 ++++++++++++++----- examples/meta/peppro_test.yaml | 4 +- mkdocs.yml | 12 +-- 7 files changed, 111 insertions(+), 37 deletions(-) create mode 100644 docs/faq.md rename docs/howto/{use_container.md => configure_compute.md} (74%) create mode 100644 docs/howto/run_direct.md diff --git a/docs/faq.md b/docs/faq.md new file mode 100644 index 0000000..f5320fd --- /dev/null +++ b/docs/faq.md @@ -0,0 +1,5 @@ +# FAQ + +## Do I have to use PEPPRO with looper? + +No. `PEPPRO` by itself does not specify any cluster resources, so you could just roll your own and submit individual jobs to a cluster however you choose. But because `PEPPRO` is already `looper`-compatible, the easier way is to use `looper's` built-in template system, which `looper` uses to build flexible shell scripts for job submission. These templates can be used to run jobs in a container, to submit to a cluster resource manager, or both. diff --git a/docs/features.md b/docs/features.md index 00048c2..8681e90 100644 --- a/docs/features.md +++ b/docs/features.md @@ -2,15 +2,15 @@ Here are a few of the highlights that make `PEPPRO` valuable. -- **Scalability.** Run the pipeline easily on a project with a single sample or a thousand. This pipeline is compatible with [`looper`](https://github.com/pepkit/looper), so it can run locally, in a cloud container engine, or with any cluster resource manager (e.g. SLURM, SGE, or LFS). -- **Restartability.** The pipeline is built using [`pypiper`](https://github.com/databio/pypiper), so it automatically picks up where it left off in case of preemption or crash. +- **Scalability.** Run the pipeline easily on a project with a single sample or a thousand. This pipeline is compatible with [`looper`](https://looper.databio.org), so it can run locally, in a cloud container engine, or with any cluster resource manager (e.g. SLURM, SGE, or LFS). +- **Restartability.** The pipeline is built using [`pypiper`](https://pypiper.databio.org), so it automatically picks up where it left off in case of preemption or crash. - **Copious logging.** The pipeline produces a detailed log file recording all output from every command run, and also records the time and memory use of every process, the version of the pipeline and other software, and other useful run information. - **Flexibility.** The pipeline provides options for multiple peak callers, multiple adapter trimmers, and fully configurable parameterization for many underlying tools. - **Portability.** Run it using `docker` or `singularity` with no other prerequisites, or it can be run natively without containers. The choice is yours. - **Standardized user interface.** The pipeline reads sample metadata formatted in [standard PEP format](http://pepkit.github.io/), so you can use the same sample annotation sheets for your downstream R or python analysis using tools from [pepkit](http://pepkit.github.io/). -- **Standardized reference genome assembly.** The pipeline uses standard reference genome assemblies produced by [`refgenie`](http://github.com/databio/refgenie)], which provides a scripted way to produce a compatible reference assembly for any custom genome. For common genomes, you can either download pre-indexed assemblies or build your own. +- **Standardized reference genome assembly.** The pipeline uses standard reference genome assemblies produced by [`refgenie`](http://refgenie.databio.org)], which provides a scripted way to produce a compatible reference assembly for any custom genome. For common genomes, you can either download pre-indexed assemblies or build your own. - **Prealignments.** The pipeline can (optionally) first align to any number of reference assemblies separately before the primary genome alignment. This increases both speed and accuracy and can be used, for example, to align sequentially to mtDNA, repeats, or spike-ins. - **Fraction of reads in pre-mature mRNA and features (FRiP/FRiF).** By default, the pipeline will calculate the FRiP using annotated pre-mature mRNA. The pipeline will also calculate the fraction of reads in known annotated features if using a common reference genome and may be customized to use any feature set. - **TSS enrichments, Fragment length distributions and more.** The pipeline produces various nice QC plots. -- **Beautiful `HTML` reports.** Your results include an easy-to-navigate `HTML` report with a sample table, job status, summary statistics, and QC plots at your fingertips when run using our [pipeline submission engine, `Looper`](https://looper.readthedocs.io/en/latest/index.html). +- **Beautiful `HTML` reports.** Your results include an easy-to-navigate `HTML` report with a sample table, job status, summary statistics, and QC plots at your fingertips when run using our [pipeline submission engine, `looper`](https://looper.databio.org). diff --git a/docs/howto/use_container.md b/docs/howto/configure_compute.md similarity index 74% rename from docs/howto/use_container.md rename to docs/howto/configure_compute.md index f4656c4..0ea962a 100644 --- a/docs/howto/use_container.md +++ b/docs/howto/configure_compute.md @@ -1,4 +1,18 @@ -# Run PEPPRO in a container +# Configuring PEPPRO computing settings + +## Cluster computing + +When you run your PEPPRO project using `looper run`, by default it will simply run each sample locally. You can adjust the computing settings using the `--compute` argument to `looper run`. This enables you to adjust your computing preferences on-the-fly when you run a project. You have several built-in options to change this. Some common examples are these: + +- `--compute slurm`. Submit the jobs to a SLURM cluster using `sbatch`. +- `--compute sge`. Submit the jobs to a SGE cluster using `sbatch`. +- `--compute docker`. Submit the jobs locally using the `databio/peppro` docker image. +- `--compute singularity`. Submit the jobs locally using the `peppro` singularity image. +- `--compute singularity_slurm`. Submit the jobs using `sbatch`, but then run them using the `peppro` singularity image. + +These available computing options are actually using a standardized computing system called [divvy](https://divvy.databio.org), and you can view a list of all your available options by typing `divvy list` on the command line. Divvy also allows you to very easily change these templates or add your own, so you can run PEPPRO in any possible computing environment. + +The instructions for changing these computing configuration options are universal for any software that relies on `divvy`. For complete instructions, you should consult the [divvy documentation](https://divvy.databio.org). In a nutshell, you will first create a `divvy` computing configuration file (compute_config.yaml) and point an environment variable (`DIVCFG`) to that file. You then have access to any configured computing packages by using `looper --compute `, where `package` can be any computing system you configure. We have produced both docker and singularity containers that hold all the necessary software for `PEPPRO`. You can run `PEPPRO` as an individual pipeline on a single sample using these containers by directly calling `docker run` or `singularity exec`. Or, you can rely on `looper`, which is already set up to run any pipeline in existing containers using the `divvy` templating system. Instructions for both follow: @@ -30,7 +44,6 @@ make singularity Now you'll need to tell the pipeline where you saved the singularity image. You can either create an environment variable called `$SIMAGES` that points to the folder where your image is stored, or you can tweak the `pipeline_interface.yaml` file so that the `compute.singularity_image` attribute is pointing to the right location on disk. - ## Running individual samples in a container Individual jobs can be run in a container by simply running the `peppro.py` command through `docker run` or `singularity exec`. You can run containers either on your local computer, or in an HPC environment, as long as you have `docker` or `singularity` installed. For example, run it locally in singularity like this: diff --git a/docs/howto/run_direct.md b/docs/howto/run_direct.md new file mode 100644 index 0000000..b312dd4 --- /dev/null +++ b/docs/howto/run_direct.md @@ -0,0 +1,16 @@ +# Runing the pipeline script directly + +The pipeline at its core is just a python script, and you can run it on the command line for a single sample (see [command-line usage](usage)), which you can also get on the command line by running `pipelines/peppro.py --help`. You just need to pass a few command-line parameters to specify sample name, reference genome, input files, etc. Here's the basic command to run the included small test example through the pipeline: + +```console +cd peppro +./pipelines/peppro.py \ + --sample-name test \ + --genome hg38 \ + --input examples/data/test_r1.fq.gz \ + --single-or-paired single \ + -O $HOME/peppro_example/ +``` + +This test example takes less than 5 minutes to complete. + diff --git a/docs/install.md b/docs/install.md index ae00b96..9eeb1c5 100644 --- a/docs/install.md +++ b/docs/install.md @@ -2,20 +2,20 @@ ## 1: Clone the `PEPPRO` pipeline -Clone the pipeline: ``` git clone https://github.com/databio/peppro.git ``` ## 2: Download `refgenie` assets -The pipeline relies on [`refgenie` assets](http://refgenie.databio.org/en/dev/install/) for alignment. First, initialize a folder for genome indexes and the `refgenie` config file. +PEPPRO uses [`refgenie`](http://refgenie.databio.org/) assets. If you haven't already set it up, initialize your refgenie config file like this: ```console +pip install --user refgenie export REFGENIE=your_genome_folder/genome_config.yaml refgenie init -c $REFGENIE ``` -Then, just pull the assets you need. +Add the `export REFGENIE` line to your `.bashrc` or `.profile` to ensure it persists. Then, pull the assets you need. By default, that's these for human: ```console refgenie pull -g hg38 -a bowtie2_index @@ -23,11 +23,21 @@ refgenie pull -g human_rDNA -a bowtie2_index refgenie pull -g rCRSd -a bowtie2_index ``` -(Add `REFGENIE` to your .bashrc or .profile to ensure it persists). Alternatively, you can skip the `REFGENIE` variable and simply change the value of the `resources.genome_config` option in the [`pipeline_config.yaml`](https://github.com/databio/peppro/blob/master/pipelines/peppro.yaml) file to point to the folder where you stored the assemblies. - ## 3: Install required software -`PEPPRO` requires a series of publicly-available, common bioinformatics tools including: [samtools](http://www.htslib.org/), [bedtools](https://bedtools.readthedocs.io/en/latest/content/installation.html), [bowtie2](http://bowtie-bio.sourceforge.net/bowtie2/index.shtml), [seqkit](https://bioinf.shenwei.me/seqkit/), [fastp](https://github.com/OpenGene/fastp), [seqtk](https://github.com/lh3/seqtk), [preseq](http://smithlabresearch.org/software/preseq/), [fastq-pair](https://github.com/linsalrob/fastq-pair.git), [picard](http://broadinstitute.github.io/picard/), [wigToBigWig](http://hgdownload.soe.ucsc.edu/admin/exe/), and [bigWigCat](http://hgdownload.soe.ucsc.edu/admin/exe/). +If you don't want to install the prerequisite software used by PEPPRO, you can follow our tutorial on [running PEPPRO directly in a container](howto/use_container.md) and then skip this step. If you want to run it natively, you'll need to install the following: + +* [bedtools](https://bedtools.readthedocs.io/en/latest/content/installation.html) +* [bowtie2](http://bowtie-bio.sourceforge.net/bowtie2/index.shtml) +* [cutadapt](https://cutadapt.readthedocs.io/) +* [fastp](https://github.com/OpenGene/fastp) +* [fastq-pair](https://github.com/linsalrob/fastq-pair.git) +* [picard](http://broadinstitute.github.io/picard/) +* [preseq](http://smithlabresearch.org/software/preseq/) +* [samtools](http://www.htslib.org/) +* [seqkit](https://bioinf.shenwei.me/seqkit/) +* [seqtk](https://github.com/lh3/seqtk) +* [wigToBigWig, bigWigCat](http://hgdownload.soe.ucsc.edu/admin/exe/) ### Python packages @@ -51,29 +61,59 @@ Optionally, `PEPPRO` can mix and match tools for adapter removal, read trimming, `seqOutBias` can be used to take into account the mappability at a given read length to filter the sample signal. -*Optional tools:* [fqdedup](https://github.com/guertinlab/fqdedup), [fastx toolkit](http://hannonlab.cshl.edu/fastx_toolkit/), [seqOutBias](https://github.com/guertinlab/seqOutBias), [fastqc](https://www.bioinformatics.babraham.ac.uk/projects/download.html#fastqc), and [pigz (v2.3.4+)](https://zlib.net/pigz/). +*Optional tools:* -## 4: Run the pipeline script directly +* [fqdedup](https://github.com/guertinlab/fqdedup) +* [fastx toolkit](http://hannonlab.cshl.edu/fastx_toolkit/) +* [seqOutBias](https://github.com/guertinlab/seqOutBias) +* [fastqc](https://www.bioinformatics.babraham.ac.uk/projects/download.html#fastqc) +* [pigz (v2.3.4+)](https://zlib.net/pigz/) -The pipeline at its core is just a python script, and you can run it on the command line for a single sample (see [command-line usage](usage)), which you can also get on the command line by running `pipelines/peppro.py --help`. You just need to pass a few command-line parameters to specify sample name, reference genome, input files, etc. Here's the basic command to run the included small test example through the pipeline: +## 4: Run an example project through PEPPRO -```console +Start by running the example project (`peppro_test.yaml`) in the [`examples/meta/`](https://github.com/databio/peppro/tree/master/examples/meta) folder. Let's use `looper`'s `-d` argument to do a *dry run*, which will create job scripts for every sample in a project, but will not execute them: + +``` cd peppro -./pipelines/peppro.py \ - --sample-name test \ - --genome hg38 \ - --input examples/data/test_r1.fq.gz \ - --single-or-paired single \ - -O $HOME/peppro_example/ +looper run -d examples/meta/peppro_test.yaml +``` + +If the looper executable is not in your `$PATH`, add the following line to your `.bashrc` or `.profile`: +``` +export PATH=$PATH:~/.local/bin +``` +If that worked, let's actually run the example by taking out the `-d` flag: + +```console +looper run examples/meta/peppro_test.yaml +``` + +You could run it in a container like this: + +```console +looper run examples/meta/peppro_test.yaml --compute docker +looper run examples/meta/peppro_test.yaml --compute singularity ``` -This test example takes less than 5 minutes to complete. Read more about how to [run the test sample using `Looper`](howto/use_looper.md) with the included [example `peppro_test.yaml` file](https://github.com/databio/peppro/blob/master/examples/meta/peppro_test.yaml). +There are lots of other cool things you can do with looper, like dry runs, summarize results, check on pipeline run status, clean intermediate files to save disk space, lump multiple samples into one job, and more. For details, consult the [`looper` docs](http://looper.databio.org/). + +## 5: Configure your project files + +To run your own samples, you'll need to organize them in **PEP format**, which is explained in [how to create a PEP](https://pepkit.github.io/docs/home/) and is universal to all pipelines that read PEPs, including `PEPPRO`. To get you started, there are examples you can adapt in the `examples/` folder (*e.g.* [example test PEP](https://github.com/databio/peppro/tree/master/examples/meta/peppro_test.yaml)). In short, you need two files for your project: + + 1. project config file -- describes output locations, pointers to data, etc. + 2. sample annotation file -- comma-separated value (CSV) list of your samples. + +The sample annotation file must specify these columns: + +- sample_name +- library ('PRO' or 'PROSEQ' or 'PRO-seq') +- organism (e.g. 'human' or 'mouse') +- read1 +- read2 (if paired) +- whatever else you want -# 5. Next steps +## Next steps -This is just the beginning. For your next step, take a look at one of these user guides: +This is just the beginning. For your next step, take a look at one of other detailed user guide links in the side menu. -- [Extended tutorial for running a single sample](tutorial.md) -- [Running on multiple samples with looper](howto/use_looper.md) -- [Running the pipeline directly in a container](howto/use_container.md) -- See other detailed user guide links in the side menu diff --git a/examples/meta/peppro_test.yaml b/examples/meta/peppro_test.yaml index 1e9611f..afda0c9 100644 --- a/examples/meta/peppro_test.yaml +++ b/examples/meta/peppro_test.yaml @@ -3,8 +3,8 @@ name: test metadata: sample_annotation: "peppro_test.csv" - output_dir: "$HOME/peppro_test/" - pipeline_interfaces: "$HOME/peppro/pipeline_interface.yaml" + output_dir: "peppro_test/" + pipeline_interfaces: "$CODE/peppro/pipeline_interface.yaml" derived_columns: [read1] diff --git a/mkdocs.yml b/mkdocs.yml index 4e5663e..2b3196f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -18,13 +18,13 @@ nav: - Install and run: 'install.md' - Extended tutorial: 'tutorial.md' - How-to Guides: - - Annotation files: 'howto/annotation_files/' - - Configuring prealignments: 'howto/prealignments/' + - Annotation files: 'howto/annotation_files.md' + - Configuring prealignments: 'howto/prealignments.md' + - Configuring computing: 'howto/configure_compute.md' - Detailed install guide: 'howto/detailed_install.md' - - Running on a cluster: 'howto/run_cluster/' - - Running in a container: 'howto/use_container/' - - Using looper: 'howto/use_looper/' - - Reference: + - Run PEPPRO directly: 'howto/run_direct.md' + - Reference: + - FAQ: 'faq.md' - Usage: 'usage.md' - Changelog: 'changelog.md' - Support: 'https://github.com/databio/peppro/issues' From 720ec0000256ca0420aff04fbbfd4eb50b2ccf2a Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 4 Jul 2019 00:38:21 -0400 Subject: [PATCH 013/207] docs updates --- docs/howto/configure_compute.md | 20 ++++---- docs/howto/container_reference.md | 79 +++++++++++++++++++++++++++++++ docs/howto/run_direct.md | 2 +- docs/howto/use_container.md | 30 ++++++++++++ docs/install.md | 6 +-- mkdocs.yml | 4 +- 6 files changed, 128 insertions(+), 13 deletions(-) create mode 100644 docs/howto/container_reference.md create mode 100644 docs/howto/use_container.md diff --git a/docs/howto/configure_compute.md b/docs/howto/configure_compute.md index 0ea962a..638e48f 100644 --- a/docs/howto/configure_compute.md +++ b/docs/howto/configure_compute.md @@ -1,6 +1,6 @@ -# Configuring PEPPRO computing settings +# Configuring PEPPRO computing settings -## Cluster computing +## Default computing options When you run your PEPPRO project using `looper run`, by default it will simply run each sample locally. You can adjust the computing settings using the `--compute` argument to `looper run`. This enables you to adjust your computing preferences on-the-fly when you run a project. You have several built-in options to change this. Some common examples are these: @@ -10,7 +10,15 @@ When you run your PEPPRO project using `looper run`, by default it will simply r - `--compute singularity`. Submit the jobs locally using the `peppro` singularity image. - `--compute singularity_slurm`. Submit the jobs using `sbatch`, but then run them using the `peppro` singularity image. -These available computing options are actually using a standardized computing system called [divvy](https://divvy.databio.org), and you can view a list of all your available options by typing `divvy list` on the command line. Divvy also allows you to very easily change these templates or add your own, so you can run PEPPRO in any possible computing environment. +To use the docker or singularity options, you'll need to make sure you're [set up for using PEPPRO containers](use_container.md). These available computing options are actually using a standardized computing system called [divvy](https://divvy.databio.org), and you can view a list of all your available options with this command: + +```console +divvy list +``` + +## Customizing compute options + +Divvy also allows you to very easily change these templates or add your own, so you can run PEPPRO in any possible computing environment. Changing these computing configuration options will work for any software that relies on `divvy`. For complete instructions, you should consult the [divvy documentation](https://divvy.databio.org). In a nutshell, you will first create a `divvy` computing configuration file (compute_config.yaml) and point an environment variable (`DIVCFG`) to that file. You then have access to any configured computing packages by using `looper --compute `, where `package` can be any computing system you configure. The instructions for changing these computing configuration options are universal for any software that relies on `divvy`. For complete instructions, you should consult the [divvy documentation](https://divvy.databio.org). In a nutshell, you will first create a `divvy` computing configuration file (compute_config.yaml) and point an environment variable (`DIVCFG`) to that file. You then have access to any configured computing packages by using `looper --compute `, where `package` can be any computing system you configure. @@ -126,8 +134,4 @@ singularity exec instance://peppro_instance \ Third, close your instance when finished. ``` singularity instance.stop peppro_instance -``` - -## Running multiple samples in a container with looper - -To run multiple samples in a container, you simply need to configure `looper` to use a container-compatible template. The looper documentation has detailed instructions for [how to run pipelines in containers](http://looper.databio.org/containers/). \ No newline at end of file +``` \ No newline at end of file diff --git a/docs/howto/container_reference.md b/docs/howto/container_reference.md new file mode 100644 index 0000000..ff7a1a3 --- /dev/null +++ b/docs/howto/container_reference.md @@ -0,0 +1,79 @@ +# Running individual samples in a container + +We have produced both docker and singularity containers that hold all the necessary software for `PEPPRO`. You can run `PEPPRO` as an individual pipeline on a single sample using these containers by directly calling `docker run` or `singularity exec`. Or, you can rely on `looper`, which is already set up to run any pipeline in existing containers using the `divvy` templating system. + +Individual jobs can be run in a container by simply running the `peppro.py` command through `docker run` or `singularity exec`. You can run containers either on your local computer, or in an HPC environment, as long as you have `docker` or `singularity` installed. For example, run it locally in singularity like this: +``` +singularity exec --bind $GENOMES $SIMAGES/peppro pipelines/peppro.py --help +``` + +With `docker`, you can use: +``` +docker run --rm -it databio/peppro pipelines/peppro.py --help +``` +Be sure to mount the volumes you need with `--volume`. If you're using any environment variables (e.g. `$GENOMES`), don't forget to include those in your docker command with the `-e` option. + +### Detailed example using `docker` +The pipeline has been successfully run in both a Linux and MacOS environment. With `docker` you need to bind mount your volume that contains the pipeline and your `$GENOMES` location, as well as provide the container the same environment variables your host environment is using. + +In the first example, we're mounting our home user directory (`/home/jps3ag/`) which contains the parent directories to our `$GENOMES` folder and to the pipeline itself. We'll also provide the pipeline two environment variables, `$GENOMES` and `$HOME`. + +Here's that example command in a Linux environment to run the test example through the pipeline: +``` +docker run --rm -it --volume /home/jps3ag/:/home/jps3ag/ \ + -e GENOMES='/home/jps3ag/genomes/' \ + -e HOME='/home/jps3ag/' \ + databio/peppro \ + /home/jps3ag/src/peppro/pipelines/peppro.py --single-or-paired single \ + --prealignments rCRSd human_repeats \ + --genome hg38 \ + --sample-name test1 \ + --input /home/jps3ag/src/peppro/examples/data/test_r1.fq.gz \ + -O $HOME/peppro_test +``` + +In this second example, we'll perform the same command in a Mac environment using [Docker for Mac](https://docs.docker.com/v17.12/docker-for-mac/install/). + +This necessitates a few minor changes to run that same example: + +- replace `/home/` with `/Users/` format +- e.g. `--volume /Users/jps3ag/:/Users/jps3ag/` + +Remember to [allocate sufficient memory](https://docs.docker.com/docker-for-mac/#advanced) (6-8GB should generally be more than adequate) in Docker for Mac. + +``` +docker run --rm -it --volume /Users/jps3ag/:/Users/jps3ag/ \ + -e GENOMES="/Users/jps3ag/genomes" \ + -e HOME="/Users/jps3ag/" \ + databio/peppro \ + /Users/jps3ag/src/peppro/pipelines/peppro.py --single-or-paired single \ + --prealignments rCRSd human_repeats \ + --genome hg38 \ + --sample-name test1 \ + --input /Users/jps3ag/src/peppro/examples/data/test_r1.fq.gz \ + -O $HOME/peppro_test +``` + +### Detailed example using `singularity` + +First, build a singularity container from the docker image and create a running instance (be sure to mount your directories containing your `$GENOMES` folder and pipeline. +``` +singularity build peppro docker://databio/peppro:latest +singularity instance.start -B /home/jps3ag/:/home/jps3aq/ peppro peppro_instance +``` + +Second, run your command. +``` +singularity exec instance://peppro_instance \ + /home/jps3ag/src/peppro/pipelines/peppro.py --single-or-paired single \ + --prealignments rCRSd human_repeats \ + --genome hg38 \ + --sample-name test1 \ + --input /home/jps3ag/src/peppro/examples/data/test_r1.fq.gz \ + -O $HOME/peppro_test +``` + +Third, close your instance when finished. +``` +singularity instance.stop peppro_instance +``` diff --git a/docs/howto/run_direct.md b/docs/howto/run_direct.md index b312dd4..c198a75 100644 --- a/docs/howto/run_direct.md +++ b/docs/howto/run_direct.md @@ -1,4 +1,4 @@ -# Runing the pipeline script directly +# Running the pipeline script directly The pipeline at its core is just a python script, and you can run it on the command line for a single sample (see [command-line usage](usage)), which you can also get on the command line by running `pipelines/peppro.py --help`. You just need to pass a few command-line parameters to specify sample name, reference genome, input files, etc. Here's the basic command to run the included small test example through the pipeline: diff --git a/docs/howto/use_container.md b/docs/howto/use_container.md new file mode 100644 index 0000000..274e6af --- /dev/null +++ b/docs/howto/use_container.md @@ -0,0 +1,30 @@ + +## Setting up PEPPRO containers + +First, make sure your environment is set up to run either docker or singularity containers. Then, pull the container image (choose either docker or singularity). If your containers are set up correctly, then you won't need to install any additional software. + +### Docker + +You can pull the docker [databio/peppro image](https://hub.docker.com/r/databio/peppro/) from dockerhub like this: + +``` +docker pull databio/peppro +``` + +Or build the image using the included Dockerfile (you can use a recipe in the included Makefile): +``` +cd peppro/ +make docker +``` + +### Singularity + +You can [download the singularity image](http://big.databio.org/simages/peppro) or build it from the docker image using the Makefile: +``` +cd peppro/ +make singularity +``` + +Now you'll need to tell the pipeline where you saved the singularity image. You can either create an environment variable called `$SIMAGES` that points to the folder where your image is stored, or you can tweak the `pipeline_interface.yaml` file so that the `compute.singularity_image` attribute is pointing to the right location on disk. + + You can now use the containerized [compute packages](configure_compute.md), *e.g.*, `looper run --compute docker` or `looper run --compute singularity`. \ No newline at end of file diff --git a/docs/install.md b/docs/install.md index 9eeb1c5..8fe957c 100644 --- a/docs/install.md +++ b/docs/install.md @@ -1,4 +1,4 @@ -# Getting started +# Install and run PEPPRO ## 1: Clone the `PEPPRO` pipeline @@ -71,7 +71,7 @@ Optionally, `PEPPRO` can mix and match tools for adapter removal, read trimming, ## 4: Run an example project through PEPPRO -Start by running the example project (`peppro_test.yaml`) in the [`examples/meta/`](https://github.com/databio/peppro/tree/master/examples/meta) folder. Let's use `looper`'s `-d` argument to do a *dry run*, which will create job scripts for every sample in a project, but will not execute them: +Start by running the example project (`peppro_test.yaml`) in the [`examples/meta/`](https://github.com/databio/peppro/tree/master/examples/meta) folder. PEPPRO uses a project management tool called [looper](https://looper.databio.org) to run the pipeline across samples in a project. Let's use `looper`'s `-d` argument to do a *dry run*, which will create job scripts for every sample in a project, but will not execute them: ``` cd peppro @@ -88,7 +88,7 @@ If that worked, let's actually run the example by taking out the `-d` flag: looper run examples/meta/peppro_test.yaml ``` -You could run it in a container like this: +Or, if you're using containers, adjust the `--compute` argument accordingly: ```console looper run examples/meta/peppro_test.yaml --compute docker diff --git a/mkdocs.yml b/mkdocs.yml index 2b3196f..a4c98e0 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -19,13 +19,15 @@ nav: - Extended tutorial: 'tutorial.md' - How-to Guides: - Annotation files: 'howto/annotation_files.md' + - Run PEPPRO directly: 'howto/run_direct.md' + - Run PEPPRO in containers: 'howto/use_container.md' - Configuring prealignments: 'howto/prealignments.md' - Configuring computing: 'howto/configure_compute.md' - Detailed install guide: 'howto/detailed_install.md' - - Run PEPPRO directly: 'howto/run_direct.md' - Reference: - FAQ: 'faq.md' - Usage: 'usage.md' + - Advanced container reference: 'howto/container_reference.md' - Changelog: 'changelog.md' - Support: 'https://github.com/databio/peppro/issues' - Example output file structure: 'browse_output.md' From 59a48feca0a035600ad9d26153326b307137c9e7 Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 18 Jul 2019 15:34:49 -0400 Subject: [PATCH 014/207] remove py from piface --- docs/img/peppro_logo2.svg | 193 ++++++++++++++++++++++++++++++++++++++ pipeline_interface.yaml | 14 +-- 2 files changed, 200 insertions(+), 7 deletions(-) create mode 100644 docs/img/peppro_logo2.svg diff --git a/docs/img/peppro_logo2.svg b/docs/img/peppro_logo2.svg new file mode 100644 index 0000000..0da2ae5 --- /dev/null +++ b/docs/img/peppro_logo2.svg @@ -0,0 +1,193 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pipeline_interface.yaml b/pipeline_interface.yaml index a0e9725..968202c 100644 --- a/pipeline_interface.yaml +++ b/pipeline_interface.yaml @@ -1,13 +1,13 @@ protocol_mapping: - PRO: peppro.py - pro: peppro.py - PRO-SEQ: peppro.py - PRO-seq: peppro.py - PROSEQ: peppro.py - proseq: peppro.py + PRO: peppro + pro: peppro + PRO-SEQ: peppro + PRO-seq: peppro + PROSEQ: peppro + proseq: peppro pipelines: - peppro.py: + peppro: name: PEPPRO path: pipelines/peppro.py looper_args: True From 2841e8ccc0295b90edcc769a4a2effc20835f624 Mon Sep 17 00:00:00 2001 From: nsheff Date: Fri, 19 Jul 2019 13:24:03 -0400 Subject: [PATCH 015/207] add GRO and gro to PI --- pipeline_interface.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pipeline_interface.yaml b/pipeline_interface.yaml index 968202c..9b94814 100644 --- a/pipeline_interface.yaml +++ b/pipeline_interface.yaml @@ -1,6 +1,8 @@ protocol_mapping: PRO: peppro pro: peppro + GRO: peppro + gro: peppro PRO-SEQ: peppro PRO-seq: peppro PROSEQ: peppro From 2f6b41957fed506e68d9122af09357404da33e14 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Tue, 30 Jul 2019 09:54:38 -0400 Subject: [PATCH 016/207] increase y-max by 10% for TSS plotting --- PEPPROr/R/PEPPROr.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PEPPROr/R/PEPPROr.R b/PEPPROr/R/PEPPROr.R index 3a502f8..768498d 100644 --- a/PEPPROr/R/PEPPROr.R +++ b/PEPPROr/R/PEPPROr.R @@ -814,7 +814,7 @@ plotTSS <- function(TSSfile) { geom_smooth(method="loess", span=0.02, se=FALSE, colour=lineColor) + labs(x = "Distance from TSS (bp)", y = "TSS Enrichment Score") - y_max <- max(30, roundUpNice(TSSscore)) + y_max <- max(30, roundUpNice(TSSscore*1.1)) p <- pre + t1 + scale_x_continuous(expand=c(0,0)) + scale_y_continuous(expand=c(0,0)) + From 7ca1b97a099b39310d4c3761f54790786bc23561 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Tue, 30 Jul 2019 11:10:12 -0400 Subject: [PATCH 017/207] fix strand position for TSS enrichments --- pipelines/peppro.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 3a0c9c5..78e7e32 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -2188,6 +2188,7 @@ def count_unmapped_reads(): mapping_genome_bam, (">", plus_bam) ]) + cmd2 = build_command([ tools.samtools, "view", @@ -2197,7 +2198,7 @@ def count_unmapped_reads(): (">", minus_bam) ]) - pm.run([cmd1,cmd2], minus_bam) + pm.run([cmd1, cmd2], [plus_bam, minus_bam]) ############################################################################ # TSS enrichment # @@ -2231,7 +2232,7 @@ def count_unmapped_reads(): cmd = tool_path("pyTssEnrichment.py") cmd += " -a " + mapping_genome_bam + " -b " + plus_TSS + " -p ends" cmd += " -c " + str(pm.cores) - cmd += " -z -v -s 4 -o " + Tss_plus + cmd += " -z -v -s 6 -o " + Tss_plus pm.run(cmd, Tss_plus, nofail=True) pm.clean_add(plus_TSS) pm.clean_add(Tss_plus) @@ -2254,7 +2255,7 @@ def count_unmapped_reads(): cmd = tool_path("pyTssEnrichment.py") cmd += " -a " + mapping_genome_bam + " -b " + minus_TSS + " -p ends" cmd += " -c " + str(pm.cores) - cmd += " -z -v -s 4 -o " + Tss_minus + cmd += " -z -v -s 6 -o " + Tss_minus pm.run(cmd, Tss_minus, nofail=True) pm.clean_add(minus_TSS) pm.clean_add(Tss_minus) From 2505b8ebdb8e1513c3e2790875910d17dc1cbe4a Mon Sep 17 00:00:00 2001 From: nsheff Date: Tue, 30 Jul 2019 13:00:15 -0400 Subject: [PATCH 018/207] update docs, logos --- docs/README.md | 6 +- docs/features.md | 2 +- docs/howto/use_container.md | 8 +- docs/img/peppro_logo.svg | 70 +++--- docs/img/peppro_logo_gray.svg | 220 ++++++++++++++++++ ...peppro_logo3.svg => peppro_logo_large.svg} | 50 ++-- docs/install.md | 30 +-- docs/tutorial.md | 2 +- examples/meta/peppro_test.yaml | 5 - mkdocs.yml | 11 +- 10 files changed, 291 insertions(+), 113 deletions(-) create mode 100644 docs/img/peppro_logo_gray.svg rename docs/img/{peppro_logo3.svg => peppro_logo_large.svg} (62%) diff --git a/docs/README.md b/docs/README.md index fe63db4..6f5b023 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,16 +1,16 @@ -# PEPPRO +# PEPPRO
[![PEP compatible](http://pepkit.github.io/img/PEP-compatible-green.svg)](http://pepkit.github.io) -`PEPPRO` is a pipeline designed to process PRO-seq data. It is optimized on unique features of PRO-seq to be fast and accurate. It performs adapter removal, including UMI of variable length, read deduplication, trimming, mapping, and signal tracks (bigWig) for plus and minus strands using scaled (based on mappability information) or unscaled read count patterns. +`PEPPRO` is a pipeline designed to process PRO-seq data. It is optimized on unique features of PRO-seq to be fast and accurate. It performs variable-length UMI adapter removal, read deduplication, trimming, mapping, and signal tracks (bigWig) for plus and minus strands using mappability-scaled or unscaled read counts. ## Outputs `PEPPRO` produces quality control plots, summary statistics, and several data formats to set the stage for project-specific analysis. -- PEPPRO produces an easily-navigable HTML report when used with [`Looper`](http://looper.databio.org/en/latest/): View this [HTML Summary report demo](files/examples/tutorial/tutorial_summary.html) +- PEPPRO produces an easily-navigable HTML report: [HTML summary report demo](files/examples/tutorial/tutorial_summary.html) - We have produced an [interactive display of the output folder structure](browse_output/), which includes: - [Easily parsable summary statistics file](files/examples/tutorial/results_pipeline/tutorial/stats.tsv) - BigWig signal tracks (plus and minus stranded): diff --git a/docs/features.md b/docs/features.md index 8681e90..739407e 100644 --- a/docs/features.md +++ b/docs/features.md @@ -1,4 +1,4 @@ -# PEPPRO features at-a-glance +# PEPPRO features at-a-glance Here are a few of the highlights that make `PEPPRO` valuable. diff --git a/docs/howto/use_container.md b/docs/howto/use_container.md index 712343b..643139e 100644 --- a/docs/howto/use_container.md +++ b/docs/howto/use_container.md @@ -1,9 +1,4 @@ -<<<<<<< HEAD -======= # Run PEPPRO in a container ->>>>>>> master - -## Setting up PEPPRO containers First, make sure your environment is set up to run either docker or singularity containers. Then, pull the container image (choose either docker or singularity). If your containers are set up correctly, then you won't need to install any additional software. @@ -31,9 +26,8 @@ make singularity Now you'll need to tell the pipeline where you saved the singularity image. You can either create an environment variable called `$SIMAGES` that points to the folder where your image is stored, or you can tweak the `pipeline_interface.yaml` file so that the `compute.singularity_image` attribute is pointing to the right location on disk. -<<<<<<< HEAD You can now use the containerized [compute packages](configure_compute.md), *e.g.*, `looper run --compute docker` or `looper run --compute singularity`. -======= + If your containers are set up correctly, then won't need to install any additional software. ## Running individual samples in a container diff --git a/docs/img/peppro_logo.svg b/docs/img/peppro_logo.svg index 5cfa336..3b8e52c 100644 --- a/docs/img/peppro_logo.svg +++ b/docs/img/peppro_logo.svg @@ -9,19 +9,19 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="3339.698" - height="3101.6738" + width="955.19135" + height="227.99561" id="svg2" version="1.1" - inkscape:version="0.92.4 (33fec40, 2019-01-16)" - sodipodi:docname="peppro_logo.svg"> + inkscape:version="0.91 r13725" + sodipodi:docname="peppro_logo3.svg"> image/svg+xml - + @@ -85,105 +85,105 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(1937.2167,1519.8908)"> + transform="translate(1709.3385,1366.0829)"> + transform="matrix(0.5246427,0,0,0.5246427,-1432.1606,-1298.4311)"> + transform="matrix(0.7353359,0,0,0.7353359,-1369.3683,-1375.8491)"> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:115.00834656px;line-height:1.25;font-family:'Franklin Gothic';-inkscape-font-specification:'Franklin Gothic, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000080;fill-opacity:1;stroke:#ffffff;stroke-width:1.15406287;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m -1374.8609,-1192.9145 0,-110.335 50.6038,0 q 13.5293,0 23.0201,3.9578 9.4908,3.9578 14.4179,11.5908 4.9272,7.633 4.9272,18.3757 0,9.2485 -4.1194,16.8815 -4.079,7.5925 -11.2678,11.7119 -5.8157,3.231 -12.5197,4.604 -6.7041,1.3733 -16.7603,1.3733 l -18.0122,0 0,41.84 z m 30.2896,-89.3343 0,25.6454 14.8621,0 q 8.5619,0 12.3178,-2.9484 3.7558,-2.9481 3.7558,-9.6118 0,-6.6638 -3.7558,-9.8543 -3.7559,-3.2309 -12.3178,-3.2309 z" /> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:115.00834656px;line-height:1.25;font-family:'Franklin Gothic';-inkscape-font-specification:'Franklin Gothic, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000080;fill-opacity:1;stroke:#ffffff;stroke-width:1.15406287;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m -1266.949,-1192.9145 0,-110.335 79.3991,0 0,23.1412 -49.1096,0 0,19.7085 31.259,0 0,23.1413 -31.259,0 0,21.2026 51.4117,0 0,23.1414 z" /> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:115.00834656px;line-height:1.25;font-family:'Franklin Gothic';-inkscape-font-specification:'Franklin Gothic, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000080;fill-opacity:1;stroke:#ffffff;stroke-width:1.15406287;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m -1171.9608,-1192.9145 0,-110.335 50.6039,0 q 13.5294,0 23.0202,3.9578 9.4907,3.9578 14.4178,11.5908 4.9271,7.633 4.9271,18.3757 0,9.2485 -4.1194,16.8815 -4.079,7.5925 -11.2676,11.7119 -5.8157,3.231 -12.5197,4.604 -6.7042,1.3733 -16.7605,1.3733 l -18.0122,0 0,41.84 z m 30.2896,-89.3343 0,25.6454 14.8621,0 q 8.5619,0 12.3179,-2.9484 3.7559,-2.9481 3.7559,-9.6118 0,-6.6638 -3.7559,-9.8543 -3.756,-3.2309 -12.3179,-3.2309 z" /> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:115.00834656px;line-height:1.25;font-family:'Franklin Gothic';-inkscape-font-specification:'Franklin Gothic, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#aa4400;fill-opacity:1;stroke:#ffffff;stroke-width:1.15406287;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m -1065.1324,-1192.9145 0,-110.335 50.6039,0 q 13.5294,0 23.02019,3.9578 9.49077,3.9578 14.41784,11.5909 4.92719,7.6329 4.92719,18.3757 0,9.2483 -4.11942,16.8814 -4.07908,7.5925 -11.26777,11.7119 -5.81564,3.2309 -12.51973,4.6041 -6.7041,1.3732 -16.7602,1.3732 l -18.0122,0 0,41.84 z m 30.2898,-89.3343 0,25.6453 14.862,0 q 8.5619,0 12.3178,-2.9482 3.7559,-2.9481 3.7559,-9.6119 0,-6.6638 -3.7559,-9.8543 -3.7559,-3.2309 -12.3178,-3.2309 z" /> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:115.00834656px;line-height:1.25;font-family:'Franklin Gothic';-inkscape-font-specification:'Franklin Gothic, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#aa4400;fill-opacity:1;stroke:#ffffff;stroke-width:1.15406287;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m -957.22037,-1192.9144 0,-110.335 48.3018,0 q 15.30636,0 25.32215,3.15 8.80417,2.706 14.29669,10.6216 5.53292,7.8754 5.53292,17.6488 0,11.8736 -7.59262,19.7085 -4.20014,4.4424 -12.76203,8.2388 l 20.03155,50.9673 -33.9244,0 -15.18518,-45.6364 -13.89286,0 0,45.6364 z m 30.12802,-89.3343 0,23.0201 17.85068,0 q 6.46179,0 10.09654,-3.0692 3.63478,-3.0694 3.63478,-8.5216 0,-5.4521 -3.59437,-8.4406 -3.55398,-2.9887 -10.13695,-2.9887 z" /> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:115.00834656px;line-height:1.25;font-family:'Franklin Gothic';-inkscape-font-specification:'Franklin Gothic, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#aa4400;fill-opacity:1;stroke:#ffffff;stroke-width:1.15406287;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m -853.79145,-1248.0819 q 0,-17.4064 6.17913,-30.3705 6.17906,-12.9639 17.48719,-19.8295 11.30813,-6.8658 25.9683,-6.8658 12.03508,0 21.32391,4.3618 9.32922,4.3214 15.58906,12.0352 6.25987,7.7137 9.36961,17.6083 3.1501,9.8946 3.1501,21.0816 0,12.0755 -2.94819,22.7777 -2.90781,10.7024 -8.92534,18.8201 -5.97715,8.1175 -15.50831,12.8023 -9.49073,4.6444 -22.05084,4.6444 -10.41962,0 -19.46611,-3.5943 -9.00615,-3.5944 -15.8314,-10.7427 -6.78488,-7.1888 -10.5812,-17.9315 -3.75591,-10.7831 -3.75591,-24.7971 z m 31.74357,0 q 0,35.0551 17.89105,35.0551 10.01577,0 13.85246,-9.7329 3.83669,-9.7333 3.83669,-27.1395 0,-33.238 -17.68915,-33.238 -6.58296,0 -10.54079,4.281 -3.95784,4.2809 -5.65407,12.0755 -1.69619,7.7541 -1.69619,18.6988 z" /> diff --git a/docs/img/peppro_logo_gray.svg b/docs/img/peppro_logo_gray.svg new file mode 100644 index 0000000..6cdf71e --- /dev/null +++ b/docs/img/peppro_logo_gray.svg @@ -0,0 +1,220 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/img/peppro_logo3.svg b/docs/img/peppro_logo_large.svg similarity index 62% rename from docs/img/peppro_logo3.svg rename to docs/img/peppro_logo_large.svg index 4322759..5cfa336 100644 --- a/docs/img/peppro_logo3.svg +++ b/docs/img/peppro_logo_large.svg @@ -9,19 +9,19 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="955.19135" - height="251.85074" + width="3339.698" + height="3101.6738" id="svg2" version="1.1" - inkscape:version="0.91 r13725" - sodipodi:docname="peppro_logo3.svg"> + inkscape:version="0.92.4 (33fec40, 2019-01-16)" + sodipodi:docname="peppro_logo.svg"> image/svg+xml - + @@ -85,11 +85,11 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(1709.3385,1380.6936)"> + transform="translate(1937.2167,1519.8908)"> + transform="matrix(6.381606,0,0,6.381606,812.64674,-580.09177)"> + transform="matrix(6.381606,0,0,6.381606,1013.2115,-561.85861)"> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:115.00834656px;line-height:1.25;font-family:'Franklin Gothic';-inkscape-font-specification:'Franklin Gothic, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000080;fill-opacity:1;stroke:#ffffff;stroke-width:5;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" + d="M -1401.7108,775.9994 V 297.97058 h 219.2423 q 58.6163,0 99.7351,17.14744 41.1189,17.14744 62.4657,50.21756 21.34689,33.07006 21.34689,79.61309 0,40.06902 -17.84739,73.13914 -17.6723,32.89507 -48.8177,50.74245 -25.1962,13.99786 -54.2419,19.94698 -29.0457,5.94913 -72.6142,5.94913 h -78.0384 V 775.9994 Z m 131.2304,-387.04237 v 111.10842 h 64.3905 q 37.0944,0 53.367,-12.7731 16.2726,-12.7731 16.2726,-41.64374 0,-28.87071 -16.2726,-42.69371 -16.2726,-13.99787 -53.367,-13.99787 z" /> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:115.00834656px;line-height:1.25;font-family:'Franklin Gothic';-inkscape-font-specification:'Franklin Gothic, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000080;fill-opacity:1;stroke:#ffffff;stroke-width:5;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" + d="M -934.18043,775.9994 V 297.97058 h 343.99874 v 100.26008 h -212.76836 v 85.38729 h 135.42987 v 100.26001 h -135.42987 v 91.86136 h 222.74186 V 775.9994 Z" /> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:115.00834656px;line-height:1.25;font-family:'Franklin Gothic';-inkscape-font-specification:'Franklin Gothic, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000080;fill-opacity:1;stroke:#ffffff;stroke-width:5;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" + d="M -522.64177,775.9994 V 297.97058 h 219.24237 q 58.61627,0 99.73513,17.14744 41.11885,17.14744 62.46571,50.21756 21.34679,33.07006 21.34679,79.61309 0,40.06902 -17.84737,73.13914 -17.67233,32.89507 -48.8177,50.74245 -25.19623,13.99786 -54.24192,19.94698 -29.04563,5.94913 -72.61419,5.94913 h -78.03836 V 775.9994 Z m 131.23046,-387.04237 v 111.10842 h 64.3904 q 37.09449,0 53.36707,-12.7731 16.27259,-12.7731 16.27259,-41.64374 0,-28.87071 -16.27259,-42.69371 -16.27258,-13.99787 -53.36707,-13.99787 z" /> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:115.00834656px;line-height:1.25;font-family:'Franklin Gothic';-inkscape-font-specification:'Franklin Gothic, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#aa4400;fill-opacity:1;stroke:#ffffff;stroke-width:5;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" + d="M -59.805326,465.83924 V -12.189507 H 159.43705 q 58.61626,0 99.73512,17.1474457 41.11892,17.1474453 62.46571,50.2175533 21.34679,33.070057 21.34679,79.613088 0,40.06902 -17.84737,73.13908 -17.67233,32.8952 -48.81769,50.74244 -25.19624,13.99793 -54.24187,19.94705 -29.04575,5.94913 -72.61425,5.94913 H 71.425127 V 465.83924 Z M 71.425127,78.796943 V 189.90543 h 64.390403 q 37.09449,0 53.36701,-12.77311 16.27265,-12.7731 16.27265,-41.64387 0,-28.87064 -16.27265,-42.693582 -16.27252,-13.997925 -53.36701,-13.997925 z" /> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:115.00834656px;line-height:1.25;font-family:'Franklin Gothic';-inkscape-font-specification:'Franklin Gothic, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#aa4400;fill-opacity:1;stroke:#ffffff;stroke-width:5;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" + d="M 407.72505,465.83924 V -12.189507 h 209.26883 q 66.31512,0 109.70865,13.6479708 38.14432,11.7232532 61.94078,46.0181442 23.97142,34.119945 23.97142,76.463622 0,51.44232 -32.8951,85.38729 -18.19729,19.24712 -55.29176,35.69462 l 86.78708,220.8171 H 664.23684 L 598.44664,268.11877 H 538.25561 V 465.83924 Z M 538.25561,78.796943 v 99.735117 h 77.33847 q 27.99583,0 43.74349,-13.29799 15.74766,-13.29799 15.74766,-36.9195 0,-23.62145 -15.57269,-36.56954 -15.39771,-12.948087 -43.91846,-12.948087 z" /> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:115.00834656px;line-height:1.25;font-family:'Franklin Gothic';-inkscape-font-specification:'Franklin Gothic, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#aa4400;fill-opacity:1;stroke:#ffffff;stroke-width:5;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" + d="m 855.8333,227.17483 q 0,-75.41373 26.77101,-131.580415 26.77101,-56.166608 75.76371,-85.9121734 48.99268,-29.7455716 112.50828,-29.7455716 52.1422,0 92.3862,18.897186 40.419,18.722209 67.5399,52.14222 27.121,33.420024 40.594,76.288654 13.648,42.86863 13.648,91.33635 0,52.31724 -12.7731,98.68529 -12.5982,46.36817 -38.6693,81.5379 -25.8961,35.16974 -67.19,55.46675 -41.1188,20.12204 -95.5357,20.12204 -45.1433,0 -84.33748,-15.57272 -39.01918,-15.57271 -68.58978,-46.54309 -29.39562,-31.14537 -45.84317,-77.6884 Q 855.8333,287.89077 855.8333,227.17483 Z m 137.52951,0 q 0,151.87738 77.51349,151.87738 43.3935,0 60.016,-42.16876 16.6225,-42.1687 16.6225,-117.58243 0,-144.003559 -76.6385,-144.003559 -28.5208,0 -45.6682,18.547245 -17.1475,18.547244 -24.4964,52.317234 -7.34889,33.59495 -7.34889,81.01289 z" /> diff --git a/docs/install.md b/docs/install.md index 62a24c3..79f5cb8 100644 --- a/docs/install.md +++ b/docs/install.md @@ -7,9 +7,8 @@ git clone https://github.com/databio/peppro.git ``` ## 2: Download `refgenie` assets -PEPPRO uses [`refgenie`](http://refgenie.databio.org/) assets. If you haven't already set it up, initialize your refgenie config file like this: +PEPPRO uses [`refgenie`](http://refgenie.databio.org/) assets for alignment. If you haven't already, initialize a refgenie config file like this: -<<<<<<< HEAD ```console pip install --user refgenie export REFGENIE=your_genome_folder/genome_config.yaml @@ -26,19 +25,8 @@ refgenie pull -g human_repeats -a bowtie2_index ## 3: Install required software -If you don't want to install the prerequisite software used by PEPPRO, you can follow our tutorial on [running PEPPRO directly in a container](howto/use_container.md) and then skip this step. If you want to run it natively, you'll need to install the following: +If you don't want to install the prerequisite software used by PEPPRO, you can follow our tutorial on [running PEPPRO directly in a container](howto/use_container.md) and then skip this step. If you want to run it natively, you'll need to install the following: [samtools](http://www.htslib.org/), [bedtools](https://bedtools.readthedocs.io/en/latest/content/installation.html), [bowtie2](http://bowtie-bio.sourceforge.net/bowtie2/index.shtml), [seqkit](https://bioinf.shenwei.me/seqkit/), [fastp](https://github.com/OpenGene/fastp), [seqtk](https://github.com/lh3/seqtk), [preseq](http://smithlabresearch.org/software/preseq/), [fastq-pair](https://github.com/linsalrob/fastq-pair.git), [wigToBigWig](http://hgdownload.soe.ucsc.edu/admin/exe/), and [bigWigCat](http://hgdownload.soe.ucsc.edu/admin/exe/). -* [samtools](http://www.htslib.org/) -* [bedtools](https://bedtools.readthedocs.io/en/latest/content/installation.html) -* [bowtie2](http://bowtie-bio.sourceforge.net/bowtie2/index.shtml) -* [seqkit](https://bioinf.shenwei.me/seqkit/) -* [fastp](https://github.com/OpenGene/fastp) -* [seqtk](https://github.com/lh3/seqtk) -* [preseq](http://smithlabresearch.org/software/preseq/) -* [wigToBigWig, bigWigCat](http://hgdownload.soe.ucsc.edu/admin/exe/) -======= -`PEPPRO` requires a series of publicly-available, common bioinformatics tools including: [samtools](http://www.htslib.org/), [bedtools](https://bedtools.readthedocs.io/en/latest/content/installation.html), [bowtie2](http://bowtie-bio.sourceforge.net/bowtie2/index.shtml), [seqkit](https://bioinf.shenwei.me/seqkit/), [fastp](https://github.com/OpenGene/fastp), [seqtk](https://github.com/lh3/seqtk), [preseq](http://smithlabresearch.org/software/preseq/), [fastq-pair](https://github.com/linsalrob/fastq-pair.git), [wigToBigWig](http://hgdownload.soe.ucsc.edu/admin/exe/), and [bigWigCat](http://hgdownload.soe.ucsc.edu/admin/exe/). ->>>>>>> master ### Python packages @@ -66,7 +54,7 @@ Optionally, `PEPPRO` can mix and match tools for adapter removal, read trimming, ## 4: Run an example project through PEPPRO -Start by running the example project (`peppro_test.yaml`) in the [`examples/meta/`](https://github.com/databio/peppro/tree/master/examples/meta) folder. PEPPRO uses a project management tool called [looper](https://looper.databio.org) to run the pipeline across samples in a project. Let's use `looper`'s `-d` argument to do a *dry run*, which will create job scripts for every sample in a project, but will not execute them: +Start by running the example project (`peppro_test.yaml`) in the [`examples/meta/`](https://github.com/databio/peppro/tree/master/examples/meta) folder. PEPPRO uses a project management tool called [looper](https://looper.databio.org) to run the pipeline across samples in a project. Let's use the `-d` argument to do a *dry run*, which will create job scripts for every sample in a project, but will not execute them: ``` cd peppro @@ -101,25 +89,15 @@ To run your own samples, you'll need to organize them in **PEP format**, which i The sample annotation file must specify these columns: -<<<<<<< HEAD - sample_name - library ('PRO' or 'PROSEQ' or 'PRO-seq') - organism (e.g. 'human' or 'mouse') - read1 - read2 (if paired) - whatever else you want -======= -This test example takes less than 5 minutes to complete. Read more about how to [run the test sample using `Looper`](howto/use_looper.md) with the included [example `peppro_test.yaml` file](https://github.com/databio/peppro/blob/master/examples/meta/peppro_test.yaml). ->>>>>>> master +This test example takes less than 5 minutes to complete. Read more about how to [run the test sample using `Looper`](howto/use_looper.md) with the included [example `peppro_test.yaml` file](https://github.com/databio/peppro/blob/master/examples/meta/peppro_test.yaml). ## Next steps -<<<<<<< HEAD This is just the beginning. For your next step, take a look at one of other detailed user guide links in the side menu. -======= -- [Extended tutorial for running a single sample](tutorial.md) -- [Running on multiple samples with looper](howto/use_looper.md) -- [Running the pipeline directly in a container](howto/use_container.md) -- See other detailed user guide links in the side menu ->>>>>>> master diff --git a/docs/tutorial.md b/docs/tutorial.md index 46b39fc..1423902 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -1,4 +1,4 @@ -# PEPPRO pipeline step-by-step guide +# PEPPRO pipeline step-by-step guide In this guide, we'll walk you through the step by step procedure of running a tutorial PRO-seq dataset through the pipeline. The output from this process is the same as you see in the [example PRO-seq output](browse_output.md) we've provided. To use this tutorial, you should have a basic familiarity with [working in a command line driven environment](http://matt.might.net/articles/basic-unix/). You also need to have already installed `PEPPRO` prerequisites, which you can do following the [detailed installation guide](howto/detailed_install.md). diff --git a/examples/meta/peppro_test.yaml b/examples/meta/peppro_test.yaml index 03d3b45..afda0c9 100644 --- a/examples/meta/peppro_test.yaml +++ b/examples/meta/peppro_test.yaml @@ -3,13 +3,8 @@ name: test metadata: sample_annotation: "peppro_test.csv" -<<<<<<< HEAD output_dir: "peppro_test/" pipeline_interfaces: "$CODE/peppro/pipeline_interface.yaml" -======= - output_dir: "$HOME/peppro_test/" - pipeline_interfaces: "$HOME/peppro/pipeline_interface.yaml" ->>>>>>> master derived_columns: [read1] diff --git a/mkdocs.yml b/mkdocs.yml index 399259a..5d08c9c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -3,7 +3,7 @@ theme: databio site_name: peppro site_author: Jason Smith site_url: http://peppro.databio.org/ -site_logo: img/peppro_inline_logo.svg +site_logo: img/peppro_logo_gray.svg repo_url: https://github.com/databio/peppro/ #google_analytics: ['UA-127092878-1', 'code.databio.org/peppro'] @@ -18,20 +18,11 @@ nav: - Install and run: 'install.md' - Extended tutorial: 'tutorial.md' - How-to Guides: -<<<<<<< HEAD - Annotation files: 'howto/annotation_files.md' - Run PEPPRO directly: 'howto/run_direct.md' - PEPPRO in containers: 'howto/use_container.md' - Configuring prealignments: 'howto/prealignments.md' - Configuring computing: 'howto/configure_compute.md' -======= - - Annotation files: 'howto/annotation_files/' - - Configuring prealignments: 'howto/prealignments/' - - Detailed install guide: 'howto/detailed_install.md' - - Running on a cluster: 'howto/run_cluster/' - - Running in a container: 'howto/use_container/' - - Using looper: 'howto/use_looper/' ->>>>>>> master - Reference: - FAQ: 'faq.md' - Usage: 'usage.md' From da31eb31c814cce9d0a62387d069860a9cb7a271 Mon Sep 17 00:00:00 2001 From: nsheff Date: Tue, 30 Jul 2019 13:14:52 -0400 Subject: [PATCH 019/207] umi_len is an int --- .gitignore | 2 ++ pipelines/peppro.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d2de169..3b490e2 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ # Tests .cache/ +*peppro_test* # MkDocs files site/ @@ -30,3 +31,4 @@ anno/mm10_annotations.bed.gz anno/mm10_annotations.bed anno/mm9_annotations.bed.gz anno/mm9_annotations.bed + diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 78e7e32..5a2d030 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -59,7 +59,7 @@ def parse_arguments(): help="Remove umi with fastp") parser.add_argument("--umi_len", dest="umi_len", - default="8", + default="8", type=int, help="Specify the length of the UMI." "If your data does not utilize UMIs, set to 0.") From 1b9601ce73a9813351b24a4cbf76c3c61cea88e1 Mon Sep 17 00:00:00 2001 From: nsheff Date: Tue, 30 Jul 2019 13:55:28 -0400 Subject: [PATCH 020/207] fix up reqs --- requirements.txt | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/requirements.txt b/requirements.txt index f74c008..d8b2383 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,21 +1,8 @@ cutadapt loopercli numpy -<<<<<<< HEAD -<<<<<<< HEAD -loopercli -pararead -pandas -piper -======= -======= pandas ->>>>>>> 7ca1b97a099b39310d4c3761f54790786bc23561 pararead piper refgenconf -<<<<<<< HEAD ->>>>>>> master -======= ->>>>>>> 7ca1b97a099b39310d4c3761f54790786bc23561 refgenie From 629efcca6dd81970cbd0b5f868225b1c5e9fb8b3 Mon Sep 17 00:00:00 2001 From: nsheff Date: Tue, 30 Jul 2019 15:50:40 -0400 Subject: [PATCH 021/207] restructure docs; updates to annotation docs --- .../annotation_files.md => annotation.md} | 74 +++++++++---------- docs/{howto => }/configure_compute.md | 0 docs/{howto => }/container_reference.md | 0 docs/{howto => }/detailed_install.md | 0 docs/install.md | 10 ++- docs/{howto => }/prealignments.md | 0 docs/{howto => }/run_cluster.md | 0 docs/{howto => }/run_direct.md | 0 docs/tutorial.md | 2 +- docs/{howto => }/use_container.md | 0 docs/{howto => }/use_looper.md | 0 mkdocs.yml | 14 ++-- 12 files changed, 51 insertions(+), 49 deletions(-) rename docs/{howto/annotation_files.md => annotation.md} (56%) rename docs/{howto => }/configure_compute.md (100%) rename docs/{howto => }/container_reference.md (100%) rename docs/{howto => }/detailed_install.md (100%) rename docs/{howto => }/prealignments.md (100%) rename docs/{howto => }/run_cluster.md (100%) rename docs/{howto => }/run_direct.md (100%) rename docs/{howto => }/use_container.md (100%) rename docs/{howto => }/use_looper.md (100%) diff --git a/docs/howto/annotation_files.md b/docs/annotation.md similarity index 56% rename from docs/howto/annotation_files.md rename to docs/annotation.md index 8cf94de..74e0bc6 100644 --- a/docs/howto/annotation_files.md +++ b/docs/annotation.md @@ -1,22 +1,45 @@ -# Download or create annotation files for PEPPRO +# Annotation reference +This document outlines how we created the reference data, so you can recreate it if you need to. The easiest way to do this is use `refgenie build`. All you need to do is: -For each annotation type (TSS, CpA sites, premature mRNA, or general features), we provide [downloadable defaults](http://big.databio.org/peppro/) for common genomes. You may also recreate these yourself as described below. + +## Fasta file +You need a FASTA file for your genome. You can insert this file into refgenie like this: +``` +refgenie build -g GENOME -a fasta --fasta path/to/file.fa +``` + +## GTF file + +You also need an Ensembl GTF file (or equivalent) for your genome. You can insert this file into refgenie like this: + +``` +refgenie build -g GENOME -a ensembl_gtf --GTF path/to/file.gtf +``` + +## Other assets +Once you have those two assets installed, `refgenie` can automatically build all the remaining assets from them. Build the assets that are required like this: + +``` +refgenie build -g GENOME -a ensembl_gtf tss_annotation feat_annotation pi_tss pi_body +``` + +That's it! These assets will be automatically detected by PEPPRO if you build them like this with refgenie. If you want to know what we're doing, or customize these, more details follow: ### TSS -To calculate [TSS enrichments](../glossary.md), you will need a [TSS annotation file](http://big.databio.org/refgenomes/) in your reference genome directory. If a pre-built version for your genome of interest isn't present, you can quickly create that file yourself. In the reference genome directory, you can perform the following commands for in this example, `hg38`: +To calculate [TSS enrichments](../glossary.md), you will need a [TSS annotation file](http://big.databio.org/refgenomes/). We build these using these commands, in this example for `hg38`: ```console wget -O hg38_TSS_full.txt.gz http://hgdownload.soe.ucsc.edu/goldenPath/hg38/database/refGene.txt.gz \ zcat hg38_TSS_full.txt.gz | \ awk '{if($4=="+"){print $3"\t"$5"\t"$5"\t"$13"\t.\t"$4}else{print $3"\t"$6"\t"$6"\t"$13"\t.\t"$4}}' | \ LC_COLLATE=C sort -k1,1 -k2,2n -u > hg38_TSS.bed ``` -This asset (`tss_annotation`) needs to be [included in your `$REFGENIE` configuration file](annotation_files.md#example-peppro-refgenie-configuration-file) for the pipeline to detect it automatically. Alternatively, you can use the `--TSS-name` pipeline option to provide a path directly to this file. +You can pass the `--TSS-name` pipeline option to provide a path directly to this file. ### Pause index annotation (PI) -To calculate [pause indicies](../glossary.md), you will need two files in your reference genome directory: a [PI TSS annotation file](http://big.databio.org/refgenomes/) and a [PI gene body annotation file](http://big.databio.org/refgenomes/). If a pre-built version for your genome of interest isn't present, you can quickly create that file yourself. In the reference genome directory, you can perform the following commands for in this example, `hg38`: +To calculate [pause indicies](../glossary.md), you will need two files in your reference genome directory: a PI TSS annotation file and a PI gene body annotation file. Here are example commands for `hg38`: ```console wget ftp://ftp.ensembl.org/pub/release-97/gtf/homo_sapiens/Homo_sapiens.GRCh38.97.gtf.gz \ zcat Homo_sapiens.GRCh38.97.gtf.gz | \ @@ -42,11 +65,12 @@ zcat Homo_sapiens.GRCh38.97.gtf.gz | \ awk '$3>$2' | \ LC_COLLATE=C sort -k4 -u > hg38_PI_gene_body.bed ``` -These assets (`pi_tss` and `pi_body`) need to be [included in your `$REFGENIE` configuration file](annotation_files.md#example-peppro-refgenie-configuration-file) for the pipeline to detect it automatically. Alternatively, you can use the `--pi-tss` and `--pi-body` pipeline options to provide paths directly to each file. +You can use the `--pi-tss` and `--pi-body` pipeline options to provide paths directly to each file. ### mRNA contamination -To determine the amount of [mRNA contamination](../glossary.md), you will need two files in your reference genome directory: an [exon annotation file](http://big.databio.org/refgenomes/) and an [intron annotation file](http://big.databio.org/refgenomes/). If a pre-built version for your genome of interest isn't present, you can quickly create that file yourself. In the reference genome directory, you can perform the following commands for in this example, `hg38`: +To determine the amount of [mRNA contamination](../glossary.md), you will need two files in your reference genome directory: an [exon annotation file](http://big.databio.org/refgenomes/) and an [intron annotation file](http://big.databio.org/refgenomes/). Here are example commands for `hg38`: + ```console wget -O hg38_TSS_full.txt.gz http://hgdownload.soe.ucsc.edu/goldenPath/hg38/database/refGene.txt.gz \ zcat hg38_TSS_full.txt.gz | \ @@ -60,7 +84,7 @@ zcat hg38_TSS_full.txt.gz | \ awk -F"\t" '{ exonCount=int($9);split($10,exonStarts,"[,]"); split($11,exonEnds,"[,]"); for(i=1;i hg38_introns.bed ``` -These assets (`exon_annotation` and `intron_annotation`) need to be [included in your `$REFGENIE` configuration file](annotation_files.md#example-peppro-refgenie-configuration-file) for the pipeline to detect it automatically. Alternatively, you can use the `--exon-name` and `--intron-name` pipeline options to provide paths directly to each file. +You can use the `--exon-name` and `--intron-name` pipeline options to provide paths directly to each file. ### Premature mRNA @@ -71,11 +95,11 @@ zcat hg38_refGene.txt.gz | grep 'cmpl' | \ awk '{print $3"\t"$5"\t"$6"\t"$13"\t.\t"$4}' | \ LC_COLLATE=C sort -k1,1 -k2,2n -u > hg38_pre-mRNA.bed ``` -This asset (`pre_mRNA_annotation`) needs to be [included in your `$REFGENIE` configuration file](#Example_PEPPRO_REFGENIE_configuration_file) for the pipeline to detect it automatically. Alternatively, you can use the `--pre-name` pipeline option to provide a path directly to this file. +You can use the `--pre-name` pipeline option to provide a path directly to this file. ### Features -We also have [downloadable genome feature annotation files](http://big.databio.org/peppro/) for both `hg38` and `hg19` that you can use. These files annotate 3' and 5' UTR, Exons, Introns, Promoters, and Promoter Flanking Regions. If present in the corresponding reference genome folder and included as an asset (named `feat_annotation`) in your `$REFGENIE` configuration file you don't need to do anything else as the pipeline will look there automatically. Alternatively, you can use the `--anno-name` pipeline option to just directly point to this file. +We also have [downloadable genome feature annotation files](http://big.databio.org/peppro/) for both `hg38` and `hg19` that you can use. These files annotate 3' and 5' UTR, Exons, Introns, Promoters, and Promoter Flanking Regions. You can use the `--anno-name` pipeline option to directly point to this file. #### Create a custom feature annotation file @@ -104,33 +128,3 @@ Just like a standard `BED` file, the first three fields are: Column four is the **name** column, in our case the name of our feature of interest. The fifth column is the **score**, which would determine how darkly an item would be displayed in a genome browser if you chose to set that or if the information in your file of interest has ascribed a score to the features. The final, sixth, column is the **strand** column. After creating your `BED` file, you can point the pipeline to it using the `--anno-name` option followed with the path to your file. The pipeline will then use that file to determine the fractions of reads that cover those features. - -### Example `PEPPRO` `refgenie` configuration file - -As mentioned above, you can point the pipeline directly to your annotation files using the matching arguments. - -Alternatively, if they are all present in the corresponding reference genome folders, you can direct `refgenie` to detect them automatically. Here's an example of what a `refgenie` configuration file would look like: -```yaml -genome_folder: $GENOMES -genome_server: http://refgenomes.databio.org -genomes: - hg38: - bowtie2: - path: indexed_bowtie2 - chrom_sizes: - path: hg38.chrom.sizes - tss_annotation: - path: hg38_TSS.bed - pi_tss: - path: hg38_PI_TSS.bed - pi_body: - path: hg38_PI_gene_body.bed - pre_mRNA_annotation: - path: hg38_pre-mRNA.bed - feat_annotation: - path: hg38_annotations.bed.gz - exon_annotation: - path: hg38_exons.bed - intron_annotation: - path: hg38_introns.bed -``` \ No newline at end of file diff --git a/docs/howto/configure_compute.md b/docs/configure_compute.md similarity index 100% rename from docs/howto/configure_compute.md rename to docs/configure_compute.md diff --git a/docs/howto/container_reference.md b/docs/container_reference.md similarity index 100% rename from docs/howto/container_reference.md rename to docs/container_reference.md diff --git a/docs/howto/detailed_install.md b/docs/detailed_install.md similarity index 100% rename from docs/howto/detailed_install.md rename to docs/detailed_install.md diff --git a/docs/install.md b/docs/install.md index 93c8981..934183f 100644 --- a/docs/install.md +++ b/docs/install.md @@ -23,9 +23,17 @@ refgenie pull -g human_rDNA -a bowtie2_index refgenie pull -g rCRSd -a bowtie2_index ``` +PEPPRO also uses [refgenie](https://refgenie.databio.org) to manage a variety of annotation files for quality control plots. Downloading them is very easy: + +``` +refgenie pull -g hg38 -a ensembl_gtf tss_annotation feat_annotation pi_tss pi_body +``` +Replace `hg38` if you need to use a different genome assembly. If these assets are not available automatically for your genome of interest, then you'll need to [build them](annotation.md). + + ## 3: Install required software -If you don't want to install the prerequisite software used by PEPPRO, you can follow our tutorial on [running PEPPRO directly in a container](howto/use_container.md) and then skip this step. If you want to run it natively, you'll need to install the following: [samtools](http://www.htslib.org/), [bedtools](https://bedtools.readthedocs.io/en/latest/content/installation.html), [bowtie2](http://bowtie-bio.sourceforge.net/bowtie2/index.shtml), [seqkit](https://bioinf.shenwei.me/seqkit/), [fastp](https://github.com/OpenGene/fastp), [seqtk](https://github.com/lh3/seqtk), [preseq](http://smithlabresearch.org/software/preseq/), [fastq-pair](https://github.com/linsalrob/fastq-pair.git), [wigToBigWig](http://hgdownload.soe.ucsc.edu/admin/exe/), and [bigWigCat](http://hgdownload.soe.ucsc.edu/admin/exe/). +If you don't want to install the prerequisite software used by PEPPRO, you can follow our tutorial on [running PEPPRO directly in a container](use_container.md) and then skip this step. If you want to run it natively, you'll need to install the following: [samtools](http://www.htslib.org/), [bedtools](https://bedtools.readthedocs.io/en/latest/content/installation.html), [bowtie2](http://bowtie-bio.sourceforge.net/bowtie2/index.shtml), [seqkit](https://bioinf.shenwei.me/seqkit/), [fastp](https://github.com/OpenGene/fastp), [seqtk](https://github.com/lh3/seqtk), [preseq](http://smithlabresearch.org/software/preseq/), [fastq-pair](https://github.com/linsalrob/fastq-pair.git), [wigToBigWig](http://hgdownload.soe.ucsc.edu/admin/exe/), and [bigWigCat](http://hgdownload.soe.ucsc.edu/admin/exe/). ### Python packages diff --git a/docs/howto/prealignments.md b/docs/prealignments.md similarity index 100% rename from docs/howto/prealignments.md rename to docs/prealignments.md diff --git a/docs/howto/run_cluster.md b/docs/run_cluster.md similarity index 100% rename from docs/howto/run_cluster.md rename to docs/run_cluster.md diff --git a/docs/howto/run_direct.md b/docs/run_direct.md similarity index 100% rename from docs/howto/run_direct.md rename to docs/run_direct.md diff --git a/docs/tutorial.md b/docs/tutorial.md index 1423902..75ff7fb 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -1,6 +1,6 @@ # PEPPRO pipeline step-by-step guide -In this guide, we'll walk you through the step by step procedure of running a tutorial PRO-seq dataset through the pipeline. The output from this process is the same as you see in the [example PRO-seq output](browse_output.md) we've provided. To use this tutorial, you should have a basic familiarity with [working in a command line driven environment](http://matt.might.net/articles/basic-unix/). You also need to have already installed `PEPPRO` prerequisites, which you can do following the [detailed installation guide](howto/detailed_install.md). +In this guide, we'll walk you through the step by step procedure of running a tutorial PRO-seq dataset through the pipeline. The output from this process is the same as you see in the [example PRO-seq output](browse_output.md) we've provided. To use this tutorial, you should have a basic familiarity with [working in a command line driven environment](http://matt.might.net/articles/basic-unix/). You also need to have already installed `PEPPRO` prerequisites, which you can do following the [detailed installation guide](detailed_install.md). ## 1: Download tutorial read files diff --git a/docs/howto/use_container.md b/docs/use_container.md similarity index 100% rename from docs/howto/use_container.md rename to docs/use_container.md diff --git a/docs/howto/use_looper.md b/docs/use_looper.md similarity index 100% rename from docs/howto/use_looper.md rename to docs/use_looper.md diff --git a/mkdocs.yml b/mkdocs.yml index 9c7f255..4f06a45 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -18,16 +18,16 @@ nav: - Install and run: 'install.md' - Extended tutorial: 'tutorial.md' - How-to Guides: - - Annotation files: 'howto/annotation_files.md' - - Run PEPPRO directly: 'howto/run_direct.md' - - Run PEPPRO in containers: 'howto/use_container.md' - - Configuring prealignments: 'howto/prealignments.md' - - Configuring computing: 'howto/configure_compute.md' - - Detailed install guide: 'howto/detailed_install.md' + - Run PEPPRO directly: 'run_direct.md' + - Run PEPPRO in containers: 'use_container.md' + - Configuring prealignments: 'prealignments.md' + - Configuring computing: 'configure_compute.md' + - Detailed install guide: 'detailed_install.md' + - Annotation files: 'annotation.md' - Reference: - FAQ: 'faq.md' - Usage: 'usage.md' - - Advanced container reference: 'howto/container_reference.md' + - Advanced container reference: 'container_reference.md' - Changelog: 'changelog.md' - Support: 'https://github.com/databio/peppro/issues' - Example output file structure: 'browse_output.md' From d2e3cbf5fc13d4e8a810819ce6301c20fe25da44 Mon Sep 17 00:00:00 2001 From: nsheff Date: Tue, 30 Jul 2019 16:33:32 -0400 Subject: [PATCH 022/207] update docs --- docs/README.md | 14 ++-- docs/cluster.md | 37 ++++++++++ docs/configure_compute.md | 138 ------------------------------------ docs/container.md | 58 +++++++++++++++ docs/container_reference.md | 28 ++++---- docs/faq.md | 4 ++ docs/features.md | 4 +- docs/run_direct.md | 2 +- docs/use_container.md | 99 ++++++-------------------- mkdocs.yml | 5 +- 10 files changed, 146 insertions(+), 243 deletions(-) create mode 100644 docs/cluster.md delete mode 100644 docs/configure_compute.md create mode 100644 docs/container.md diff --git a/docs/README.md b/docs/README.md index 6f5b023..ded4840 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,19 +4,15 @@ [![PEP compatible](http://pepkit.github.io/img/PEP-compatible-green.svg)](http://pepkit.github.io) -`PEPPRO` is a pipeline designed to process PRO-seq data. It is optimized on unique features of PRO-seq to be fast and accurate. It performs variable-length UMI adapter removal, read deduplication, trimming, mapping, and signal tracks (bigWig) for plus and minus strands using mappability-scaled or unscaled read counts. +`PEPPRO` is a pipeline for PRO-seq nascent RNA sequencing data. It is optimized on unique features of PRO-seq to be fast and accurate. It performs variable-length UMI adapter removal, read deduplication, trimming, mapping, QC, and signal tracks (bigWig) for plus and minus strands using mappability-scaled or unscaled read counts. ## Outputs -`PEPPRO` produces quality control plots, summary statistics, and several data formats to set the stage for project-specific analysis. +`PEPPRO` produces quality control plots, statistics, and data formats to set the stage for project-specific analysis. We have produced an [interactive display of the output folder structure](browse_output/), which includes: -- PEPPRO produces an easily-navigable HTML report: [HTML summary report demo](files/examples/tutorial/tutorial_summary.html) -- We have produced an [interactive display of the output folder structure](browse_output/), which includes: - - [Easily parsable summary statistics file](files/examples/tutorial/results_pipeline/tutorial/stats.tsv) - - BigWig signal tracks (plus and minus stranded): - - nucleotide-resolution, exact RNA polymerase position signal - - smoothed signal - - nucleotide-resolution signal corrected for enzymatic sequence bias +- **HTML report**: an easily-navigable HTML report with pretty plots: [HTML summary report demo](files/examples/tutorial/tutorial_summary.html). +- **Stats**: An easily parsable stats file: [Summary statistics demo file](files/examples/tutorial/results_pipeline/tutorial/stats.tsv). +- **Processed data**: Several bigWig signal tracks (plus and minus stranded), including: smoothed signal; exact (nucleotide-resolution) RNA polymerase position signal; and nucleotide-resolution signal corrected for enzymatic sequence bias. ## User interface diff --git a/docs/cluster.md b/docs/cluster.md new file mode 100644 index 0000000..28b07e3 --- /dev/null +++ b/docs/cluster.md @@ -0,0 +1,37 @@ +# Running on a cluster + +## Default computing options + +When you run your PEPPRO project using `looper run`, by default it will simply run each sample locally. You can adjust the computing settings using the `--compute` argument to `looper run`. This enables you to adjust your computing preferences on-the-fly when you run a project. You have several built-in options to change this. Some common examples are these: + +- `--compute slurm`. Submit the jobs to a SLURM cluster using `sbatch`. +- `--compute sge`. Submit the jobs to a SGE cluster using `qsub`. +- `--compute docker`. Submit the jobs locally using the `databio/peppro` docker image. +- `--compute singularity`. Submit the jobs locally using the singularity image. +- `--compute singularity_slurm`. Submit jobs using `sbatch`, but run them using the singularity image. + +These available computing options are actually using a standardized computing system called [divvy](https://divvy.databio.org), and you can view a list of all your available options with this command: + +```console +divvy list +``` + +To show how this works, let's run the example project using the `slurm` compute package. Used `-d` for a dry run to create the submits scripts but not run them: + +``` +cd peppro +looper run examples/meta/peppro_test.yaml -d \ + --compute slurm +``` + +This will give us a script produced, which we can look at: + +``` +cat peppro_test/submission/peppro_test.sub +``` + +If all looks well, run looper without `-d` to actually submit the jobs. To use the docker or singularity options, see [running PEPPRO in containers](container.md). + +## Customizing compute options + +Divvy also allows you to very easily change these templates or add your own, so you can run PEPPRO in any possible computing environment. Changing these computing configuration options will work for any software that relies on `divvy`. For complete instructions, you should consult the [divvy documentation](https://divvy.databio.org). In a nutshell, you will first create a `divvy` computing configuration file and point an environment variable (`DIVCFG`) to that file. You then have access to any configured computing packages by using `looper --compute `, where `package` can be any computing system you configure. The instructions for changing these computing configuration options are universal for any software that relies on `divvy`. \ No newline at end of file diff --git a/docs/configure_compute.md b/docs/configure_compute.md deleted file mode 100644 index 15221c2..0000000 --- a/docs/configure_compute.md +++ /dev/null @@ -1,138 +0,0 @@ -# Configuring PEPPRO computing settings - -## Default computing options - -When you run your PEPPRO project using `looper run`, by default it will simply run each sample locally. You can adjust the computing settings using the `--compute` argument to `looper run`. This enables you to adjust your computing preferences on-the-fly when you run a project. You have several built-in options to change this. Some common examples are these: - -- `--compute slurm`. Submit the jobs to a SLURM cluster using `sbatch`. -- `--compute sge`. Submit the jobs to a SGE cluster using `sbatch`. -- `--compute docker`. Submit the jobs locally using the `databio/peppro` docker image. -- `--compute singularity`. Submit the jobs locally using the `peppro` singularity image. -- `--compute singularity_slurm`. Submit the jobs using `sbatch`, but then run them using the `peppro` singularity image. - -To use the docker or singularity options, you'll need to make sure you're [set up for using PEPPRO containers](use_container.md). These available computing options are actually using a standardized computing system called [divvy](https://divvy.databio.org), and you can view a list of all your available options with this command: - -```console -divvy list -``` - -## Customizing compute options - -Divvy also allows you to very easily change these templates or add your own, so you can run PEPPRO in any possible computing environment. Changing these computing configuration options will work for any software that relies on `divvy`. For complete instructions, you should consult the [divvy documentation](https://divvy.databio.org). In a nutshell, you will first create a `divvy` computing configuration file (compute_config.yaml) and point an environment variable (`DIVCFG`) to that file. You then have access to any configured computing packages by using `looper --compute `, where `package` can be any computing system you configure. - -The instructions for changing these computing configuration options are universal for any software that relies on `divvy`. For complete instructions, you should consult the [divvy documentation](https://divvy.databio.org). In a nutshell, you will first create a `divvy` computing configuration file (compute_config.yaml) and point an environment variable (`DIVCFG`) to that file. You then have access to any configured computing packages by using `looper --compute `, where `package` can be any computing system you configure. - -We have produced both docker and singularity containers that hold all the necessary software for `PEPPRO`. You can run `PEPPRO` as an individual pipeline on a single sample using these containers by directly calling `docker run` or `singularity exec`. Or, you can rely on `looper`, which is already set up to run any pipeline in existing containers using the `divvy` templating system. Instructions for both follow: - -## Setting up the container - -First, make sure your environment is set up to run either docker or singularity containers. Then, pull the container image (choose either docker or singularity). If your containers are set up correctly, then you won't need to install any additional software. - -### Docker - -You can pull the docker [databio/peppro image](https://hub.docker.com/r/databio/peppro/) from dockerhub like this: - -``` -docker pull databio/peppro -``` - -Or build the image using the included Dockerfile (you can use a recipe in the included Makefile): -``` -cd peppro/ -make docker -``` - -### Singularity - -You can [download the singularity image](http://big.databio.org/simages/peppro) or build it from the docker image using the Makefile: -``` -cd peppro/ -make singularity -``` - -Now you'll need to tell the pipeline where you saved the singularity image. You can either create an environment variable called `$SIMAGES` that points to the folder where your image is stored, or you can tweak the `pipeline_interface.yaml` file so that the `compute.singularity_image` attribute is pointing to the right location on disk. - -## Running individual samples in a container - -Individual jobs can be run in a container by simply running the `peppro.py` command through `docker run` or `singularity exec`. You can run containers either on your local computer, or in an HPC environment, as long as you have `docker` or `singularity` installed. For example, run it locally in singularity like this: -``` -singularity exec --bind $REFGENIE $SIMAGES/peppro pipelines/peppro.py --help -``` - -With `docker`, you can use: -``` -docker run --rm -it databio/peppro pipelines/peppro.py --help -``` - -### Container details - -#### Using `docker` - -The pipeline has been successfully run in both a Linux and MacOS environment. With `docker` you need to bind mount your volume that contains the pipeline and your `$REFGENIE` location, as well as provide the container the same environment variables your host environment is using. - -Be sure to mount the volumes you need with `--volume`. If you're using any environment variables (e.g. `$REFGENIE`), don't forget to include those in your docker command with the `-e` option. - -### Detailed example using `docker` - -In the first example, we're mounting our home user directory (`/home/jps3ag/`) which contains the parent directories to our `$REFGENIE` folder and to the pipeline itself. We'll also provide the pipeline two environment variables, `$REFGENIE` and `$HOME`. - -Here's that example command in a Linux environment to run the test example through the pipeline: -``` -docker run --rm -it --volume /home/jps3ag/:/home/jps3ag/ \ - -e REFGENIE='/home/jps3ag/genomes/genome_config.yaml' \ - -e HOME='/home/jps3ag/' \ - databio/peppro \ - /home/jps3ag/src/peppro/pipelines/peppro.py --single-or-paired single \ - --prealignments rCRSd human_repeats \ - --genome hg38 \ - --sample-name test1 \ - --input /home/jps3ag/src/peppro/examples/data/test_r1.fq.gz \ - -O $HOME/peppro_test -``` - -In this second example, we'll perform the same command in a Mac environment using [Docker for Mac](https://docs.docker.com/v17.12/docker-for-mac/install/). - -This necessitates a few minor changes to run that same example: - -- replace `/home/` with `/Users/` format -- e.g. `--volume /Users/jps3ag/:/Users/jps3ag/` - -Remember to [allocate sufficient memory](https://docs.docker.com/docker-for-mac/#advanced) (6-8GB should generally be more than adequate) in Docker for Mac. - -``` -docker run --rm -it --volume /Users/jps3ag/:/Users/jps3ag/ \ - -e REFGENIE="/Users/jps3ag/genomes/genome_config.yaml" \ - -e HOME="/Users/jps3ag/" \ - databio/peppro \ - /Users/jps3ag/src/peppro/pipelines/peppro.py --single-or-paired single \ - --prealignments rCRSd human_repeats \ - --genome hg38 \ - --sample-name test1 \ - --input /Users/jps3ag/src/peppro/examples/data/test_r1.fq.gz \ - -O $HOME/peppro_test -``` - -### Detailed example using `singularity` - -First, build a singularity container from the docker image and create a running instance (be sure to mount your directories containing your `$REFGENIE` configuration file, corresponding `refgenie` genomes, and the pipeline. -``` -singularity build peppro docker://databio/peppro:latest -singularity instance.start -B /home/jps3ag/:/home/jps3aq/ peppro peppro_instance -``` - -Second, run your command. -``` -singularity exec instance://peppro_instance \ - /home/jps3ag/src/peppro/pipelines/peppro.py --single-or-paired single \ - --prealignments rCRSd human_repeats \ - --genome hg38 \ - --sample-name test1 \ - --input /home/jps3ag/src/peppro/examples/data/test_r1.fq.gz \ - -O $HOME/peppro_test -``` - -Third, close your instance when finished. -``` -singularity instance.stop peppro_instance -``` - diff --git a/docs/container.md b/docs/container.md new file mode 100644 index 0000000..86af50b --- /dev/null +++ b/docs/container.md @@ -0,0 +1,58 @@ +# Run PEPPRO in a container + +We have produced both docker and singularity containers that hold all the necessary software for `PEPPRO`. If your containers are set up correctly, then you won't need to install any additional software. It's easy to run your jobs in a container by configuring `looper` to use a container-compatible template. Follow the instructions below for either `docker` or `singularity` as you wish: + +## Run PEPPRO using docker + +You can pull the docker [databio/peppro image](https://hub.docker.com/r/databio/peppro/) from dockerhub like this: + +``` +docker pull databio/peppro +``` + +Or build the image using the included Dockerfile (you can use a recipe in the included Makefile): +``` +cd peppro/ +make docker +``` + +Next, just add `--compute docker` to your `looper run` command: + +``` +cd peppro +looper run examples/meta/peppro_test.yaml --compute docker +``` + +## Run PEPPRO using singularity + +You can [download the singularity image](http://big.databio.org/simages/peppro) or build it from the docker image using the Makefile: +``` +cd peppro/ +make singularity +``` + +Now you'll need to tell the pipeline where you saved the singularity image. By default PEPPRO expects you to put your singularity image in a folder referred to with an environment variable called `$SIMAGES`: + +``` +export SIMAGES=path/to/singularity/folder/ +``` + +You could also tweak the `pipeline_interface.yaml` file so that the `compute.singularity_image` attribute is pointing to the right location on disk. Run it like this: + +``` +cd peppro +looper run examples/meta/peppro_test.yaml \ + --compute singularity +``` + +## Run PEPPRO using singularity with SLURM + +``` +cd peppro +looper run examples/meta/peppro_test.yaml \ + --compute singularity_slurm +``` + +## More details on containers + +The looper documentation has detailed instructions for [how to run pipelines in containers](http://looper.databio.org/en/latest/containers/). diff --git a/docs/container_reference.md b/docs/container_reference.md index ff7a1a3..e53b95b 100644 --- a/docs/container_reference.md +++ b/docs/container_reference.md @@ -1,27 +1,27 @@ # Running individual samples in a container -We have produced both docker and singularity containers that hold all the necessary software for `PEPPRO`. You can run `PEPPRO` as an individual pipeline on a single sample using these containers by directly calling `docker run` or `singularity exec`. Or, you can rely on `looper`, which is already set up to run any pipeline in existing containers using the `divvy` templating system. - -Individual jobs can be run in a container by simply running the `peppro.py` command through `docker run` or `singularity exec`. You can run containers either on your local computer, or in an HPC environment, as long as you have `docker` or `singularity` installed. For example, run it locally in singularity like this: +Individual jobs can be run in a container by simply running the `peppro.py` command through `docker run` or `singularity exec`. For example, run it locally in singularity like this: ``` -singularity exec --bind $GENOMES $SIMAGES/peppro pipelines/peppro.py --help +singularity exec --bind $REFGENIE $SIMAGES/peppro pipelines/peppro.py --help ``` With `docker`, you can use: ``` docker run --rm -it databio/peppro pipelines/peppro.py --help ``` -Be sure to mount the volumes you need with `--volume`. If you're using any environment variables (e.g. `$GENOMES`), don't forget to include those in your docker command with the `-e` option. +Be sure to mount the volumes you need with `--volume`. If you're utilizing any environment variables (e.g. `$REFGENIE`), don't forget to include those in your docker command with the `-e` option. + +### Container details -### Detailed example using `docker` -The pipeline has been successfully run in both a Linux and MacOS environment. With `docker` you need to bind mount your volume that contains the pipeline and your `$GENOMES` location, as well as provide the container the same environment variables your host environment is using. +#### Using `docker` +With `docker` you need to bind mount your volume that contains the pipeline and your `$REFGENIE` location, as well as provide the container the same environment variables your host environment is using. -In the first example, we're mounting our home user directory (`/home/jps3ag/`) which contains the parent directories to our `$GENOMES` folder and to the pipeline itself. We'll also provide the pipeline two environment variables, `$GENOMES` and `$HOME`. +In the first example, we're mounting our home user directory (`/home/jps3ag/`) which contains the parent directories to our `$REFGENIE` folder and to the pipeline itself. We'll also provide the pipeline two environment variables, `$REFGENIE` and `$HOME`. Here's that example command in a Linux environment to run the test example through the pipeline: ``` docker run --rm -it --volume /home/jps3ag/:/home/jps3ag/ \ - -e GENOMES='/home/jps3ag/genomes/' \ + -e REFGENIE='/home/jps3ag/genomes/genome_config.yaml' \ -e HOME='/home/jps3ag/' \ databio/peppro \ /home/jps3ag/src/peppro/pipelines/peppro.py --single-or-paired single \ @@ -43,7 +43,7 @@ Remember to [allocate sufficient memory](https://docs.docker.com/docker-for-mac/ ``` docker run --rm -it --volume /Users/jps3ag/:/Users/jps3ag/ \ - -e GENOMES="/Users/jps3ag/genomes" \ + -e REFGENIE="/Users/jps3ag/genomes/genome_config.yaml" \ -e HOME="/Users/jps3ag/" \ databio/peppro \ /Users/jps3ag/src/peppro/pipelines/peppro.py --single-or-paired single \ @@ -54,9 +54,9 @@ docker run --rm -it --volume /Users/jps3ag/:/Users/jps3ag/ \ -O $HOME/peppro_test ``` -### Detailed example using `singularity` +#### Using `singularity` -First, build a singularity container from the docker image and create a running instance (be sure to mount your directories containing your `$GENOMES` folder and pipeline. +First, build a singularity container from the docker image and create a running instance (be sure to mount your directories containing your `$REFGENIE` configuration file, corresponding `refgenie` genomes, and the pipeline. ``` singularity build peppro docker://databio/peppro:latest singularity instance.start -B /home/jps3ag/:/home/jps3aq/ peppro peppro_instance @@ -77,3 +77,7 @@ Third, close your instance when finished. ``` singularity instance.stop peppro_instance ``` + + + + diff --git a/docs/faq.md b/docs/faq.md index f5320fd..f2ed598 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -3,3 +3,7 @@ ## Do I have to use PEPPRO with looper? No. `PEPPRO` by itself does not specify any cluster resources, so you could just roll your own and submit individual jobs to a cluster however you choose. But because `PEPPRO` is already `looper`-compatible, the easier way is to use `looper's` built-in template system, which `looper` uses to build flexible shell scripts for job submission. These templates can be used to run jobs in a container, to submit to a cluster resource manager, or both. + +## Will PEPPRO run on a mac? + +The pipeline has been successfully run in both a Linux and MacOS environment. diff --git a/docs/features.md b/docs/features.md index 739407e..4e3fdc8 100644 --- a/docs/features.md +++ b/docs/features.md @@ -8,9 +8,9 @@ Here are a few of the highlights that make `PEPPRO` valuable. - **Flexibility.** The pipeline provides options for multiple peak callers, multiple adapter trimmers, and fully configurable parameterization for many underlying tools. - **Portability.** Run it using `docker` or `singularity` with no other prerequisites, or it can be run natively without containers. The choice is yours. - **Standardized user interface.** The pipeline reads sample metadata formatted in [standard PEP format](http://pepkit.github.io/), so you can use the same sample annotation sheets for your downstream R or python analysis using tools from [pepkit](http://pepkit.github.io/). -- **Standardized reference genome assembly.** The pipeline uses standard reference genome assemblies produced by [`refgenie`](http://refgenie.databio.org)], which provides a scripted way to produce a compatible reference assembly for any custom genome. For common genomes, you can either download pre-indexed assemblies or build your own. +- **Standardized reference genome assembly.** The pipeline uses standard reference genome assemblies produced by [refgenie](http://refgenie.databio.org), which provides a scripted way to produce a compatible reference assembly for any custom genome. For common genomes, you can either download pre-indexed assemblies or build your own. - **Prealignments.** The pipeline can (optionally) first align to any number of reference assemblies separately before the primary genome alignment. This increases both speed and accuracy and can be used, for example, to align sequentially to mtDNA, repeats, or spike-ins. - **Fraction of reads in pre-mature mRNA and features (FRiP/FRiF).** By default, the pipeline will calculate the FRiP using annotated pre-mature mRNA. The pipeline will also calculate the fraction of reads in known annotated features if using a common reference genome and may be customized to use any feature set. - **TSS enrichments, Fragment length distributions and more.** The pipeline produces various nice QC plots. -- **Beautiful `HTML` reports.** Your results include an easy-to-navigate `HTML` report with a sample table, job status, summary statistics, and QC plots at your fingertips when run using our [pipeline submission engine, `looper`](https://looper.databio.org). +- **Beautiful `HTML` reports.** Your results include an easy-to-navigate `HTML` report with a sample table, job status, summary statistics, and QC plots at your fingertips when run using our [pipeline submission engine, looper](https://looper.databio.org). diff --git a/docs/run_direct.md b/docs/run_direct.md index c198a75..22a3eb0 100644 --- a/docs/run_direct.md +++ b/docs/run_direct.md @@ -1,6 +1,6 @@ # Running the pipeline script directly -The pipeline at its core is just a python script, and you can run it on the command line for a single sample (see [command-line usage](usage)), which you can also get on the command line by running `pipelines/peppro.py --help`. You just need to pass a few command-line parameters to specify sample name, reference genome, input files, etc. Here's the basic command to run the included small test example through the pipeline: +It's easiest to run PEPPRO using `looper`, as described in the [install](install.md) and [tutorial](tutorial.md) guides. This greatly simplifies the process of running the pipeline across many sampels in a project. But really, the pipeline at its core is just a python script, and you can run it on the command line for a single sample (see [command-line usage](usage.md) by running `pipelines/peppro.py --help`). You just need to pass a few command-line parameters to specify sample name, reference genome, input files, etc. Here's the basic command to run the included small test example through the pipeline: ```console cd peppro diff --git a/docs/use_container.md b/docs/use_container.md index a29d690..86af50b 100644 --- a/docs/use_container.md +++ b/docs/use_container.md @@ -1,8 +1,8 @@ # Run PEPPRO in a container -First, make sure your environment is set up to run either docker or singularity containers. Then, pull the container image (choose either docker or singularity). If your containers are set up correctly, then you won't need to install any additional software. +We have produced both docker and singularity containers that hold all the necessary software for `PEPPRO`. If your containers are set up correctly, then you won't need to install any additional software. It's easy to run your jobs in a container by configuring `looper` to use a container-compatible template. Follow the instructions below for either `docker` or `singularity` as you wish: -### Docker +## Run PEPPRO using docker You can pull the docker [databio/peppro image](https://hub.docker.com/r/databio/peppro/) from dockerhub like this: @@ -16,100 +16,43 @@ cd peppro/ make docker ``` -### Singularity +Next, just add `--compute docker` to your `looper run` command: -You can [download the singularity image](http://big.databio.org/simages/peppro) or build it from the docker image using the Makefile: -``` -cd peppro/ -make singularity -``` - -Now you'll need to tell the pipeline where you saved the singularity image. You can either create an environment variable called `$SIMAGES` that points to the folder where your image is stored, or you can tweak the `pipeline_interface.yaml` file so that the `compute.singularity_image` attribute is pointing to the right location on disk. - -You can now use the containerized [compute packages](configure_compute.md), *e.g.*, `looper run --compute docker` or `looper run --compute singularity`. - -If your containers are set up correctly, then won't need to install any additional software. - -## Running individual samples in a container - -Individual jobs can be run in a container by simply running the `peppro.py` command through `docker run` or `singularity exec`. You can run containers either on your local computer, or in an HPC environment, as long as you have `docker` or `singularity` installed. For example, run it locally in singularity like this: ``` -singularity exec --bind $REFGENIE $SIMAGES/peppro pipelines/peppro.py --help +cd peppro +looper run examples/meta/peppro_test.yaml --compute docker ``` -With `docker`, you can use: -``` -docker run --rm -it databio/peppro pipelines/peppro.py --help -``` -Be sure to mount the volumes you need with `--volume`. If you're utilizing any environment variables (e.g. `$REFGENIE`), don't forget to include those in your docker command with the `-e` option. +## Run PEPPRO using singularity -### Container details - -#### Using `docker` -The pipeline has been successfully run in both a Linux and MacOS environment. With `docker` you need to bind mount your volume that contains the pipeline and your `$REFGENIE` location, as well as provide the container the same environment variables your host environment is using. - -In the first example, we're mounting our home user directory (`/home/jps3ag/`) which contains the parent directories to our `$REFGENIE` folder and to the pipeline itself. We'll also provide the pipeline two environment variables, `$REFGENIE` and `$HOME`. - -Here's that example command in a Linux environment to run the test example through the pipeline: +You can [download the singularity image](http://big.databio.org/simages/peppro) or build it from the docker image using the Makefile: ``` -docker run --rm -it --volume /home/jps3ag/:/home/jps3ag/ \ - -e REFGENIE='/home/jps3ag/genomes/genome_config.yaml' \ - -e HOME='/home/jps3ag/' \ - databio/peppro \ - /home/jps3ag/src/peppro/pipelines/peppro.py --single-or-paired single \ - --prealignments rCRSd human_repeats \ - --genome hg38 \ - --sample-name test1 \ - --input /home/jps3ag/src/peppro/examples/data/test_r1.fq.gz \ - -O $HOME/peppro_test +cd peppro/ +make singularity ``` -In this second example, we'll perform the same command in a Mac environment using [Docker for Mac](https://docs.docker.com/v17.12/docker-for-mac/install/). - -This necessitates a few minor changes to run that same example: - -- replace `/home/` with `/Users/` format -- e.g. `--volume /Users/jps3ag/:/Users/jps3ag/` - -Remember to [allocate sufficient memory](https://docs.docker.com/docker-for-mac/#advanced) (6-8GB should generally be more than adequate) in Docker for Mac. +Now you'll need to tell the pipeline where you saved the singularity image. By default PEPPRO expects you to put your singularity image in a folder referred to with an environment variable called `$SIMAGES`: ``` -docker run --rm -it --volume /Users/jps3ag/:/Users/jps3ag/ \ - -e REFGENIE="/Users/jps3ag/genomes/genome_config.yaml" \ - -e HOME="/Users/jps3ag/" \ - databio/peppro \ - /Users/jps3ag/src/peppro/pipelines/peppro.py --single-or-paired single \ - --prealignments rCRSd human_repeats \ - --genome hg38 \ - --sample-name test1 \ - --input /Users/jps3ag/src/peppro/examples/data/test_r1.fq.gz \ - -O $HOME/peppro_test +export SIMAGES=path/to/singularity/folder/ ``` -#### Using `singularity` +You could also tweak the `pipeline_interface.yaml` file so that the `compute.singularity_image` attribute is pointing to the right location on disk. Run it like this: -First, build a singularity container from the docker image and create a running instance (be sure to mount your directories containing your `$REFGENIE` configuration file, corresponding `refgenie` genomes, and the pipeline. ``` -singularity build peppro docker://databio/peppro:latest -singularity instance.start -B /home/jps3ag/:/home/jps3aq/ peppro peppro_instance +cd peppro +looper run examples/meta/peppro_test.yaml \ + --compute singularity ``` -Second, run your command. -``` -singularity exec instance://peppro_instance \ - /home/jps3ag/src/peppro/pipelines/peppro.py --single-or-paired single \ - --prealignments rCRSd human_repeats \ - --genome hg38 \ - --sample-name test1 \ - --input /home/jps3ag/src/peppro/examples/data/test_r1.fq.gz \ - -O $HOME/peppro_test -``` +## Run PEPPRO using singularity with SLURM -Third, close your instance when finished. ``` -singularity instance.stop peppro_instance +cd peppro +looper run examples/meta/peppro_test.yaml \ + --compute singularity_slurm ``` -## Running multiple samples in a container with looper +## More details on containers -To run multiple samples in a container, you simply need to configure `looper` to use a container-compatible template. The looper documentation has detailed instructions for [how to run pipelines in containers](http://code.databio.org/looper/containers/). +The looper documentation has detailed instructions for [how to run pipelines in containers](http://looper.databio.org/en/latest/containers/). diff --git a/mkdocs.yml b/mkdocs.yml index 4f06a45..67a87d8 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -19,15 +19,14 @@ nav: - Extended tutorial: 'tutorial.md' - How-to Guides: - Run PEPPRO directly: 'run_direct.md' - - Run PEPPRO in containers: 'use_container.md' + - Run PEPPRO on a cluster: 'cluster.md' + - Run PEPPRO in containers: 'container.md' - Configuring prealignments: 'prealignments.md' - - Configuring computing: 'configure_compute.md' - Detailed install guide: 'detailed_install.md' - Annotation files: 'annotation.md' - Reference: - FAQ: 'faq.md' - Usage: 'usage.md' - - Advanced container reference: 'container_reference.md' - Changelog: 'changelog.md' - Support: 'https://github.com/databio/peppro/issues' - Example output file structure: 'browse_output.md' From 554d57b52461ed411485796a26413062f0b0a852 Mon Sep 17 00:00:00 2001 From: nsheff Date: Tue, 30 Jul 2019 20:20:26 -0400 Subject: [PATCH 023/207] docs work --- docs/cluster.md | 12 +++----- docs/container.md | 5 +++- docs/detailed_install.md | 59 ++++++++++++++-------------------------- 3 files changed, 28 insertions(+), 48 deletions(-) diff --git a/docs/cluster.md b/docs/cluster.md index 28b07e3..1c0d4f1 100644 --- a/docs/cluster.md +++ b/docs/cluster.md @@ -2,7 +2,7 @@ ## Default computing options -When you run your PEPPRO project using `looper run`, by default it will simply run each sample locally. You can adjust the computing settings using the `--compute` argument to `looper run`. This enables you to adjust your computing preferences on-the-fly when you run a project. You have several built-in options to change this. Some common examples are these: +When you run your PEPPRO project using `looper run`, by default it will simply run each sample locally. You can adjust the computing settings using the `--compute` argument to `looper run`. This enables you to adjust your computing preferences on-the-fly when you run a project. You have several built-in options to change this. You can view a list of all your available options by typing `divvy list`. Here are some of them: - `--compute slurm`. Submit the jobs to a SLURM cluster using `sbatch`. - `--compute sge`. Submit the jobs to a SGE cluster using `qsub`. @@ -10,12 +10,6 @@ When you run your PEPPRO project using `looper run`, by default it will simply r - `--compute singularity`. Submit the jobs locally using the singularity image. - `--compute singularity_slurm`. Submit jobs using `sbatch`, but run them using the singularity image. -These available computing options are actually using a standardized computing system called [divvy](https://divvy.databio.org), and you can view a list of all your available options with this command: - -```console -divvy list -``` - To show how this works, let's run the example project using the `slurm` compute package. Used `-d` for a dry run to create the submits scripts but not run them: ``` @@ -34,4 +28,6 @@ If all looks well, run looper without `-d` to actually submit the jobs. To use t ## Customizing compute options -Divvy also allows you to very easily change these templates or add your own, so you can run PEPPRO in any possible computing environment. Changing these computing configuration options will work for any software that relies on `divvy`. For complete instructions, you should consult the [divvy documentation](https://divvy.databio.org). In a nutshell, you will first create a `divvy` computing configuration file and point an environment variable (`DIVCFG`) to that file. You then have access to any configured computing packages by using `looper --compute `, where `package` can be any computing system you configure. The instructions for changing these computing configuration options are universal for any software that relies on `divvy`. \ No newline at end of file +These available computing options are actually using a standardized computing system called [divvy](https://divvy.databio.org). In addition to these built-in options, Divvy allows you to very easily change templates or add your own, so you can run PEPPRO in any possible computing environment. You first create a `divvy` computing configuration file and point an environment variable (`DIVCFG`) to that file. You then have access to any configured computing packages by using `looper --compute `, where `package` can be anything you configure. The instructions for changing these computing configuration options are universal for any software that relies on `divvy`. + +For complete instructions, read [how to configure divvy](https://divvy.databio.org/en/latest/configuration/). diff --git a/docs/container.md b/docs/container.md index 86af50b..47220f0 100644 --- a/docs/container.md +++ b/docs/container.md @@ -55,4 +55,7 @@ looper run examples/meta/peppro_test.yaml \ ## More details on containers -The looper documentation has detailed instructions for [how to run pipelines in containers](http://looper.databio.org/en/latest/containers/). +You may need to adjust the built-in templates to fit with how you run docker or singularity in your environment. For example, you'll need to make sure to mount any filesystems you need. To do this pretty easy, you will just need to tweak the default templates to fit your environment. Here are some resources to get you started: + +- [Divvy documentation on container templates](http://divvy.databio.org/en/latest/containers/) +- Looper documentation detailed instructions for [how to run pipelines in containers](http://looper.databio.org/en/latest/containers/). diff --git a/docs/detailed_install.md b/docs/detailed_install.md index 6cad101..171d12d 100644 --- a/docs/detailed_install.md +++ b/docs/detailed_install.md @@ -4,18 +4,9 @@ This guide walks you through the minutiae of how to install each prerequisite co ## 1: Clone the `PEPPRO` pipeline -To begin, we need to get the `PEPPRO` pipeline itself. The pipeline is hosted on [github](https://github.com/databio/peppro). If you don't have git installed, follow the [git installation instructions](https://git-scm.com/download/linux), and here is a [brief introduction to git](https://guides.github.com/introduction/git-handbook/). To install `PEPPRO`, you can use one of the following methods: +To begin, we need to get the `PEPPRO` pipeline itself. The pipeline is hosted on [github](https://github.com/databio/peppro). If you don't have git installed, follow the [git installation instructions](https://git-scm.com/download/linux), and here is a [brief introduction to git](https://guides.github.com/introduction/git-handbook/). -* using SSH: -``` -git clone git@github.com:databio/peppro.git -``` -* using HTTPS: -``` -git clone https://github.com/databio/peppro.git -``` - -We'll use HTTPS in this example. From an open terminal, let's first create a directory we'll use to run through this guide: +From an open terminal, let's first create a directory we'll use to run through this guide: ```console mkdir peppro_tutorial ``` @@ -35,11 +26,11 @@ Time to get PEPPRO! ``` git clone https://github.com/databio/peppro.git ``` -Success! If you had any issues, feel free to [reach out to us with questions](https://github.com/databio/peppro/issues). Otherwise, let's move on to installing additional software. +(You could instead use SSH instead of HTTPS with `git clone git@github.com:databio/peppro.git`). Success! If you had any issues, feel free to [reach out to us with questions](https://github.com/databio/peppro/issues). Otherwise, let's move on to installing additional software. ## 2: Install required software -You have two options for installing the software prerequisites: 1) use a container, in which case you need only either `docker` or `singularity`; or 2) install all prerequisites natively. We'll install everything natively in this guide. +You have two options for installing the software prerequisites: 1) use a container, in which case you need only either `docker` or `singularity`; or 2) install all prerequisites natively. We'll install everything natively in this guide. If you want to try the container approach, read [PEPPRO in containers](container.md). To use `PEPPRO`, we need the following software: **Python packages**. The pipeline uses [`pypiper`](http://pypiper.readthedocs.io/en/latest/) to run a single sample, [`looper`](http://looper.readthedocs.io/en/latest/) to handle multi-sample projects (for either local or cluster computation), [`pararead`](https://github.com/databio/pararead) for parallel processing sequence reads, [`refgenie`](http://refgenie.databio.org/en/latest/) to organize and build reference assemblies, [`cutadapt`](https://cutadapt.readthedocs.io/) to remove adapters for single-end data or optionally for paired-end, and the common `python` libraries [`numpy`](https://www.numpy.org/) and [`pandas`](https://pandas.pydata.org/). You can do a user-specific install using the included requirements.txt file in the pipeline directory: @@ -191,7 +182,7 @@ Add our `tools/` directory to our `PATH` environment variable. ``` export PATH="$PATH:/path/to/peppro_tutorial/tools/" ``` -That should do it! Now we'll [install some **optional** packages](../tutorial.md#install-optional-software). Of course, these are not required, but for the purposes of this tutorial we're going to be completionists. +That should do it! Now we'll install some **optional** packages. Of course, these are not required, but for the purposes of this tutorial we're going to be completionists. ### Optional software @@ -239,39 +230,29 @@ Fantastic! Now that we have the pipeline and its requirements installed, we're r ## 3: Download a reference genome -Before we analyze anything, we also need a reference genome. `PEPPRO` uses `refgenie` genomes. For the purposes of this tutorial, we'll just download pre-built genomes. Follow the `'refgenie` instructions if you'd like to [build your own reference genome](https://github.com/databio/refgenie). First, let's change into our `genomes/` folder. -``` -cd /path/to/peppro_tutorial/genomes/ -wget http://big.databio.org/refgenomes/hg38.tgz -wget http://cloud.databio.org.s3.amazonaws.com/refgenomes/human_repeats_170502.tgz -wget http://cloud.databio.org.s3.amazonaws.com/refgenomes/rCRSd_170502.tgz -tar xvfz hg38.tgz -tar xvfz human_repeats_170502.tgz -tar xvfz rCRSd_170502.tgz -rm hg38.tgz -rm human_repeats_170502.tgz -rm rCRSd_170502.tgz -``` -## 4: Point the pipeline to your Refgenie assemblies +PEPPRO uses [`refgenie`](http://refgenie.databio.org/) assets for alignment. If you haven't already, initialize a refgenie config file like this: -Let's also create another environment variable that points to our genomes. -``` -export GENOMES="/path/to/peppro_tutorial/genomes/ +```console +pip install --user refgenie +export REFGENIE=your_genome_folder/genome_config.yaml +refgenie init -c $REFGENIE ``` -(Don't forget to add this to your `.bashrc` or `.profile` to ensure it persists). +Add the `export REFGENIE` line to your `.bashrc` or `.profile` to ensure it persists. Then, pull the assets you need. By default, that's these for human: + +```console +refgenie pull -g hg38 -a bowtie2_index +refgenie pull -g human_rDNA -a bowtie2_index +refgenie pull -g rCRSd -a bowtie2_index +``` -## 5: Download or create annotation files +PEPPRO also uses [refgenie](https://refgenie.databio.org) to manage a variety of annotation files for quality control plots. Downloading them is very easy: -To calculate TSS enrichments, you will need a [TSS annotation file](http://big.databio.org/refgenomes/) in your reference genome directory. If a pre-built version for your genome of interest isn't present, you can quickly create that file yourself. In the reference genome directory, you can perform the following commands for in this example, `hg38`: ``` -wget -O hg38_TSS_full.txt.gz http://hgdownload.soe.ucsc.edu/goldenPath/hg38/database/refGene.txt.gz \ -zcat hg38_TSS_full.txt.gz | \ - awk '{if($4=="+"){print $3"\t"$5"\t"$5"\t"$4"\t"$13}else{print $3"\t"$6"\t"$6"\t"$4"\t"$13}}' | \ - LC_COLLATE=C sort -k1,1 -k2,2n -u > hg38_TSS.tsv +refgenie pull -g hg38 -a ensembl_gtf tss_annotation feat_annotation pi_tss pi_body ``` +Replace `hg38` if you need to use a different genome assembly. If these assets are not available automatically for your genome of interest, then you'll need to [build them](annotation.md). -We also have [downloadable pre-built genome annotation files](http://big.databio.org/peppro/) for `hg38`, `hg19`, `mm10`, and `mm9` that you can use to annotate the reads and peaks. These files annotate 3' and 5' UTR, Exonic, Intronic, Intergenic, Promoter, and Promoter Flanking Regions of the corresponding genome as indicated in Ensembl or UCSC. Simply move the corresponding genome annotation file into the `peppro/anno` folder. Once present in the `peppro/anno` folder you don't need to do anything else as the pipeline will look there automatically. Alternatively, you can use the `--anno-name` pipeline option to directly point to this file when running. You can also [learn how to create a custom annotation file](annotation_files.md) to calculate coverage using your own features of interest. Alright! Time to setup the pipeline configuration files and run our sample. From f8b9132c718db9bd39d7d677b1f9c577f347df12 Mon Sep 17 00:00:00 2001 From: nsheff Date: Tue, 30 Jul 2019 20:45:12 -0400 Subject: [PATCH 024/207] docs updates --- docs/container.md | 2 +- docs/detailed_install.md | 74 ++-------------------------------------- docs/install.md | 7 ++-- docs/tutorial.md | 43 ++++++++++++++++++++--- docs/use_container.md | 58 ------------------------------- 5 files changed, 44 insertions(+), 140 deletions(-) delete mode 100644 docs/use_container.md diff --git a/docs/container.md b/docs/container.md index 47220f0..e422cbd 100644 --- a/docs/container.md +++ b/docs/container.md @@ -1,4 +1,4 @@ -# Run PEPPRO in a container +# Running in a container We have produced both docker and singularity containers that hold all the necessary software for `PEPPRO`. If your containers are set up correctly, then you won't need to install any additional software. It's easy to run your jobs in a container by configuring `looper` to use a container-compatible template. Follow the instructions below for either `docker` or `singularity` as you wish: diff --git a/docs/detailed_install.md b/docs/detailed_install.md index 171d12d..b9c29bf 100644 --- a/docs/detailed_install.md +++ b/docs/detailed_install.md @@ -2,33 +2,7 @@ This guide walks you through the minutiae of how to install each prerequisite component. We'll presume you're installing this in a Linux environment. If not the case, you'll need to go to each tool's respective site to find alternative installation approaches and options. -## 1: Clone the `PEPPRO` pipeline - -To begin, we need to get the `PEPPRO` pipeline itself. The pipeline is hosted on [github](https://github.com/databio/peppro). If you don't have git installed, follow the [git installation instructions](https://git-scm.com/download/linux), and here is a [brief introduction to git](https://guides.github.com/introduction/git-handbook/). - -From an open terminal, let's first create a directory we'll use to run through this guide: -```console -mkdir peppro_tutorial -``` - -Let's move into our newly created directory and create a few more folders that we'll use later. -```console -cd peppro_tutorial/ -mkdir data -mkdir genomes -mkdir processed -mkdir templates -mkdir tools -cd tools/ -``` - -Time to get PEPPRO! -``` -git clone https://github.com/databio/peppro.git -``` -(You could instead use SSH instead of HTTPS with `git clone git@github.com:databio/peppro.git`). Success! If you had any issues, feel free to [reach out to us with questions](https://github.com/databio/peppro/issues). Otherwise, let's move on to installing additional software. - -## 2: Install required software +## Install required software You have two options for installing the software prerequisites: 1) use a container, in which case you need only either `docker` or `singularity`; or 2) install all prerequisites natively. We'll install everything natively in this guide. If you want to try the container approach, read [PEPPRO in containers](container.md). @@ -211,48 +185,4 @@ Don't forget to add this to your `PATH` too! ``` export PATH="$PATH:/path/to/peppro_tutorial/tools/pigz-2.4/" ``` -That's it! Everything we need to run `PEPPRO` to its full potential should be installed. If you are interested and have experience using containers, you can check out the [alternate installation methods](../install.md#121-use-containers). - -### Create environment variables - -We also need to create some environment variables to help point `looper` to where we keep our data files and our tools. You may either set the environment variables up, like we're going to do now, or you may simply hard code the necessary locations in our configuration files. -First, let's create a `PROCESSED` variable that represents the location where we want to save output. -``` -export PROCESSED="/path/to/peppro_tutorial/processed/" -``` -Second, we'll create a variable representing the root path to all our tools named `CODEBASE`. -``` -export CODEBASE="/path/to/peppro_tutorial/tools/" -``` -(Add these environment variables to your `.bashrc` or `.profile` so you don't have to always do this step). -Fantastic! Now that we have the pipeline and its requirements installed, we're ready to get our reference genome(s). - - -## 3: Download a reference genome - - -PEPPRO uses [`refgenie`](http://refgenie.databio.org/) assets for alignment. If you haven't already, initialize a refgenie config file like this: - -```console -pip install --user refgenie -export REFGENIE=your_genome_folder/genome_config.yaml -refgenie init -c $REFGENIE -``` - -Add the `export REFGENIE` line to your `.bashrc` or `.profile` to ensure it persists. Then, pull the assets you need. By default, that's these for human: - -```console -refgenie pull -g hg38 -a bowtie2_index -refgenie pull -g human_rDNA -a bowtie2_index -refgenie pull -g rCRSd -a bowtie2_index -``` - -PEPPRO also uses [refgenie](https://refgenie.databio.org) to manage a variety of annotation files for quality control plots. Downloading them is very easy: - -``` -refgenie pull -g hg38 -a ensembl_gtf tss_annotation feat_annotation pi_tss pi_body -``` -Replace `hg38` if you need to use a different genome assembly. If these assets are not available automatically for your genome of interest, then you'll need to [build them](annotation.md). - - -Alright! Time to setup the pipeline configuration files and run our sample. +That's it! Everything we need to run `PEPPRO` to its full potential should be installed. \ No newline at end of file diff --git a/docs/install.md b/docs/install.md index 934183f..02286e3 100644 --- a/docs/install.md +++ b/docs/install.md @@ -1,4 +1,4 @@ -# Install and run PEPPRO +# Install and run PEPPRO ## 1: Clone the `PEPPRO` pipeline @@ -33,8 +33,7 @@ Replace `hg38` if you need to use a different genome assembly. If these assets a ## 3: Install required software -If you don't want to install the prerequisite software used by PEPPRO, you can follow our tutorial on [running PEPPRO directly in a container](use_container.md) and then skip this step. If you want to run it natively, you'll need to install the following: [samtools](http://www.htslib.org/), [bedtools](https://bedtools.readthedocs.io/en/latest/content/installation.html), [bowtie2](http://bowtie-bio.sourceforge.net/bowtie2/index.shtml), [seqkit](https://bioinf.shenwei.me/seqkit/), [fastp](https://github.com/OpenGene/fastp), [seqtk](https://github.com/lh3/seqtk), [preseq](http://smithlabresearch.org/software/preseq/), [fastq-pair](https://github.com/linsalrob/fastq-pair.git), [wigToBigWig](http://hgdownload.soe.ucsc.edu/admin/exe/), and [bigWigCat](http://hgdownload.soe.ucsc.edu/admin/exe/). - +If you don't want to install the prerequisite software used by PEPPRO, you can follow our tutorial on [running PEPPRO directly in a container](container.md) and then skip this step. If you want to run it natively, you'll need to install the following: [samtools](http://www.htslib.org/), [bedtools](https://bedtools.readthedocs.io/en/latest/content/installation.html), [bowtie2](http://bowtie-bio.sourceforge.net/bowtie2/index.shtml), [seqkit](https://bioinf.shenwei.me/seqkit/), [fastp](https://github.com/OpenGene/fastp), [seqtk](https://github.com/lh3/seqtk), [preseq](http://smithlabresearch.org/software/preseq/), [fastq-pair](https://github.com/linsalrob/fastq-pair.git), [wigToBigWig](http://hgdownload.soe.ucsc.edu/admin/exe/), and [bigWigCat](http://hgdownload.soe.ucsc.edu/admin/exe/). If you need help, we have [detailed installation instructions](detailed_install.md) for installing these. ### Python packages @@ -112,4 +111,4 @@ The sample annotation file must specify these columns: ## Next steps -This is just the beginning. For your next step, take a look at one of other detailed user guide links in the side menu. +This is just the beginning. For your next step, the [extended tutorial](tutorial.md) will walk you through a real project. Or, take a look at one of other detailed user guide links in the side menu. diff --git a/docs/tutorial.md b/docs/tutorial.md index 75ff7fb..614a90a 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -1,8 +1,26 @@ # PEPPRO pipeline step-by-step guide -In this guide, we'll walk you through the step by step procedure of running a tutorial PRO-seq dataset through the pipeline. The output from this process is the same as you see in the [example PRO-seq output](browse_output.md) we've provided. To use this tutorial, you should have a basic familiarity with [working in a command line driven environment](http://matt.might.net/articles/basic-unix/). You also need to have already installed `PEPPRO` prerequisites, which you can do following the [detailed installation guide](detailed_install.md). +In this guide, we'll walk you through the step by step procedure of running a tutorial PRO-seq dataset through the pipeline. The output from this process is the same as you see in the [example PRO-seq output](browse_output.md) we've provided. To use this tutorial, you should have a basic familiarity with [working in a command line driven environment](http://matt.might.net/articles/basic-unix/). You also need to have already installed `PEPPRO` prerequisites, which you can do following the [basic installation instructions](install.md). -## 1: Download tutorial read files +## 1: Set up folders + +From an open terminal, let's first create a directory we'll use to run through this guide: +```console +mkdir peppro_tutorial +``` + +Let's move into our newly created directory and create a few more folders that we'll use later. +```console +cd peppro_tutorial/ +mkdir data +mkdir genomes +mkdir processed +mkdir templates +mkdir tools +cd tools/ +``` + +## 2: Download tutorial read files We're going to work with some files a little larger than the test data included in the pipeline so we can see all the features included in a full run of the pipeline. Go ahead and download the [tutorial_r1.fastq.gz](http://big.databio.org/peppro/tutorial_r1.fq.gz) and [tutorial_r2.fq.gz](http://big.databio.org/peppro/tutorial_r2.fastq.gz) files. ```console @@ -16,7 +34,7 @@ mv tutorial_r1.fq.gz peppro/examples/data/ mv tutorial_r2.fq.gz peppro/examples/data/ ``` -## 2: Configure project files +## 3: Configure project files We're going to use `looper` to analyze our data. For that, we need to pass looper a configuration file. This project config file describes your project. See [`looper` docs](https://looper.readthedocs.io/en/latest/) for details. A configuration file has been provided for you in the pipeline itself, conveniently named `tutorial.yaml`. This configuration file also points to our sample. In this case, we've provided a sample for you with the pipeline. You don't have to do anything else at this point and may [skip right to running the sample if you'd like](tutorial.md#3-using-looper-to-run-the-pipeline). Otherwise, we'll briefly touch on what those configuration files look like. @@ -55,7 +73,21 @@ tutorial,human,PROSEQ,paired,R1,R2 That's it! Let's analyze that sample! -## 3: Using `looper` to run the pipeline +## 4: Create environment variables + +We also need to create some environment variables to help point `looper` to where we keep our data files and our tools. You may either set the environment variables up, like we're going to do now, or you may simply hard code the necessary locations in our configuration files. +First, let's create a `PROCESSED` variable that represents the location where we want to save output. +``` +export PROCESSED="/path/to/peppro_tutorial/processed/" +``` +Second, we'll create a variable representing the root path to all our tools named `CODEBASE`. +``` +export CODEBASE="/path/to/peppro_tutorial/tools/" +``` +(Add these environment variables to your `.bashrc` or `.profile` so you don't have to always do this step). +Fantastic! Now that we have the pipeline and its requirements installed, we're ready to get our reference genome(s). + +## 5: Use `looper` to run the pipeline Looper requires a few variables and configuration files to work for the specific user. Let's get those set up now. `Looper` uses [`divvy`](http://code.databio.org/divvy) to manage computing resource configuration so that projects and pipelines can easily travel among environments. For more detailed information, [check out the `looper` docs](https://looper.readthedocs.io/en/latest/cluster-computing/). Let's set it up. ``` cd /path/to/peppro_tutorial/ @@ -94,6 +126,7 @@ echo 'Start time:' `date +'%Y-%m-%d %T'` {CODE} } | tee {LOGFILE} --ignore-interrupts ``` + Save and close that file, and return to our main tutorial directory. ``` cd ../ @@ -107,7 +140,7 @@ Congratulations! Your first sample should be running through the pipeline now. After the pipeline is finished, we can look through the output directory together. We've provided a breakdown of that directory in the [browse output page](/browse_output/). -## 4: Generate an `HTML` report using `looper` +## 6: Generate an `HTML` report using `looper` Let's take full advantage of `looper` and generate a pipeline `HTML` report that makes all our results easy to view and browse. If you'd like to skip right to the results and see what it looks like, [check out the tutorial results](../files/examples/tutorial/tutorial_summary.html). Otherwise, let's generate a report ourselves. Using our same configuration file we used to run the samples through the pipeline, we'll now employ the `summarize` function of `looper`. diff --git a/docs/use_container.md b/docs/use_container.md deleted file mode 100644 index 86af50b..0000000 --- a/docs/use_container.md +++ /dev/null @@ -1,58 +0,0 @@ -# Run PEPPRO in a container - -We have produced both docker and singularity containers that hold all the necessary software for `PEPPRO`. If your containers are set up correctly, then you won't need to install any additional software. It's easy to run your jobs in a container by configuring `looper` to use a container-compatible template. Follow the instructions below for either `docker` or `singularity` as you wish: - -## Run PEPPRO using docker - -You can pull the docker [databio/peppro image](https://hub.docker.com/r/databio/peppro/) from dockerhub like this: - -``` -docker pull databio/peppro -``` - -Or build the image using the included Dockerfile (you can use a recipe in the included Makefile): -``` -cd peppro/ -make docker -``` - -Next, just add `--compute docker` to your `looper run` command: - -``` -cd peppro -looper run examples/meta/peppro_test.yaml --compute docker -``` - -## Run PEPPRO using singularity - -You can [download the singularity image](http://big.databio.org/simages/peppro) or build it from the docker image using the Makefile: -``` -cd peppro/ -make singularity -``` - -Now you'll need to tell the pipeline where you saved the singularity image. By default PEPPRO expects you to put your singularity image in a folder referred to with an environment variable called `$SIMAGES`: - -``` -export SIMAGES=path/to/singularity/folder/ -``` - -You could also tweak the `pipeline_interface.yaml` file so that the `compute.singularity_image` attribute is pointing to the right location on disk. Run it like this: - -``` -cd peppro -looper run examples/meta/peppro_test.yaml \ - --compute singularity -``` - -## Run PEPPRO using singularity with SLURM - -``` -cd peppro -looper run examples/meta/peppro_test.yaml \ - --compute singularity_slurm -``` - -## More details on containers - -The looper documentation has detailed instructions for [how to run pipelines in containers](http://looper.databio.org/en/latest/containers/). From ed4b633d32f6f135bce842473ceb3589e8c4332a Mon Sep 17 00:00:00 2001 From: nsheff Date: Tue, 30 Jul 2019 20:51:16 -0400 Subject: [PATCH 025/207] docs --- docs/annotation.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/annotation.md b/docs/annotation.md index 74e0bc6..8ead43b 100644 --- a/docs/annotation.md +++ b/docs/annotation.md @@ -3,13 +3,13 @@ This document outlines how we created the reference data, so you can recreate it if you need to. The easiest way to do this is use `refgenie build`. All you need to do is: -## Fasta file +## 1: Build the fasta asset You need a FASTA file for your genome. You can insert this file into refgenie like this: ``` refgenie build -g GENOME -a fasta --fasta path/to/file.fa ``` -## GTF file +## 2: Build the GTF asset You also need an Ensembl GTF file (or equivalent) for your genome. You can insert this file into refgenie like this: @@ -17,7 +17,7 @@ You also need an Ensembl GTF file (or equivalent) for your genome. You can inser refgenie build -g GENOME -a ensembl_gtf --GTF path/to/file.gtf ``` -## Other assets +## 3: Build all other assets Once you have those two assets installed, `refgenie` can automatically build all the remaining assets from them. Build the assets that are required like this: ``` From bab22cf4ce567acee2b24c3a45535718a4bd5234 Mon Sep 17 00:00:00 2001 From: nsheff Date: Tue, 30 Jul 2019 21:06:25 -0400 Subject: [PATCH 026/207] simplify refgenie instructions --- docs/install.md | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/docs/install.md b/docs/install.md index 02286e3..1a609ce 100644 --- a/docs/install.md +++ b/docs/install.md @@ -15,25 +15,25 @@ export REFGENIE=your_genome_folder/genome_config.yaml refgenie init -c $REFGENIE ``` -Add the `export REFGENIE` line to your `.bashrc` or `.profile` to ensure it persists. Then, pull the assets you need. By default, that's these for human: +Add the `export REFGENIE` line to your `.bashrc` or `.profile` to ensure it persists. Then, pull the assets you need. + +For your primary genome, PEPPRO will require these assets: ```console -refgenie pull -g hg38 -a bowtie2_index -refgenie pull -g human_rDNA -a bowtie2_index -refgenie pull -g rCRSd -a bowtie2_index +refgenie pull -g hg38 -a bowtie2_index ensembl_gtf tss_annotation \ + feat_annotation pi_tss pi_body ``` -PEPPRO also uses [refgenie](https://refgenie.databio.org) to manage a variety of annotation files for quality control plots. Downloading them is very easy: +Replace `hg38` if you need to use a different genome assembly. If these assets are not available automatically for your genome of interest, then you'll need to [build them](annotation.md). PEPPRO also requires `bowtie2_index` for any pre-alignment genomes: +```console +refgenie pull -g human_rDNA -a bowtie2_index +refgenie pull -g rCRSd -a bowtie2_index ``` -refgenie pull -g hg38 -a ensembl_gtf tss_annotation feat_annotation pi_tss pi_body -``` -Replace `hg38` if you need to use a different genome assembly. If these assets are not available automatically for your genome of interest, then you'll need to [build them](annotation.md). - ## 3: Install required software -If you don't want to install the prerequisite software used by PEPPRO, you can follow our tutorial on [running PEPPRO directly in a container](container.md) and then skip this step. If you want to run it natively, you'll need to install the following: [samtools](http://www.htslib.org/), [bedtools](https://bedtools.readthedocs.io/en/latest/content/installation.html), [bowtie2](http://bowtie-bio.sourceforge.net/bowtie2/index.shtml), [seqkit](https://bioinf.shenwei.me/seqkit/), [fastp](https://github.com/OpenGene/fastp), [seqtk](https://github.com/lh3/seqtk), [preseq](http://smithlabresearch.org/software/preseq/), [fastq-pair](https://github.com/linsalrob/fastq-pair.git), [wigToBigWig](http://hgdownload.soe.ucsc.edu/admin/exe/), and [bigWigCat](http://hgdownload.soe.ucsc.edu/admin/exe/). If you need help, we have [detailed installation instructions](detailed_install.md) for installing these. +If you don't want to install the prerequisite software used by PEPPRO, you can follow our tutorial on [running PEPPRO directly in a container](container.md) and skip this step. If you want to run it natively, you'll need to install the following: [samtools](http://www.htslib.org/), [bedtools](https://bedtools.readthedocs.io/en/latest/content/installation.html), [bowtie2](http://bowtie-bio.sourceforge.net/bowtie2/index.shtml), [seqkit](https://bioinf.shenwei.me/seqkit/), [fastp](https://github.com/OpenGene/fastp), [seqtk](https://github.com/lh3/seqtk), [preseq](http://smithlabresearch.org/software/preseq/), [fastq-pair](https://github.com/linsalrob/fastq-pair.git), [wigToBigWig](http://hgdownload.soe.ucsc.edu/admin/exe/), and [bigWigCat](http://hgdownload.soe.ucsc.edu/admin/exe/). If you need help, we have [detailed installation instructions](detailed_install.md) for installing these. ### Python packages @@ -53,9 +53,7 @@ Rscript -e 'install.packages("PEPPROr", repos=NULL, type="source")' ### Optional software -Optionally, `PEPPRO` can mix and match tools for adapter removal, read trimming, deduplication, and reverse complementation. The use of `fqdedup`, in particular, is useful if you wish to minimize memory use at the expense of speed. We suggest using the default tools simply due to the fact that `fastx toolkit` has not been supported since 2012. - -`seqOutBias` can be used to take into account the mappability at a given read length to filter the sample signal. +Optionally, `PEPPRO` can mix and match tools for adapter removal, read trimming, deduplication, and reverse complementation. The use of `fqdedup`, in particular, is useful if you wish to minimize memory use at the expense of speed. We suggest using the default tools simply due to the fact that `fastx toolkit` has not been supported since 2012. `seqOutBias` can be used to take into account the mappability at a given read length to filter the sample signal. *Optional tools:* From 9f4a9e0ded47c7eb99b2895eff21c8ecdd55a78c Mon Sep 17 00:00:00 2001 From: nsheff Date: Tue, 30 Jul 2019 21:08:45 -0400 Subject: [PATCH 027/207] fix links --- docs/tutorial.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index 614a90a..2cae198 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -88,7 +88,7 @@ export CODEBASE="/path/to/peppro_tutorial/tools/" Fantastic! Now that we have the pipeline and its requirements installed, we're ready to get our reference genome(s). ## 5: Use `looper` to run the pipeline -Looper requires a few variables and configuration files to work for the specific user. Let's get those set up now. `Looper` uses [`divvy`](http://code.databio.org/divvy) to manage computing resource configuration so that projects and pipelines can easily travel among environments. For more detailed information, [check out the `looper` docs](https://looper.readthedocs.io/en/latest/cluster-computing/). Let's set it up. +Looper requires a few variables and configuration files to work for the specific user. Let's get those set up now. `Looper` uses [`divvy`](https://divvy.databio.org/) to manage computing resource configuration so that projects and pipelines can easily travel among environments. For more detailed information, [check out the `looper` docs](https://looper.readthedocs.io/en/latest/cluster-computing/). Let's set it up. ``` cd /path/to/peppro_tutorial/ touch compute_config.yaml @@ -109,7 +109,7 @@ Now, let's close and save that file and create an environment variable pointing export DIVCFG="/path/to/peppro_tutorial/compute_config.yaml" ``` (Remember to add `DIVCFG` to your `.bashrc` or `.profile` to ensure it persists). -The `looper` environment configuration file points to submission template(s) in order to know how to run a samples locally or using cluster resources. If you'd like to learn more, check out the [`DIVCFG` configuration file and submission templates](http://code.databio.org/divvy). We're going to simply setup a local template for the purposes of this tutorial. You can also easily create [templates for cluster or container use as well](https://github.com/pepkit/divcfg/tree/master/templates)! +The `looper` environment configuration file points to submission template(s) in order to know how to run a samples locally or using cluster resources. If you'd like to learn more, check out the [`DIVCFG` configuration file and submission templates](https://divvy.databio.org/). We're going to simply setup a local template for the purposes of this tutorial. You can also easily create [templates for cluster or container use as well](https://github.com/pepkit/divcfg/tree/master/templates)! Let's change to our `templates/` directory to make our first submission template. ``` cd /path/to/peppro_tutorial/templates/ From deed1d9b8bddd695d92440010d49301531974028 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Wed, 31 Jul 2019 09:19:20 -0400 Subject: [PATCH 028/207] add additional needed annotation file --- docs/install.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/install.md b/docs/install.md index 1a609ce..33a1db9 100644 --- a/docs/install.md +++ b/docs/install.md @@ -21,7 +21,7 @@ For your primary genome, PEPPRO will require these assets: ```console refgenie pull -g hg38 -a bowtie2_index ensembl_gtf tss_annotation \ - feat_annotation pi_tss pi_body + pre_mRNA_annotation feat_annotation pi_tss pi_body ``` Replace `hg38` if you need to use a different genome assembly. If these assets are not available automatically for your genome of interest, then you'll need to [build them](annotation.md). PEPPRO also requires `bowtie2_index` for any pre-alignment genomes: From 9ae855d2251c7c3c4f4b2f52ffed4204500e5f58 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Wed, 31 Jul 2019 09:29:21 -0400 Subject: [PATCH 029/207] add additional needed annotation file to guide --- docs/annotation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/annotation.md b/docs/annotation.md index 8ead43b..1971803 100644 --- a/docs/annotation.md +++ b/docs/annotation.md @@ -21,7 +21,7 @@ refgenie build -g GENOME -a ensembl_gtf --GTF path/to/file.gtf Once you have those two assets installed, `refgenie` can automatically build all the remaining assets from them. Build the assets that are required like this: ``` -refgenie build -g GENOME -a ensembl_gtf tss_annotation feat_annotation pi_tss pi_body +refgenie build -g GENOME -a ensembl_gtf tss_annotation pre_mRNA_annotation feat_annotation pi_tss pi_body ``` That's it! These assets will be automatically detected by PEPPRO if you build them like this with refgenie. If you want to know what we're doing, or customize these, more details follow: From 7ce3d6b275a0b7aea53c15712ef0a277b6aa450f Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Wed, 31 Jul 2019 09:30:20 -0400 Subject: [PATCH 030/207] fix typo in build instructions --- docs/annotation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/annotation.md b/docs/annotation.md index 1971803..4f5b834 100644 --- a/docs/annotation.md +++ b/docs/annotation.md @@ -48,7 +48,7 @@ zcat Homo_sapiens.GRCh38.97.gtf.gz | \ awk '{OFS="\t";} {print $1,$4,$5,$20,$14,$7}' | \ sed 's/";//g' | \ sed 's/"//g' | \ - awk '{if($6=="+"){print $1"\t"$2+20"\t"$3+120"\t"$4"\t"$5"\t"$6}else{print $1"\t"$3-120"\t"$3-20"\t"$4"\t"$5"\t"$6}}' | \ + awk '{if($6=="+"){print $1"\t"$2+20"\t"$2+120"\t"$4"\t"$5"\t"$6}else{print $1"\t"$3-120"\t"$3-20"\t"$4"\t"$5"\t"$6}}' | \ LC_COLLATE=C sort -k1,1 -k2,2n -u > hg38_PI_TSS.bed zcat Homo_sapiens.GRCh38.97.gtf.gz | \ From d33c8c499a98e8b9a13fb22220b5d7bddd2bf8e5 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Wed, 31 Jul 2019 09:45:55 -0400 Subject: [PATCH 031/207] fix example of prealignments to use --- docs/prealignments.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/prealignments.md b/docs/prealignments.md index 873183a..9241ee6 100644 --- a/docs/prealignments.md +++ b/docs/prealignments.md @@ -14,7 +14,7 @@ In this example, we'll align sequentially to human mitochondrial sequence (e.g. /pipelines/peppro.py \ --sample-name test \ --genome hg38 \ - --prealignments rCRSd human_repeats \ + --prealignments human_rDNA rCRSd \ --input examples/data/test_r1.fq.gz \ --single-or-paired single \ -O $HOME/peppro_example/ From 68907d90da9dca0a401916993ce41c20fe9dfeac Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Wed, 31 Jul 2019 10:04:21 -0400 Subject: [PATCH 032/207] add additional required annotation files --- docs/annotation.md | 3 ++- docs/install.md | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/annotation.md b/docs/annotation.md index 4f5b834..38d9c2b 100644 --- a/docs/annotation.md +++ b/docs/annotation.md @@ -21,7 +21,8 @@ refgenie build -g GENOME -a ensembl_gtf --GTF path/to/file.gtf Once you have those two assets installed, `refgenie` can automatically build all the remaining assets from them. Build the assets that are required like this: ``` -refgenie build -g GENOME -a ensembl_gtf tss_annotation pre_mRNA_annotation feat_annotation pi_tss pi_body +refgenie build -g GENOME -a ensembl_gtf tss_annotation pre_mRNA_annotation \ + feat_annotation pi_tss pi_body exon_annotation intron_annotation ``` That's it! These assets will be automatically detected by PEPPRO if you build them like this with refgenie. If you want to know what we're doing, or customize these, more details follow: diff --git a/docs/install.md b/docs/install.md index 33a1db9..590cce3 100644 --- a/docs/install.md +++ b/docs/install.md @@ -21,7 +21,8 @@ For your primary genome, PEPPRO will require these assets: ```console refgenie pull -g hg38 -a bowtie2_index ensembl_gtf tss_annotation \ - pre_mRNA_annotation feat_annotation pi_tss pi_body + pre_mRNA_annotation feat_annotation exon_annotation intron_annotation \ + pi_tss pi_body ``` Replace `hg38` if you need to use a different genome assembly. If these assets are not available automatically for your genome of interest, then you'll need to [build them](annotation.md). PEPPRO also requires `bowtie2_index` for any pre-alignment genomes: From 0345462ebfa3d891357fce35d7393c7dba43cb17 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Wed, 31 Jul 2019 10:09:36 -0400 Subject: [PATCH 033/207] fix typo for complexity curve file saving --- tools/PEPPRO.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/PEPPRO.R b/tools/PEPPRO.R index 3a4f6fa..4ceb5ae 100755 --- a/tools/PEPPRO.R +++ b/tools/PEPPRO.R @@ -168,11 +168,11 @@ if (is.na(subcmd) || grepl("/R", subcmd)) { # now save the plot pdf(file = paste0(tools::file_path_sans_ext(output_name), ".pdf"), width= 10, height = 7, useDingbats=F) - print(fig) + print(p) invisible(dev.off()) png(filename = paste0(tools::file_path_sans_ext(output_name), ".png"), width = 686, height = 480) - print(fig) + print(p) invisible(dev.off()) if (exists("p")) { From 3758699936b30b5a973ae02250192088af28d476 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Wed, 31 Jul 2019 10:31:22 -0400 Subject: [PATCH 034/207] update to returning plot object method --- PEPPROr/R/PEPPROr.R | 2 +- tools/PEPPRO_summarizer.R | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/PEPPROr/R/PEPPROr.R b/PEPPROr/R/PEPPROr.R index 768498d..bab7135 100644 --- a/PEPPROr/R/PEPPROr.R +++ b/PEPPROr/R/PEPPROr.R @@ -438,7 +438,7 @@ plotComplexityCurves <- function(ccurves, ymax = max(preseq_ymax, max_unique)/2) } - return(p) + return(q) } #' Compute the axis value limit diff --git a/tools/PEPPRO_summarizer.R b/tools/PEPPRO_summarizer.R index b16cd38..e39f682 100755 --- a/tools/PEPPRO_summarizer.R +++ b/tools/PEPPRO_summarizer.R @@ -66,12 +66,18 @@ rc <- paste(config(prj)$metadata$output_dir, paste0("QC_", samples(prj)$genome), paste0(samples(prj)$sample_name, "_preseq_counts.txt"), sep="/") -plotComplexityCurves(ccurves = cc, - coverage = 0, read_length = 0, - real_counts_path = rc, ignore_unique = FALSE, - output_name = paste(config(prj)$metadata$output_dir, - "summary", - paste0(config(prj)$name, "_libComplexity"), - sep="/")) +output_name = paste(config(prj)$metadata$output_dir, "summary", + paste0(config(prj)$name, "_libComplexity"), sep="/") +p <- plotComplexityCurves(ccurves = cc, coverage = 0, read_length = 0, + real_counts_path = rc, ignore_unique = FALSE) + +pdf(file = paste0(tools::file_path_sans_ext(output_name), ".pdf"), + width= 10, height = 7, useDingbats=F) +print(p) +invisible(dev.off()) +png(filename = paste0(tools::file_path_sans_ext(output_name), ".png"), + width = 686, height = 480) +print(p) +invisible(dev.off()) ############################################################################### From a28ac00d09b143ea554eba24f6aa178c92a98a92 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Wed, 31 Jul 2019 10:47:27 -0400 Subject: [PATCH 035/207] update object return and update naming for pause index plotting --- PEPPROr/R/PEPPROr.R | 7 ++++--- tools/PEPPRO.R | 10 +++++----- tools/PEPPRO_summarizer.R | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/PEPPROr/R/PEPPROr.R b/PEPPROr/R/PEPPROr.R index bab7135..7ae7cb9 100644 --- a/PEPPROr/R/PEPPROr.R +++ b/PEPPROr/R/PEPPROr.R @@ -438,7 +438,7 @@ plotComplexityCurves <- function(ccurves, ymax = max(preseq_ymax, max_unique)/2) } - return(q) + return(fig) } #' Compute the axis value limit @@ -1116,13 +1116,14 @@ mRNAcontamination <- function(rpkm, raw=FALSE) { #' #' @param pi A single column containing the ratio of TSS densities/gene body #' densities for the highest scoring TSSs +#' @param name X-axis label, typically a sample name #' @keywords pause index #' @export #' @examples #' data("pidx") #' plotPI(pi = "pidx") #' @export -plotPI <- function(pi) { +plotPI <- function(pi, name='pause indicies') { if (exists(pi)) { PI <- data.table(get(pi)) } else if (file.exists(pi)) { @@ -1150,7 +1151,7 @@ plotPI <- function(pi) { } else if (max(PI$pi) > 100 & max(PI$pi) < 500) { q <- q + scale_y_continuous(breaks = round(seq(min(PI$pi), max(PI$pi), - by = 10), 0), + by = 25), 0), limits=c(0, max(PI$pi))) } else { q <- q + scale_y_continuous(breaks = round(seq(min(PI$pi), diff --git a/tools/PEPPRO.R b/tools/PEPPRO.R index 4ceb5ae..9add886 100755 --- a/tools/PEPPRO.R +++ b/tools/PEPPRO.R @@ -383,13 +383,13 @@ if (is.na(subcmd) || grepl("/R", subcmd)) { # Save plot to pdf file pdf(file=paste0(sample_name, "_mRNA_contamination.pdf"), width= 7, height = 7, useDingbats=F) - print(q) + print(p) invisible(dev.off()) # Save plot to png file png(filename = paste0(sample_name, "_mRNA_contamination.png"), width = 480, height = 480) - print(q) + print(p) invisible(dev.off()) if (exists("p")) { @@ -421,9 +421,9 @@ if (is.na(subcmd) || grepl("/R", subcmd)) { input <- opt_get(name = c("input", "i"), required=TRUE, description="Pause density/gene body density ratios.") - suppressWarnings(p <- plotPI(pi=input)) - - sample_name <- sampleName(input) + sample_name <- sampleName(input) + name <- basename(sample_name) + suppressWarnings(p <- plotPI(pi=input, name=name)) # Save plot to pdf file pdf(file=paste0(sample_name, "_pause_index.pdf"), diff --git a/tools/PEPPRO_summarizer.R b/tools/PEPPRO_summarizer.R index e39f682..c89130d 100755 --- a/tools/PEPPRO_summarizer.R +++ b/tools/PEPPRO_summarizer.R @@ -72,7 +72,7 @@ p <- plotComplexityCurves(ccurves = cc, coverage = 0, read_length = 0, real_counts_path = rc, ignore_unique = FALSE) pdf(file = paste0(tools::file_path_sans_ext(output_name), ".pdf"), - width= 10, height = 7, useDingbats=F) + width= 10, height = 7, useDingbats=F) print(p) invisible(dev.off()) png(filename = paste0(tools::file_path_sans_ext(output_name), ".png"), From 4470835dacc856cc156ce219aee86af399df8f18 Mon Sep 17 00:00:00 2001 From: nsheff Date: Wed, 31 Jul 2019 12:04:03 -0400 Subject: [PATCH 036/207] docs cleanup --- docs/annotation.md | 21 ++++++++++++------- docs/cluster.md | 19 +++++++++++------ docs/install.md | 11 ++++------ docs/run_cluster.md | 13 ------------ docs/run_direct.md | 2 +- docs/use_looper.md | 51 --------------------------------------------- 6 files changed, 32 insertions(+), 85 deletions(-) delete mode 100644 docs/run_cluster.md delete mode 100644 docs/use_looper.md diff --git a/docs/annotation.md b/docs/annotation.md index 38d9c2b..f4cfb99 100644 --- a/docs/annotation.md +++ b/docs/annotation.md @@ -8,21 +8,28 @@ You need a FASTA file for your genome. You can insert this file into refgenie li ``` refgenie build -g GENOME -a fasta --fasta path/to/file.fa ``` - -## 2: Build the GTF asset +## 2: Build the ensembl_gtf asset You also need an Ensembl GTF file (or equivalent) for your genome. You can insert this file into refgenie like this: ``` -refgenie build -g GENOME -a ensembl_gtf --GTF path/to/file.gtf +refgenie build -g GENOME -a ensembl_gtf --gtf path/to/file.gtf ``` -## 3: Build all other assets -Once you have those two assets installed, `refgenie` can automatically build all the remaining assets from them. Build the assets that are required like this: +## 3: Build the refgene_anno asset + +You will need a refGene annotation. For hg38, we obtain this from [ucsc](http://hgdownload.soe.ucsc.edu/goldenPath/hg38/database/refGene.txt.gz). Build it for a custom genome like this: + +``` +refgenie build -g GENOME -a refgene_anno --refgene path/to/file.txt.gz +``` + + +## 4: Build the feat_annotation and bowtie2_index assets +The `feat_annotation` asset includes feature annotations used to calculate various QC metrics. The `bowtie2_index` is used for alignment. `Refgenie` can automatically build these after you have the above assets installed: ``` -refgenie build -g GENOME -a ensembl_gtf tss_annotation pre_mRNA_annotation \ - feat_annotation pi_tss pi_body exon_annotation intron_annotation +refgenie build -g GENOME -a feat_annotation bowtie2_index ``` That's it! These assets will be automatically detected by PEPPRO if you build them like this with refgenie. If you want to know what we're doing, or customize these, more details follow: diff --git a/docs/cluster.md b/docs/cluster.md index 1c0d4f1..49518b0 100644 --- a/docs/cluster.md +++ b/docs/cluster.md @@ -2,7 +2,7 @@ ## Default computing options -When you run your PEPPRO project using `looper run`, by default it will simply run each sample locally. You can adjust the computing settings using the `--compute` argument to `looper run`. This enables you to adjust your computing preferences on-the-fly when you run a project. You have several built-in options to change this. You can view a list of all your available options by typing `divvy list`. Here are some of them: +When you run your PEPPRO project using `looper run`, by default it will simply run each sample locally. You can change that using `looper run --compute PACKAGE`, where PACKAGE is an option described below. This enables you to adjust your computing preferences on-the-fly. You have several built-in packages, which you can view by typing `divvy list`. Default packages include: - `--compute slurm`. Submit the jobs to a SLURM cluster using `sbatch`. - `--compute sge`. Submit the jobs to a SGE cluster using `qsub`. @@ -12,15 +12,15 @@ When you run your PEPPRO project using `looper run`, by default it will simply r To show how this works, let's run the example project using the `slurm` compute package. Used `-d` for a dry run to create the submits scripts but not run them: -``` +```console cd peppro looper run examples/meta/peppro_test.yaml -d \ --compute slurm ``` -This will give us a script produced, which we can look at: +This will produce a job script: -``` +```console cat peppro_test/submission/peppro_test.sub ``` @@ -28,6 +28,13 @@ If all looks well, run looper without `-d` to actually submit the jobs. To use t ## Customizing compute options -These available computing options are actually using a standardized computing system called [divvy](https://divvy.databio.org). In addition to these built-in options, Divvy allows you to very easily change templates or add your own, so you can run PEPPRO in any possible computing environment. You first create a `divvy` computing configuration file and point an environment variable (`DIVCFG`) to that file. You then have access to any configured computing packages by using `looper --compute `, where `package` can be anything you configure. The instructions for changing these computing configuration options are universal for any software that relies on `divvy`. +These default computing options may not fit your needs exactly. PEPPRO allows you to very easily change templates or add your own, so you can run PEPPRO in any possible computing environment. PEPPRO uses a standardized computing configuration called [divvy](https://divvy.databio.org). The instructions for changing these computing configuration options are universal for any software that relies on `divvy`. + +To customize your compute packages, you first create a `divvy` computing configuration file and point an environment variable (`DIVCFG`) to that file: + +```console +export DIVCFG="divvy_config.yaml" +divvy init -c $DIVCFG +``` -For complete instructions, read [how to configure divvy](https://divvy.databio.org/en/latest/configuration/). +Next, you edit that config file to add in any compute packages you need. PEPPRO will then give you access to any of your custom packages with `looper --compute `. For complete instructions on how to create a custom compute package, read [how to configure divvy](https://divvy.databio.org/en/latest/configuration/). diff --git a/docs/install.md b/docs/install.md index 590cce3..1e9eeb2 100644 --- a/docs/install.md +++ b/docs/install.md @@ -15,17 +15,14 @@ export REFGENIE=your_genome_folder/genome_config.yaml refgenie init -c $REFGENIE ``` -Add the `export REFGENIE` line to your `.bashrc` or `.profile` to ensure it persists. Then, pull the assets you need. +Add the `export REFGENIE` line to your `.bashrc` or `.profile` to ensure it persists. -For your primary genome, PEPPRO will require these assets: +Next, pull the assets you need. Replace `hg38` in the example below if you need to use a different genome assembly. If these assets are not available automatically for your genome of interest, then you'll need to [build them](annotation.md). Download these required assets with this command: ```console -refgenie pull -g hg38 -a bowtie2_index ensembl_gtf tss_annotation \ - pre_mRNA_annotation feat_annotation exon_annotation intron_annotation \ - pi_tss pi_body +refgenie pull -g hg38 -a bowtie2_index ensembl_gtf ensembl_rb refgene_anno feat_annotation ``` - -Replace `hg38` if you need to use a different genome assembly. If these assets are not available automatically for your genome of interest, then you'll need to [build them](annotation.md). PEPPRO also requires `bowtie2_index` for any pre-alignment genomes: +PEPPRO also requires `bowtie2_index` for any pre-alignment genomes: ```console refgenie pull -g human_rDNA -a bowtie2_index diff --git a/docs/run_cluster.md b/docs/run_cluster.md deleted file mode 100644 index 1983762..0000000 --- a/docs/run_cluster.md +++ /dev/null @@ -1,13 +0,0 @@ -# Run PEPPRO on a cluster - -`PEPPRO` by itself does not specify any cluster resources, so you could just roll your own and submit individual jobs to a cluster however you choose. But because `PEPPRO` is already `looper`-compatible, the easier way is to use `looper's` built-in template system, which `looper` uses to build flexible shell scripts for job submission. These templates can be used to run jobs in a container, to submit to a cluster resource manager, or both. - -To use `looper` templates, we must create a `divvy` computing configuration file (compute_config.yaml) and point an environment variable (`DIVCFG`) to that file. You then have access to any configured computing packages by using `looper --compute `, where `package` can be any computing system you configure. In short, you will need to: - -- Set up a compute configuration file that includes a containerized or cluster compute template (or both). -- Point the environment variable `DIVCFG` to the location of this file. -- Run the pipeline with `looper run --compute PACKAGE` (where `PACKAGE` is specified in your `DIVCFG` file). - -This enables you to adjust your computing preferences on-the-fly when you run a project. - -The complete description of setting up `looper` to use `DIVCFG` is generic to any pipeline. If you want to use looper with containers or clusters, you should consult the complete docs in the looper documentation on [configuring looper to use a cluster](http://looper.databio.org/en/latest/cluster-computing/). diff --git a/docs/run_direct.md b/docs/run_direct.md index 22a3eb0..f0cf859 100644 --- a/docs/run_direct.md +++ b/docs/run_direct.md @@ -1,6 +1,6 @@ # Running the pipeline script directly -It's easiest to run PEPPRO using `looper`, as described in the [install](install.md) and [tutorial](tutorial.md) guides. This greatly simplifies the process of running the pipeline across many sampels in a project. But really, the pipeline at its core is just a python script, and you can run it on the command line for a single sample (see [command-line usage](usage.md) by running `pipelines/peppro.py --help`). You just need to pass a few command-line parameters to specify sample name, reference genome, input files, etc. Here's the basic command to run the included small test example through the pipeline: +It's easiest to run PEPPRO using `looper`, as described in the [install](install.md) and [tutorial](tutorial.md) guides. This simplifies running the pipeline across many samples, on a cluster, or in containers. But really, the pipeline at its core is just a python script, and you can run it on the command line for a single sample (see [command-line usage](usage.md) by running `pipelines/peppro.py --help`). You just need to pass a few command-line parameters to specify sample name, reference genome, input files, etc. Here's the basic command to run the included small test example through the pipeline: ```console cd peppro diff --git a/docs/use_looper.md b/docs/use_looper.md deleted file mode 100644 index 4724279..0000000 --- a/docs/use_looper.md +++ /dev/null @@ -1,51 +0,0 @@ -# Run samples through PEPPRO using `Looper` - - -This guide walks you through extending `PEPPRO` to run on multiple samples using `looper`. The pipeline can be run directly from the command line for a single sample ([see Install and run](../install.md)). If you need to run it on many samples, you could write your own sample handling code, but we have pre-configured everything to work nicely with `looper`, our sample handling engine. - -## 1: Install `looper` - -[`Looper`](http://looper.readthedocs.io/) is a pipeline submission engine that makes it easy to deploy any pipeline across samples. It will let you run the jobs locally, in containers, using any cluster resource manager, or in containers on a cluster. - -You can install `looper` using `pip`: - -```{bash} -pip install --user loopercli -``` - -## 2: Run an example through `looper` - -Start by running the example project (`peppro_test.yaml`) in the [`examples/meta/`](https://github.com/databio/peppro/tree/master/examples/meta) folder. Let's use `looper`'s `-d` argument to do a *dry run*, which will create job scripts for every sample in a project, but will not execute them: - -``` -cd peppro -looper run -d examples/meta/peppro_test.yaml -``` - -If the looper executable is not in your `$PATH`, add the following line to your `.bashrc` or `.profile`: -``` -export PATH=$PATH:~/.local/bin -``` -If that worked, let's actually run the example by taking out the `-d` flag: - -``` -looper run examples/meta/peppro_test.yaml -``` - -There are lots of other cool things you can do with looper, like dry runs, summarize results, check on pipeline run status, clean intermediate files to save disk space, lump multiple samples into one job, and more. For details, consult the [`looper` docs](http://looper.databio.org/). - -## 3: Configure your project files - -To run your own samples, you'll need to organize them in **PEP format**, which is explained in [how to create a PEP](https://pepkit.github.io/docs/home/) and is universal to all pipelines that read PEPs, including `PEPPRO`. To get you started, there are examples you can adapt in the `examples/` folder (*e.g.* [example test PEP](https://github.com/databio/peppro/tree/master/examples/meta/peppro_test.yaml)). In short, you need two files for your project: - - 1. project config file -- describes output locations, pointers to data, etc. - 2. sample annotation file -- comma-separated value (CSV) list of your samples. - -The sample annotation file must specify these columns: - -- sample_name -- library ('PRO' or 'PROSEQ' or 'PRO-seq') -- organism (e.g. 'human' or 'mouse') -- read1 -- read2 (if paired) -- whatever else you want From 1a7fef68fba8b1d04d0512d8cc204a456168a376 Mon Sep 17 00:00:00 2001 From: nsheff Date: Wed, 31 Jul 2019 13:48:14 -0400 Subject: [PATCH 037/207] docs --- docs/annotation.md | 12 ++++++------ mkdocs.yml | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/annotation.md b/docs/annotation.md index f4cfb99..b5f9297 100644 --- a/docs/annotation.md +++ b/docs/annotation.md @@ -1,18 +1,18 @@ -# Annotation reference +# Custom reference data -This document outlines how we created the reference data, so you can recreate it if you need to. The easiest way to do this is use `refgenie build`. All you need to do is: +The pipeline uses reference data at various stages, such as for alignment, calculating TSS enrichments, and other QC scores. If you're using a common genome assembly, these resources are pre-built and can be easily downloaded using `refgenie pull`, as described in the setup instructions. If the resources are not available, you'll have to build them. This document outlines how we created the reference data, so you can recreate it if you need to. The easiest way to do this is use `refgenie build`. All you need to do is: ## 1: Build the fasta asset You need a FASTA file for your genome. You can insert this file into refgenie like this: -``` +```console refgenie build -g GENOME -a fasta --fasta path/to/file.fa ``` ## 2: Build the ensembl_gtf asset You also need an Ensembl GTF file (or equivalent) for your genome. You can insert this file into refgenie like this: -``` +```console refgenie build -g GENOME -a ensembl_gtf --gtf path/to/file.gtf ``` @@ -20,7 +20,7 @@ refgenie build -g GENOME -a ensembl_gtf --gtf path/to/file.gtf You will need a refGene annotation. For hg38, we obtain this from [ucsc](http://hgdownload.soe.ucsc.edu/goldenPath/hg38/database/refGene.txt.gz). Build it for a custom genome like this: -``` +```console refgenie build -g GENOME -a refgene_anno --refgene path/to/file.txt.gz ``` @@ -28,7 +28,7 @@ refgenie build -g GENOME -a refgene_anno --refgene path/to/file.txt.gz ## 4: Build the feat_annotation and bowtie2_index assets The `feat_annotation` asset includes feature annotations used to calculate various QC metrics. The `bowtie2_index` is used for alignment. `Refgenie` can automatically build these after you have the above assets installed: -``` +```console refgenie build -g GENOME -a feat_annotation bowtie2_index ``` diff --git a/mkdocs.yml b/mkdocs.yml index 67a87d8..e8e6ab8 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -21,9 +21,9 @@ nav: - Run PEPPRO directly: 'run_direct.md' - Run PEPPRO on a cluster: 'cluster.md' - Run PEPPRO in containers: 'container.md' - - Configuring prealignments: 'prealignments.md' + - Configure prealignments: 'prealignments.md' - Detailed install guide: 'detailed_install.md' - - Annotation files: 'annotation.md' + - Use custom reference data: 'annotation.md' - Reference: - FAQ: 'faq.md' - Usage: 'usage.md' From 31b49f54c9c32d65ca70da132d40d18ecfbea51e Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Wed, 31 Jul 2019 14:14:51 -0400 Subject: [PATCH 038/207] update install guide to get python and R packages independently of bioinformatic tools --- docs/install.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/install.md b/docs/install.md index 1e9eeb2..619b4d3 100644 --- a/docs/install.md +++ b/docs/install.md @@ -31,7 +31,7 @@ refgenie pull -g rCRSd -a bowtie2_index ## 3: Install required software -If you don't want to install the prerequisite software used by PEPPRO, you can follow our tutorial on [running PEPPRO directly in a container](container.md) and skip this step. If you want to run it natively, you'll need to install the following: [samtools](http://www.htslib.org/), [bedtools](https://bedtools.readthedocs.io/en/latest/content/installation.html), [bowtie2](http://bowtie-bio.sourceforge.net/bowtie2/index.shtml), [seqkit](https://bioinf.shenwei.me/seqkit/), [fastp](https://github.com/OpenGene/fastp), [seqtk](https://github.com/lh3/seqtk), [preseq](http://smithlabresearch.org/software/preseq/), [fastq-pair](https://github.com/linsalrob/fastq-pair.git), [wigToBigWig](http://hgdownload.soe.ucsc.edu/admin/exe/), and [bigWigCat](http://hgdownload.soe.ucsc.edu/admin/exe/). If you need help, we have [detailed installation instructions](detailed_install.md) for installing these. +PEPPRO requires a set of Python and R packages to run. ### Python packages @@ -49,6 +49,10 @@ pip install --user -r requirements.txt Rscript -e 'install.packages("PEPPROr", repos=NULL, type="source")' ``` +The pipeline also relies on a set of publicly available bioinformatic tools, but if you don't want to install the prerequisite software used by PEPPRO natively, you can follow our tutorial on [running PEPPRO directly in a container](container.md) and skip this step. + +Otherwise, you'll need to install the following: [samtools](http://www.htslib.org/), [bedtools](https://bedtools.readthedocs.io/en/latest/content/installation.html), [bowtie2](http://bowtie-bio.sourceforge.net/bowtie2/index.shtml), [seqkit](https://bioinf.shenwei.me/seqkit/), [fastp](https://github.com/OpenGene/fastp), [seqtk](https://github.com/lh3/seqtk), [preseq](http://smithlabresearch.org/software/preseq/), [fastq-pair](https://github.com/linsalrob/fastq-pair.git), [wigToBigWig](http://hgdownload.soe.ucsc.edu/admin/exe/), and [bigWigCat](http://hgdownload.soe.ucsc.edu/admin/exe/). If you need help, we have [detailed installation instructions](detailed_install.md) for installing these. + ### Optional software Optionally, `PEPPRO` can mix and match tools for adapter removal, read trimming, deduplication, and reverse complementation. The use of `fqdedup`, in particular, is useful if you wish to minimize memory use at the expense of speed. We suggest using the default tools simply due to the fact that `fastx toolkit` has not been supported since 2012. `seqOutBias` can be used to take into account the mappability at a given read length to filter the sample signal. From c8ddd044c4e9f0763c5511738bbb67eb542677d8 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Wed, 31 Jul 2019 21:22:41 -0400 Subject: [PATCH 039/207] fix name usage --- PEPPROr/R/PEPPROr.R | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/PEPPROr/R/PEPPROr.R b/PEPPROr/R/PEPPROr.R index 7ae7cb9..4e6d4ba 100644 --- a/PEPPROr/R/PEPPROr.R +++ b/PEPPROr/R/PEPPROr.R @@ -1028,6 +1028,7 @@ fancyNumbers <- function(n){ #' #' @param rpkm A three column TSV format file containing #' "gene", "intron RPKM", "exon RPKM" columns. +#' @param name X-axis label, typically a sample name #' @param raw Plot raw distribution #' @keywords mRNA contamination #' @export @@ -1035,7 +1036,9 @@ fancyNumbers <- function(n){ #' data("rpkm_ratios") #' mRNAcontamination(rpkm = "rpkm_ratios") #' @export -mRNAcontamination <- function(rpkm, raw=FALSE) { +mRNAcontamination <- function(rpkm, + name='mRNA contamination ratios', + raw=FALSE) { if (exists(rpkm)) { RPKM <- data.table(get(rpkm)) } else if (file.exists(rpkm)) { @@ -1108,7 +1111,7 @@ mRNAcontamination <- function(rpkm, raw=FALSE) { hjust=0, vjust=1, label = label1, parse=TRUE) } - return(p) + return(q) } From 4b4d9f4cec389adfb66b8f2e3fc9c7df103c80de Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Wed, 31 Jul 2019 21:22:51 -0400 Subject: [PATCH 040/207] add output file --- docs/browse_output.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/browse_output.md b/docs/browse_output.md index 3a4747e..e1cb7d1 100644 --- a/docs/browse_output.md +++ b/docs/browse_output.md @@ -10,6 +10,7 @@ This is an interactive display of exactly what results you'll get as output from * :fa-file-code-o: [plus_frif.html](../files/examples/tutorial/reports/plus_frif.html) * :fa-file-code-o: [mrna_contamination.html](../files/examples/tutorial/reports/mrna_contamination.html) * :fa-file-code-o: [objects.html](../files/examples/tutorial/reports/objects.html) + * :fa-file-code-o: [pause_index.html](../files/examples/tutorial/reports/pause_index.html) * :fa-file-code-o: [samples.html](../files/examples/tutorial/reports/samples.html) * :fa-file-code-o: [status.html](../files/examples/tutorial/reports/status.html) * :fa-file-code-o: [tss_enrichment.html](../files/examples/tutorial/reports/tss_enrichment.html) From 721b564703fc55227e1d20764fce8d7c632c21ba Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Wed, 31 Jul 2019 21:23:02 -0400 Subject: [PATCH 041/207] cleanup example --- examples/meta/peppro_test.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/examples/meta/peppro_test.yaml b/examples/meta/peppro_test.yaml index afda0c9..9716332 100644 --- a/examples/meta/peppro_test.yaml +++ b/examples/meta/peppro_test.yaml @@ -22,10 +22,6 @@ implied_columns: runon: pro # Default umi_len: 8 # Default max_len: 30 # Default - TSS_name: $HOME/genomes/hg38/hg38_TSS.tsv # Default. Pipeline checks corresponding genome folder without specifying. - CpA_name: $HOME/genomes/hg38/hg38_CpA.tsv # Default. Pipeline checks corresponding genome folder without specifying. - pre_name: $HOME/genomes/hg38/hg38_pre-mRNA.tsv # Default. Pipeline checks corresponding genome folder without specifying. - anno_name: $HOME/genomes/hg38/hg38_annotations.bed.gz # Default. Pipeline checks corresponding genome folder without specifying. pipeline_args: # peppro.py: From c8571124a3baae6ddbeefe292970963f81d3f58d Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Wed, 31 Jul 2019 21:23:19 -0400 Subject: [PATCH 042/207] update usage; update asset naming --- pipelines/peppro.py | 70 ++++++++++++++++++++++----------------------- tools/PEPPRO.R | 6 ++-- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 5a2d030..fd527ff 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -92,11 +92,11 @@ def parse_arguments(): help="file_name of TSS annotation file.") parser.add_argument("--pi-tss", default=None, - dest="pi_tss", type=str, + dest="ensembl_tss", type=str, help="file_name of pause index TSS annotation file.") parser.add_argument("--pi-body", default=None, - dest="pi_body", type=str, + dest="ensembl_gene_body", type=str, help="file_name of pause index gene body annotation file.") parser.add_argument("--pre-name", default=None, @@ -1373,7 +1373,7 @@ def _add_resources(args, res): msg = "The '{}' asset is not present in your REFGENIE config file." err = "The '{}' asset does not exist." - asset = "tss_annotation" + asset = "refgene_tss" if args.TSS_name: res[asset] = os.path.abspath(args.TSS_name) else: @@ -1387,9 +1387,9 @@ def _add_resources(args, res): print(err.format(asset)) print(msg) - asset = "pi_tss" - if args.pi_tss: - res[asset] = os.path.abspath(args.pi_tss) + asset = "ensembl_tss" + if args.ensembl_tss: + res[asset] = os.path.abspath(args.ensembl_tss) else: try: res[asset] = rgc.get_asset(args.genome_assembly, asset) @@ -1401,9 +1401,9 @@ def _add_resources(args, res): print(err.format(asset)) print(msg) - asset = "pi_body" - if args.pi_body: - res[asset] = os.path.abspath(args.pi_body) + asset = "ensembl_gene_body" + if args.ensembl_gene_body: + res[asset] = os.path.abspath(args.ensembl_gene_body) else: try: res[asset] = rgc.get_asset(args.genome_assembly, asset) @@ -1415,7 +1415,7 @@ def _add_resources(args, res): print(err.format(asset)) print(msg) - asset = "pre_mRNA_annotation" + asset = "refgene_pre_mRNA" if args.pre_name: res[asset] = os.path.abspath(args.pre_name) else: @@ -1443,7 +1443,7 @@ def _add_resources(args, res): print(err.format(asset)) print(msg) - asset = "exon_annotation" + asset = "refgene_exon" if args.exon_name: res[asset] = os.path.abspath(args.exon_name) else: @@ -1457,7 +1457,7 @@ def _add_resources(args, res): print(err.format(asset)) print(msg) - asset = "intron_annotation" + asset = "refgene_intron" if args.intron_name: res[asset] = os.path.abspath(args.intron_name) else: @@ -1869,9 +1869,9 @@ def check_alignment_genome(temp_bam, bam): ar = float(ar)/2 rr = float(pm.get_stat("Raw_reads")) tr = float(pm.get_stat("Trimmed_reads")) - if os.path.exists(res.pre_mRNA_annotation): + if os.path.exists(res.refgene_pre_mRNA): cmd = (tools.samtools + " depth -b " + - res.pre_mRNA_annotation + " " + bam + + res.refgene_pre_mRNA + " " + bam + " | awk '{counter++;sum+=$3}END{print sum/counter}'") rd = pm.checkprint(cmd) else: @@ -2203,9 +2203,9 @@ def count_unmapped_reads(): ############################################################################ # TSS enrichment # ############################################################################ - if not os.path.exists(res.tss_annotation): + if not os.path.exists(res.refgene_tss): print("Skipping TSS -- TSS enrichment requires TSS annotation file: {}" - .format(res.tss_annotation)) + .format(res.refgene_tss)) else: pm.timestamp("### Calculate TSS enrichment") @@ -2214,7 +2214,7 @@ def count_unmapped_reads(): minus_TSS = os.path.join(QC_folder, "minus_TSS.tsv") cmd = ("sed -n -e '/[[:space:]]+/w " + plus_TSS + "' -e '/[[:space:]]-/w " + - minus_TSS + "' " + res.tss_annotation) + minus_TSS + "' " + res.refgene_tss) pm.run(cmd, [plus_TSS, minus_TSS]) # pyTssEnrichment requires indexed bam @@ -2310,28 +2310,28 @@ def count_unmapped_reads(): pm.clean_add(chr_order) pm.clean_add(chr_keep) - if not os.path.exists(res.pi_tss): - if not os.path.exists(res.pi_body): + if not os.path.exists(res.ensembl_tss): + if not os.path.exists(res.ensembl_gene_body): print("Skipping PI -- Pause index requires 'TSS' and 'gene body' annotation files: {} and {}" - .format(res.pi_tss, res.pi_body)) + .format(res.ensembl_tss, res.ensembl_gene_body)) else: print("Skipping PI -- Pause index requires 'TSS' annotation file: {}" - .format(res.pi_tss)) - elif not os.path.exists(res.pi_body): + .format(res.ensembl_tss)) + elif not os.path.exists(res.ensembl_gene_body): print("Skipping PI -- Pause index requires 'gene body' annotation file: {}" - .format(res.pi_body)) + .format(res.ensembl_gene_body)) else: pm.timestamp("### Calculate Pause Index (PI)") # Remove missing chr from PI annotations tss_local = os.path.join(QC_folder, - args.genome_assembly + "_PI_TSS.bed") + args.genome_assembly + "_ensembl_tss.bed") body_local = os.path.join(QC_folder, - args.genome_assembly + "_PI_body.bed") - cmd1 = ("grep -wf " + chr_keep + " " + res.pi_tss + " | " + + args.genome_assembly + "_ensembl_gene_body.bed") + cmd1 = ("grep -wf " + chr_keep + " " + res.ensembl_tss + " | " + tools.bedtools + " sort -i stdin -faidx " + chr_order + " > " + tss_local) - cmd2 = ("grep -wf " + chr_keep + " " + res.pi_body + " | " + + cmd2 = ("grep -wf " + chr_keep + " " + res.ensembl_gene_body + " | " + tools.bedtools + " sort -i stdin -faidx " + chr_order + " > " + body_local) pm.run([cmd1,cmd2], [tss_local, body_local], nofail=True) @@ -2392,19 +2392,19 @@ def count_unmapped_reads(): ############################################################################ # Calculate Fraction of Reads in Pre-mRNA (FRiP) # ############################################################################ - if not os.path.exists(res.pre_mRNA_annotation): + if not os.path.exists(res.refgene_pre_mRNA): print("Skipping FRiP -- Fraction of reads in pre-mRNA requires " "pre-mRNA annotation file: {}" - .format(res.pre_mRNA_annotation)) + .format(res.refgene_pre_mRNA)) else: pm.timestamp("### Calculate FRiP") # Plus - plus_frip = calc_frip(plus_bam, res.pre_mRNA_annotation, + plus_frip = calc_frip(plus_bam, res.refgene_pre_mRNA, frip_func=ngstk.simple_frip, pipeline_manager=pm) pm.report_result("Plus FRiP", round(plus_frip, 2)) # Minus - minus_frip = calc_frip(minus_bam, res.pre_mRNA_annotation, + minus_frip = calc_frip(minus_bam, res.refgene_pre_mRNA, frip_func=ngstk.simple_frip, pipeline_manager=pm) pm.report_result("Minus FRiP", round(minus_frip, 2)) @@ -2609,8 +2609,8 @@ def count_unmapped_reads(): ############################################################################ # Report mRNA contamination # ############################################################################ - if (os.path.exists(res.exon_annotation) and - os.path.exists(res.intron_annotation)): + if (os.path.exists(res.refgene_exon) and + os.path.exists(res.refgene_intron)): pm.timestamp("### Calculate mRNA contamination") @@ -2619,11 +2619,11 @@ def count_unmapped_reads(): "_exons_sort.bed") introns_sort = os.path.join(QC_folder, args.genome_assembly + "_introns_sort.bed") - cmd1 = ("grep -wf " + chr_keep + " " + res.exon_annotation + + cmd1 = ("grep -wf " + chr_keep + " " + res.refgene_exon + " | " + tools.bedtools + " sort -i stdin -faidx " + chr_order + " > " + exons_sort) # a single sort fails to sort a 1 bp different start position intron - cmd2 = ("grep -wf " + chr_keep + " " + res.intron_annotation + + cmd2 = ("grep -wf " + chr_keep + " " + res.refgene_intron + " | " + tools.bedtools + " sort -i stdin -faidx " + chr_order + " | " + tools.bedtools + " sort -i stdin -faidx " + chr_order + " > " + introns_sort) diff --git a/tools/PEPPRO.R b/tools/PEPPRO.R index 9add886..ef996c7 100755 --- a/tools/PEPPRO.R +++ b/tools/PEPPRO.R @@ -376,9 +376,9 @@ if (is.na(subcmd) || grepl("/R", subcmd)) { raw <- opt_get(name = c("raw", "w"), required=FALSE, default=FALSE, description="Plot raw ratios (Default = FALSE).") - suppressWarnings(p <- mRNAcontamination(rpkm=rpkm, raw=raw)) - - sample_name <- sampleName(rpkm) + sample_name <- sampleName(rpkm) + name <- basename(sample_name) + suppressWarnings(p <- mRNAcontamination(rpkm=rpkm, name=name, raw=raw)) # Save plot to pdf file pdf(file=paste0(sample_name, "_mRNA_contamination.pdf"), From 1c48a20a0e5cddb9fb55ce2754534d80fd946935 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Wed, 31 Jul 2019 21:24:10 -0400 Subject: [PATCH 043/207] add example output --- .../tutorial/reports/fastp_report.html | 257 ++ .../reports/fragment_distribution.html | 257 ++ .../tutorial/reports/library_complexity.html | 257 ++ .../examples/tutorial/reports/minus_frif.html | 257 ++ .../tutorial/reports/mrna_contamination.html | 257 ++ .../examples/tutorial/reports/objects.html | 270 ++ .../tutorial/reports/pause_index.html | 257 ++ .../examples/tutorial/reports/plus_frif.html | 257 ++ .../examples/tutorial/reports/samples.html | 249 ++ .../examples/tutorial/reports/status.html | 302 ++ .../tutorial/reports/tss_enrichment.html | 257 ++ .../examples/tutorial/reports/tutorial.html | 561 +++ .../tutorial/PEPPRO_commands.sh | 141 + .../results_pipeline/tutorial/PEPPRO_log.md | 2047 ++++++++++ .../tutorial/PEPPRO_profile.tsv | 173 + .../QC_hg38/tutorial_TSSenrichment.pdf | Bin 0 -> 5633 bytes .../QC_hg38/tutorial_TSSenrichment.png | Bin 0 -> 26362 bytes .../QC_hg38/tutorial_fragLenDistribution.pdf | Bin 0 -> 38797 bytes .../QC_hg38/tutorial_fragLenDistribution.png | Bin 0 -> 12998 bytes .../QC_hg38/tutorial_mRNA_contamination.pdf | Bin 0 -> 5048 bytes .../QC_hg38/tutorial_mRNA_contamination.png | Bin 0 -> 5390 bytes .../tutorial/QC_hg38/tutorial_minus_frif.pdf | Bin 0 -> 195496 bytes .../tutorial/QC_hg38/tutorial_minus_frif.png | Bin 0 -> 25148 bytes .../tutorial/QC_hg38/tutorial_pause_index.pdf | Bin 0 -> 10020 bytes .../tutorial/QC_hg38/tutorial_pause_index.png | Bin 0 -> 12264 bytes .../tutorial/QC_hg38/tutorial_plus_frif.pdf | Bin 0 -> 199001 bytes .../tutorial/QC_hg38/tutorial_plus_frif.png | Bin 0 -> 25458 bytes .../tutorial/QC_hg38/tutorial_preseq_plot.pdf | Bin 0 -> 8290 bytes .../tutorial/QC_hg38/tutorial_preseq_plot.png | Bin 0 -> 24780 bytes .../fastqc/tutorial_R1_rmAdapter.html | 3511 +++++++++++++++++ .../fastqc/tutorial_R1_rmAdapter.json | 751 ++++ .../tutorial/fastqc/tutorial_R1_rmAdapter.txt | 29 + .../fastqc/tutorial_R2_rmAdapter.html | 2725 +++++++++++++ .../fastqc/tutorial_R2_rmAdapter.json | 358 ++ .../results_pipeline/tutorial/objects.tsv | 8 + .../results_pipeline/tutorial/stats.tsv | 34 + .../summary/tutorial_libComplexity.pdf | Bin 0 -> 8290 bytes .../summary/tutorial_libComplexity.png | Bin 0 -> 24780 bytes .../tutorial/tutorial_stats_summary.tsv | 2 + .../examples/tutorial/tutorial_summary.html | 762 ++++ 40 files changed, 13979 insertions(+) create mode 100644 docs/files/examples/tutorial/reports/fastp_report.html create mode 100644 docs/files/examples/tutorial/reports/fragment_distribution.html create mode 100644 docs/files/examples/tutorial/reports/library_complexity.html create mode 100644 docs/files/examples/tutorial/reports/minus_frif.html create mode 100644 docs/files/examples/tutorial/reports/mrna_contamination.html create mode 100644 docs/files/examples/tutorial/reports/objects.html create mode 100644 docs/files/examples/tutorial/reports/pause_index.html create mode 100644 docs/files/examples/tutorial/reports/plus_frif.html create mode 100644 docs/files/examples/tutorial/reports/samples.html create mode 100644 docs/files/examples/tutorial/reports/status.html create mode 100644 docs/files/examples/tutorial/reports/tss_enrichment.html create mode 100644 docs/files/examples/tutorial/reports/tutorial.html create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/PEPPRO_commands.sh create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/PEPPRO_log.md create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/PEPPRO_profile.tsv create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_TSSenrichment.pdf create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_TSSenrichment.png create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_fragLenDistribution.pdf create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_fragLenDistribution.png create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_mRNA_contamination.pdf create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_mRNA_contamination.png create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_minus_frif.pdf create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_minus_frif.png create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_pause_index.pdf create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_pause_index.png create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_plus_frif.pdf create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_plus_frif.png create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_preseq_plot.pdf create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_preseq_plot.png create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.html create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.json create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.txt create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/fastqc/tutorial_R2_rmAdapter.html create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/fastqc/tutorial_R2_rmAdapter.json create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/objects.tsv create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/stats.tsv create mode 100644 docs/files/examples/tutorial/summary/tutorial_libComplexity.pdf create mode 100644 docs/files/examples/tutorial/summary/tutorial_libComplexity.png create mode 100644 docs/files/examples/tutorial/tutorial_stats_summary.tsv create mode 100644 docs/files/examples/tutorial/tutorial_summary.html diff --git a/docs/files/examples/tutorial/reports/fastp_report.html b/docs/files/examples/tutorial/reports/fastp_report.html new file mode 100644 index 0000000..8c694f0 --- /dev/null +++ b/docs/files/examples/tutorial/reports/fastp_report.html @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + Looper: FastP_report objects + +
+ + + +
+
+
+ +

FastP_report

+ + + +
Links
+
+ + tutorial + +
+ + +
+
+ +
+ + \ No newline at end of file diff --git a/docs/files/examples/tutorial/reports/fragment_distribution.html b/docs/files/examples/tutorial/reports/fragment_distribution.html new file mode 100644 index 0000000..e270881 --- /dev/null +++ b/docs/files/examples/tutorial/reports/fragment_distribution.html @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + Looper: Fragment distribution objects + +
+ + + +
+
+
+ +

Fragment distribution

+ + + +
Links
+
+ + tutorial + +
+ + +
+
+ +
+ + \ No newline at end of file diff --git a/docs/files/examples/tutorial/reports/library_complexity.html b/docs/files/examples/tutorial/reports/library_complexity.html new file mode 100644 index 0000000..d2f2d12 --- /dev/null +++ b/docs/files/examples/tutorial/reports/library_complexity.html @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + Looper: Library complexity objects + +
+ + + +
+
+
+ +

Library complexity

+ + + +
Links
+
+ + tutorial + +
+ + +
+
+ +
+ + \ No newline at end of file diff --git a/docs/files/examples/tutorial/reports/minus_frif.html b/docs/files/examples/tutorial/reports/minus_frif.html new file mode 100644 index 0000000..fca96b5 --- /dev/null +++ b/docs/files/examples/tutorial/reports/minus_frif.html @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + Looper: Minus FRiF objects + +
+ + + +
+
+
+ +

Minus FRiF

+ + + +
Links
+
+ + tutorial + +
+ + +
+
+ +
+ + \ No newline at end of file diff --git a/docs/files/examples/tutorial/reports/mrna_contamination.html b/docs/files/examples/tutorial/reports/mrna_contamination.html new file mode 100644 index 0000000..79b9a18 --- /dev/null +++ b/docs/files/examples/tutorial/reports/mrna_contamination.html @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + Looper: mRNA contamination objects + +
+ + + +
+
+
+ +

mRNA contamination

+ + + +
Links
+
+ + tutorial + +
+ + +
+
+ +
+ + \ No newline at end of file diff --git a/docs/files/examples/tutorial/reports/objects.html b/docs/files/examples/tutorial/reports/objects.html new file mode 100644 index 0000000..6705261 --- /dev/null +++ b/docs/files/examples/tutorial/reports/objects.html @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + + + + + + Looper: Objects + +
+ + + +
+ + +
+ + \ No newline at end of file diff --git a/docs/files/examples/tutorial/reports/pause_index.html b/docs/files/examples/tutorial/reports/pause_index.html new file mode 100644 index 0000000..363e2eb --- /dev/null +++ b/docs/files/examples/tutorial/reports/pause_index.html @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + Looper: Pause index objects + +
+ + + +
+
+
+ +

Pause index

+ + + +
Links
+
+ + tutorial + +
+ + +
+
+ +
+ + \ No newline at end of file diff --git a/docs/files/examples/tutorial/reports/plus_frif.html b/docs/files/examples/tutorial/reports/plus_frif.html new file mode 100644 index 0000000..646aa6a --- /dev/null +++ b/docs/files/examples/tutorial/reports/plus_frif.html @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + Looper: Plus FRiF objects + +
+ + + +
+
+
+ +

Plus FRiF

+ + + +
Links
+
+ + tutorial + +
+ + +
+
+ +
+ + \ No newline at end of file diff --git a/docs/files/examples/tutorial/reports/samples.html b/docs/files/examples/tutorial/reports/samples.html new file mode 100644 index 0000000..09559cb --- /dev/null +++ b/docs/files/examples/tutorial/reports/samples.html @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + Looper: Samples + +
+ + + +
+
+

Samples

+
+ + + tutorial + +
+
+ +
+ + \ No newline at end of file diff --git a/docs/files/examples/tutorial/reports/status.html b/docs/files/examples/tutorial/reports/status.html new file mode 100644 index 0000000..a341e47 --- /dev/null +++ b/docs/files/examples/tutorial/reports/status.html @@ -0,0 +1,302 @@ + + + + + + + + + + + + + + + + + + + Looper: status + +
+ + + +
+
+

Status by sample

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Sample nameStatusLog fileRuntimePeak memory use
+ tutorial + + Completed + + PEPPRO_log.md + + 0:31:58 + + 3.4502 GB +
+
+
+
+ + + + + + +
+ +
+ + \ No newline at end of file diff --git a/docs/files/examples/tutorial/reports/tss_enrichment.html b/docs/files/examples/tutorial/reports/tss_enrichment.html new file mode 100644 index 0000000..3d3cffc --- /dev/null +++ b/docs/files/examples/tutorial/reports/tss_enrichment.html @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + Looper: TSS enrichment objects + +
+ + + +
+
+
+ +

TSS enrichment

+ + + +
Links
+
+ + tutorial + +
+ + +
+
+ +
+ + \ No newline at end of file diff --git a/docs/files/examples/tutorial/reports/tutorial.html b/docs/files/examples/tutorial/reports/tutorial.html new file mode 100644 index 0000000..29a52ff --- /dev/null +++ b/docs/files/examples/tutorial/reports/tutorial.html @@ -0,0 +1,561 @@ + + + + + + + + + + + + + + + + + + + Looper: tutorial + +
+ + + +
+
+

Sample name: tutorial

+
+
+

+ + + Log file + + + Pipeline profile + + + Pipeline commands + + + Stats summary file + +

+
+
+
+

Looper stats summary

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
sample_nametutorial
organismhuman
protocolPROSEQ
read_typepaired
read1/scratch/jps3dp/DATA/proseq/tutorial_r1.fq.gz
read2/scratch/jps3dp/DATA/proseq/tutorial_r2.fq.gz
File_mb50.42
Read_typepaired
Genomehg38
Raw_reads2000000
Fastq_reads2000000
Reads_with_adapter598996.0
Pct_adapter_contamination0.44
Reads_too_short522549.0
Duplicate_reads3022.0
Trimmed_reads461368
Trim_loss_rate76.93
Aligned_reads_human_rDNA68452.0
Alignment_rate_human_rDNA14.84
Aligned_reads_rCRSd12998.0
Alignment_rate_rCRSd2.82
Mapped_reads711524
QC_filtered_reads384789
Aligned_reads326735.0
Alignment_rate70.82
Total_efficiency16.34
Read_depth1.35
Mitochondrial_reads249
NRF1.0
PBC1164998.5
PBC2164998.5
Unmapped_reads44906
TSS_Plus_Score56.2
TSS_Minus_Score17.9
Pause index108.18
Plus FRiP0.37
Minus FRiP0.36
mRNA contamination0.63
Time0:14:01
Success07-31-20:57:16
+
+
+ +
+ +
+ + \ No newline at end of file diff --git a/docs/files/examples/tutorial/results_pipeline/tutorial/PEPPRO_commands.sh b/docs/files/examples/tutorial/results_pipeline/tutorial/PEPPRO_commands.sh new file mode 100644 index 0000000..20e98c3 --- /dev/null +++ b/docs/files/examples/tutorial/results_pipeline/tutorial/PEPPRO_commands.sh @@ -0,0 +1,141 @@ +# Pipeline started at 07-31 20:43:16 + +ln -sf /scratch/jps3dp/DATA/proseq/tutorial_r1.fq.gz /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/tutorial_R1.fastq.gz +ln -sf /scratch/jps3dp/DATA/proseq/tutorial_r2.fq.gz /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/tutorial_R2.fastq.gz +gzip -f -d -c /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/tutorial_R1.fastq.gz > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1.fastq +gzip -f -d -c /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/tutorial_R2.fastq.gz > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2.fastq +(fastp --overrepresentation_analysis --thread 1 --in1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1.fastq --adapter_sequence TGGAATTCTCGGGTGCCAAGG --length_required 26 --html /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.html --json /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.json --report_title 'tutorial' -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_noadap.fastq ) 2> /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.txt +seqkit rmdup --threads 1 --by-seq --ignore-case -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_dedup.fastq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_noadap.fastq +seqtk trimfq -b 8 -L 30 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_noadap.fastq | seqtk seq -r - > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq +grep 'reads with adapter trimmed:' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.txt | head -n 1 | awk '{print $NF}' +grep 'total bases:' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.txt | head -n 1 | awk '{print $NF}' +grep 'bases trimmed due to adapters:' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.txt | awk '{print $NF}' +grep 'reads failed due to too short:' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.txt | head -n 1 | awk '{print $NF}' +seqtk trimfq -b 8 -L 30 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_dedup.fastq | seqtk seq -r - > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq +(fastp --overrepresentation_analysis --thread 1 --in1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2.fastq --adapter_sequence GATCGTCGGACTGTAGAACTCTGAAC --length_required 26 --html /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R2_rmAdapter.html --json /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R2_rmAdapter.json --report_title 'tutorial' --stdout ) 2> /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.txt | seqtk trimfq -e 8 - | seqtk seq -r - > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq +cp /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed_dups.fastq +fastq_pair -t 1800000 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq +mv /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq.paired.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq +mv /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq.paired.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq +touch repaired.flag +fastq_pair -t 1800000 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed_dups.fastq +mv /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq.paired.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq +mv /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed_dups.fastq.paired.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed_dups.fastq +touch dups_repaired.flag +mkfifo /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/human_rDNA_bt2 +perl /scratch/jps3dp/tools/databio/peppro/tools/filter_paired_fq.pl /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/human_rDNA_bt2 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R1.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R2.fq +(bowtie2 -p 1 -k 1 -D 20 -R 3 -N 1 -L 20 -i S,1,0.50 -x /nv/t1/genomes/human_rDNA/bowtie2_index/human_rDNA --rg-id tutorial -U /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq --un /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/human_rDNA_bt2 > /dev/null) 2>/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_bt_aln_summary.log +grep 'aligned exactly 1 time' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_bt_aln_summary.log | awk '{print $1}' +mkfifo /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/human_rDNA_dups_bt2 +perl /scratch/jps3dp/tools/databio/peppro/tools/filter_paired_fq.pl /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/human_rDNA_dups_bt2 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed_dups.fastq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_dups_R1.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_dups_R2.fq +(bowtie2 -p 1 -k 1 -D 20 -R 3 -N 1 -L 20 -i S,1,0.50 -x /nv/t1/genomes/human_rDNA/bowtie2_index/human_rDNA --rg-id tutorial -U /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq --un /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/human_rDNA_dups_bt2 > /dev/null) 2>/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_bt_aln_dups_summary.log +mkfifo /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/rCRSd_bt2 +perl /scratch/jps3dp/tools/databio/peppro/tools/filter_paired_fq.pl /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/rCRSd_bt2 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R1.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R2.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_R1.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_R2.fq +(bowtie2 -p 1 -k 1 -D 20 -R 3 -N 1 -L 20 -i S,1,0.50 -x /nv/t1/genomes/rCRSd/bowtie2_index/rCRSd --rg-id tutorial -U /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R1.fq --un /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/rCRSd_bt2 > /dev/null) 2>/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_bt_aln_summary.log +grep 'aligned exactly 1 time' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_bt_aln_summary.log | awk '{print $1}' +mkfifo /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/rCRSd_dups_bt2 +perl /scratch/jps3dp/tools/databio/peppro/tools/filter_paired_fq.pl /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/rCRSd_dups_bt2 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_dups_R1.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_dups_R2.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_dups_R1.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_dups_R2.fq +(bowtie2 -p 1 -k 1 -D 20 -R 3 -N 1 -L 20 -i S,1,0.50 -x /nv/t1/genomes/rCRSd/bowtie2_index/rCRSd --rg-id tutorial -U /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_dups_R1.fq --un /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/rCRSd_dups_bt2 > /dev/null) 2>/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_bt_aln_dups_summary.log +bowtie2 -p 1 --very-sensitive -X 2000 --rg-id tutorial -x /nv/t1/genomes/hg38/bowtie2_index/hg38 --rf -1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_R1.fq -2 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_R2.fq | samtools view -bS - -@ 1 | samtools sort - -@ 1 -T /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tmplh2_a83a -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp.bam +samtools view -q 10 -b -@ 1 -U /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_fail_qc.bam /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp.bam > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam +samtools depth -b /nv/t1/genomes/hg38/refgene_anno/hg38_pre-mRNA.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam | awk '{counter++;sum+=$3}END{print sum/counter}' +bowtie2 -p 1 --very-sensitive -X 2000 --rg-id tutorial -x /nv/t1/genomes/hg38/bowtie2_index/hg38 --rf -1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_dups_R1.fq -2 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_dups_R2.fq | samtools view -bS - -@ 1 | samtools sort - -@ 1 -T /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tmplh2_a83a -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp_dups.bam +samtools view -q 10 -b -@ 1 -U /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_fail_qc_dups.bam /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp_dups.bam > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort_dups.bam +gzip -f /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R1.fq +gzip -f /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R2.fq +gzip -f /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_R1.fq +gzip -f /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_R2.fq +samtools index /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp.bam +samtools idxstats /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp.bam | grep -we 'chrM' -we 'chrMT' -we 'M' -we 'MT' -we 'rCRSd' -we 'rCRSd_3k'| cut -f 3 +samtools index /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam +samtools idxstats /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam | cut -f 1 | grep -vwe 'chrM' -vwe 'chrMT' -vwe 'M' -vwe 'MT' -vwe 'rCRSd' -vwe 'rCRSd_3k'| xargs samtools view -b -@ 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_noMT.bam +mv /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_noMT.bam /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam +samtools index /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam +samtools stats /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam | grep '^SN' | cut -f 2- | grep 'maximum length:' | cut -f 2- +samtools view -b -f 64 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam | samtools sort - -@ 1 > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam +samtools view -b -f 128 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam | samtools sort - -@ 1 > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE2.bam +samtools index /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp_dups.bam +samtools idxstats /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp_dups.bam | grep -we 'chrM' -we 'chrMT' -we 'M' -we 'MT' -we 'rCRSd' -we 'rCRSd_3k'| cut -f 3 +samtools index /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort_dups.bam +samtools idxstats /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort_dups.bam | cut -f 1 | grep -vwe 'chrM' -vwe 'chrMT' -vwe 'M' -vwe 'MT' -vwe 'rCRSd' -vwe 'rCRSd_3k'| xargs samtools view -b -@ 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort_dups.bam > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_noMT_dups.bam +mv /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_noMT_dups.bam /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort_dups.bam +samtools index /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort_dups.bam +samtools view -b -f 64 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort_dups.bam | samtools sort - -@ 1 > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_dups_PE1.bam +samtools view -b -f 128 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort_dups.bam | samtools sort - -@ 1 > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_dups_PE2.bam +preseq c_curve -v -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_out.txt -B /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_dups_PE1.bam +preseq lc_extrap -v -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_yield.txt -B /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_dups_PE1.bam +echo '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_yield.txt '$(samtools view -c -F 4 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_dups_PE1.bam)' '$(samtools view -c -F 4 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam) > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_counts.txt +awk '{sum+=$2} END {printf "%.0f", sum}' /nv/t1/genomes/hg38/hg38.chrom.sizes +Rscript /scratch/jps3dp/tools/databio/peppro/tools/PEPPRO.R preseq -i /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_yield.txt -r /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_counts.txt -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_plot +samtools index /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam +/scratch/jps3dp/tools/databio/peppro/tools/bamQC.py -i /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam -c 1 -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_bamQC.tsv +awk '{ for (i=1; i<=NF; ++i) { if ($i ~ "NRF") c=i } getline; print $c }' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_bamQC.tsv +awk '{ for (i=1; i<=NF; ++i) { if ($i ~ "PBC1") c=i } getline; print $c }' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_bamQC.tsv +awk '{ for (i=1; i<=NF; ++i) { if ($i ~ "PBC2") c=i } getline; print $c }' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_bamQC.tsv +samtools view -b -@ 1 -f 12 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp.bam > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_unmap.bam +samtools view -c -f 4 -@ 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp.bam +samtools view -bh -F 20 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam +samtools view -bh -f 16 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam +sed -n -e '/[[:space:]]+/w /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/plus_TSS.tsv' -e '/[[:space:]]-/w /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/minus_TSS.tsv' /nv/t1/genomes/hg38/refgene_anno/hg38_TSS.bed +/scratch/jps3dp/tools/databio/peppro/tools/pyTssEnrichment.py -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/plus_TSS.tsv -p ends -c 1 -z -v -s 6 -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_plus_TssEnrichment.txt +/scratch/jps3dp/tools/databio/peppro/tools/pyTssEnrichment.py -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/minus_TSS.tsv -p ends -c 1 -z -v -s 6 -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_minus_TssEnrichment.txt +Rscript /scratch/jps3dp/tools/databio/peppro/tools/PEPPRO.R tss -i /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_plus_TssEnrichment.txt /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_minus_TssEnrichment.txt +samtools view -H /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam | grep 'SN:' | awk -F':' '{print $2,$3}' | awk -F' ' -v OFS=' ' '{print $1,$3}' > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt +cut -f 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_keep.txt +grep -wf /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_keep.txt /nv/t1/genomes/hg38/ensembl_gtf/hg38_ensembl_TSS.bed | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_ensembl_tss.bed +grep -wf /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_keep.txt /nv/t1/genomes/hg38/ensembl_gtf/hg38_ensembl_gene_body.bed | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_ensembl_gene_body.bed +bedtools coverage -sorted -counts -s -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_ensembl_tss.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt | awk '$7>0' | sort -k4,4 -k7,7nr | sort -k4,4 -u > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_TSS_density.bed +bedtools coverage -sorted -counts -s -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_ensembl_gene_body.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt | awk '$7>0' | sort -k4 > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_gene_body_density.bed +join -j4 -o 1.1 1.2 1.3 1.4 1.6 1.7 2.2 2.3 2.7 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_TSS_density.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_gene_body_density.bed | awk '{print ($6/($3-$2))/($9/($8-$7))}' > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_pause_index.txt +sort -n /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_pause_index.txt | awk ' { a[i++]=$1; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }' +Rscript /scratch/jps3dp/tools/databio/peppro/tools/PEPPRO.R pi -i /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_pause_index.txt +samtools view -@ 4 -c -L /nv/t1/genomes/hg38/refgene_anno/hg38_pre-mRNA.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam +samtools view -@ 4 -c -L /nv/t1/genomes/hg38/refgene_anno/hg38_pre-mRNA.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam +perl /scratch/jps3dp/tools/databio/peppro/tools/fragment_length_dist.pl /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_fragLen.txt +sort -n /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_fragLen.txt | uniq -c > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_fragCount.txt +Rscript /scratch/jps3dp/tools/databio/peppro/tools/PEPPRO.R frag -l /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_fragLen.txt -c /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_fragCount.txt -p /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_fragLenDistribution.pdf -t /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_fragLenDistribution.txt +ln -sf /nv/t1/genomes/hg38/feat_annotation/hg38_annotations.bed.gz /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/hg38_annotations.bed.gz +gzip -f -d -c /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/hg38_annotations.bed.gz > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/hg38_annotations.bed +cut -f 4 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/hg38_annotations.bed | sort -u +awk -F' ' '{print>"/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/"$4}' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/hg38_annotations.bed +mv "/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3' UTR" "/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3_UTR" +cut -f 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt | grep -wf - /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3_UTR | cut -f 1-3 | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3_UTR_sort.bed +bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3_UTR_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_3_UTR_plus_coverage.bed +bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3_UTR_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_3_UTR_minus_coverage.bed +mv "/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5' UTR" "/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5_UTR" +cut -f 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt | grep -wf - /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5_UTR | cut -f 1-3 | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5_UTR_sort.bed +bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5_UTR_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_5_UTR_plus_coverage.bed +bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5_UTR_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_5_UTR_minus_coverage.bed +cut -f 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt | grep -wf - /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Enhancer | cut -f 1-3 | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Enhancer_sort.bed +bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Enhancer_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Enhancer_plus_coverage.bed +bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Enhancer_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Enhancer_minus_coverage.bed +cut -f 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt | grep -wf - /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Exon | cut -f 1-3 | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Exon_sort.bed +bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Exon_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Exon_plus_coverage.bed +bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Exon_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Exon_minus_coverage.bed +cut -f 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt | grep -wf - /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Intron | cut -f 1-3 | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Intron_sort.bed +bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Intron_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Intron_plus_coverage.bed +bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Intron_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Intron_minus_coverage.bed +cut -f 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt | grep -wf - /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter | cut -f 1-3 | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_sort.bed +bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_plus_coverage.bed +bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_minus_coverage.bed +mv "/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter Flanking Region" "/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_Flanking_Region" +cut -f 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt | grep -wf - /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_Flanking_Region | cut -f 1-3 | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_Flanking_Region_sort.bed +bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_Flanking_Region_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_Flanking_Region_plus_coverage.bed +bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_Flanking_Region_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_Flanking_Region_minus_coverage.bed +samtools view -@ 1 -q 10 -c -F4 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam +Rscript /scratch/jps3dp/tools/databio/peppro/tools/PEPPRO.R frif -n tutorial -r 166413 -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_plus_frif.pdf --bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_3_UTR_plus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_5_UTR_plus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Enhancer_plus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Exon_plus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Intron_plus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_plus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_Flanking_Region_plus_coverage.bed +samtools view -@ 1 -q 10 -c -F4 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam +Rscript /scratch/jps3dp/tools/databio/peppro/tools/PEPPRO.R frif -n tutorial -r 163584 -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_minus_frif.pdf --bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_3_UTR_minus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_5_UTR_minus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Enhancer_minus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Exon_minus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Intron_minus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_minus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_Flanking_Region_minus_coverage.bed +grep -wf /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_keep.txt /nv/t1/genomes/hg38/refgene_anno/hg38_exons.bed | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_exons_sort.bed +grep -wf /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_keep.txt /nv/t1/genomes/hg38/refgene_anno/hg38_introns.bed | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_introns_sort.bed +bedtools coverage -sorted -counts -s -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_exons_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_exons_coverage.bed +bedtools coverage -sorted -counts -s -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_introns_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_introns_coverage.bed +awk -v OFS=' ' '{readCount[$4] += $7; exonCount[$4] += 1; geneSizeKB[$4] += (sqrt(($3-$2+0.00000001)^2)/1000); gene[$4] = $4} END { for (a in readCount) { print gene[a], (readCount[a]/0.326735)/geneSizeKB[a]}}' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_exons_coverage.bed | awk '$2>0' | sort -k1 > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_exons_rpkm.tsv +awk -v OFS=' ' '{readCount[$4] += $7; exonCount[$4] += 1; geneSizeKB[$4] += (sqrt(($3-$2+0.00000001)^2)/1000); gene[$4] = $4} END { for (a in readCount) { print gene[a], (readCount[a]/0.326735)/geneSizeKB[a]}}' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_introns_coverage.bed | awk '$2>0' | sort -k1 > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_introns_rpkm.tsv +join -a1 -a2 -j1 -e0 -o 0 1.2 2.2 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_introns_rpkm.tsv /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_exons_rpkm.tsv > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_intron_exon.tsv +awk '$2>0' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_intron_exon.tsv | awk '{print $3/$2}' | sort -n | awk ' { a[i++]=$1; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }' +Rscript /scratch/jps3dp/tools/databio/peppro/tools/PEPPRO.R mrna -i /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_intron_exon.tsv --raw +samtools index /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam +/scratch/jps3dp/tools/databio/peppro/tools/bamSitesToWig.py -i /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam -c /nv/t1/genomes/hg38/hg38.chrom.sizes -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/signal_hg38/tutorial_plus_body_0-mer.bw -p 1 --variable-step --tail-edge +samtools index /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam +/scratch/jps3dp/tools/databio/peppro/tools/bamSitesToWig.py -i /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam -c /nv/t1/genomes/hg38/hg38.chrom.sizes -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/signal_hg38/tutorial_minus_body_0-mer.bw -p 1 --variable-step --tail-edge diff --git a/docs/files/examples/tutorial/results_pipeline/tutorial/PEPPRO_log.md b/docs/files/examples/tutorial/results_pipeline/tutorial/PEPPRO_log.md new file mode 100644 index 0000000..b94c30a --- /dev/null +++ b/docs/files/examples/tutorial/results_pipeline/tutorial/PEPPRO_log.md @@ -0,0 +1,2047 @@ +### [Pipeline run code and environment:] + +* Command: `/scratch/jps3dp/tools/databio/peppro/pipelines/peppro.py --sample-name tutorial --genome hg38 --input /scratch/jps3dp/DATA/proseq/tutorial_r1.fq.gz --single-or-paired paired --input2 /scratch/jps3dp/DATA/proseq/tutorial_r2.fq.gz --prealignments human_rDNA rCRSd -O /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline -M 8000` +* Compute host: udc-ba26-32c1 +* Working dir: /sfs/lustre/scratch/jps3dp/DATA/proseq +* Outfolder: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/ +* Pipeline started at: (07-31 20:43:17) elapsed: 1.0 _TIME_ + +### [Version log:] + +* Python version: 3.6.5 +* Pypiper dir: `/sfs/qumulo/qhome/jps3dp/.local/lib/python3.6/site-packages/pypiper` +* Pypiper version: 0.11.3 +* Pipeline dir: `/sfs/lustre/scratch/jps3dp/tools/databio/peppro/pipelines` +* Pipeline version: 0.8.0 +* Pipeline hash: a9b81015dd8bff626b2aa7be9e9038fa5ff2937a +* Pipeline branch: * dev +* Pipeline date: 2019-07-31 14:14:51 -0400 +* Pipeline diff: 5 files changed, 44 insertions(+), 44 deletions(-) + +### [Arguments passed to pipeline:] + +* `recover`: `False` +* `new_start`: `False` +* `dirty`: `False` +* `force_follow`: `False` +* `config_file`: `peppro.yaml` +* `output_parent`: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline` +* `mem`: `8000` +* `cores`: `1` +* `sample_name`: `tutorial` +* `input`: `['/scratch/jps3dp/DATA/proseq/tutorial_r1.fq.gz']` +* `input2`: `['/scratch/jps3dp/DATA/proseq/tutorial_r2.fq.gz']` +* `genome_assembly`: `hg38` +* `single_or_paired`: `paired` +* `runon`: `pro` +* `adapter`: `fastp` +* `dedup`: `seqkit` +* `trimmer`: `seqtk` +* `umi`: `False` +* `umi_len`: `8` +* `max_len`: `30` +* `sob`: `False` +* `scale`: `False` +* `parts`: `4` +* `prealignments`: `['human_rDNA', 'rCRSd']` +* `TSS_name`: `None` +* `ensembl_tss`: `None` +* `ensembl_gene_body`: `None` +* `pre_name`: `None` +* `anno_name`: `None` +* `exon_name`: `None` +* `intron_name`: `None` +* `coverage`: `False` +* `keep`: `False` +* `no_fifo`: `False` +* `complexity`: `True` +* `paired_end`: `True` + +---------------------------------------- + + +Changed status from initializing to running. + +Loading config file: /scratch/jps3dp/tools/databio/peppro/pipelines/peppro.yaml + +Local input file: /scratch/jps3dp/DATA/proseq/tutorial_r1.fq.gz +Local input file: /scratch/jps3dp/DATA/proseq/tutorial_r2.fq.gz + +> `File_mb` 50.42 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +> `Read_type` paired PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +> `Genome` hg38 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +### Merge/link and fastq conversion: (07-31 20:43:18) elapsed: 1.0 _TIME_ + +Number of input file sets: 2 +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/tutorial_R1.fastq.gz'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/tutorial_R1.fastq.gz` + + +> `ln -sf /scratch/jps3dp/DATA/proseq/tutorial_r1.fq.gz /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/tutorial_R1.fastq.gz` (418166) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 0GB. + PID: 418166; Command: ln; Return code: 0; Memory used: 0.0GB +Local input file: '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/tutorial_R1.fastq.gz' +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/tutorial_R2.fastq.gz'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/tutorial_R2.fastq.gz` + + +> `ln -sf /scratch/jps3dp/DATA/proseq/tutorial_r2.fq.gz /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/tutorial_R2.fastq.gz` (418167) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 0GB. + PID: 418167; Command: ln; Return code: 0; Memory used: 0.0GB +Local input file: '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/tutorial_R2.fastq.gz' +Found .fastq.gz file +Found .fastq.gz file +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1.fastq', '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2.fastq'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1.fastq`,`/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2.fastq` + + +> `gzip -f -d -c /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/tutorial_R1.fastq.gz > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1.fastq` (418169) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 0.001GB. + PID: 418169; Command: gzip; Return code: 0; Memory used: 0.001GB + +> `gzip -f -d -c /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/tutorial_R2.fastq.gz > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2.fastq` (418173) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 0.001GB. + PID: 418173; Command: gzip; Return code: 0; Memory used: 0.001GB +Follow: + +> `Raw_reads` 2000000 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +> `Fastq_reads` 2000000 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv +['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/tutorial_R1.fastq.gz', '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/tutorial_R2.fastq.gz'] + +### FASTQ processing: (07-31 20:43:22) elapsed: 4.0 _TIME_ + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq` + + +> `(fastp --overrepresentation_analysis --thread 1 --in1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1.fastq --adapter_sequence TGGAATTCTCGGGTGCCAAGG --length_required 26 --html /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.html --json /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.json --report_title 'tutorial' -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_noadap.fastq ) 2> /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.txt` (418211) + +
+
+Command completed. Elapsed time: 0:00:08. Running peak memory: 0.535GB. + PID: 418211; Command: fastp; Return code: 0; Memory used: 0.535GB + +> `seqkit rmdup --threads 1 --by-seq --ignore-case -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_dedup.fastq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_noadap.fastq` (418223) + +
+[INFO] 3022 duplicated records removed
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 0.535GB. + PID: 418223; Command: seqkit; Return code: 0; Memory used: 0.0GB + +> `seqtk trimfq -b 8 -L 30 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_noadap.fastq | seqtk seq -r - > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq` (418234,418241) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 0.535GB. + PID: 418234; Command: seqtk; Return code: 0; Memory used: 0.0GB + PID: 418241; Command: seqtk; Return code: 0; Memory used: 0.0GB +Follow: +> `FastP_report` fastqc/tutorial_R1_rmAdapter.html FastP_report None PEPPRO _OBJ_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/objects.tsv + +> `grep 'reads with adapter trimmed:' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.txt | head -n 1 | awk '{print $NF}'` + + +> `Reads_with_adapter` 598996.0 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +> `grep 'total bases:' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.txt | head -n 1 | awk '{print $NF}'` + + +> `grep 'bases trimmed due to adapters:' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.txt | awk '{print $NF}'` + + +> `Pct_adapter_contamination` 0.44 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +> `grep 'reads failed due to too short:' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.txt | head -n 1 | awk '{print $NF}'` + + +> `Reads_too_short` 522549.0 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +> `Duplicate_reads` 3022.0 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq` + + +> `seqtk trimfq -b 8 -L 30 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_dedup.fastq | seqtk seq -r - > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq` (418276,418277) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 0.535GB. + PID: 418276; Command: seqtk; Return code: 0; Memory used: 0.0GB + PID: 418277; Command: seqtk; Return code: 0; Memory used: 0.0GB +Follow: +Evaluating read trimming + +> `Trimmed_reads` 461368 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +> `Trim_loss_rate` 76.93 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq` + + +> `(fastp --overrepresentation_analysis --thread 1 --in1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2.fastq --adapter_sequence GATCGTCGGACTGTAGAACTCTGAAC --length_required 26 --html /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R2_rmAdapter.html --json /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R2_rmAdapter.json --report_title 'tutorial' --stdout ) 2> /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.txt | seqtk trimfq -e 8 - | seqtk seq -r - > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq` (418284,418285,418286) + +
+
+Command completed. Elapsed time: 0:00:07. Running peak memory: 0.535GB. + PID: 418285; Command: seqtk; Return code: 0; Memory used: 0.0GB + PID: 418284; Command: fastp; Return code: 0; Memory used: 0.091GB + PID: 418286; Command: seqtk; Return code: 0; Memory used: 0.001GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed_dups.fastq'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed_dups.fastq` + + +> `cp /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed_dups.fastq` (418296) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 0.535GB. + PID: 418296; Command: cp; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq.paired.fq', '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq.paired.fq'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq.paired.fq`,`/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq.paired.fq` + + +> `fastq_pair -t 1800000 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq` (418298) + +
+Left paired: 418940		Right paired: 418940
+Left single: 42428		Right single: 20579
+Writing the paired reads to /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq.paired.fq and /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq.paired.fq.
+Writing the single reads to /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq.single.fq and /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq.single.fq
+
+Command completed. Elapsed time: 0:00:02. Running peak memory: 0.535GB. + PID: 418298; Command: fastq_pair; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/repaired.flag'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/repaired.flag` + + +> `mv /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq.paired.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq` (418301) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 0.535GB. + PID: 418301; Command: mv; Return code: 0; Memory used: 0.0GB + +> `mv /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq.paired.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq` (418302) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 0.535GB. + PID: 418302; Command: mv; Return code: 0; Memory used: 0.0GB + +> `touch repaired.flag` (418303) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 0.535GB. + PID: 418303; Command: touch; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq.paired.fq', '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed_dups.fastq.paired.fq'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq.paired.fq`,`/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed_dups.fastq.paired.fq` + + +> `fastq_pair -t 1800000 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed_dups.fastq` (418304) + +
+Left paired: 420772		Right paired: 420772
+Left single: 43618		Right single: 18747
+Writing the paired reads to /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq.paired.fq and /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed_dups.fastq.paired.fq.
+Writing the single reads to /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq.single.fq and /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed_dups.fastq.single.fq
+
+Command completed. Elapsed time: 0:00:02. Running peak memory: 0.535GB. + PID: 418304; Command: fastq_pair; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/dups_repaired.flag'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/dups_repaired.flag` + + +> `mv /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq.paired.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq` (418306) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 0.535GB. + PID: 418306; Command: mv; Return code: 0; Memory used: 0.0GB + +> `mv /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed_dups.fastq.paired.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed_dups.fastq` (418307) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 0.535GB. + PID: 418307; Command: mv; Return code: 0; Memory used: 0.0GB + +> `touch dups_repaired.flag` (418308) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 0.535GB. + PID: 418308; Command: touch; Return code: 0; Memory used: 0.0GB + +### Prealignments (07-31 20:43:43) elapsed: 21.0 _TIME_ + +Prealignment assemblies: ['human_rDNA', 'rCRSd'] + +### Map to human_rDNA (07-31 20:43:43) elapsed: 0.0 _TIME_ + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/human_rDNA_bt2'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/human_rDNA_bt2` + + +> `mkfifo /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/human_rDNA_bt2` (418309) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 0.535GB. + PID: 418309; Command: mkfifo; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_bt_aln_summary.log', '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R2.fq.gz'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_bt_aln_summary.log`,`/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R2.fq.gz` + + +> `perl /scratch/jps3dp/tools/databio/peppro/tools/filter_paired_fq.pl /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/human_rDNA_bt2 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R1.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R2.fq` (418311) + +
+
+Not waiting for subprocesses: [418311] +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_bt_aln_summary.log', '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R2.fq.gz'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_bt_aln_summary.log`,`/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R2.fq.gz` + + +> `(bowtie2 -p 1 -k 1 -D 20 -R 3 -N 1 -L 20 -i S,1,0.50 -x /nv/t1/genomes/human_rDNA/bowtie2_index/human_rDNA --rg-id tutorial -U /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq --un /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/human_rDNA_bt2 > /dev/null) 2>/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_bt_aln_summary.log` (418312) + +
+not gzipping output
+
+Command completed. Elapsed time: 0:00:07. Running peak memory: 0.535GB. + PID: 418312; Command: bowtie2; Return code: 0; Memory used: 0.022GB + +> `grep 'aligned exactly 1 time' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_bt_aln_summary.log | awk '{print $1}'` + + +> `Aligned_reads_human_rDNA` 68452.0 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +> `Alignment_rate_human_rDNA` 14.84 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +### Map to human_rDNA (07-31 20:43:51) elapsed: 8.0 _TIME_ + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/human_rDNA_dups_bt2'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/human_rDNA_dups_bt2` + + +> `mkfifo /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/human_rDNA_dups_bt2` (418446) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 0.535GB. + PID: 418446; Command: mkfifo; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_bt_aln_dups_summary.log', '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_dups_R2.fq.gz'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_bt_aln_dups_summary.log`,`/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_dups_R2.fq.gz` + + +> `perl /scratch/jps3dp/tools/databio/peppro/tools/filter_paired_fq.pl /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/human_rDNA_dups_bt2 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed_dups.fastq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_dups_R1.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_dups_R2.fq` (418447) + +
+
+Not waiting for subprocesses: [418447] +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_bt_aln_dups_summary.log', '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_dups_R2.fq.gz'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_bt_aln_dups_summary.log`,`/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_dups_R2.fq.gz` + + +> `(bowtie2 -p 1 -k 1 -D 20 -R 3 -N 1 -L 20 -i S,1,0.50 -x /nv/t1/genomes/human_rDNA/bowtie2_index/human_rDNA --rg-id tutorial -U /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq --un /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/human_rDNA_dups_bt2 > /dev/null) 2>/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_bt_aln_dups_summary.log` (418448) + +
+not gzipping output
+34226 reads skipped
+0 reads lost
+
+Command completed. Elapsed time: 0:00:08. Running peak memory: 0.535GB. + PID: 418448; Command: bowtie2; Return code: 0; Memory used: 0.022GB + +### Map to rCRSd (07-31 20:43:59) elapsed: 8.0 _TIME_ + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/rCRSd_bt2'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/rCRSd_bt2` + + +> `mkfifo /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/rCRSd_bt2` (418461) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 0.535GB. + PID: 418461; Command: mkfifo; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_bt_aln_summary.log', '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_R2.fq.gz'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_bt_aln_summary.log`,`/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_R2.fq.gz` + + +> `perl /scratch/jps3dp/tools/databio/peppro/tools/filter_paired_fq.pl /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/rCRSd_bt2 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R1.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R2.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_R1.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_R2.fq` (418462) + +
+
+Not waiting for subprocesses: [418462] +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_bt_aln_summary.log', '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_R2.fq.gz'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_bt_aln_summary.log`,`/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_R2.fq.gz` + + +> `(bowtie2 -p 1 -k 1 -D 20 -R 3 -N 1 -L 20 -i S,1,0.50 -x /nv/t1/genomes/rCRSd/bowtie2_index/rCRSd --rg-id tutorial -U /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R1.fq --un /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/rCRSd_bt2 > /dev/null) 2>/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_bt_aln_summary.log` (418463) + +
+not gzipping output
+34533 reads skipped
+0 reads lost
+
+Command completed. Elapsed time: 0:00:07. Running peak memory: 0.535GB. + PID: 418463; Command: bowtie2; Return code: 0; Memory used: 0.024GB + +> `grep 'aligned exactly 1 time' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_bt_aln_summary.log | awk '{print $1}'` + + +> `Aligned_reads_rCRSd` 12998.0 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +> `Alignment_rate_rCRSd` 2.82 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +### Map to rCRSd (07-31 20:44:08) elapsed: 8.0 _TIME_ + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/rCRSd_dups_bt2'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/rCRSd_dups_bt2` + + +> `mkfifo /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/rCRSd_dups_bt2` (418497) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 0.535GB. + PID: 418497; Command: mkfifo; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_bt_aln_dups_summary.log', '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_dups_R2.fq.gz'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_bt_aln_dups_summary.log`,`/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_dups_R2.fq.gz` + + +> `perl /scratch/jps3dp/tools/databio/peppro/tools/filter_paired_fq.pl /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/rCRSd_dups_bt2 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_dups_R1.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_dups_R2.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_dups_R1.fq /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_dups_R2.fq` (418498) + +
+
+Not waiting for subprocesses: [418498] +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_bt_aln_dups_summary.log', '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_dups_R2.fq.gz'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_bt_aln_dups_summary.log`,`/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_dups_R2.fq.gz` + + +> `(bowtie2 -p 1 -k 1 -D 20 -R 3 -N 1 -L 20 -i S,1,0.50 -x /nv/t1/genomes/rCRSd/bowtie2_index/rCRSd --rg-id tutorial -U /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_dups_R1.fq --un /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/rCRSd_dups_bt2 > /dev/null) 2>/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_bt_aln_dups_summary.log` (418499) + +
+not gzipping output
+6499 reads skipped
+0 reads lost
+
+Command completed. Elapsed time: 0:00:07. Running peak memory: 0.535GB. + PID: 418499; Command: bowtie2; Return code: 0; Memory used: 0.024GB + +### Map to genome (07-31 20:44:15) elapsed: 7.0 _TIME_ + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam` + +6503 reads skipped +0 reads lost + +> `bowtie2 -p 1 --very-sensitive -X 2000 --rg-id tutorial -x /nv/t1/genomes/hg38/bowtie2_index/hg38 --rf -1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_R1.fq -2 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_R2.fq | samtools view -bS - -@ 1 | samtools sort - -@ 1 -T /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tmplh2_a83a -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp.bam` (418519,418530,418532) + +
+378215 reads; of these:
+  378215 (100.00%) were paired; of these:
+    41435 (10.96%) aligned concordantly 0 times
+    279989 (74.03%) aligned concordantly exactly 1 time
+    56791 (15.02%) aligned concordantly >1 times
+    ----
+    41435 pairs aligned concordantly 0 times; of these:
+      8119 (19.59%) aligned discordantly 1 time
+    ----
+    33316 pairs aligned 0 times concordantly or discordantly; of these:
+      66632 mates make up the pairs; of these:
+        44906 (67.39%) aligned 0 times
+        13697 (20.56%) aligned exactly 1 time
+        8029 (12.05%) aligned >1 times
+94.06% overall alignment rate
+
+Command completed. Elapsed time: 0:04:30. Running peak memory: 3.45GB. + PID: 418532; Command: samtools; Return code: 0; Memory used: 0.0GB + PID: 418519; Command: bowtie2; Return code: 0; Memory used: 3.45GB + PID: 418530; Command: samtools; Return code: 0; Memory used: 0.0GB + +> `samtools view -q 10 -b -@ 1 -U /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_fail_qc.bam /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp.bam > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam` (419432) + +
+
+Command completed. Elapsed time: 0:00:07. Running peak memory: 3.45GB. + PID: 419432; Command: samtools; Return code: 0; Memory used: 0.01GB +Follow: + +> `samtools depth -b /nv/t1/genomes/hg38/refgene_anno/hg38_pre-mRNA.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam | awk '{counter++;sum+=$3}END{print sum/counter}'` + + +> `Mapped_reads` 711524 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +> `QC_filtered_reads` 384789 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +> `Aligned_reads` 326735.0 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +> `Alignment_rate` 70.82 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +> `Total_efficiency` 16.34 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +> `Read_depth` 1.35 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort_dups.bam'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort_dups.bam` + + +> `bowtie2 -p 1 --very-sensitive -X 2000 --rg-id tutorial -x /nv/t1/genomes/hg38/bowtie2_index/hg38 --rf -1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_dups_R1.fq -2 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_dups_R2.fq | samtools view -bS - -@ 1 | samtools sort - -@ 1 -T /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tmplh2_a83a -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp_dups.bam` (419470,419471,419472) + +
+379736 reads; of these:
+  379736 (100.00%) were paired; of these:
+    41728 (10.99%) aligned concordantly 0 times
+    280272 (73.81%) aligned concordantly exactly 1 time
+    57736 (15.20%) aligned concordantly >1 times
+    ----
+    41728 pairs aligned concordantly 0 times; of these:
+      8143 (19.51%) aligned discordantly 1 time
+    ----
+    33585 pairs aligned 0 times concordantly or discordantly; of these:
+      67170 mates make up the pairs; of these:
+        45195 (67.28%) aligned 0 times
+        13717 (20.42%) aligned exactly 1 time
+        8258 (12.29%) aligned >1 times
+94.05% overall alignment rate
+
+Command completed. Elapsed time: 0:04:18. Running peak memory: 3.45GB. + PID: 419471; Command: samtools; Return code: 0; Memory used: 0.0GB + PID: 419470; Command: bowtie2; Return code: 0; Memory used: 3.45GB + PID: 419472; Command: samtools; Return code: 0; Memory used: 0.0GB + +> `samtools view -q 10 -b -@ 1 -U /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_fail_qc_dups.bam /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp_dups.bam > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort_dups.bam` (419887) + +
+
+Command completed. Elapsed time: 0:00:05. Running peak memory: 3.45GB. + PID: 419887; Command: samtools; Return code: 0; Memory used: 0.01GB + +### Compress all unmapped read files (07-31 20:53:45) elapsed: 570.0 _TIME_ + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R1.fq.gz'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R1.fq.gz` + + +> `gzip -f /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R1.fq` (419893) + +
+
+Command completed. Elapsed time: 0:00:03. Running peak memory: 3.45GB. + PID: 419893; Command: gzip; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R2.fq.gz'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R2.fq.gz` + + +> `gzip -f /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_R2.fq` (419896) + +
+
+Command completed. Elapsed time: 0:00:03. Running peak memory: 3.45GB. + PID: 419896; Command: gzip; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_R1.fq.gz'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_R1.fq.gz` + + +> `gzip -f /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_R1.fq` (419900) + +
+
+Command completed. Elapsed time: 0:00:03. Running peak memory: 3.45GB. + PID: 419900; Command: gzip; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_R2.fq.gz'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_R2.fq.gz` + + +> `gzip -f /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_R2.fq` (419905) + +
+
+Command completed. Elapsed time: 0:00:03. Running peak memory: 3.45GB. + PID: 419905; Command: gzip; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp.bam.bai'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp.bam.bai` + + +> `samtools index /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp.bam` (419909) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 419909; Command: samtools; Return code: 0; Memory used: 0.0GB + +> `samtools idxstats /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp.bam | grep -we 'chrM' -we 'chrMT' -we 'M' -we 'MT' -we 'rCRSd' -we 'rCRSd_3k'| cut -f 3` + + +> `Mitochondrial_reads` 249 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_noMT.bam'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_noMT.bam` + + +> `samtools index /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam` (419914) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 419914; Command: samtools; Return code: 0; Memory used: 0.0GB + +> `samtools idxstats /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam | cut -f 1 | grep -vwe 'chrM' -vwe 'chrMT' -vwe 'M' -vwe 'MT' -vwe 'rCRSd' -vwe 'rCRSd_3k'| xargs samtools view -b -@ 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_noMT.bam` (419916,419917,419918,419919) + +
+
+Command completed. Elapsed time: 0:00:04. Running peak memory: 3.45GB. + PID: 419916; Command: samtools; Return code: 0; Memory used: 0.0GB + PID: 419918; Command: grep; Return code: 0; Memory used: 0.0GB + PID: 419917; Command: cut; Return code: 0; Memory used: 0.0GB + PID: 419919; Command: xargs; Return code: 0; Memory used: 0.0GB + +> `mv /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_noMT.bam /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam` (419925) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 419925; Command: mv; Return code: 0; Memory used: 0.0GB + +> `samtools index /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam` (419926) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 419926; Command: samtools; Return code: 0; Memory used: 0.0GB + +> `samtools stats /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam | grep '^SN' | cut -f 2- | grep 'maximum length:' | cut -f 2-` + + +### Split BAM file (07-31 20:54:07) elapsed: 22.0 _TIME_ + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam', '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE2.bam'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam`,`/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE2.bam` + + +> `samtools view -b -f 64 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam | samtools sort - -@ 1 > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam` (419935,419936) + +
+
+Command completed. Elapsed time: 0:00:08. Running peak memory: 3.45GB. + PID: 419935; Command: samtools; Return code: 0; Memory used: 0.0GB + PID: 419936; Command: samtools; Return code: 0; Memory used: 0.087GB + +> `samtools view -b -f 128 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam | samtools sort - -@ 1 > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE2.bam` (419946,419947) + +
+
+Command completed. Elapsed time: 0:00:05. Running peak memory: 3.45GB. + PID: 419946; Command: samtools; Return code: 0; Memory used: 0.0GB + PID: 419947; Command: samtools; Return code: 0; Memory used: 0.082GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp_dups.bam.bai'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp_dups.bam.bai` + + +> `samtools index /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp_dups.bam` (419953) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 419953; Command: samtools; Return code: 0; Memory used: 0.0GB + +> `samtools idxstats /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp_dups.bam | grep -we 'chrM' -we 'chrMT' -we 'M' -we 'MT' -we 'rCRSd' -we 'rCRSd_3k'| cut -f 3` + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_noMT_dups.bam'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_noMT_dups.bam` + + +> `samtools index /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort_dups.bam` (419959) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 419959; Command: samtools; Return code: 0; Memory used: 0.0GB + +> `samtools idxstats /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort_dups.bam | cut -f 1 | grep -vwe 'chrM' -vwe 'chrMT' -vwe 'M' -vwe 'MT' -vwe 'rCRSd' -vwe 'rCRSd_3k'| xargs samtools view -b -@ 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort_dups.bam > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_noMT_dups.bam` (419961,419962,419963,419964) + +
+
+Command completed. Elapsed time: 0:00:04. Running peak memory: 3.45GB. + PID: 419963; Command: grep; Return code: 0; Memory used: 0.0GB + PID: 419961; Command: samtools; Return code: 0; Memory used: 0.0GB + PID: 419962; Command: cut; Return code: 0; Memory used: 0.0GB + PID: 419964; Command: xargs; Return code: 0; Memory used: 0.013GB + +> `mv /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_noMT_dups.bam /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort_dups.bam` (419970) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 419970; Command: mv; Return code: 0; Memory used: 0.0GB + +> `samtools index /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort_dups.bam` (419971) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 419971; Command: samtools; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_dups_PE1.bam', '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_dups_PE2.bam'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_dups_PE1.bam`,`/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_dups_PE2.bam` + + +> `samtools view -b -f 64 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort_dups.bam | samtools sort - -@ 1 > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_dups_PE1.bam` (419973,419974) + +
+
+Command completed. Elapsed time: 0:00:04. Running peak memory: 3.45GB. + PID: 419973; Command: samtools; Return code: 0; Memory used: 0.0GB + PID: 419974; Command: samtools; Return code: 0; Memory used: 0.083GB + +> `samtools view -b -f 128 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort_dups.bam | samtools sort - -@ 1 > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_dups_PE2.bam` (419981,419982) + +
+
+Command completed. Elapsed time: 0:00:05. Running peak memory: 3.45GB. + PID: 419981; Command: samtools; Return code: 0; Memory used: 0.0GB + PID: 419982; Command: samtools; Return code: 0; Memory used: 0.08GB + +### Calculate library complexity (07-31 20:54:35) elapsed: 28.0 _TIME_ + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_out.txt'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_out.txt` + + +> `preseq c_curve -v -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_out.txt -B /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_dups_PE1.bam` (419989) + +
+BAM_INPUT
+TOTAL READS     = 330356
+COUNTS_SUM      = 330356
+DISTINCT READS  = 324913
+DISTINCT COUNTS = 18
+MAX COUNT       = 59
+COUNTS OF 1     = 320412
+OBSERVED COUNTS (60)
+1	320412
+2	3997
+3	383
+4	64
+5	22
+6	14
+7	5
+8	3
+9	1
+10	2
+12	1
+13	1
+15	2
+16	1
+31	1
+33	2
+36	1
+59	1
+
+
+Command completed. Elapsed time: 0:00:02. Running peak memory: 3.45GB. + PID: 419989; Command: preseq; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_yield.txt'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_yield.txt` + + +> `preseq lc_extrap -v -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_yield.txt -B /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_dups_PE1.bam` (419991) + +
+BAM_INPUT
+TOTAL READS     = 330356
+DISTINCT READS  = 324913
+DISTINCT COUNTS = 18
+MAX COUNT       = 59
+COUNTS OF 1     = 320412
+MAX TERMS       = 10
+OBSERVED COUNTS (60)
+1	320412
+2	3997
+3	383
+4	64
+5	22
+6	14
+7	5
+8	3
+9	1
+10	2
+12	1
+13	1
+15	2
+16	1
+31	1
+33	2
+36	1
+59	1
+
+[ESTIMATING YIELD CURVE]
+[BOOTSTRAPPING HISTOGRAM]
+.._..._..._____._..._.____...._..___......_____.__..._.___...._.._.._...____.__.__..._..._.______..._.____._.......____._...__.._..___._._..__.._..._.._____.___..__.___._.____.__._._._..__..._______....
+[COMPUTING CONFIDENCE INTERVALS]
+[WRITING OUTPUT]
+
+Command completed. Elapsed time: 0:00:02. Running peak memory: 3.45GB. + PID: 419991; Command: preseq; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_counts.txt'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_counts.txt` + + +> `echo '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_yield.txt '$(samtools view -c -F 4 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_dups_PE1.bam)' '$(samtools view -c -F 4 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam) > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_counts.txt` (419994) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 419994; Command: echo; Return code: 0; Memory used: 0.0GB + +> `awk '{sum+=$2} END {printf "%.0f", sum}' /nv/t1/genomes/hg38/hg38.chrom.sizes` + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_plot.pdf', '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_plot.png'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_plot.pdf`,`/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_plot.png` + + +> `Rscript /scratch/jps3dp/tools/databio/peppro/tools/PEPPRO.R preseq -i /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_yield.txt -r /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_counts.txt -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_preseq_plot` (420001) + +
+Processing tutorial
+INFO: Found real counts for tutorial - Total: 330356 Unique: 329997
+
+Library complexity plot completed!
+
+
+Command completed. Elapsed time: 0:00:05. Running peak memory: 3.45GB. + PID: 420001; Command: Rscript; Return code: 0; Memory used: 0.0GB +> `Library complexity` QC_hg38/tutorial_preseq_plot.pdf Library complexity QC_hg38/tutorial_preseq_plot.png PEPPRO _OBJ_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/objects.tsv + +### Calculate NRF, PBC1, and PBC2 (07-31 20:54:46) elapsed: 11.0 _TIME_ + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam.bai'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam.bai` + + +> `samtools index /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam` (420033) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 420033; Command: samtools; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_bamQC.tsv'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_bamQC.tsv` + + +> `/scratch/jps3dp/tools/databio/peppro/tools/bamQC.py -i /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam -c 1 -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_bamQC.tsv` (420035) + +
+Configured logger 'root' using pararead v0.6
+Registering input file: '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam'
+Temporary files will be stored in: '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tmp_tutorial_PE1_93hvn24v'
+Processing with 1 cores...
+[Name: chr1; Size: 248956422]
+[Name: chr2; Size: 242193529]
+[Name: chr3; Size: 198295559]
+[Name: chr4; Size: 190214555]
+[Name: chr5; Size: 181538259]
+[Name: chr6; Size: 170805979]
+[Name: chr7; Size: 159345973]
+[Name: chr8; Size: 145138636]
+[Name: chr9; Size: 138394717]
+[Name: chr10; Size: 133797422]
+[Name: chr11; Size: 135086622]
+[Name: chr12; Size: 133275309]
+[Name: chr13; Size: 114364328]
+[Name: chr14; Size: 107043718]
+[Name: chr15; Size: 101991189]
+[Name: chr16; Size: 90338345]
+[Name: chr17; Size: 83257441]
+[Name: chr18; Size: 80373285]
+[Name: chr19; Size: 58617616]
+[Name: chr20; Size: 64444167]
+[Name: chr21; Size: 46709983]
+[Name: chr22; Size: 50818468]
+[Name: chrX; Size: 156040895]
+[Name: chrY; Size: 57227415]
+[Name: chr1_KI270706v1_random; Size: 175055]
+[Name: chr1_KI270713v1_random; Size: 40745]
+[Name: chr14_GL000225v1_random; Size: 211173]
+[Name: chr14_GL000194v1_random; Size: 191469]
+[Name: chr14_KI270725v1_random; Size: 172810]
+[Name: chr14_KI270726v1_random; Size: 43739]
+[Name: chr17_GL000205v2_random; Size: 185591]
+[Name: chr22_KI270733v1_random; Size: 179772]
+[Name: chr22_KI270736v1_random; Size: 181920]
+[Name: chrUn_KI270442v1; Size: 392061]
+[Name: chrUn_KI270438v1; Size: 112505]
+[Name: chrUn_GL000195v1; Size: 182896]
+[Name: chrUn_GL000219v1; Size: 179198]
+[Name: chrUn_KI270750v1; Size: 148850]
+[Name: chrUn_GL000218v1; Size: 161147]
+Discarding 156 chunk(s) of reads: ['chrM', 'chr1_KI270707v1_random', 'chr1_KI270708v1_random', 'chr1_KI270709v1_random', 'chr1_KI270710v1_random', 'chr1_KI270711v1_random', 'chr1_KI270712v1_random', 'chr1_KI270714v1_random', 'chr2_KI270715v1_random', 'chr2_KI270716v1_random', 'chr3_GL000221v1_random', 'chr4_GL000008v2_random', 'chr5_GL000208v1_random', 'chr9_KI270717v1_random', 'chr9_KI270718v1_random', 'chr9_KI270719v1_random', 'chr9_KI270720v1_random', 'chr11_KI270721v1_random', 'chr14_GL000009v2_random', 'chr14_KI270722v1_random', 'chr14_KI270723v1_random', 'chr14_KI270724v1_random', 'chr15_KI270727v1_random', 'chr16_KI270728v1_random', 'chr17_KI270729v1_random', 'chr17_KI270730v1_random', 'chr22_KI270731v1_random', 'chr22_KI270732v1_random', 'chr22_KI270734v1_random', 'chr22_KI270735v1_random', 'chr22_KI270737v1_random', 'chr22_KI270738v1_random', 'chr22_KI270739v1_random', 'chrY_KI270740v1_random', 'chrUn_KI270302v1', 'chrUn_KI270304v1', 'chrUn_KI270303v1', 'chrUn_KI270305v1', 'chrUn_KI270322v1', 'chrUn_KI270320v1', 'chrUn_KI270310v1', 'chrUn_KI270316v1', 'chrUn_KI270315v1', 'chrUn_KI270312v1', 'chrUn_KI270311v1', 'chrUn_KI270317v1', 'chrUn_KI270412v1', 'chrUn_KI270411v1', 'chrUn_KI270414v1', 'chrUn_KI270419v1', 'chrUn_KI270418v1', 'chrUn_KI270420v1', 'chrUn_KI270424v1', 'chrUn_KI270417v1', 'chrUn_KI270422v1', 'chrUn_KI270423v1', 'chrUn_KI270425v1', 'chrUn_KI270429v1', 'chrUn_KI270466v1', 'chrUn_KI270465v1', 'chrUn_KI270467v1', 'chrUn_KI270435v1', 'chrUn_KI270468v1', 'chrUn_KI270510v1', 'chrUn_KI270509v1', 'chrUn_KI270518v1', 'chrUn_KI270508v1', 'chrUn_KI270516v1', 'chrUn_KI270512v1', 'chrUn_KI270519v1', 'chrUn_KI270522v1', 'chrUn_KI270511v1', 'chrUn_KI270515v1', 'chrUn_KI270507v1', 'chrUn_KI270517v1', 'chrUn_KI270529v1', 'chrUn_KI270528v1', 'chrUn_KI270530v1', 'chrUn_KI270539v1', 'chrUn_KI270538v1', 'chrUn_KI270544v1', 'chrUn_KI270548v1', 'chrUn_KI270583v1', 'chrUn_KI270587v1', 'chrUn_KI270580v1', 'chrUn_KI270581v1', 'chrUn_KI270579v1', 'chrUn_KI270589v1', 'chrUn_KI270590v1', 'chrUn_KI270584v1', 'chrUn_KI270582v1', 'chrUn_KI270588v1', 'chrUn_KI270593v1', 'chrUn_KI270591v1', 'chrUn_KI270330v1', 'chrUn_KI270329v1', 'chrUn_KI270334v1', 'chrUn_KI270333v1', 'chrUn_KI270335v1', 'chrUn_KI270338v1', 'chrUn_KI270340v1', 'chrUn_KI270336v1', 'chrUn_KI270337v1', 'chrUn_KI270363v1', 'chrUn_KI270364v1', 'chrUn_KI270362v1', 'chrUn_KI270366v1', 'chrUn_KI270378v1', 'chrUn_KI270379v1', 'chrUn_KI270389v1', 'chrUn_KI270390v1', 'chrUn_KI270387v1', 'chrUn_KI270395v1', 'chrUn_KI270396v1', 'chrUn_KI270388v1', 'chrUn_KI270394v1', 'chrUn_KI270386v1', 'chrUn_KI270391v1', 'chrUn_KI270383v1', 'chrUn_KI270393v1', 'chrUn_KI270384v1', 'chrUn_KI270392v1', 'chrUn_KI270381v1', 'chrUn_KI270385v1', 'chrUn_KI270382v1', 'chrUn_KI270376v1', 'chrUn_KI270374v1', 'chrUn_KI270372v1', 'chrUn_KI270373v1', 'chrUn_KI270375v1', 'chrUn_KI270371v1', 'chrUn_KI270448v1', 'chrUn_KI270521v1', 'chrUn_GL000220v1', 'chrUn_GL000224v1', 'chrUn_KI270741v1', 'chrUn_GL000226v1', 'chrUn_GL000213v1', 'chrUn_KI270743v1', 'chrUn_KI270744v1', 'chrUn_KI270745v1', 'chrUn_KI270746v1', 'chrUn_KI270747v1', 'chrUn_KI270748v1', 'chrUn_KI270749v1', 'chrUn_KI270751v1', 'chrUn_KI270752v1', 'chrUn_KI270753v1', 'chrUn_KI270754v1', 'chrUn_KI270755v1', 'chrUn_KI270756v1', 'chrUn_KI270757v1', 'chrUn_GL000214v1', 'chrUn_KI270742v1', 'chrUn_GL000216v2', 'chrEBV']
+Keeping 39 chunk(s) of reads: ['chr1', 'chr2', 'chr3', 'chr4', 'chr5', 'chr6', 'chr7', 'chr8', 'chr9', 'chr10', 'chr11', 'chr12', 'chr13', 'chr14', 'chr15', 'chr16', 'chr17', 'chr18', 'chr19', 'chr20', 'chr21', 'chr22', 'chrX', 'chrY', 'chr1_KI270706v1_random', 'chr1_KI270713v1_random', 'chr14_GL000225v1_random', 'chr14_GL000194v1_random', 'chr14_KI270725v1_random', 'chr14_KI270726v1_random', 'chr17_GL000205v2_random', 'chr22_KI270733v1_random', 'chr22_KI270736v1_random', 'chrUn_KI270442v1', 'chrUn_KI270438v1', 'chrUn_GL000195v1', 'chrUn_GL000219v1', 'chrUn_KI270750v1', 'chrUn_GL000218v1']
+Reduce step (merge files)...
+Merging 39 files into output file: '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_bamQC.tsv'
+
+Command completed. Elapsed time: 0:00:05. Running peak memory: 3.45GB. + PID: 420035; Command: /scratch/jps3dp/tools/databio/peppro/tools/bamQC.py; Return code: 0; Memory used: 0.0GB +Follow: + +> `awk '{ for (i=1; i<=NF; ++i) { if ($i ~ "NRF") c=i } getline; print $c }' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_bamQC.tsv` + + +> `awk '{ for (i=1; i<=NF; ++i) { if ($i ~ "PBC1") c=i } getline; print $c }' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_bamQC.tsv` + + +> `awk '{ for (i=1; i<=NF; ++i) { if ($i ~ "PBC2") c=i } getline; print $c }' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_bamQC.tsv` + + +> `NRF` 1.0 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +> `PBC1` 164998.5 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +> `PBC2` 164998.5 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_unmap.bam'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_unmap.bam` + + +> `samtools view -b -@ 1 -f 12 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp.bam > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_unmap.bam` (420082) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 420082; Command: samtools; Return code: 0; Memory used: 0.0GB +Follow: + +> `samtools view -c -f 4 -@ 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp.bam` + + +> `Unmapped_reads` 44906 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +### Split BAM by strand (07-31 20:54:53) elapsed: 7.0 _TIME_ + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam', '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam`,`/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam` + + +> `samtools view -bh -F 20 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam` (420086) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 420086; Command: samtools; Return code: 0; Memory used: 0.008GB + +> `samtools view -bh -f 16 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam` (420089) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 420089; Command: samtools; Return code: 0; Memory used: 0.008GB + +### Calculate TSS enrichment (07-31 20:54:55) elapsed: 3.0 _TIME_ + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/plus_TSS.tsv', '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/minus_TSS.tsv'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/plus_TSS.tsv`,`/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/minus_TSS.tsv` + + +> `sed -n -e '/[[:space:]]+/w /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/plus_TSS.tsv' -e '/[[:space:]]-/w /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/minus_TSS.tsv' /nv/t1/genomes/hg38/refgene_anno/hg38_TSS.bed` (420092) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 420092; Command: sed; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_plus_TssEnrichment.txt'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_plus_TssEnrichment.txt` + + +> `/scratch/jps3dp/tools/databio/peppro/tools/pyTssEnrichment.py -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/plus_TSS.tsv -p ends -c 1 -z -v -s 6 -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_plus_TssEnrichment.txt` (420093) + +
+
+Command completed. Elapsed time: 0:00:05. Running peak memory: 3.45GB. + PID: 420093; Command: /scratch/jps3dp/tools/databio/peppro/tools/pyTssEnrichment.py; Return code: 0; Memory used: 0.066GB + +> `TSS_Plus_Score` 56.2 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_minus_TssEnrichment.txt'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_minus_TssEnrichment.txt` + + +> `/scratch/jps3dp/tools/databio/peppro/tools/pyTssEnrichment.py -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/minus_TSS.tsv -p ends -c 1 -z -v -s 6 -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_minus_TssEnrichment.txt` (420142) + +
+
+Command completed. Elapsed time: 0:00:05. Running peak memory: 3.45GB. + PID: 420142; Command: /scratch/jps3dp/tools/databio/peppro/tools/pyTssEnrichment.py; Return code: 0; Memory used: 0.067GB + +> `TSS_Minus_Score` 17.9 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_TSSenrichment.pdf'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_TSSenrichment.pdf` + + +> `Rscript /scratch/jps3dp/tools/databio/peppro/tools/PEPPRO.R tss -i /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_plus_TssEnrichment.txt /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_minus_TssEnrichment.txt` (420375) + +
+
+Generating TSS plot with /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_plus_TssEnrichment.txt and /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_minus_TssEnrichment.txt
+TSS enrichment plot completed!
+
+
+Command completed. Elapsed time: 0:00:05. Running peak memory: 3.45GB. + PID: 420375; Command: Rscript; Return code: 0; Memory used: 0.0GB +> `TSS enrichment` QC_hg38/tutorial_TSSenrichment.pdf TSS enrichment QC_hg38/tutorial_TSSenrichment.png PEPPRO _OBJ_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/objects.tsv +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt` + + +> `samtools view -H /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam | grep 'SN:' | awk -F':' '{print $2,$3}' | awk -F' ' -v OFS=' ' '{print $1,$3}' > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt` (420407,420408,420409,420410) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420408; Command: grep; Return code: 0; Memory used: 0.0GB + PID: 420407; Command: samtools; Return code: 0; Memory used: 0.0GB + PID: 420410; Command: awk; Return code: 0; Memory used: 0.001GB + PID: 420409; Command: awk; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_keep.txt'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_keep.txt` + + +> `cut -f 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_keep.txt` (420412) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420412; Command: cut; Return code: 0; Memory used: 0.0GB + +### Calculate Pause Index (PI) (07-31 20:55:11) elapsed: 16.0 _TIME_ + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_ensembl_tss.bed', '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_ensembl_gene_body.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_ensembl_tss.bed`,`/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_ensembl_gene_body.bed` + + +> `grep -wf /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_keep.txt /nv/t1/genomes/hg38/ensembl_gtf/hg38_ensembl_TSS.bed | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_ensembl_tss.bed` (420414,420415) + +
+
+Command completed. Elapsed time: 0:00:02. Running peak memory: 3.45GB. + PID: 420414; Command: grep; Return code: 0; Memory used: 0.0GB + PID: 420415; Command: bedtools; Return code: 0; Memory used: 0.098GB + +> `grep -wf /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_keep.txt /nv/t1/genomes/hg38/ensembl_gtf/hg38_ensembl_gene_body.bed | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_ensembl_gene_body.bed` (420419,420420) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420419; Command: grep; Return code: 0; Memory used: 0.0GB + PID: 420420; Command: bedtools; Return code: 0; Memory used: 0.021GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_TSS_density.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_TSS_density.bed` + + +> `bedtools coverage -sorted -counts -s -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_ensembl_tss.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt | awk '$7>0' | sort -k4,4 -k7,7nr | sort -k4,4 -u > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_TSS_density.bed` (420423,420424,420425,420426) + +
+
+Command completed. Elapsed time: 0:00:02. Running peak memory: 3.45GB. + PID: 420423; Command: bedtools; Return code: 0; Memory used: 0.0GB + PID: 420425; Command: sort; Return code: 0; Memory used: 0.0GB + PID: 420424; Command: awk; Return code: 0; Memory used: 0.0GB + PID: 420426; Command: sort; Return code: 0; Memory used: 0.007GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_gene_body_density.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_gene_body_density.bed` + + +> `bedtools coverage -sorted -counts -s -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_ensembl_gene_body.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt | awk '$7>0' | sort -k4 > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_gene_body_density.bed` (420429,420430,420431) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 420430; Command: awk; Return code: 0; Memory used: 0.0GB + PID: 420429; Command: bedtools; Return code: 0; Memory used: 0.0GB + PID: 420431; Command: sort; Return code: 0; Memory used: 0.001GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_pause_index.txt'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_pause_index.txt` + + +> `join -j4 -o 1.1 1.2 1.3 1.4 1.6 1.7 2.2 2.3 2.7 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_TSS_density.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_gene_body_density.bed | awk '{print ($6/($3-$2))/($9/($8-$7))}' > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_pause_index.txt` (420434,420435) + +join: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_gene_body_density.bed:33: is not sorted: chr16 15950077 16143074 ABCC1 . + 73 +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420434; Command: join; Return code: 1; Memory used: 0.0GB + PID: 420435; Command: awk; Return code: 0; Memory used: 0.0GB +Subprocess returned nonzero result. Check above output for details +ERROR: Subprocess returned nonzero result, but pipeline is continuing because nofail=True + +> `sort -n /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_pause_index.txt | awk ' { a[i++]=$1; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }'` + + +> `Pause index` 108.18 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_pause_index.pdf'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_pause_index.pdf` + + +> `Rscript /scratch/jps3dp/tools/databio/peppro/tools/PEPPRO.R pi -i /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_pause_index.txt` (420440) + +
+Pause index plot completed!
+
+
+Command completed. Elapsed time: 0:00:05. Running peak memory: 3.45GB. + PID: 420440; Command: Rscript; Return code: 0; Memory used: 0.0GB +> `Pause index` QC_hg38/tutorial_pause_index.pdf Pause index QC_hg38/tutorial_pause_index.png PEPPRO _OBJ_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/objects.tsv + +### Calculate FRiP (07-31 20:55:22) elapsed: 11.0 _TIME_ + + +> `samtools view -@ 4 -c -L /nv/t1/genomes/hg38/refgene_anno/hg38_pre-mRNA.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam` + +326735.0 120762 + +> `Plus FRiP` 0.37 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +> `samtools view -@ 4 -c -L /nv/t1/genomes/hg38/refgene_anno/hg38_pre-mRNA.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam` + +326735.0 116268 + +> `Minus FRiP` 0.36 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +### Plot fragment distribution (07-31 20:55:23) elapsed: 1.0 _TIME_ + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_fragLenDistribution.pdf'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_fragLenDistribution.pdf` + + +> `perl /scratch/jps3dp/tools/databio/peppro/tools/fragment_length_dist.pl /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_fragLen.txt` (420499) + +
+
+Command completed. Elapsed time: 0:00:02. Running peak memory: 3.45GB. + PID: 420499; Command: perl; Return code: 0; Memory used: 0.003GB + +> `sort -n /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_fragLen.txt | uniq -c > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_fragCount.txt` (420502,420503) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420502; Command: sort; Return code: 0; Memory used: 0.0GB + PID: 420503; Command: uniq; Return code: 0; Memory used: 0.0GB + +> `Rscript /scratch/jps3dp/tools/databio/peppro/tools/PEPPRO.R frag -l /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_fragLen.txt -c /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_fragCount.txt -p /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_fragLenDistribution.pdf -t /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_fragLenDistribution.txt` (420506) + +
+Fragment distribution plot completed!
+
+
+Command completed. Elapsed time: 0:00:04. Running peak memory: 3.45GB. + PID: 420506; Command: Rscript; Return code: 0; Memory used: 0.0GB +> `Fragment distribution` QC_hg38/tutorial_fragLenDistribution.pdf Fragment distribution QC_hg38/tutorial_fragLenDistribution.png PEPPRO _OBJ_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/objects.tsv +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/hg38_annotations.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/hg38_annotations.bed` + + +> `ln -sf /nv/t1/genomes/hg38/feat_annotation/hg38_annotations.bed.gz /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/hg38_annotations.bed.gz` (420536) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420536; Command: ln; Return code: 0; Memory used: 0.0GB + +> `gzip -f -d -c /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/hg38_annotations.bed.gz > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/hg38_annotations.bed` (420537) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420537; Command: gzip; Return code: 0; Memory used: 0.0GB + +### Calculate fraction of reads in features (FRiF) (07-31 20:55:30) elapsed: 7.0 _TIME_ + + +> `cut -f 4 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/hg38_annotations.bed | sort -u` + +original_path: ["/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3' UTR"] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3' UTR` + + +> `awk -F' ' '{print>"/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/"$4}' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/hg38_annotations.bed` (420545) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 420545; Command: awk; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3_UTR'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3_UTR` + + +> `mv "/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3' UTR" "/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3_UTR"` (420547) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420547; Command: mv; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3_UTR_sort.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3_UTR_sort.bed` + + +> `cut -f 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt | grep -wf - /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3_UTR | cut -f 1-3 | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3_UTR_sort.bed` (420548,420549,420550,420551) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 420548; Command: cut; Return code: 0; Memory used: 0.0GB + PID: 420549; Command: grep; Return code: 0; Memory used: 0.0GB + PID: 420551; Command: bedtools; Return code: 0; Memory used: 0.0GB + PID: 420550; Command: cut; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_3_UTR_plus_coverage.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_3_UTR_plus_coverage.bed` + + +> `bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3_UTR_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_3_UTR_plus_coverage.bed` (420554) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420554; Command: bedtools; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_3_UTR_minus_coverage.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_3_UTR_minus_coverage.bed` + + +> `bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3_UTR_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_3_UTR_minus_coverage.bed` (420556) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420556; Command: bedtools; Return code: 0; Memory used: 0.0GB +original_path: ["/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5' UTR"] +Target exists: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5' UTR` +Skipped command: `awk -F' ' '{print>"/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/"$4}' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/hg38_annotations.bed` +Command ID incremented by: `1`. Current ID: `117` + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5_UTR'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5_UTR` + + +> `mv "/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5' UTR" "/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5_UTR"` (420559) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420559; Command: mv; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5_UTR_sort.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5_UTR_sort.bed` + + +> `cut -f 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt | grep -wf - /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5_UTR | cut -f 1-3 | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5_UTR_sort.bed` (420560,420561,420562,420563) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 420560; Command: cut; Return code: 0; Memory used: 0.0GB + PID: 420561; Command: grep; Return code: 0; Memory used: 0.0GB + PID: 420563; Command: bedtools; Return code: 0; Memory used: 0.028GB + PID: 420562; Command: cut; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_5_UTR_plus_coverage.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_5_UTR_plus_coverage.bed` + + +> `bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5_UTR_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_5_UTR_plus_coverage.bed` (420565) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420565; Command: bedtools; Return code: 0; Memory used: 0.001GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_5_UTR_minus_coverage.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_5_UTR_minus_coverage.bed` + + +> `bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5_UTR_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_5_UTR_minus_coverage.bed` (420568) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420568; Command: bedtools; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Enhancer'] +Target exists: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Enhancer` +Skipped command: `awk -F' ' '{print>"/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/"$4}' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/hg38_annotations.bed` +Command ID incremented by: `1`. Current ID: `125` + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Enhancer_sort.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Enhancer_sort.bed` + + +> `cut -f 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt | grep -wf - /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Enhancer | cut -f 1-3 | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Enhancer_sort.bed` (420570,420571,420572,420573) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 420570; Command: cut; Return code: 0; Memory used: 0.0GB + PID: 420572; Command: cut; Return code: 0; Memory used: 0.0GB + PID: 420571; Command: grep; Return code: 0; Memory used: 0.0GB + PID: 420573; Command: bedtools; Return code: 0; Memory used: 0.044GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Enhancer_plus_coverage.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Enhancer_plus_coverage.bed` + + +> `bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Enhancer_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Enhancer_plus_coverage.bed` (420576) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420576; Command: bedtools; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Enhancer_minus_coverage.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Enhancer_minus_coverage.bed` + + +> `bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Enhancer_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Enhancer_minus_coverage.bed` (420578) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420578; Command: bedtools; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Exon'] +Target exists: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Exon` +Skipped command: `awk -F' ' '{print>"/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/"$4}' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/hg38_annotations.bed` +Command ID incremented by: `1`. Current ID: `132` + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Exon_sort.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Exon_sort.bed` + + +> `cut -f 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt | grep -wf - /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Exon | cut -f 1-3 | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Exon_sort.bed` (420580,420581,420582,420583) + +
+
+Command completed. Elapsed time: 0:00:04. Running peak memory: 3.45GB. + PID: 420580; Command: cut; Return code: 0; Memory used: 0.0GB + PID: 420581; Command: grep; Return code: 0; Memory used: 0.0GB + PID: 420583; Command: bedtools; Return code: 0; Memory used: 0.169GB + PID: 420582; Command: cut; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Exon_plus_coverage.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Exon_plus_coverage.bed` + + +> `bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Exon_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Exon_plus_coverage.bed` (420588) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 420588; Command: bedtools; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Exon_minus_coverage.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Exon_minus_coverage.bed` + + +> `bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Exon_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Exon_minus_coverage.bed` (420591) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 420591; Command: bedtools; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Intron'] +Target exists: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Intron` +Skipped command: `awk -F' ' '{print>"/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/"$4}' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/hg38_annotations.bed` +Command ID incremented by: `1`. Current ID: `139` + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Intron_sort.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Intron_sort.bed` + + +> `cut -f 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt | grep -wf - /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Intron | cut -f 1-3 | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Intron_sort.bed` (420593,420595,420596,420597) + +
+
+Command completed. Elapsed time: 0:00:02. Running peak memory: 3.45GB. + PID: 420593; Command: cut; Return code: 0; Memory used: 0.0GB + PID: 420597; Command: bedtools; Return code: 0; Memory used: 0.081GB + PID: 420595; Command: grep; Return code: 0; Memory used: 0.0GB + PID: 420596; Command: cut; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Intron_plus_coverage.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Intron_plus_coverage.bed` + + +> `bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Intron_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Intron_plus_coverage.bed` (420604) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 420604; Command: bedtools; Return code: 0; Memory used: 0.007GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Intron_minus_coverage.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Intron_minus_coverage.bed` + + +> `bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Intron_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Intron_minus_coverage.bed` (420607) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 420607; Command: bedtools; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter'] +Target exists: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter` +Skipped command: `awk -F' ' '{print>"/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/"$4}' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/hg38_annotations.bed` +Command ID incremented by: `1`. Current ID: `146` + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_sort.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_sort.bed` + + +> `cut -f 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt | grep -wf - /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter | cut -f 1-3 | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_sort.bed` (420609,420610,420611,420612) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420609; Command: cut; Return code: 0; Memory used: 0.0GB + PID: 420610; Command: grep; Return code: 0; Memory used: 0.0GB + PID: 420612; Command: bedtools; Return code: 0; Memory used: 0.013GB + PID: 420611; Command: cut; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_plus_coverage.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_plus_coverage.bed` + + +> `bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_plus_coverage.bed` (420615) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420615; Command: bedtools; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_minus_coverage.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_minus_coverage.bed` + + +> `bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_minus_coverage.bed` (420617) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420617; Command: bedtools; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter Flanking Region'] +Target exists: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter Flanking Region` +Skipped command: `awk -F' ' '{print>"/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/"$4}' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/hg38_annotations.bed` +Command ID incremented by: `1`. Current ID: `153` + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_Flanking_Region'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_Flanking_Region` + + +> `mv "/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter Flanking Region" "/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_Flanking_Region"` (420619) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420619; Command: mv; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_Flanking_Region_sort.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_Flanking_Region_sort.bed` + + +> `cut -f 1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt | grep -wf - /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_Flanking_Region | cut -f 1-3 | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_Flanking_Region_sort.bed` (420620,420621,420622,420623) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 420620; Command: cut; Return code: 0; Memory used: 0.0GB + PID: 420622; Command: cut; Return code: 0; Memory used: 0.0GB + PID: 420621; Command: grep; Return code: 0; Memory used: 0.0GB + PID: 420623; Command: bedtools; Return code: 0; Memory used: 0.048GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_Flanking_Region_plus_coverage.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_Flanking_Region_plus_coverage.bed` + + +> `bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_Flanking_Region_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_Flanking_Region_plus_coverage.bed` (420626) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420626; Command: bedtools; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_Flanking_Region_minus_coverage.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_Flanking_Region_minus_coverage.bed` + + +> `bedtools coverage -sorted -counts -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_Flanking_Region_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_Flanking_Region_minus_coverage.bed` (420629) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420629; Command: bedtools; Return code: 0; Memory used: 0.0GB + +### Plot FRiF (07-31 20:55:52) elapsed: 22.0 _TIME_ + + +> `samtools view -@ 1 -q 10 -c -F4 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam` + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_plus_frif.pdf'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_plus_frif.pdf` + + +> `Rscript /scratch/jps3dp/tools/databio/peppro/tools/PEPPRO.R frif -n tutorial -r 166413 -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_plus_frif.pdf --bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_3_UTR_plus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_5_UTR_plus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Enhancer_plus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Exon_plus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Intron_plus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_plus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_Flanking_Region_plus_coverage.bed` (420632) + +
+Cumulative FRiF plot completed!
+
+
+Command completed. Elapsed time: 0:00:26. Running peak memory: 3.45GB. + PID: 420632; Command: Rscript; Return code: 0; Memory used: 0.0GB +> `Plus FRiF` QC_hg38/tutorial_plus_frif.pdf Plus FRiF QC_hg38/tutorial_plus_frif.png PEPPRO _OBJ_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/objects.tsv + +> `samtools view -@ 1 -q 10 -c -F4 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam` + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_minus_frif.pdf'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_minus_frif.pdf` + + +> `Rscript /scratch/jps3dp/tools/databio/peppro/tools/PEPPRO.R frif -n tutorial -r 163584 -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_minus_frif.pdf --bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_3_UTR_minus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_5_UTR_minus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Enhancer_minus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Exon_minus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Intron_minus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_minus_coverage.bed /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_Flanking_Region_minus_coverage.bed` (420681) + +
+Cumulative FRiF plot completed!
+
+
+Command completed. Elapsed time: 0:00:26. Running peak memory: 3.45GB. + PID: 420681; Command: Rscript; Return code: 0; Memory used: 0.0GB +> `Minus FRiF` QC_hg38/tutorial_minus_frif.pdf Minus FRiF QC_hg38/tutorial_minus_frif.png PEPPRO _OBJ_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/objects.tsv + +### Calculate mRNA contamination (07-31 20:56:44) elapsed: 52.0 _TIME_ + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_exons_sort.bed', '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_introns_sort.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_exons_sort.bed`,`/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_introns_sort.bed` + + +> `grep -wf /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_keep.txt /nv/t1/genomes/hg38/refgene_anno/hg38_exons.bed | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_exons_sort.bed` (420730,420731) + +
+
+Command completed. Elapsed time: 0:00:06. Running peak memory: 3.45GB. + PID: 420731; Command: bedtools; Return code: 0; Memory used: 0.086GB + PID: 420730; Command: grep; Return code: 0; Memory used: 0.0GB + +> `grep -wf /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_keep.txt /nv/t1/genomes/hg38/refgene_anno/hg38_introns.bed | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt | bedtools sort -i stdin -faidx /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_introns_sort.bed` (420737,420738,420739) + +
+
+Command completed. Elapsed time: 0:00:06. Running peak memory: 3.45GB. + PID: 420737; Command: grep; Return code: 0; Memory used: 0.0GB + PID: 420739; Command: bedtools; Return code: 0; Memory used: 0.005GB + PID: 420738; Command: bedtools; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_exons_coverage.bed', '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_introns_coverage.bed'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_exons_coverage.bed`,`/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_introns_coverage.bed` + + +> `bedtools coverage -sorted -counts -s -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_exons_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_exons_coverage.bed` (420747) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 420747; Command: bedtools; Return code: 0; Memory used: 0.0GB + +> `bedtools coverage -sorted -counts -s -a /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_introns_sort.bed -b /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_PE1.bam -g /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_introns_coverage.bed` (420750) + +
+
+Command completed. Elapsed time: 0:00:01. Running peak memory: 3.45GB. + PID: 420750; Command: bedtools; Return code: 0; Memory used: 0.014GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_exons_rpkm.tsv'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_exons_rpkm.tsv` + + +> `awk -v OFS=' ' '{readCount[$4] += $7; exonCount[$4] += 1; geneSizeKB[$4] += (sqrt(($3-$2+0.00000001)^2)/1000); gene[$4] = $4} END { for (a in readCount) { print gene[a], (readCount[a]/0.326735)/geneSizeKB[a]}}' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_exons_coverage.bed | awk '$2>0' | sort -k1 > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_exons_rpkm.tsv` (420753,420754,420755) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420753; Command: awk; Return code: 0; Memory used: 0.0GB + PID: 420755; Command: sort; Return code: 0; Memory used: 0.0GB + PID: 420754; Command: awk; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_introns_rpkm.tsv'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_introns_rpkm.tsv` + + +> `awk -v OFS=' ' '{readCount[$4] += $7; exonCount[$4] += 1; geneSizeKB[$4] += (sqrt(($3-$2+0.00000001)^2)/1000); gene[$4] = $4} END { for (a in readCount) { print gene[a], (readCount[a]/0.326735)/geneSizeKB[a]}}' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_introns_coverage.bed | awk '$2>0' | sort -k1 > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_introns_rpkm.tsv` (420757,420758,420759) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420757; Command: awk; Return code: 0; Memory used: 0.0GB + PID: 420759; Command: sort; Return code: 0; Memory used: 0.0GB + PID: 420758; Command: awk; Return code: 0; Memory used: 0.0GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_intron_exon.tsv'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_intron_exon.tsv` + + +> `join -a1 -a2 -j1 -e0 -o 0 1.2 2.2 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_introns_rpkm.tsv /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_exons_rpkm.tsv > /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_intron_exon.tsv` (420761) + +
+join: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_introns_rpkm.tsv:12: is not sorted: AARS	2.62812
+join: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_exons_rpkm.tsv:8: is not sorted: AARS	2.82081
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420761; Command: join; Return code: 1; Memory used: 0.0GB +Subprocess returned nonzero result. Check above output for details +ERROR: Subprocess returned nonzero result, but pipeline is continuing because nofail=True + +> `awk '$2>0' /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_intron_exon.tsv | awk '{print $3/$2}' | sort -n | awk ' { a[i++]=$1; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }'` + + +> `mRNA contamination` 0.63 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_mRNA_contamination.pdf'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_mRNA_contamination.pdf` + + +> `Rscript /scratch/jps3dp/tools/databio/peppro/tools/PEPPRO.R mrna -i /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_intron_exon.tsv --raw` (420768) + +
+mRNA contamination plot completed!
+
+Warning messages:
+1: Removed 3008 rows containing non-finite values (stat_boxplot). 
+2: Removed 3008 rows containing non-finite values (stat_boxplot). 
+3: Removed 3008 rows containing non-finite values (stat_summary). 
+4: Removed 3008 rows containing non-finite values (stat_boxplot). 
+5: Removed 3008 rows containing non-finite values (stat_boxplot). 
+6: Removed 3008 rows containing non-finite values (stat_summary). 
+
+Command completed. Elapsed time: 0:00:05. Running peak memory: 3.45GB. + PID: 420768; Command: Rscript; Return code: 0; Memory used: 0.0GB +> `mRNA contamination` QC_hg38/tutorial_mRNA_contamination.pdf mRNA contamination QC_hg38/tutorial_mRNA_contamination.png PEPPRO _OBJ_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/objects.tsv + +### Produce bigWig files (07-31 20:57:04) elapsed: 20.0 _TIME_ + +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/signal_hg38/tutorial_plus_body_0-mer.bw'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/signal_hg38/tutorial_plus_body_0-mer.bw` + + +> `samtools index /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam` (420816) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 420816; Command: samtools; Return code: 0; Memory used: 0.0GB + +> `/scratch/jps3dp/tools/databio/peppro/tools/bamSitesToWig.py -i /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam -c /nv/t1/genomes/hg38/hg38.chrom.sizes -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/signal_hg38/tutorial_plus_body_0-mer.bw -p 1 --variable-step --tail-edge` (420817) + +
+Configured logger 'root' using pararead v0.6
+Registering input file: '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_plus.bam'
+Temporary files will be stored in: 'tmp_tutorial_plus_v2s7uhd7'
+Processing with 1 cores...
+[Name: chr1; Size: 248956422]
+[Name: chr2; Size: 242193529]
+[Name: chr3; Size: 198295559]
+[Name: chr4; Size: 190214555]
+[Name: chr5; Size: 181538259]
+[Name: chr6; Size: 170805979]
+[Name: chr7; Size: 159345973]
+[Name: chr8; Size: 145138636]
+[Name: chr9; Size: 138394717]
+[Name: chr10; Size: 133797422]
+[Name: chr11; Size: 135086622]
+[Name: chr12; Size: 133275309]
+[Name: chr13; Size: 114364328]
+[Name: chr14; Size: 107043718]
+[Name: chr15; Size: 101991189]
+[Name: chr16; Size: 90338345]
+[Name: chr17; Size: 83257441]
+[Name: chr18; Size: 80373285]
+[Name: chr19; Size: 58617616]
+[Name: chr20; Size: 64444167]
+[Name: chr21; Size: 46709983]
+[Name: chr22; Size: 50818468]
+[Name: chrX; Size: 156040895]
+[Name: chrY; Size: 57227415]
+[Name: chr1_KI270706v1_random; Size: 175055]
+[Name: chr1_KI270713v1_random; Size: 40745]
+[Name: chr14_KI270726v1_random; Size: 43739]
+[Name: chr17_GL000205v2_random; Size: 185591]
+[Name: chr22_KI270733v1_random; Size: 179772]
+[Name: chr22_KI270736v1_random; Size: 181920]
+[Name: chrUn_KI270442v1; Size: 392061]
+[Name: chrUn_GL000195v1; Size: 182896]
+[Name: chrUn_GL000219v1; Size: 179198]
+[Name: chrUn_KI270750v1; Size: 148850]
+Discarding 161 chunk(s) of reads: ['chrM', 'chr1_KI270707v1_random', 'chr1_KI270708v1_random', 'chr1_KI270709v1_random', 'chr1_KI270710v1_random', 'chr1_KI270711v1_random', 'chr1_KI270712v1_random', 'chr1_KI270714v1_random', 'chr2_KI270715v1_random', 'chr2_KI270716v1_random', 'chr3_GL000221v1_random', 'chr4_GL000008v2_random', 'chr5_GL000208v1_random', 'chr9_KI270717v1_random', 'chr9_KI270718v1_random', 'chr9_KI270719v1_random', 'chr9_KI270720v1_random', 'chr11_KI270721v1_random', 'chr14_GL000009v2_random', 'chr14_GL000225v1_random', 'chr14_KI270722v1_random', 'chr14_GL000194v1_random', 'chr14_KI270723v1_random', 'chr14_KI270724v1_random', 'chr14_KI270725v1_random', 'chr15_KI270727v1_random', 'chr16_KI270728v1_random', 'chr17_KI270729v1_random', 'chr17_KI270730v1_random', 'chr22_KI270731v1_random', 'chr22_KI270732v1_random', 'chr22_KI270734v1_random', 'chr22_KI270735v1_random', 'chr22_KI270737v1_random', 'chr22_KI270738v1_random', 'chr22_KI270739v1_random', 'chrY_KI270740v1_random', 'chrUn_KI270302v1', 'chrUn_KI270304v1', 'chrUn_KI270303v1', 'chrUn_KI270305v1', 'chrUn_KI270322v1', 'chrUn_KI270320v1', 'chrUn_KI270310v1', 'chrUn_KI270316v1', 'chrUn_KI270315v1', 'chrUn_KI270312v1', 'chrUn_KI270311v1', 'chrUn_KI270317v1', 'chrUn_KI270412v1', 'chrUn_KI270411v1', 'chrUn_KI270414v1', 'chrUn_KI270419v1', 'chrUn_KI270418v1', 'chrUn_KI270420v1', 'chrUn_KI270424v1', 'chrUn_KI270417v1', 'chrUn_KI270422v1', 'chrUn_KI270423v1', 'chrUn_KI270425v1', 'chrUn_KI270429v1', 'chrUn_KI270466v1', 'chrUn_KI270465v1', 'chrUn_KI270467v1', 'chrUn_KI270435v1', 'chrUn_KI270438v1', 'chrUn_KI270468v1', 'chrUn_KI270510v1', 'chrUn_KI270509v1', 'chrUn_KI270518v1', 'chrUn_KI270508v1', 'chrUn_KI270516v1', 'chrUn_KI270512v1', 'chrUn_KI270519v1', 'chrUn_KI270522v1', 'chrUn_KI270511v1', 'chrUn_KI270515v1', 'chrUn_KI270507v1', 'chrUn_KI270517v1', 'chrUn_KI270529v1', 'chrUn_KI270528v1', 'chrUn_KI270530v1', 'chrUn_KI270539v1', 'chrUn_KI270538v1', 'chrUn_KI270544v1', 'chrUn_KI270548v1', 'chrUn_KI270583v1', 'chrUn_KI270587v1', 'chrUn_KI270580v1', 'chrUn_KI270581v1', 'chrUn_KI270579v1', 'chrUn_KI270589v1', 'chrUn_KI270590v1', 'chrUn_KI270584v1', 'chrUn_KI270582v1', 'chrUn_KI270588v1', 'chrUn_KI270593v1', 'chrUn_KI270591v1', 'chrUn_KI270330v1', 'chrUn_KI270329v1', 'chrUn_KI270334v1', 'chrUn_KI270333v1', 'chrUn_KI270335v1', 'chrUn_KI270338v1', 'chrUn_KI270340v1', 'chrUn_KI270336v1', 'chrUn_KI270337v1', 'chrUn_KI270363v1', 'chrUn_KI270364v1', 'chrUn_KI270362v1', 'chrUn_KI270366v1', 'chrUn_KI270378v1', 'chrUn_KI270379v1', 'chrUn_KI270389v1', 'chrUn_KI270390v1', 'chrUn_KI270387v1', 'chrUn_KI270395v1', 'chrUn_KI270396v1', 'chrUn_KI270388v1', 'chrUn_KI270394v1', 'chrUn_KI270386v1', 'chrUn_KI270391v1', 'chrUn_KI270383v1', 'chrUn_KI270393v1', 'chrUn_KI270384v1', 'chrUn_KI270392v1', 'chrUn_KI270381v1', 'chrUn_KI270385v1', 'chrUn_KI270382v1', 'chrUn_KI270376v1', 'chrUn_KI270374v1', 'chrUn_KI270372v1', 'chrUn_KI270373v1', 'chrUn_KI270375v1', 'chrUn_KI270371v1', 'chrUn_KI270448v1', 'chrUn_KI270521v1', 'chrUn_GL000220v1', 'chrUn_GL000224v1', 'chrUn_KI270741v1', 'chrUn_GL000226v1', 'chrUn_GL000213v1', 'chrUn_KI270743v1', 'chrUn_KI270744v1', 'chrUn_KI270745v1', 'chrUn_KI270746v1', 'chrUn_KI270747v1', 'chrUn_KI270748v1', 'chrUn_KI270749v1', 'chrUn_KI270751v1', 'chrUn_KI270752v1', 'chrUn_KI270753v1', 'chrUn_KI270754v1', 'chrUn_KI270755v1', 'chrUn_KI270756v1', 'chrUn_KI270757v1', 'chrUn_GL000214v1', 'chrUn_KI270742v1', 'chrUn_GL000216v2', 'chrUn_GL000218v1', 'chrEBV']
+Keeping 34 chunk(s) of reads: ['chr1', 'chr2', 'chr3', 'chr4', 'chr5', 'chr6', 'chr7', 'chr8', 'chr9', 'chr10', 'chr11', 'chr12', 'chr13', 'chr14', 'chr15', 'chr16', 'chr17', 'chr18', 'chr19', 'chr20', 'chr21', 'chr22', 'chrX', 'chrY', 'chr1_KI270706v1_random', 'chr1_KI270713v1_random', 'chr14_KI270726v1_random', 'chr17_GL000205v2_random', 'chr22_KI270733v1_random', 'chr22_KI270736v1_random', 'chrUn_KI270442v1', 'chrUn_GL000195v1', 'chrUn_GL000219v1', 'chrUn_KI270750v1']
+Reduce step (merge files)...
+Merging 34 files into output file: '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/signal_hg38/tutorial_plus_body_0-mer.bw'
+
+Command completed. Elapsed time: 0:00:06. Running peak memory: 3.45GB. + PID: 420817; Command: /scratch/jps3dp/tools/databio/peppro/tools/bamSitesToWig.py; Return code: 0; Memory used: 0.006GB +original_path: ['/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/signal_hg38/tutorial_minus_body_0-mer.bw'] +Target to produce: `/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/signal_hg38/tutorial_minus_body_0-mer.bw` + + +> `samtools index /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam` (421014) + +
+
+Command completed. Elapsed time: 0:00:00. Running peak memory: 3.45GB. + PID: 421014; Command: samtools; Return code: 0; Memory used: 0.0GB + +> `/scratch/jps3dp/tools/databio/peppro/tools/bamSitesToWig.py -i /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam -c /nv/t1/genomes/hg38/hg38.chrom.sizes -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/signal_hg38/tutorial_minus_body_0-mer.bw -p 1 --variable-step --tail-edge` (421015) + +
+Configured logger 'root' using pararead v0.6
+Registering input file: '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_minus.bam'
+Temporary files will be stored in: 'tmp_tutorial_minus_lycz3ftu'
+Processing with 1 cores...
+[Name: chr1; Size: 248956422]
+[Name: chr2; Size: 242193529]
+[Name: chr3; Size: 198295559]
+[Name: chr4; Size: 190214555]
+[Name: chr5; Size: 181538259]
+[Name: chr6; Size: 170805979]
+[Name: chr7; Size: 159345973]
+[Name: chr8; Size: 145138636]
+[Name: chr9; Size: 138394717]
+[Name: chr10; Size: 133797422]
+[Name: chr11; Size: 135086622]
+[Name: chr12; Size: 133275309]
+[Name: chr13; Size: 114364328]
+[Name: chr14; Size: 107043718]
+[Name: chr15; Size: 101991189]
+[Name: chr16; Size: 90338345]
+[Name: chr17; Size: 83257441]
+[Name: chr18; Size: 80373285]
+[Name: chr19; Size: 58617616]
+[Name: chr20; Size: 64444167]
+[Name: chr21; Size: 46709983]
+[Name: chr22; Size: 50818468]
+[Name: chrX; Size: 156040895]
+[Name: chrY; Size: 57227415]
+[Name: chr1_KI270713v1_random; Size: 40745]
+[Name: chr14_GL000225v1_random; Size: 211173]
+[Name: chr14_GL000194v1_random; Size: 191469]
+[Name: chr14_KI270725v1_random; Size: 172810]
+[Name: chr14_KI270726v1_random; Size: 43739]
+[Name: chr17_GL000205v2_random; Size: 185591]
+[Name: chr22_KI270733v1_random; Size: 179772]
+[Name: chrUn_KI270438v1; Size: 112505]
+[Name: chrUn_GL000195v1; Size: 182896]
+[Name: chrUn_GL000219v1; Size: 179198]
+[Name: chrUn_KI270750v1; Size: 148850]
+[Name: chrUn_GL000218v1; Size: 161147]
+Discarding 159 chunk(s) of reads: ['chrM', 'chr1_KI270706v1_random', 'chr1_KI270707v1_random', 'chr1_KI270708v1_random', 'chr1_KI270709v1_random', 'chr1_KI270710v1_random', 'chr1_KI270711v1_random', 'chr1_KI270712v1_random', 'chr1_KI270714v1_random', 'chr2_KI270715v1_random', 'chr2_KI270716v1_random', 'chr3_GL000221v1_random', 'chr4_GL000008v2_random', 'chr5_GL000208v1_random', 'chr9_KI270717v1_random', 'chr9_KI270718v1_random', 'chr9_KI270719v1_random', 'chr9_KI270720v1_random', 'chr11_KI270721v1_random', 'chr14_GL000009v2_random', 'chr14_KI270722v1_random', 'chr14_KI270723v1_random', 'chr14_KI270724v1_random', 'chr15_KI270727v1_random', 'chr16_KI270728v1_random', 'chr17_KI270729v1_random', 'chr17_KI270730v1_random', 'chr22_KI270731v1_random', 'chr22_KI270732v1_random', 'chr22_KI270734v1_random', 'chr22_KI270735v1_random', 'chr22_KI270736v1_random', 'chr22_KI270737v1_random', 'chr22_KI270738v1_random', 'chr22_KI270739v1_random', 'chrY_KI270740v1_random', 'chrUn_KI270302v1', 'chrUn_KI270304v1', 'chrUn_KI270303v1', 'chrUn_KI270305v1', 'chrUn_KI270322v1', 'chrUn_KI270320v1', 'chrUn_KI270310v1', 'chrUn_KI270316v1', 'chrUn_KI270315v1', 'chrUn_KI270312v1', 'chrUn_KI270311v1', 'chrUn_KI270317v1', 'chrUn_KI270412v1', 'chrUn_KI270411v1', 'chrUn_KI270414v1', 'chrUn_KI270419v1', 'chrUn_KI270418v1', 'chrUn_KI270420v1', 'chrUn_KI270424v1', 'chrUn_KI270417v1', 'chrUn_KI270422v1', 'chrUn_KI270423v1', 'chrUn_KI270425v1', 'chrUn_KI270429v1', 'chrUn_KI270442v1', 'chrUn_KI270466v1', 'chrUn_KI270465v1', 'chrUn_KI270467v1', 'chrUn_KI270435v1', 'chrUn_KI270468v1', 'chrUn_KI270510v1', 'chrUn_KI270509v1', 'chrUn_KI270518v1', 'chrUn_KI270508v1', 'chrUn_KI270516v1', 'chrUn_KI270512v1', 'chrUn_KI270519v1', 'chrUn_KI270522v1', 'chrUn_KI270511v1', 'chrUn_KI270515v1', 'chrUn_KI270507v1', 'chrUn_KI270517v1', 'chrUn_KI270529v1', 'chrUn_KI270528v1', 'chrUn_KI270530v1', 'chrUn_KI270539v1', 'chrUn_KI270538v1', 'chrUn_KI270544v1', 'chrUn_KI270548v1', 'chrUn_KI270583v1', 'chrUn_KI270587v1', 'chrUn_KI270580v1', 'chrUn_KI270581v1', 'chrUn_KI270579v1', 'chrUn_KI270589v1', 'chrUn_KI270590v1', 'chrUn_KI270584v1', 'chrUn_KI270582v1', 'chrUn_KI270588v1', 'chrUn_KI270593v1', 'chrUn_KI270591v1', 'chrUn_KI270330v1', 'chrUn_KI270329v1', 'chrUn_KI270334v1', 'chrUn_KI270333v1', 'chrUn_KI270335v1', 'chrUn_KI270338v1', 'chrUn_KI270340v1', 'chrUn_KI270336v1', 'chrUn_KI270337v1', 'chrUn_KI270363v1', 'chrUn_KI270364v1', 'chrUn_KI270362v1', 'chrUn_KI270366v1', 'chrUn_KI270378v1', 'chrUn_KI270379v1', 'chrUn_KI270389v1', 'chrUn_KI270390v1', 'chrUn_KI270387v1', 'chrUn_KI270395v1', 'chrUn_KI270396v1', 'chrUn_KI270388v1', 'chrUn_KI270394v1', 'chrUn_KI270386v1', 'chrUn_KI270391v1', 'chrUn_KI270383v1', 'chrUn_KI270393v1', 'chrUn_KI270384v1', 'chrUn_KI270392v1', 'chrUn_KI270381v1', 'chrUn_KI270385v1', 'chrUn_KI270382v1', 'chrUn_KI270376v1', 'chrUn_KI270374v1', 'chrUn_KI270372v1', 'chrUn_KI270373v1', 'chrUn_KI270375v1', 'chrUn_KI270371v1', 'chrUn_KI270448v1', 'chrUn_KI270521v1', 'chrUn_GL000220v1', 'chrUn_GL000224v1', 'chrUn_KI270741v1', 'chrUn_GL000226v1', 'chrUn_GL000213v1', 'chrUn_KI270743v1', 'chrUn_KI270744v1', 'chrUn_KI270745v1', 'chrUn_KI270746v1', 'chrUn_KI270747v1', 'chrUn_KI270748v1', 'chrUn_KI270749v1', 'chrUn_KI270751v1', 'chrUn_KI270752v1', 'chrUn_KI270753v1', 'chrUn_KI270754v1', 'chrUn_KI270755v1', 'chrUn_KI270756v1', 'chrUn_KI270757v1', 'chrUn_GL000214v1', 'chrUn_KI270742v1', 'chrUn_GL000216v2', 'chrEBV']
+Keeping 36 chunk(s) of reads: ['chr1', 'chr2', 'chr3', 'chr4', 'chr5', 'chr6', 'chr7', 'chr8', 'chr9', 'chr10', 'chr11', 'chr12', 'chr13', 'chr14', 'chr15', 'chr16', 'chr17', 'chr18', 'chr19', 'chr20', 'chr21', 'chr22', 'chrX', 'chrY', 'chr1_KI270713v1_random', 'chr14_GL000225v1_random', 'chr14_GL000194v1_random', 'chr14_KI270725v1_random', 'chr14_KI270726v1_random', 'chr17_GL000205v2_random', 'chr22_KI270733v1_random', 'chrUn_KI270438v1', 'chrUn_GL000195v1', 'chrUn_GL000219v1', 'chrUn_KI270750v1', 'chrUn_GL000218v1']
+Reduce step (merge files)...
+Merging 36 files into output file: '/sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/signal_hg38/tutorial_minus_body_0-mer.bw'
+
+Command completed. Elapsed time: 0:00:05. Running peak memory: 3.45GB. + PID: 421015; Command: /scratch/jps3dp/tools/databio/peppro/tools/bamSitesToWig.py; Return code: 0; Memory used: 0.007GB + +Changed status from running to completed. +Starting cleanup: 79 files; 8 conditional files for cleanup + +Cleaning up flagged intermediate files. . . + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_noadap.fastq +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_noadap.fastq` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_dedup.fastq +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_dedup.fastq` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq.single.fq +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq.single.fq` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq.single.fq +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq.single.fq` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/repaired.flag + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq.single.fq +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_trimmed.fastq.single.fq` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed_dups.fastq.single.fq +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed_dups.fastq.single.fq` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/dups_repaired.flag + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tmpcmta8okh +`rmdir /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tmpcmta8okh` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/human_rDNA_bt2 + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tmp4z58ml5o +`rmdir /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tmp4z58ml5o` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/human_rDNA_dups_bt2 + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tmp8zeo8d45 +`rmdir /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tmp8zeo8d45` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/rCRSd_bt2 + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tmpd16_9pvj +`rmdir /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tmpd16_9pvj` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/rCRSd_dups_bt2 + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tmplh2_a83a +`rmdir /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tmplh2_a83a` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_fail_qc_dups.bam +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_fail_qc_dups.bam` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_dups_R1.fq +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_dups_R1.fq` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_dups_R2.fq +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_human_rDNA_unmap_dups_R2.fq` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_dups_R1.fq +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_dups_R1.fq` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_dups_R2.fq +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/tutorial_rCRSd_unmap_dups_R2.fq` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp.bam.bai +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp.bam.bai` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam.bai +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort.bam.bai` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp_dups.bam.bai +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp_dups.bam.bai` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort_dups.bam.bai +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_sort_dups.bam.bai` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_dups_PE1.bam +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_dups_PE1.bam` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp_dups.bam +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp_dups.bam` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp.bam +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/aligned_hg38/tutorial_temp.bam` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/plus_TSS.tsv +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/plus_TSS.tsv` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_plus_TssEnrichment.txt +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_plus_TssEnrichment.txt` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/minus_TSS.tsv +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/minus_TSS.tsv` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_minus_TssEnrichment.txt +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_minus_TssEnrichment.txt` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_order.txt` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_keep.txt +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/chr_keep.txt` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_ensembl_tss.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_ensembl_tss.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_ensembl_gene_body.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_ensembl_gene_body.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_TSS_density.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_TSS_density.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_gene_body_density.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_gene_body_density.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_pause_index.txt +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_pause_index.txt` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_fragLen.txt +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_fragLen.txt` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_fragCount.txt +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_fragCount.txt` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/hg38_annotations.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/raw/hg38_annotations.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3_UTR +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3_UTR` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3_UTR_sort.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/3_UTR_sort.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_3_UTR_plus_coverage.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_3_UTR_plus_coverage.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_3_UTR_minus_coverage.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_3_UTR_minus_coverage.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5_UTR +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5_UTR` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5_UTR_sort.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/5_UTR_sort.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_5_UTR_plus_coverage.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_5_UTR_plus_coverage.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_5_UTR_minus_coverage.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_5_UTR_minus_coverage.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Enhancer +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Enhancer` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Enhancer_sort.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Enhancer_sort.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Enhancer_plus_coverage.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Enhancer_plus_coverage.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Enhancer_minus_coverage.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Enhancer_minus_coverage.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Exon +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Exon` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Exon_sort.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Exon_sort.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Exon_plus_coverage.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Exon_plus_coverage.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Exon_minus_coverage.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Exon_minus_coverage.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Intron +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Intron` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Intron_sort.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Intron_sort.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Intron_plus_coverage.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Intron_plus_coverage.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Intron_minus_coverage.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Intron_minus_coverage.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_sort.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_sort.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_plus_coverage.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_plus_coverage.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_minus_coverage.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_minus_coverage.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_Flanking_Region +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_Flanking_Region` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_Flanking_Region_sort.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/Promoter_Flanking_Region_sort.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_Flanking_Region_plus_coverage.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_Flanking_Region_plus_coverage.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_Flanking_Region_minus_coverage.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_Promoter_Flanking_Region_minus_coverage.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_exons_sort.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_exons_sort.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_introns_sort.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/hg38_introns_sort.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_exons_coverage.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_exons_coverage.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_introns_coverage.bed +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_introns_coverage.bed` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_exons_rpkm.tsv +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_exons_rpkm.tsv` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_introns_rpkm.tsv +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_introns_rpkm.tsv` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_intron_exon.tsv +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/QC_hg38/tutorial_intron_exon.tsv` + +Cleaning up conditional list. . . + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial*.fastq +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_processed.fastq` +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1.fastq` +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2.fastq` +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed_dups.fastq` +`rm /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2_trimmed.fastq` + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/*.fq + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/*.fastq + +Removing glob: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/*.log + +Removing glob: mkfifo /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/human_rDNA_bt2 + +Removing glob: mkfifo /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/human_rDNA_dups_bt2 + +Removing glob: mkfifo /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/rCRSd_bt2 + +Removing glob: mkfifo /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/prealignments/rCRSd_dups_bt2 + +> `Time` 0:14:01 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +> `Success` 07-31-20:57:16 PEPPRO _RES_ +original_path: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/stats.tsv + +##### [Epilogue:] +* Total elapsed time: 0:14:01 +* Peak memory used: 3.45 GB +* Pipeline completed at: (07-31 20:57:16) elapsed: 13.0 _TIME_ diff --git a/docs/files/examples/tutorial/results_pipeline/tutorial/PEPPRO_profile.tsv b/docs/files/examples/tutorial/results_pipeline/tutorial/PEPPRO_profile.tsv new file mode 100644 index 0000000..c58d0c8 --- /dev/null +++ b/docs/files/examples/tutorial/results_pipeline/tutorial/PEPPRO_profile.tsv @@ -0,0 +1,173 @@ +# Pipeline started at 07-31 20:43:16 + +418166 fa4b175b07 1 0:00:00.070000 0.0 ln lock.raw__tutorial_R1.fastq.gz +418167 4253151691 2 0:00:00.040000 0.0 ln lock.raw__tutorial_R2.fastq.gz +418169 0e417c1b10 3 0:00:01.160000 0.0007 gzip lock.fastq__tutorial_R2.fastq +418173 5053539199 4 0:00:01.110000 0.0007 gzip lock.fastq__tutorial_R2.fastq +418211 6d575db13e 5 0:00:07.760000 0.5352 fastp lock.fastq__tutorial_R1_trimmed.fastq +418223 1227473e92 6 0:00:01.290000 0.0 seqkit lock.fastq__tutorial_R1_trimmed.fastq +418234 a16bed34de 7 0:00:00.530000 0.0 seqtk lock.fastq__tutorial_R1_trimmed.fastq +418241 32a387817b 8 0:00:00.540000 0.0 seqtk lock.fastq__tutorial_R1_trimmed.fastq +418276 19af58ff58 9 0:00:00.490000 0.0 seqtk lock.fastq__tutorial_R1_processed.fastq +418277 91166398f0 10 0:00:00.500000 0.0 seqtk lock.fastq__tutorial_R1_processed.fastq +418285 dec700e855 12 0:00:06.980000 0.0 seqtk lock.fastq__tutorial_R2_trimmed.fastq +418284 310415f365 11 0:00:07 0.091 fastp lock.fastq__tutorial_R2_trimmed.fastq +418286 cc78891348 13 0:00:07.010000 0.0006 seqtk lock.fastq__tutorial_R2_trimmed.fastq +418296 ef7bae33d7 14 0:00:00.260000 0.0 cp lock.fastq__tutorial_R2_trimmed_dups.fastq +418298 03d8c6cdf5 15 0:00:01.710000 0.0 fastq_pair lock.fastq__tutorial_R2_trimmed.fastq.paired.fq +418301 63cbd3626e 16 0:00:00.090000 0.0 mv lock.fastq__repaired.flag +418302 02717bee3c 17 0:00:00.050000 0.0 mv lock.fastq__repaired.flag +418303 947f1f1a82 18 0:00:00.060000 0.0 touch lock.fastq__repaired.flag +418304 c8a2dfd336 19 0:00:01.730000 0.0 fastq_pair lock.fastq__tutorial_R2_trimmed_dups.fastq.paired.fq +418306 bc1cd85162 20 0:00:00.050000 0.0 mv lock.fastq__dups_repaired.flag +418307 16cea102ff 21 0:00:00.050000 0.0 mv lock.fastq__dups_repaired.flag +418308 b09f1692d8 22 0:00:00.040000 0.0 touch lock.fastq__dups_repaired.flag +418309 bb3e78443e 23 0:00:00.060000 0.0 mkfifo lock.prealignments__human_rDNA_bt2 +418312 01051eb8b7 25 0:00:07.230000 0.0222 bowtie2 lock.prealignments__tutorial_human_rDNA_unmap_R2.fq.gz +418446 d16eb9b182 26 0:00:00.210000 0.0 mkfifo lock.prealignments__human_rDNA_dups_bt2 +418448 f12c0f3a29 28 0:00:07.770000 0.0222 bowtie2 lock.prealignments__tutorial_human_rDNA_unmap_dups_R2.fq.gz +418461 8da9b3ec0d 29 0:00:00.100000 0.0 mkfifo lock.prealignments__rCRSd_bt2 +418463 567a992166 31 0:00:07.280000 0.0236 bowtie2 lock.prealignments__tutorial_rCRSd_unmap_R2.fq.gz +418497 509a3ea572 32 0:00:00.100000 0.0 mkfifo lock.prealignments__rCRSd_dups_bt2 +418499 fb3ee03ba2 34 0:00:06.840000 0.0236 bowtie2 lock.prealignments__tutorial_rCRSd_unmap_dups_R2.fq.gz +418532 425cef1162 37 0:04:30.220000 0.0 samtools lock.aligned_hg38__tutorial_sort.bam +418519 bd39211900 35 0:04:30.230000 3.4501 bowtie2 lock.aligned_hg38__tutorial_sort.bam +418530 ea03362230 36 0:04:30.250000 0.0 samtools lock.aligned_hg38__tutorial_sort.bam +419432 b0948a1062 38 0:00:06.860000 0.0105 samtools lock.aligned_hg38__tutorial_sort.bam +419471 ea03362230 40 0:04:13.520000 0.0 samtools lock.aligned_hg38__tutorial_sort_dups.bam +419470 6dae660057 39 0:04:13.570000 3.4502 bowtie2 lock.aligned_hg38__tutorial_sort_dups.bam +419472 e861c6fea8 41 0:04:17.870000 0.0 samtools lock.aligned_hg38__tutorial_sort_dups.bam +419887 cc1d9d54af 42 0:00:04.810000 0.0105 samtools lock.aligned_hg38__tutorial_sort_dups.bam +419893 2e9530bf6c 43 0:00:03.340000 0.0 gzip lock.prealignments__tutorial_human_rDNA_unmap_R1.fq.gz +419896 b6dc0c1159 44 0:00:03.470000 0.0 gzip lock.prealignments__tutorial_human_rDNA_unmap_R2.fq.gz +419900 cc81eefae4 45 0:00:03.270000 0.0 gzip lock.prealignments__tutorial_rCRSd_unmap_R1.fq.gz +419905 59a3f835bb 46 0:00:03.380000 0.0 gzip lock.prealignments__tutorial_rCRSd_unmap_R2.fq.gz +419909 2d7fb78b42 47 0:00:00.950000 0.0 samtools lock.aligned_hg38__tutorial_temp.bam.bai +419914 b0beeb4727 48 0:00:00.710000 0.0 samtools lock.aligned_hg38__tutorial_noMT.bam +419916 47b9c1e507 49 0:00:00.130000 0.0 samtools lock.aligned_hg38__tutorial_noMT.bam +419918 fca72ccf6f 51 0:00:00.140000 0.0 grep lock.aligned_hg38__tutorial_noMT.bam +419917 844085f6da 50 0:00:00.160000 0.0 cut lock.aligned_hg38__tutorial_noMT.bam +419919 f7d721533d 52 0:00:04.260000 0.0 xargs lock.aligned_hg38__tutorial_noMT.bam +419925 2284a2e42b 53 0:00:00.050000 0.0 mv lock.aligned_hg38__tutorial_noMT.bam +419926 b0beeb4727 54 0:00:00.730000 0.0 samtools lock.aligned_hg38__tutorial_noMT.bam +419935 53f83c7ee8 55 0:00:02.510000 0.0 samtools lock.aligned_hg38__tutorial_PE2.bam +419936 bdb367e67f 56 0:00:07.700000 0.0869 samtools lock.aligned_hg38__tutorial_PE2.bam +419946 6b4b9342e7 57 0:00:02.710000 0.0 samtools lock.aligned_hg38__tutorial_PE2.bam +419947 698da2957a 58 0:00:04.590000 0.0819 samtools lock.aligned_hg38__tutorial_PE2.bam +419953 f90daee77b 59 0:00:00.820000 0.0 samtools lock.aligned_hg38__tutorial_temp_dups.bam.bai +419959 8252985430 60 0:00:00.670000 0.0 samtools lock.aligned_hg38__tutorial_noMT_dups.bam +419963 fca72ccf6f 63 0:00:00.100000 0.0 grep lock.aligned_hg38__tutorial_noMT_dups.bam +419961 01b6aa2cf1 61 0:00:00.120000 0.0 samtools lock.aligned_hg38__tutorial_noMT_dups.bam +419962 844085f6da 62 0:00:00.910000 0.0 cut lock.aligned_hg38__tutorial_noMT_dups.bam +419964 6da75e14f4 64 0:00:04.140000 0.0126 xargs lock.aligned_hg38__tutorial_noMT_dups.bam +419970 587a654226 65 0:00:00.050000 0.0 mv lock.aligned_hg38__tutorial_noMT_dups.bam +419971 8252985430 66 0:00:00.750000 0.0 samtools lock.aligned_hg38__tutorial_noMT_dups.bam +419973 336503cd9a 67 0:00:02.530000 0.0 samtools lock.aligned_hg38__tutorial_dups_PE2.bam +419974 782e41dca8 68 0:00:04.380000 0.0828 samtools lock.aligned_hg38__tutorial_dups_PE2.bam +419981 e7f1aa708c 69 0:00:02.700000 0.0 samtools lock.aligned_hg38__tutorial_dups_PE2.bam +419982 4f89470829 70 0:00:04.710000 0.0797 samtools lock.aligned_hg38__tutorial_dups_PE2.bam +419989 f06f21f991 71 0:00:01.980000 0.0 preseq lock.QC_hg38__tutorial_preseq_out.txt +419991 1b55f62ace 72 0:00:02.380000 0.0 preseq lock.QC_hg38__tutorial_preseq_yield.txt +419994 292f1bbf00 73 0:00:00.630000 0.0 echo lock.QC_hg38__tutorial_preseq_counts.txt +420001 a8a28fd593 74 0:00:05.500000 0.0 Rscript lock.QC_hg38__tutorial_preseq_plot.png +420033 a571e678c8 75 0:00:00.550000 0.0 samtools lock.aligned_hg38__tutorial_PE1.bam.bai +420035 ce7aa6a88d 76 0:00:04.850000 0.0 /scratch/jps3dp/tools/databio/peppro/tools/bamQC.py lock.QC_hg38__tutorial_bamQC.tsv +420082 4e40678f75 77 0:00:00.790000 0.0 samtools lock.aligned_hg38__tutorial_unmap.bam +420086 51834b8cbb 78 0:00:01.340000 0.0078 samtools lock.aligned_hg38__tutorial_minus.bam +420089 d721511ee0 79 0:00:01.290000 0.0078 samtools lock.aligned_hg38__tutorial_minus.bam +420092 0d3ccd6e36 80 0:00:00.510000 0.0 sed lock.QC_hg38__minus_TSS.tsv +420093 4d3fb13c36 81 0:00:05.200000 0.066 /scratch/jps3dp/tools/databio/peppro/tools/pyTssEnrichment.py lock.QC_hg38__tutorial_plus_TssEnrichment.txt +420142 e8193c7830 82 0:00:05 0.0675 /scratch/jps3dp/tools/databio/peppro/tools/pyTssEnrichment.py lock.QC_hg38__tutorial_minus_TssEnrichment.txt +420375 7790439d41 83 0:00:04.690000 0.0 Rscript lock.QC_hg38__tutorial_TSSenrichment.pdf +420408 ee0e759359 85 0:00:00.070000 0.0 grep lock.QC_hg38__chr_order.txt +420407 ed923dfefe 84 0:00:00.110000 0.0 samtools lock.QC_hg38__chr_order.txt +420410 cfcc904afb 87 0:00:00.120000 0.0008 awk lock.QC_hg38__chr_order.txt +420409 11d4d2d744 86 0:00:00.140000 0.0 awk lock.QC_hg38__chr_order.txt +420412 492745bf50 88 0:00:00.050000 0.0 cut lock.QC_hg38__chr_keep.txt +420414 4b3a6514da 89 0:00:02.160000 0.0 grep lock.QC_hg38__hg38_ensembl_gene_body.bed +420415 fb40d88cc7 90 0:00:02.340000 0.0979 bedtools lock.QC_hg38__hg38_ensembl_gene_body.bed +420419 5d5eacd644 91 0:00:00.450000 0.0 grep lock.QC_hg38__hg38_ensembl_gene_body.bed +420420 6a6f27ea1e 92 0:00:00.490000 0.0205 bedtools lock.QC_hg38__hg38_ensembl_gene_body.bed +420423 f64f204df8 93 0:00:00.920000 0.0 bedtools lock.QC_hg38__tutorial_TSS_density.bed +420425 20dd9dc48f 95 0:00:01.440000 0.0 sort lock.QC_hg38__tutorial_TSS_density.bed +420424 44ead293ac 94 0:00:01.490000 0.0 awk lock.QC_hg38__tutorial_TSS_density.bed +420426 a8a9f5a8ad 96 0:00:01.520000 0.0073 sort lock.QC_hg38__tutorial_TSS_density.bed +420430 44ead293ac 98 0:00:01.370000 0.0 awk lock.QC_hg38__tutorial_gene_body_density.bed +420429 3cb646553a 97 0:00:01.390000 0.0 bedtools lock.QC_hg38__tutorial_gene_body_density.bed +420431 0a13d1e1b3 99 0:00:01.410000 0.0006 sort lock.QC_hg38__tutorial_gene_body_density.bed +420434 626a8e0a54 100 0:00:00.150000 0.0 join lock.QC_hg38__tutorial_pause_index.txt +420435 8efdaf1927 101 0:00:00.170000 0.0 awk lock.QC_hg38__tutorial_pause_index.txt +420440 75df813a31 102 0:00:05.130000 0.0 Rscript lock.QC_hg38__tutorial_pause_index.pdf +420499 b8e976f378 103 0:00:01.500000 0.0031 perl lock.QC_hg38__tutorial_fragLenDistribution.pdf +420502 d21c6d8200 104 0:00:00.310000 0.0 sort lock.QC_hg38__tutorial_fragLenDistribution.pdf +420503 1436e1600b 105 0:00:00.330000 0.0 uniq lock.QC_hg38__tutorial_fragLenDistribution.pdf +420506 c1d179856a 106 0:00:04.460000 0.0 Rscript lock.QC_hg38__tutorial_fragLenDistribution.pdf +420536 44f818c484 107 0:00:00.040000 0.0 ln lock.raw__hg38_annotations.bed +420537 eb760ffc0b 108 0:00:00.390000 0.0 gzip lock.raw__hg38_annotations.bed +420545 898546621c 109 0:00:01.180000 0.0 awk lock.QC_hg38__3' UTR +420547 85c4485210 110 0:00:00.050000 0.0 mv lock.QC_hg38__3_UTR +420548 33a9c258f8 111 0:00:00.040000 0.0 cut lock.QC_hg38__3_UTR_sort.bed +420549 ba3ea1abfa 112 0:00:00.800000 0.0 grep lock.QC_hg38__3_UTR_sort.bed +420551 7d505274b1 114 0:00:00.850000 0.0 bedtools lock.QC_hg38__3_UTR_sort.bed +420550 654c588244 113 0:00:00.870000 0.0 cut lock.QC_hg38__3_UTR_sort.bed +420554 ac3a434614 115 0:00:00.390000 0.0 bedtools lock.QC_hg38__tutorial_3_UTR_plus_coverage.bed +420556 60901cae45 116 0:00:00.380000 0.0 bedtools lock.QC_hg38__tutorial_3_UTR_minus_coverage.bed +420559 812ae956f3 118 0:00:00.050000 0.0 mv lock.QC_hg38__5_UTR +420560 33a9c258f8 119 0:00:00.040000 0.0 cut lock.QC_hg38__5_UTR_sort.bed +420561 d2cca0f4a0 120 0:00:00.690000 0.0 grep lock.QC_hg38__5_UTR_sort.bed +420563 742c257c60 122 0:00:00.730000 0.028 bedtools lock.QC_hg38__5_UTR_sort.bed +420562 654c588244 121 0:00:00.750000 0.0 cut lock.QC_hg38__5_UTR_sort.bed +420565 6112e37e63 123 0:00:00.350000 0.0006 bedtools lock.QC_hg38__tutorial_5_UTR_plus_coverage.bed +420568 e4b2ace32a 124 0:00:00.380000 0.0 bedtools lock.QC_hg38__tutorial_5_UTR_minus_coverage.bed +420570 33a9c258f8 126 0:00:00.040000 0.0 cut lock.QC_hg38__Enhancer_sort.bed +420572 654c588244 128 0:00:00.950000 0.0 cut lock.QC_hg38__Enhancer_sort.bed +420571 f3a5d7e7a7 127 0:00:00.970000 0.0 grep lock.QC_hg38__Enhancer_sort.bed +420573 b264785ca0 129 0:00:01.020000 0.0439 bedtools lock.QC_hg38__Enhancer_sort.bed +420576 fc3b721e58 130 0:00:00.400000 0.0 bedtools lock.QC_hg38__tutorial_Enhancer_plus_coverage.bed +420578 cdd70bbeb5 131 0:00:00.390000 0.0 bedtools lock.QC_hg38__tutorial_Enhancer_minus_coverage.bed +420580 33a9c258f8 133 0:00:00.050000 0.0 cut lock.QC_hg38__Exon_sort.bed +420581 58395d9bc2 134 0:00:03.420000 0.0 grep lock.QC_hg38__Exon_sort.bed +420583 d25e5e4712 136 0:00:03.610000 0.1694 bedtools lock.QC_hg38__Exon_sort.bed +420582 654c588244 135 0:00:03.630000 0.0 cut lock.QC_hg38__Exon_sort.bed +420588 531d7d759d 137 0:00:00.750000 0.0 bedtools lock.QC_hg38__tutorial_Exon_plus_coverage.bed +420591 ade7e9e18b 138 0:00:00.710000 0.0004 bedtools lock.QC_hg38__tutorial_Exon_minus_coverage.bed +420593 33a9c258f8 140 0:00:00.270000 0.0 cut lock.QC_hg38__Intron_sort.bed +420597 34f8c3cb2f 143 0:00:02.070000 0.0808 bedtools lock.QC_hg38__Intron_sort.bed +420595 7eb9090773 141 0:00:02.090000 0.0 grep lock.QC_hg38__Intron_sort.bed +420596 654c588244 142 0:00:02.100000 0.0 cut lock.QC_hg38__Intron_sort.bed +420604 858c0fd831 144 0:00:00.810000 0.007 bedtools lock.QC_hg38__tutorial_Intron_plus_coverage.bed +420607 1f51832780 145 0:00:00.790000 0.0 bedtools lock.QC_hg38__tutorial_Intron_minus_coverage.bed +420609 33a9c258f8 147 0:00:00.060000 0.0 cut lock.QC_hg38__Promoter_sort.bed +420610 c3ae13ce79 148 0:00:00.370000 0.0 grep lock.QC_hg38__Promoter_sort.bed +420612 e430520bed 150 0:00:00.400000 0.0128 bedtools lock.QC_hg38__Promoter_sort.bed +420611 654c588244 149 0:00:00.410000 0.0 cut lock.QC_hg38__Promoter_sort.bed +420615 7f5b30e014 151 0:00:00.340000 0.0 bedtools lock.QC_hg38__tutorial_Promoter_plus_coverage.bed +420617 5420859395 152 0:00:00.340000 0.0 bedtools lock.QC_hg38__tutorial_Promoter_minus_coverage.bed +420619 a10aa4d652 154 0:00:00.050000 0.0 mv lock.QC_hg38__Promoter_Flanking_Region +420620 33a9c258f8 155 0:00:00.040000 0.0 cut lock.QC_hg38__Promoter_Flanking_Region_sort.bed +420622 654c588244 157 0:00:01.250000 0.0 cut lock.QC_hg38__Promoter_Flanking_Region_sort.bed +420621 d1c8165050 156 0:00:01.270000 0.0 grep lock.QC_hg38__Promoter_Flanking_Region_sort.bed +420623 e18383f9a1 158 0:00:01.320000 0.0483 bedtools lock.QC_hg38__Promoter_Flanking_Region_sort.bed +420626 7b7ee0b66a 159 0:00:00.460000 0.0 bedtools lock.QC_hg38__tutorial_Promoter_Flanking_Region_plus_coverage.bed +420629 f5af9e0303 160 0:00:00.440000 0.0 bedtools lock.QC_hg38__tutorial_Promoter_Flanking_Region_minus_coverage.bed +420632 cf0610bf0d 161 0:00:26.020000 0.0 Rscript lock.QC_hg38__tutorial_plus_frif.pdf +420681 db2f92de95 162 0:00:25.780000 0.0 Rscript lock.QC_hg38__tutorial_minus_frif.pdf +420731 1f38fb1552 164 0:00:05.560000 0.0856 bedtools lock.QC_hg38__hg38_introns_sort.bed +420730 5d6515f139 163 0:00:05.570000 0.0 grep lock.QC_hg38__hg38_introns_sort.bed +420737 54d577c3ec 165 0:00:05.210000 0.0 grep lock.QC_hg38__hg38_introns_sort.bed +420739 5956af709b 167 0:00:05.910000 0.0049 bedtools lock.QC_hg38__hg38_introns_sort.bed +420738 76965aa884 166 0:00:05.930000 0.0 bedtools lock.QC_hg38__hg38_introns_sort.bed +420747 5302fa656e 168 0:00:00.790000 0.0 bedtools lock.QC_hg38__tutorial_introns_coverage.bed +420750 dc5c5ee148 169 0:00:01.120000 0.0138 bedtools lock.QC_hg38__tutorial_introns_coverage.bed +420753 df14b43f9e 170 0:00:00.420000 0.0 awk lock.QC_hg38__tutorial_exons_rpkm.tsv +420755 50c54eeaaf 172 0:00:00.430000 0.0 sort lock.QC_hg38__tutorial_exons_rpkm.tsv +420754 03f0563703 171 0:00:00.450000 0.0 awk lock.QC_hg38__tutorial_exons_rpkm.tsv +420757 9769db7a89 173 0:00:00.410000 0.0 awk lock.QC_hg38__tutorial_introns_rpkm.tsv +420759 6c1d9bbdf2 175 0:00:00.430000 0.0002 sort lock.QC_hg38__tutorial_introns_rpkm.tsv +420758 03f0563703 174 0:00:00.440000 0.0 awk lock.QC_hg38__tutorial_introns_rpkm.tsv +420761 66f253b516 176 0:00:00.070000 0.0 join lock.QC_hg38__tutorial_intron_exon.tsv +420768 4b064aa10d 177 0:00:05.400000 0.0 Rscript lock.QC_hg38__tutorial_mRNA_contamination.pdf +420816 cc71e2b81e 178 0:00:00.500000 0.0 samtools lock.signal_hg38__tutorial_plus_body_0-mer.bw +420817 b6c408492d 179 0:00:05.920000 0.0057 /scratch/jps3dp/tools/databio/peppro/tools/bamSitesToWig.py lock.signal_hg38__tutorial_plus_body_0-mer.bw +421014 7a8164b287 180 0:00:00.420000 0.0 samtools lock.signal_hg38__tutorial_minus_body_0-mer.bw +421015 63b0b8e486 181 0:00:05.220000 0.007 /scratch/jps3dp/tools/databio/peppro/tools/bamSitesToWig.py lock.signal_hg38__tutorial_minus_body_0-mer.bw diff --git a/docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_TSSenrichment.pdf b/docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_TSSenrichment.pdf new file mode 100644 index 0000000000000000000000000000000000000000..40fc47225cceb7754335020f3640ec3b50b43c62 GIT binary patch literal 5633 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 KM08Abng0XDXwXss literal 0 HcmV?d00001 diff --git a/docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_TSSenrichment.png b/docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_TSSenrichment.png new file mode 100644 index 0000000000000000000000000000000000000000..bff301c59f821e3c28902a146d22da5e5502b87c GIT binary patch literal 26362 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 literal 0 HcmV?d00001 diff --git a/docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_fragLenDistribution.png b/docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_fragLenDistribution.png new file mode 100644 index 0000000000000000000000000000000000000000..45e222f6d4e341c14c7ce8fa0f2742aacce6230b GIT binary patch literal 12998 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 literal 0 HcmV?d00001 diff --git a/docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_mRNA_contamination.pdf b/docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_mRNA_contamination.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f97fbbb2b3a5690a049bd26237817429732e1548 GIT binary patch literal 5048 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 literal 0 HcmV?d00001 diff --git a/docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_mRNA_contamination.png b/docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_mRNA_contamination.png new file mode 100644 index 0000000000000000000000000000000000000000..09ac1356d3151794fdccb47544ebb3477b7a9a25 GIT binary patch literal 5390 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 y-LwWHX2hos0D$ literal 0 HcmV?d00001 diff --git a/docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_minus_frif.pdf b/docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_minus_frif.pdf new file mode 100644 index 0000000000000000000000000000000000000000..df70d2677dc1526a48d3b2edb2af815e31e8e692 GIT binary patch literal 195496 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

p94ves?e0I&sMi~ZQ+^K&2*RR{hnpZjAN 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

COchZ;Ji`5gT1MAj- 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 TH1xDJ^bV}pvEzu9>5Bgk+Jxn{ literal 0 HcmV?d00001 diff --git a/docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_minus_frif.png b/docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_minus_frif.png new file mode 100644 index 0000000000000000000000000000000000000000..6fea7e3a5d0fcfb0e75fe878d3fa53f961c5f610 GIT binary patch literal 25148 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

ZH?JW*7x=(=pZ<6-PjDGfArSQd6_}gT;(^hW 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

pz?B3;N8SiPZ}jKiTqZ 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%0Ab@(p+(S%)svF7*;?qUU4Ul! zJIbfM0rA}E=anq|Taq+|ivQpGr}6#;Z-PMcg!I_>9B8PZ7g*E5M`$QRNa}&)Nf7)T z9fI(f_+VtLhVotu zm-l9be(tttgLlqzfUeB3$e^DLQj_5c^hV93G~Q4^mt4qh&ZlD?^f4Yr(1z4th*W!! z$B|Vb0{&5#ma=BiSipNQD@ZQAWi33R4|)8W7x)&wTCRjIp`lAN`IH&#C8(kvC?&`) zz3#JbdXBjm4^p9mEsms{!A^>5C0g=d1FM20xqPLRqfbkILrG zyo9P&=C84Y>S8#!0I0+xP$22<(N{rmSe8%|Rk>gjLbZlAJSX0utCVp%CX^r+U@QP} zX2_5PsPvHHpsucsG+_wlbwQo;pXQ2EJeP?7BwYpQ1L3UdFBwD<4)}m&_Wxs-pc&^; zv|);dk`(=dIy8NDH7hg9!q)2=aD4Lg1tcWJ9|zt^;751nQspi&`ZPz?+%{;oZh-O_ zAUC9)`8ofyjx->WgW?Ks4_KciF%J@2fN6(kwgqUP6!p*=*U#)$2cRCv>Moqkp+=$W zpMlR9Cx#)F$kEJv7K2O>1C%DKIc0O}niB(erpK^%hCBPRx+rF@BJo}1-r4TiI8`Xr z6;usC4&bEKVq@%@fT~c@Rszt6`lHtWn4AdAhZ8Ug0rq7&;5!~P&SC(8yW|w+uCboE|8viD zVb1@2n=W)4#4B1L{Cq$qxSWg9o|vhlNP&R`vq#2>5bG__cGNeaPNDt>0}4i2B8O|jLp##b0YsMFi;G*i#{j?8VU!3f?O|n z6f}3N;lpVh=H;oCY*dR4Fe&8v!eyYBf|mLJVO&W~1hI;Zf^cCkm@6RqiUW+yM;qUs zj(6asu=y;VbN9#wK_TY46ApwBK(hg@8sJA5psnXrqnME;4o9&8U6Dkhgu4fkLH_+p3Y=wtqz@o`kpK`y-o1syClW=TBZ#{yLx3cAAp zAiaW?-@(!u#P#y{;b>P7EW+XV8nqN0*mkTtdb=?H1t;=n4gV(@rw_scrT|e2hQijC z*cuZ;kddKJcj01SviaoQ3fX526Q?E9Ga&3lSiy!NVXOn^43JSZ!Dj}9@4(Fqg<)E< z#HP$Hc56+l`Y7d-@`R(NSaNjQOtY#r>gnuc%qDJ6f0d$^+X4=W%$y+afxm;TINH$S zQy`gXxtz(Yq8LK{WSQ6{cn_f_&ycB(mD$}C@ke|5iE+>33|0FTDfse4MP`?#6ellU zHKAqhqZ;D3xKW?RQpKZFM-%zAf|jK+JSl2repErEqE_tNXg-;wfv-;EvqYB_@9~9N z<%x#$3Y?k~v5BiI>mW~%CqLOmsfPM-S45L1pKy+9+62B09c;oM$Fd7RK@BW#BW>?ILX}sD>(ccsr2U#XMs#pHf=RR<)bqdgcD=;kKx@smYiV*fnnG zn%Y#>abY&fbM#2v_H-pAetSAZF{sY#(wv4*Z|#Fp{UdJ9wF5rl`2?9<8CqBA{t8Pw?KqrMF-!v#@tRA1kQ zkeUG|y79|QR^E~hx>^u#FF(7j0_uB;MyeTtbI&@=*ky@#!-UzWf<3B8lr(RhFnA}O zjCistA8y5~HOkO(WEYK8~zDjuF|s*GEsB+{_PJXs_vL_>(urXx|882hx{jJ#3HoT8ot znAreE0cLc`Bn0+p2eoIeMljpEq?$pU0LGs9^3U+;NMr#s0Wl}BGLWIt7+E!EjO7SQ z#_}mFot`khxetFx;@j9l(X^?28#`WA84~k^(nMZuD($HoKW++WHcdn$zziDE3^J=x zxgUy~;qfo*@jhUxC25t)5yk<))TU-;MnVog0hgy{IcER_UQ2<9c$Dr~Z7%Eg?g!$V6aaX#Z3;DwtNC66%x%yW&G!A16v z5e-U}%5t_GMw~>{hSUO#;P=gH>=3lt&05&r*c2WRQA!Z9$a^#_xa>1meCu08aq@=G z;9}dS#|;2q@Rc<&G^ZMGb!H*CaV8tiKH;#~p;}0&8p0Vds-+vXSa`phL+Eo``yj); zhzEF|S@lFz#D^Y4!7q@2@uO#MHvz#Vc8WI0E6B`l(MKVC7(uROp0U;ueDq^8b8<47@POglJ zp}C>BvZJZF2bLBB2{6$|H7dv1K?eJUJyPHf2>#UM*%KPe#`H9#BY96F0fB4*6Yr;t z-d15exO5VRL`g;9`LB)`at{LjU<#QQ>eI%-{2{KdZ69&af^ynePRFuN4p7EKM-nPl zwa!Rpkx)!P8oN=}!#B$0BQb1F8;JA?#nc~|5VZ^ow178wQubk}9O?*Ie(G3?<#~gE z5y0do?wM+`XiO5xx0@P8oV@@Eqy{(8t35@04ECs?{;83mz(l0LI6FuSfISma3qXW@ zKEgb92on=%5zINXgFtafFwC4n8PGs|qd`iZqQ3MFjd(=Ggs#R#ie8RxFN2axAx9tM zrj9m**La}M;{6yO0AXiO5P>}GDuFM0o|=S@$4$YxaX1HEX;gr9B~A|;n=xHqeA1|ctxAyrt= zo{}Lfl}{m+kSMIXVdUhZJ05M-2Rc844hU$BLjuy2XSZvuZ8ptlM>*dwa# zIYEqCc^pbV$h#WefoDb1nXw=$-cXqe=q%7iC@KJt!m^QuF{{OgK-Gdw#d<4Ml1VSHbqzXj106Goa`k3t@(NttQ{(}X@4Zfp>F+8V6jp0h40wm*^7Cxr|Bgj^8k**>gS3+Vj+c5$)=mPrvkL>}dQDKN^ zRh!D5Rg*_yuBQDw)yoiG#IgD~iazE(PJ} zCv*%0SbkI*v_UXHNMtY_7{jDamoA_DADK*rKNgPQ2O)!eK**@u%!vdt8mKue7h-ut zl;TL?von}~BBSocpG(bW1V*7*K~oP=V-jLWcSqTP21kdSe5See0Ak}I&|M6l04Ext z6!o-_0sN7@LbGYU10$PL_>c(o`wJrIlfVk>BW7eDa!q3k02f-jm5)gMBE^s% zrFqu?1~7y%uvCgUNz|Aw$rkz`3(3MHoU)1Y^pl;s;p`Kf-3Jf^a+oES%q}v> zA-EES?FvH zjS;jVL;{rj0bM%y>k|NSI%pl93R(v@{0JQd>>WM(GY1G2K$cTdw2&a1p#=lDIpQf} z23%SUFozLyT|goBXxu-W@L+kZxMiFaqH3G1o(+feDU}W2Ud*#;Ok^&=F34w7FzZ&; z0!$cPfOP;QJ_DG4K`s*!0Obby63PvD&T?ohJ}7J*om3kTORuE?%01DMfG8sg)|HUE zik)){C&8b71X(cm;i6NAM8&AteWneZyCp>ZwQ~+nEfiq@BcBmF$ANsX{H;;$v5^XL zC9ZYGoeJZkhQ$Q=MuWO4ClGO-a7Mw`BD8~xv20AlOrVtyMtET5Zp6yD@urZ&lFog& z5VFLAnL!5Gp#5*5vpk?emxI+t0JFnPWH;M@dL?wU{FydrSYY}g?j&w>>F0$&rZ)6x zt#pu(dcpIq|0L%yh46UFLzPN`0U$s)O`X5lT=@O8CPrs@DSAY=XivGJyaj)Og3WKN6irc%p5-EEU(H2#Gl55mEovtbRl>Hresq3J_`2- z(@mofmK}B}kYjdZkUoX8*zh70IWYVKVlNUbK(hywg?a{3Di>%J)I!{Lk>(l2{<)er z`av!R|Fo2bl%1*PaDI8k(=}M*zwz>M#pW77XyVVH)V#~*Y29q@jg{mw(n_F zs=c(uw1@NUc4?J?e&Fx(BBV3z%|)~cxAgSsbk%A`OkBdT3EnGx`W=~H-$xOpqmN{r z*CYy?Ncy9PoAau#qw`~`b?k)GZ~AoYLDGqjsdQtU;@r!IWur^k%3OOtHicd?d9rJd zRn6Z=CvG$KH@r%#Zf-CP_WOr!W&glJdbcLU&F!tttBIz&U1~s#Om{8R&s0)HVy}SGiFDI`+kp0h?|Jt)u45+$*0WR zp0-)~qq|6SwMakbGHH1#f#=59w^{nFryE1tLYjKEsAsiCM$7nkv#OliD80G0hNUZO zXdH~6H_&Gh$s>y_U*3#W7Dn~juDcSTPp`F)baM}3{dlB@Qq+Z0M8cm2*=sZ~kwSRA zr{mdHlhEUq19%F-cY^(Y%tPO;u#n=fB=0#t$?5Tv>HJboj>{P7V`}0=$5bluD}g>c z#Y#$FMP_U~tf@GmXvp03_-U?An zOCQlPX4%urmqbVC4g)K%mT0!n?VnM7r#P4SXMQ&cW2CB1rRZ-czE!i$B=17P5!M#H zc}DE`P4GzHKA;|Dq-aX-32?<#GbHvCRnt=YGi=O^dMveQyVD!qfOUDik zZSLGcc)h)3HaDeTz3Og?wk9RNzh=iY?;A4CU*SaFsP48ot{Ho^+v~+nSJ7M20CVp* zO0zuGyfylo4{OV)9o+j|>axB=Q^z&^4GnqiiY7CUOZyW9?1ZoO^l#sy`LMH$YMApr z^IE9pR|oTmrq@#80Tmr`8+2SoMEp%;_19Zl7vZy*}N!k8Btxq6y9k!e^>0b|@oC^991D>Y0xAHYuye zM;Z9CPkr`nieCNRe~J{vD(`$mJClcvkv|Wp*LAyc&Ho)rEgEn5#_jyNyaTua@<4P^ zqh_f(qCqp2?y1Dz%5Tg}>sP;enPT$erFD5Cmz!lwU(tOh51Vf^EkqxOePnCt-ZJJO z-XQZ2IQ`JBjJZPiT|&uBlcu!FdW(D9gA3@fHW59N6VRjToB(f8)n}6Tf~YnN>h1Fv zxqF2iFP;f{gwDS1TycB7{a1l$`}Jsw;>L9;>F(}+84YE<(n!4b@dLlg_P<$l$~(<% zDwMjcYj=wF$}&0Wc_{6xjqUHkY7hO9Uo@W^x^{paeX8q0yU!NQ+xLCyJy|K{ua6w1 z7qLrJs`Ul4klcHsJ1$ z`lyU#p-=A=gg>l^lH{o#E_2Yi(nfu8L}6~2a8);;YlY_u{_)9~=lN&0L{4lzPQClQ zLGS5{zdX1C=Ygh&DJGB4ZP?{qwR(N1wefXN-XGqI7z*iN76LA`Q=-?`_+4=c7NG)=<5XT`k-A7?Fs9Tjjn%bBJg)GW~KCo7uol# z*MDfxMXyD-UCW67L>KLH=(|%|%ujVGZrFZQ;g_OM-!3E>E^zC#ar*i}RYTWnsncYF zacNsf<#1BdJ@5Sd>rFVf-eU>*J;bL^Rqyk9Ii7-0+Ge~@#z*z|!6#a*fRu#J*$wNC z4bbK-+T&0q@w;DE+e=q`p{4!8bfUMZ_vjNz(V4fjuNJniKBmi_2vUgkYF`?bM5Y9{ zNplT1mc2Brx~Ips3{;eS0qB2gbKs|m-JY#m%E)(g8Z}2O!y`&wNJGZ;-9{LP@_<*S z!d}k6iQ}}pc%SN_zFE=Gx`5*F`BK#^d6T;DX4#&C)L^>%n?4tgV?w~hkA6}A`wG~YS~xoqK$)!ja~ zi&T$W8u&4?4Jn|+dVg1MDO6NnO_}HKkwR?LyWg;X%Ye)#;XvN2QsbUS`(oSnD$*{b zxUu{223}sGrnF#vwLvhKux5b7!{2zcC;WDWlEB+FzjYft94BVgB=c8YPrakneO6f% z&bgc#On|9KKPubje{X#DEv4Qt)%m$Ye#3*sr`q?PB6nq99jm!tZQMXueyY&vRQWr9 z4=?!lCfZVvd~9MgcygWRz7SCp;OE&u5Tw%~C78Z(`!;ezCZ%uWm@e&od9(aS`-D)% z80m?3z0bpjyGsUS2^(+h^}Jd3E6qU&tbN{6KjzzHF~&*4bSSX~7%R z6&3|eIGew#14^1dgb4V8eN`N)Mf{mN*<;x?+rySl-2O%1`QIrY@|xy-aXWVQV?_6J zI1!`#r9$BOTkQm00W(S(+f8r zx}Lu;<>xJb3$9wZHX9T7`7)Y&xshKU7q}F&ym{@Vn$!@_*y|G!$4k+Tc)L6m6>qra zt)b`+wVmh=D;J|TnYx?$&I~ zTc<%|Ms~}?>DLHLe^w84!+$q$<+$-`mFQa9|n z+auW1^2-`XfFE^~@lPN3JO@204sHA{bmhuBGK1LTS<0p`J+d)}G1}*+bp{X_V_WiK z{@DN*lf2q|53ep?*A0&?Zn~uBFDUtVVA9vs+6IFt( zLSrL1TGZ4(8IaS<26gezSdN2aefmmlSZ8wV`L6+1&8r>e&-(b!KXb)*GDH zY3@CbT>MB{))Tq?jv?L zukY@!&0k*_xyd|zyH3C;p!F#yrb`Zg3FRLl&fu#(2sj&Dc^N6oI^Hpg#7%Z%X?K~E z>rMq+cw$?!^UhuOHP>L?+XG!UEc$Qh_Xk*iC-8SQfg_8qdbPf~&s!gGVeiI(qX#;V zxPCQp#8tEYSPe7I?odMO$6Fs|Zi!^Z-}hAe*$zs4Nu^$!s(L`*&EMr_k9Gb`y?_0< zSat1?k;PyfHSkR5#v_k$7Bz9y2d7WWZwjczS>>&8`#r1Y%&k6lV_Z>#X0jdk;JK|W zRk=4s9Ndx|CcJx>NJ(gbBX?Tv=#ckJ`wJ(OBE{ zU6#uw{u$60Pz-Bzl%;unv}K;&Hd4Tat)ze+kVJ$Ci#%gU#G-TFpf&9&?rAUK2>+$k z)*h#S$DMebPOp&Ew&Tj#@lV7}`cJmgzD}D_AH+eR{W&^k)ls`f<9s*YkFoEQKd^@f zZr;|r9qD`CG-=r~`(D007O9@O<&3W0_eu+9o+bY9I+;47{=3H4%h%6!3AGh;?|`4{ zhL3|;Jw1CA&isU{E`hFu*JlH)KQ%!>rdlN{u8MtK^{5CA1q(_n0cOV3<46VlT!T#f zT&-TODA}1|2>-T~cw8;9%F``)hhzb;anOu+a6<%y@X-W9@UxLkD$52U;eGZR6w*`M z_COyKIEp=k6&R!~T=kPf5C&MUd595!K z#+-9?mb9m7GrOvcY<7RA?Qx))@Ehktx{++}R(J7FgUPwXu$5ayKR-6oTDr8q(Z%tO z|C{J^lRH&u-0$rdOvD|JED7&@0-fv%QZ#xu>^HNAG-giQ7sxq3O`CDG8}XAD5Z?IS>;3Qgth{itZWD zH^l#|y4}4qxwPHcAVLoQdC^IqFSh5DtWMEB?US$@IqJfosc$-Wn`uwIJXXAVy01B5 zojP-V&ODOd`K5O5ovA1FwRdXytp5rm)OGxP%KV(=lWAUdMknnvS5|1hUpXY&^iqEF zBubm#t7SO72%c{fVUhjQm7?P>@0za)bKmM#8TH**dl8OQKe(-rd-zXr)>vE7+xsgn z%=gY+XwSheEPC$x5wllrqrtBM$2P%h zrkBQ;(1G`4-%hqFbSR(B<8klQ|AzubN1 zkTk&b!HU=kZlN~q^_8c#*NX04*4(|lMAMSc=^{PJILkhv_vZe!cITk3gmyS|C-aX& z4&>-t+?L|D~F8CP4`!1%+Imf=kp@jV}qW5#JQCD?r)A2txieM z(=Pr#2wvQQ9NT!VAOE;5!;e@KQ7@l}s@Fd`Gt!qXeDJ9`G?XzT$nYck=dU{%;9zxf zBjbEXdc9VgiSdGMxXqq+Dv|10vG4Emw5uBw0X0Njz0{KyeH(^tPT5~lmovWbyyPY{%eXRbp0bIQzPxlzpp;ik4dq4dnf(LhU~7bxWi=n1uoUS zvu7~werScGwXCl^>Kf-1e)^*A@2Aq^Q_Oy_m+ef?Y`oi1B`6;#7k{%d7*LY10DpK- ze{Djie`4k)69JamPv7XhZr8Ht6aD;5>@IJp_%1cxyvm`d)6-7)=~+|F`?I}++614i zk@i28&z!&7QQhhJwm`W4(Vi1e;MLt)_g~Y@U+fI8INXq)_D*n`7MsH~=(@T7QIqBu zpPlLX>$F!K$ZK}qk@$6M2V?*wr*;UWhEa%@g{#d~4gU^=VoZn|PaSihp* zPjh4>^@4GDu7cA?@46R)pVqSx+{N9u7_{+3mj?^uZ2nJJXiGfeSCQA~HviL)RbrQa zDKxQFOdt0fBikp0;vXhWi+|8VY0O2w(|ZiN$t!|qj&%V-bv2me@}S*%^S(wBL1$AtQRy7SwHPlwYF zo~Zcq4^=6{z~Q}wR$iz~}dU+kdVxmuz~u@77L?O^}%%-WP8@-%*S$N6)AGc6CV zmS!)US48@=Q&#~;`m}D1Uyi?b>0Dp#rY_ysu}kObwQk)^m`V6$@mk}PM;3AL4F-Ev z?33(E=iXR}2jNlc$UX;xmEUSf#L*=qS@Y**G5_tmTD;}Uc@0(Gn|@_fb5pXLRFoQ` zf>L|2Pqn*)@-z8F@RvXoz1#$@~gK1Orq4^F}o zDOv0LjeW_n%h5-K`+xOfiqO!FZFcTubZk=l1Nbvqu(9(Cs#T9XodJ zhbKClH+|h??zf0IoOd~d*hjU!r*E&IOu6FYy6{Ib;%{l+HtZPE6qMaH_}+f& z&$br7G6r<#Eur3qN}p!Rm&{v2yO)zUv)*9AcQksA`IO71#k;cKZn`k@m%)Nr(UxDm zu6`qn_&#jbkNN2*qndG5eg)?XU8(K3uKuI?G^74cyM@f9ofmZ!-z}Ie`uAnN3umKF z=*)c?S?~Lexj>Nh^o1UN(})+%U6VwTOb*4cK3tAcPNJ1=(B zup93$Ax~2ZZgGmUD)M$myj`pit}1^NR*%!w%6;2lgF~$+&#(Z%w-H!J8st*l8&9d9ps2Yi z!&H7w#Z9xY)&pLx;&qAHAJzBCn|~#*3|W2Z$i1;FA)q<_GUqp(l>FQG8zqM|Z3!G{ zUquQ}3!QOE;Jm^~*-O7KR2~L4oQ;#Jl+3enT?#`=!-X9YepfgvwdMj~!Xm-E`L=nM+MQ*B3%FNRIbv+`&2MyZBq-_QoBeLhiHW^BQjd*>!y;&T!s8 zO<$kZ4c}P{$Csbh6>hKH@i8=cqJGC1{^8ApXd_u5yCcbbqs5VD>@%`J@}#UsbvRRT z_Y}3OMdkX8I6)b>!nypQBGf6OVOfi+-D2?@<@F`=tf@!qcC@v?yZF_0JLrxZ3!P$? z&#NBJs4(9aCXbFtfC1>`-)|%xA#w}m(c+0*RpJuwCAde2@4cUAz3=eM4nRJi5BwtICz*&y$8o`sN!$VUSDAH_vx) zEEWKV|2cQAK6lfmKkJ7C!E&SRhz<3vsc)fZR?i%qb!} zb%YjE5sjru62dqVBTJKHA7q~hF~cxpX1>=wo%8UgW$uk>`$m^r` zrzE?J?;9wN-hWD_OXV|DbE9R3!AqwnT|+xrIW@62BcvMAe)h0LN=`!Vij>3^lnn3P zTi+OC_xFOpaZ~i^ry{sE0eBPn5p67mG4+PMu!fk*RUAA%N z72OuqN{7ZSqr38>s66@HC(^Hx+?UR{#a0&Hc*XJ4KigZ>VZmVLpQ9wyRtNgR-Zg5Z zB$brq@;7VdeIY>63;E?jXs;s7d$DRlthK|M242}=(e#_e*e`|Uh6Jud0dlRoSL>~v zd`HrT^HmltNpT!j54BWjD1HDHeBNRA4wlpYL))Bdnl08rD0JnQSE9X|F%Iet5ihNM zTg5r0?Z|W7D~Jo@_n@AicR1b<;b)B;s*oQAH!wjgf0n=UsbPY{A;1uRWm?TMhepYgzBlANOaD%sQ@VK<{ixa$v*Jy`kQh$^SQtN zSe*E(eCSM=$Ot*&*87nS10VjxqB|^B#J}aKil)D;--JEld*x?)Mx1g_H`QKA8n=ao z-+#!%8GVi@g5JH9d7?hh%eO9l03X^d!M|}!T5Yp}uWrV$QhE8VQ?qDEz2O@w^~S!# zdGZT9g?|)gHd{I!q116^V(C!Pnm^;YF=sL>MAn+s;yh!NKSNxDSr8W^nk2+q)nPMJt}lhJBSurxVd3FT z7?efEb`$=P+g*RON?7vp^Gv-EBW z;>zz{p=g%h2i%P~bNLYi-FoMv!!U~89nMo-;Q2pP@T#~4w@|{ajf6PNC5op5= zN9q-fa{38p4fB^a?!*KpJ5`AghZWr5>L(2IyM$ksFRIOyv~w&lJfoaY-0@ko_IE4A zX(QNGU4E8vIwzF7F=0w`5H?W%DNnFmX~`K@`&4df;VUum&}@Nyqrv*IZ*$gg{wFb< z$tL1B?Yrf**OozGtDEdn5xE}9^xBUGwMi*IN`rc1Q+~+lVtlLAz$EZlvG3DPIa&4b zrqwWGm)Rc2{-gO_$sdAW#={%K>N|3L)t?Ms{~`uXR7$ilQCfJp21BgbE|(S}8D%w& zGB$I`%1mj}+YKAc9_WTBVlpYR{a~ZRxoVpiB6eE(I$ft-eNnDry;3OHQkFD)q(e)Q zo;hn+O&GOuc+1Wm@YuSF_<-`wT@j;UQE%3vC#qo05KpjbbymS>U{{;uOM}n!!ME>7 ze<)b9YK@|wQfkhf-KttP%pR(>NwjJCiAD`GYY?>7^rC>JNjS=AXTVe02jrYdbd z3oFk1F!jH~N|ITemG4?ijy(35vC@~vb4_b?xX(Ar<+*A`B`DmL8)f!xk{kKWWvvd* z!LU(VUgCJev4$;bNlMXHQmETjBpErMi(WJrV)-E!;*h^?HV2I4n%BF$8=f$?_8G;3 zbL7_AOvhnAJq>1_rQIc#-w7&~>zLXSB_t9{IBo6F&e@A0CikVB#L+Z^GK)0xKd_!V3T(t7AfIwj23|yjtq9svoQMEy)}H zegYY<4{32)$K?=X!uj^4SO_2(Tm>%hrg*GnW#qwhZIJcHdmt_Iqp&zO|UU({LXNRxT#&MzW=CqnI0|zcMcVO+8gwS(?Ac7q|IkPel7si$Ix4?to+c9@?K(h`ChRxPxh|dE zekSL-f!D-ivySRVNml)qfsjr4VU2C;L&tBX^jGd&+oRv{UXeexH(En+D~@$ zj<2VJ+~`kV06k$NGmUWB_Qn5au`2(C;wH|E{_hb2?cy^}5N%oCgMnAbhTe>LggTQ(ST`%cQ5q;T!-1eI$*3DItqc?{5W`L6byH72P`92tZ#H5+?u_IwWWPK4Nk?MYEeDvq}DP0+}Rb1nooSS2E!vD!o&eiAA( zIf2_=Exf=mh#P?SvxU42PH?2Liptkwhc6#=h>|J0sVx0kF(On?Zu-%;0JX+5QQ^DT zKK0}ew;iJu@D4qIQljf49KS4kWXVDO|Y6IwY>3%Ll?3nh+h>O5wi*11#ru> zILkhhqb6f>O%c;W``#`Vb(lbs%?VLzd%X1v)x2P+v8MYdHC$$Sq)C6JIwSbnIIMbuN!f@rv>!I`y?fZs7!r0!{EelX7wl z`REJhT(&SatIvu9Ke&P)tfH)b5Z4mBoj(JCx9IANemoO(Mfk+p{nCDpx?3@N3?s9- z77@96b&II&R6W=*3V5|AD?~mmxUmAWJgJT$QZD6SAS+HHS+Q_aoCqBS*l;KHWc8-| z5ZpjOEzWB(nPqaG;HQ}FIcmcDfmT}7H()Ydck~buzzPApFnTjY7M~Moi$Y zb&35x(-|T{jF2iX1UKb9*rYZ40ekZ>tx6=hNQG9#*b8n#4jNl->SFyNZB^O5^{$?^ zw=RrVOwHzfb&sDRTq5Xh^=mk~R%av)WYf;ToCjnRK}w{6h=PSK16T+b!W2`)&Fbec zX7vM%6bOFREtujOwTrraXL7d5q^Fz=zhwllp(i>A>lViE+BH8xh{swuEk0IGv(d6q zBD{YD`*9|gNLH}V^fdyCKM|xzIHX11KW5LfGE-0Li!#pSycV|sHe9YelhPC}ngi*@ zNVx?(_$RT20$>uM*5fmHZ|UO|cZe?~@l_J^_8Qo_*zIHU_fn5@-Nkd>Nss?z-x|$*Ou4I<*}OuThduU19D6lmWVT>)-(B%|e$XDX=L2c7X`zzGL5}Ek9GQQZXJ;A_ ze>0_Nc(Au2a8zq{*v-SP{E)zCD-ueU<|#&f5wex&h&@`qd?@RjbNTX_ zmBP}Yo^OCrQ<6fg;d&8|jd--x%I>#AomIh45@D>5w(2(oevp1$WF`GN5zM8NdVOj8 zP6VecuK_iz2iI6URp|J+KOkpkRs}4i09oWsnrY}+16hbaMo=n0$!e7N&Qr?F7+4uV z>n5;<5GFMbyg+(vFmtp~f|QV=?kFMWTJ?IysPVh!7Dylix!oLPk>jsx)L_AUE2IT5 zhqfb7t*enBPhu@nKv2I6L5RW%kW*xv+0jF=F8$3pxG`MsABvCZ6~Q=)*gXvrLL5ZZBP$RCzTH-R*FcV)vnT51 zAQUbj48XhLebt8NshKhjkFzI zw{|#U|1kGWw$Ah6|BVVPK*R5PY2hANZG;SQpM@LhHoVdACJBgS;q(Tf;oGW67HnUGY>*WV zn|6LazgGxz;=`-ND63)BwZspU=RhqVoVQ?NDY7}+fX`1>DIW)4L|N^GQeu*%hX9iZ z@hdiD5x}2(2AOlEqWnTvq}tn60-XEOG`nt@a^ zd5sAf*ZxXT$k@nw(;yi03BPNuq(%K#-E7fZIq0z<@_wBtGli8pXt7q3_x`vZ`J)fo zk@zmi1q$diIct{RM&huKC&00Ed;wDRbC#!oVMryhd{QpS3&|+ z7aT&=W}_GQ7L-0C~#+RK+7c=~fp3{kc2m za`G{FRQOZtfKSeO$w1;&?_yJiN6tiTm$@dN!)AiWGF#Bxdpw_#v6d+9Jb4D>XdFns zU!*!?QN)mI>(cZ~ExwZRadYVRoyqO+WW-KG!QaxFo%13z-x-KYDao1Z0M;tV&%)*&vOAd;XVf* z{BH!`R!e;mBohKtizx_w=rN$U_@$f1kvahQJnzBVR51G<>AR^Xt6YIdpe~<0t%h-{ z+7788Xb3E;K||oR1Mo%oEud`?5Ks8Az!y+Aja%BrupgSaNCQA|GF|H)znyf=+7#4F z?)g<}fp7%7tz$~`LoGG1U+W>|Y|eG4Ml}de5Y%+$ zU%I9zA_3gk)g}pN1I?7J1tzDoB7rOztr2P3u9<~$6{N&Y>1?@uQ%9s}5fjDLdoARIT%|4xK#NLGD`P&i`y_+3zr zL4)i2$Yvke_V#H*hLB690Y+{iaeOLg z8}>F>+%f~&RaY~h`uhMqEvU&7VB00oSM}hQILfEACe8eqD^XU$AJ-DI;#`2RW3Ke= zgXIfbF#09T$7_j>m7p0eAS^;X0IivjUCXV8FBNJ+@`1W#uEAP?y=esFW@jpYFDBC_ z2r^`Q8ImFXy-05O-umCzVR0D=n&C(%eqC#oHC9~5!qJ|=ejZ?r~l zMb7{4uRwJJ@$K~#c@(71@ElQ%M$QdN%Q!1vK|u8FmYZ@ycTM`bd+LpT_Hi#_6R*}4 zm4d_&pcjZ;jlevL_}Y(K4TI!&hbbL5Tbz6WD73hDom@}e(KpaUgEmUN!D>6Ap89ui zMV<<9Il}`H!K43DJhV@?k-X-C=%Fw_DG!~ppn9|C&>=}QQgqlTItxlf(7;fNk3(~^Ma(K7&(jKO5hA$qBw!Q^WQY`dw zpGNwIf4m11zzv7u^oKfogYUQ;@9REq=KC^b(m}3O=Z5?hmPBakiZ0Dz%XW316Q*D+Nrk^rsM%?QP!# znwAcCrD)dm=`95Q@|Tli%4Q(GpyGxWqG*WH-Nzt38bK<_lW91)%1Jz?aRF5Ztd>q_#Ik4`H zNr}_XX#pG?$Z15LV>okxZ5Fkia7#XCsnToLa($(pDeoZ&iObw zt?pRZ4uXJjWPT7H1$={W3>-BGLSWrX1wJ5qgj?5w0h7NZJkvNfvDClIYv^~DioV{^ z)~gxs=U=^7_o$rB=JhGd#MqECEF^{7>y!!6u!uJ#?_hYdRpv|S*$UYBu7 zPh}o6N@z4s4U$LIuPDxc(U+e8WIG#M#fZT5wKnQH>zR-xMtt$XdZ&aH1`}AT7dc5n*c^&p= zM;-P#Wvc&qg#;R!>LOh zygH_fk~xqzyFzd7tqYPaSZRvnly=}LfA7TgglE)oFEPi^gxx0C+={kzzFx_JImX7B z_54dj+Izd@8Hxdi7qZuv8N?4)m}8t7-s}(meX{m$*uwJ)8|;1i^=0&ur=(8l87F3k z$z&3Fr@j=IdBcYUK z&8cV;yWqvtfQNK{8{^Dl91+KzZt7R2tW0Rb(#J${?(}%Zpb?hlmyMc%gOlO+C(2rE z#xmf)q_@eKdod~ZA8yXNy@!3pK%9G`xd_bumb!zvXJjZCe?nIr_pwEPvk6vSm@;wh zJoc@9w#+eXFPv+-V&M|=`N&WsiEh3;l#%=lRZ62bgFl+>yqGTBAzPWp@D!YhF4X3D!CvCi# z9rp0y)U}yDOv@%jli4i?)3TFu;Z6<_Io3Mt$?0z$>0{DDmP1>)K}-#HU7PDfQ=4~s zWLsAT7(C_cNWK(9f*#*nt6I}0Y=SqcXp?EB(UX^kbkQ;iJTn>cM8R#>!iiT+Z9-3L zdi=qJT{&QSKQF}YA=+%&mr}Sb>|tds_V9g4oUesGDbjvyY2_5N{_ilWBvw~WWSf{j z1T2o)kv?;u?)?nqR#D`~tfiap3o4Kbsjx{}(Nm&?i{oO)Ot7J2<4vrU(aI#&s%-Rg z+IgK$`yEce842EQ7ux>Cii4}H~7#z)|E$K4??YD(d$xQuBr z#DD!L6D*5biA^BS5WH)|asB97@~&C2dyxxZ$vq9(#ly*JKct7wheUH~>CJdYZqMsJ z>cp_G{oI5&Cc8$}FB{EYMipC;8P95Jg$F~5UcZxMOTK-08D6k=j+)53HY%OwY>)_k z>@AdHcsl5e_vOs%V-Nm73lFHh@vG-h`B32Gd2Nd(q!~jBZi-^A2x2_=RfVNuT0{EKVa1 z41;s_ypY04SSOJ^&L{B_lufaFg-GNBWumz@HNoWUi*pPnb!G_6I!_>oBsXo(ZBo}$ z_Rml@w}o_%h|nw+%~It@lgG8S$GbicKB{ON90ibSs!Jt3MU%m+GZo91n3R#Bun4>5 zECTL^DYm7;evF=-jdBC?B$2P^NrmXL?=Jt;mu7DR95Rx5`)YfqE#W1YtlKrYz^?`W z2HsdeH#hZSK8Iw+L};@m>E;VVboVEyN_*#ef@5jR2BORjdAIv)Ko2|oD%v-r;K$rwd8S6_44h==$TvEcQcL%4p_TYC3+Ue6Gw=;`#A9XN zgCV8!@Z^-+}`}ju+}iF6DbT0V{d)f9x2C$LCi)wiPzP@)*n1y+M_mz0$Jzov_{lux>tc zL5J-X{!@?(6=YYY;=#ZgB}yn0KqC)KNBCUV7L*4+eY}{85A2mp3A=FL)A|g;9MZC> zH_30{Igj{3ZcRLibRDAyJwc7pFggQ+hRUXcb?fb!#=l@)UyJ>E4wB<@dTWfcfjb@( z0!BOK*Ia9-!?xq3zIR7oUMztZ3H)xsOG01DcqgOxE%o80&|m{8TtDZYG>1UIQDZig zg&F)&MqAGUr;XQj)zV4G$>1d;Y0l(RkkwbgSv7D@dO&Opt3Avnmr1@V2`)VK3G0~Wo)jySg&K=>?R%6EVY*TFOkASg7-8!$Y(M#m5Gi1G%oWFxnq6WbsBhP=>?TJhLW_MVLYr;epw z_7li-nfJ{#`KKN%M92c3O%%X2-hQ1{I?!ecQUi&48BeRE<-@=P%hdMRwsbSVpa+t; z?+ZU4cNtV>qjmv^V7$PevwKajN)_LMKiNKoL8jOnI4YfL=cO;syc{g4GeKo;J{y?X)Bx5V)H=4U_ zo z{3lJS1XV!ey%o>r_3=gFtgYO0Kk#Js0O9Np{5Gv}G!pJ2aa^I~KpHVtmG6!Cb zc18lxgC4NKzO6Lom)IonCSFKQsX`cZn1CXf(i(%MC4fJ>F?tMg7zl_3Wfr*1bWjg& zu^LXR#-98ewr2Jz`CmTousr`gF?Tm!R@$B zeWz9No@vezKp@z!{+7TD-}N$J*$8xXK0uH$Hizg5daSLh$}gML1I|}PXE&*04YB?P zkShj=jx0)>jrehI&ZZ^dGJftJm!+^&a#e<=T=w$?t{6;Eguv!zI5!PJS0Q<)2nIt!Y&<#d9Ha)&cg&Luy>}IuZh+3WPP(8ou2l}t7A;knHo`4mRJh$0F&dve zTPjn${A$z$4+@@e!Rw^HGx~PTcUSdA3$*Sy9uj7daW7Idm$rubmBqW#z}x3rAO-n; zuQ%I|sY~=@>bMT=;GSW2fDOST5Pzp(|6HICfQBE0`W(=y>MlKHQ$h=%RK!>(iB zb*VPsH`Bi*xos_pIXw%=I)G75<*_A*Z2jokh6Qqls4!mHyE9b+K z<)cj3a@ZG+PeU+CNfpt+^W3wS!C}i0`-{)dI2Gv8rjH=UWB|4U$2xz~7k1>H@X`rh z$O9WWfG4>5QlNwt6|~qQK#kwC{aR|;YfE5c05u=hVsC5qB!Gr;M7TYS37{bktaB{Q zS$_@t%d!tsX9?Uj|5G1-(1R6T_Xr4Tki{G2aR{-~B_RtgmG;b!kUbx( z;RCEFg<}XJI1%DiQznTFynf=K4M?fp+5%Kxf3~*-R54Eh-STMRuOLXWEskLyTTVd% z@D<3Sy(4{Ex-C5kFo&7Puz8?N;n=qgidO&;1Bd%uH^dwIl>uQCAu=pmSqtp<0@V0d zf1sOq6R5qI9h>lIHi%?*erAQu_|HjmKTDTQR3v5XK|GPTSFSP_deM8m=u@TGmISgR zhtdLfKG*;b{3NIr3~V<$;!Xfi8z9!N2dM{dlA~8R$&0r*TqRoIv_)r$&PDIAGw=7Nw9vusfzjrgjb6E+O&@#n$)%%9B_zSnkMdhik4+fgZd(&{xHJ{Ab|-Cxc+9!AoD?F8b+S zGx(D=d636rjZ2$gokwTj1~kDR&LBTDm>Q#C(h<lrZxTRsdVorH9da7L1T3PCp9{NxoZR{5D6G&2&cF7>vL_l z*6EByf)5gZsVR|ME>IvdP@fbkey;@+`a43(xI#ItIw1`*oH<0tKSNdc`GeMKfK(MQH5D9pb@*F;Q?WGc4W70j zYj?T|M)zscQ~ppL1TjVNSOZ2>m{+u^*Uj%kVPr(yTSv4C;|T+Y7b$~2%0D z61s_LYU2e8!nCWl$gfar0cjmsJOkxwiydw%Chtyj#+gA7r{ET=fIYzQg3A!#G7k;{ z7Xy6v`1iRoz-bTd$85b#u>K&m+QEIFT0v9V=?tJe2nV}hy|uq)Dj5B7UyE<}RwiY7 z$QGL^1PTS83fR8|^x9mwHoI#I>Y#Za=5sF6TgV04asUz|g4ltKyPMVfvZ>gy6XFC( zR3D@yEnQShgBFNAK)?krig&Wl z75q-1n$eWZ%WXP;zVL8561?NBEwvQAJdBLQ1acv;sHSw%!UfK~CP2!XMa2fV-U)&33B8M3bl|$p-1s?3y}_~_)KQ|aPXVbf zq&@_qv{W+1S}G56ZO1au0)ctkG+Y{aZI=l)dkpXaJKof$h=};JUL21KaO??i>K??7 zqq#_z=pkHS1N)hB8F0u8Tr)_@g)eaXUBHW7=XBWTj|87jBBueRxdB~IJw*UyJgpKe zd9_(zi84W@Ut(&QBHGH$@74LF1x?QA0ssU&+Ar`Omrgr)N{ISCf_#}<&F-Z)Q(aen zNP|wB_t8T90H)~btp()nYp4wXlow8lkYwLeE(1A}GxipcqXuZI8u~9$(n+i^86nFt zTY>?UASb-Q`^Afjmn${c7diLdyW{8U+gQDXYt%$?05t7Rf@eNK>B)Q!g$+?pidzIY z+mZgxrDQArDSoUQG% zAq%b*lv)yx{%$z@=5coBUea^X?!pUfD)QRx@)c-QWha-)K&~12 z3B(aR7`3lAIlSE+|I7wyO@psdN#rgbXwg9=DS3Y*2SQ5;g0o^#@irjy9(cnj@m)bG_tfEg+5Km%LIoA;St4tMpm{x%L2$f6qc%Y!MK?(uo zQ-XXZkO0*YG#)zLdtKGp51`T3DiF*Qzd%?Fi&PTz(_tofnm}P?lQV&9lb5)_s zb^sVL{1uST4t=OPhzkOl3`GhUTp4)?&M^eTXJtB?=6Haqf*cksHT{YeAb<-Tn8ZQk z

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 literal 0 HcmV?d00001 diff --git a/docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_plus_frif.png b/docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_plus_frif.png new file mode 100644 index 0000000000000000000000000000000000000000..fe01972d19704e1596ba0a745af18e08af6c8d11 GIT binary patch literal 25458 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 literal 0 HcmV?d00001 diff --git a/docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_preseq_plot.pdf b/docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_preseq_plot.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6668df448e67e9af559b9fe731954353bd44e964 GIT binary patch literal 8290 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 literal 0 HcmV?d00001 diff --git a/docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_preseq_plot.png b/docs/files/examples/tutorial/results_pipeline/tutorial/QC_hg38/tutorial_preseq_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..b6c82877bd64c574856cd043c1b76e0cff426f55 GIT binary patch literal 24780 zcmb4rcRZGV-0y`@WQB-O2-z!p7K!Z0UJ1z_+2fXEQ)c$grbx&xQT84oWRL7U&*%RA z&hxy^^PK08bNYks+jU>pcYNmi{r=v;s>*T%cvN@@f)L0*kWohv%n}5_n7W7w@2oJp z^&rR%L|#T(!!3Dr!qtsz@Jw=}J7Ge8{pQV^7ciDG0t_!;{9VfX zljeaf6LNw4vEL0@>D!n%s?7-A6~7+OD}A056T%IWaW(fZ-jousaGgK(@bWT0_S7<& z^qfz=)*{Rd&+K89cZOdG@g+_8Db=rv4Zrva{>K-MAH9$NR@Qm!;^E0MAt8ZiPwa{01;pMt4|A$D`E4`JIK6-bq1+hp-7*0JJ{T7HI5rkQoQ+dDLX2Ro*d=7(|Q(3&{Mn0O> zyjXGBnw4LJ}3CEGSJcUAm+qdHN|W%_#ILNBz-qVU27^WaRopO=W4RovLcj2a|8? z{^x;&G*OI}or!niju{yl-8?-T_I_DuJjcZ_4GW?Yw6z{}JKY@?7ZVE!2`TCp^E%i# z+FjWejUdo{OEmqtjxx^mY29s3&b7mZwEc~Z8<{5GUSs3p#?vZOO8V4BMyi;YOi%ot zuu*YK+LEjrGptMQeiOuL@P*%PW2&)HN=2o6ZK8%w(&r?V=w@bV!`T=2?Rg&`AMfM6 zI>))Tduu%ysvNxr7p5?1T;Z=2V?6ut~820gJG;^sz4Xn`5u#e%?g1WZ!nJwYe zz6aBRl4l2|ll9&P`ucb8-Q%E0^H{zuC|H@9N#Et}g(%kYtZX|uVmzV`eNlf%&HDnH_nD$x7O{W*;rZhZ;#FS&LkPqn#xVz0aQ{f_Dq&;MS?aPVaYZ!IUHEfaBy(k%J$Y)OW3vOgajR*4;vdBT88f59qTe#{Ba2G zk|Qjn1&9!1d%UZMhllX~Z5EarnfMf(+NHv<6Q&(oPH92P$wDS|OI@LH>zCW(b(WZe zBO|#^8HY;aUK3EmlLhKyQpG)Su(5S)PhoD9rna`W+Y8+d+nNV7Mk9~jD_$Zb{OqMf zNG(vLlq5j3cXRx(qf*naSg$g!ej7}~sK&)cR!wLDHrsaOLxx$+iL0yN{>hH5=Wb1% zf|{C|v9Ym?OmiHE9xpF1>j81gJF}SYe~#B1b9y}P0m=V*VpW#-dLF+0JjTi>A|DG!d2paQn$xIiex%*<>x&fY zzpvh4VtO4!NGE}|x9RE4%~m?ekwE(ezBCE%FV5sap`mQ2jVYq8S9`Fqmg3 zQx<nbF<7!ahy&2?*6TtH=DkA&$NW|re$|b><#Unf@KK# zoVY=Z3A@I}x)oyZ#d&jofAX`<7;M7U_BO;Ej|Femt()WdJGggc%Gl%UN6IZ!e0|Ts z^j3e@i83==%>H;w?(RCrw$NYmcd*?(7Tnuz2cHYxu*54}Fs{;77K< zKIIn{uAJ5nEu{I{P8e1@nrUl~q^R^2Xcksj4eN5v&(6LI4D3!8jt+{7iegeuJ~&z_ zE!C}9PO_^X{qkZ(+(@l-c>nL1>&j3uwV>^4Z$4!|#ydk1L z%fz1bq{GCl!DO^b4Ivrsd%5mwyj3YZ(UMnE@}7MwS5{tbrn5Hkab|0-oe%!;^0v7L z1qRAZe0hVunK_xotm9_q%D>$_}O@s1MHE{-l)at>1n%H1A>C6 zrl=MJ@mF$h#1uRO{z357`{JD6`;6T?4gL@q7+6zN13&fRKW-iuVdg5QEca#w#>Z>H z#x4&QuJ7eRB;5VjO1r(WaS;#CV?Mzmf=;qa`21wM`<8qe;S+GOP+BUfW*bxfcH-E{nV7P zo!$D&moNK<;}6#kBo}V}p0Agv+cKJ){TU6l2NWKgdwV|1`MC<+xV2;V$YgbD-5emg zd3i(1`)idil!uA9J~@f-k3&#{ki{VbvoA-=gTvgtdzU@*63yEYm34tQZnzJu`IQvx z#(Lut1eKzopdbQ^Sl%tcCUOzUOE!eMsLH^>!9ibtJX1EbK&$j@;E_sj1Qx;?$cm_@ zCf>2qjr*mQGd@24q3$4unyQEYfB(|J zfLBWQ{(bMiykKYgguk@36q32Pi+ScWP+~ADnWw@I_(-FT&)MO^-?7S2WsJ`Otj1g(d#l1PmIn%aC#szm zcw3;(dbG<$fb4Pc@jY_B@IknPyho&k(p1qI3Q}U6EKJ>8mXO7ZP=j8%|6l9CPs+Ld zhsVcoUj+G@j`u7jlO=BV6@sKI5m{NZg?XuHda=qy1M#5-*_Dh z*P>X{Et#T!c6KWL^SDczQY#S1WaVHv-u}0;lV2%{QU2>W7J?+c?kBONTF`gC03*EI zaIu2Wf&~ZZ5&DmX>)~&qM30r9&&czajQ&lS=qw+jvIt=w8F(=atgHogll3GdB+Sam+FzWPz)jh<@+N9rnVFb4^*)C=olOVQ zt&Ns5^YS`w&v(Y@&HVWT^^isT!2V5s{v9YZG9SU5j7OyHwHWS)Ee_;Af`lnA9}JbP zx_Tc}Rgn0%e_560WM{|JTUc8cz3_xO?%QjEXtU9uKP?w~GI)4+hLXT#Ds3lzyk#g{ z6OUPeQOL^5{(EOi@+!7=)*6UuWaQ-DP{F~JX}FE0#y;Dqq>5F$ZT>mjUeH^wHg0-p zGxk~M^CNY2v{Q{ip{J;%RPmdGiHS)}Y`nX>+oKcQRV7VANhUQlRdXW(He>A-t344q zeC$v9Hh{l4Ep&bV{#~cU+10gS?9^@y!%n=cbkzEHnOXbS0Q`rOzj9U5Am3f-eTj|F zDl7dps9&CTzX+*yqkNtH!e4 zjC+AliGx=rIF+!py;n-2r>AFEp`@mU2+ihTmv>nk>$~1W*>B?w{_B*~LYZVIim%@QRomT*zLc z|9G`=9wt@5j69elHe8nhF89xW4v&tOcZCYT3#W+h>Bgp}a*BXUjbQ(GpNwIY&*?6{ zj3hP+Cn#p#Lrpa4V}$=np850&A?$ei=ew+ihKy`LZQh%ZPfJ8Rj_(2b`tKsSoLrbJDCTEn zI7>PPW0O;U{tOTneH&W1Sc&I?3te#|4p{)jRaI%fxk(KT^mA^U4+(mkV31$k%6zFe zc@z*JBU56FzL`Nn=veW(o0gX23$x!69b0DW%Psl_KS$Az3B~`ZoH@yuccB2~VuFj& z=v}jmoz{(ymv#<3C4rcJwgwh+!3bP*G1(qrYuC-j@brTM=n(e?&ovLXJI^fXcARg;^v)M4yxMqDAW!h^o$sA_qj2}*DJ==qJ%}hhV&w_BOxrO}Qxh|@8Mg!Y<%b?h-z@TYGmuWQ(q~XW zt5_lwB7vL$^40ip6I{kVg?U`{O38LJwHTlOp_XaWP4x##-rD$A_5IzCgSsvvF6c{p z$*!^rmTavI$GoySX?c;F^sNB*;mwS`tX-Y>HFf)o!otB37m)~9$}C3tD>N9a9oF;m zm)a`WPL4F^ercw@ZNc={BDf^Di_}tBhw!uTE+A+bX zrf9sX1q^$ULB06bkxNSU8`YCFT$I8qR>YXg%_GtAkiNlD4X(7vmcN;?`c~vi*Thc6 zGPj*w?-C+a0mdWq$MSYt4u0Er{F5zrLk-5k5;k#lt;vEEvZISX%NCuH^h;2=k&=)& z05S&Mbg%TMPzy6wimuJjg_zIy1F?{T>jkL!ldX2HkjxR5el=_WVQ`etiNTI7W>OX>{v3$9)<(q94?L{6RG#cLe zG!iep{qk;`2-(B(rL!cABN|EW&C?euY)(_}N@X&=WYwend|2 A7A&2pM74z(BP% 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 report at 2019-07-31 20:43:29 + + + +

+ \ No newline at end of file diff --git a/docs/files/examples/tutorial/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.json b/docs/files/examples/tutorial/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.json new file mode 100644 index 0000000..40f439f --- /dev/null +++ b/docs/files/examples/tutorial/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.json @@ -0,0 +1,751 @@ +{ + "summary": { + "before_filtering": { + "total_reads":1000000, + "total_bases":45253865, + "q20_bases":43967646, + "q30_bases":43636909, + "q20_rate":0.971578, + "q30_rate":0.964269, + "read1_mean_length":45, + "gc_content":0.544178 + }, + "after_filtering": { + "total_reads":464390, + "total_bases":20168949, + "q20_bases":19734976, + "q30_bases":19583954, + "q20_rate":0.978483, + "q30_rate":0.970995, + "read1_mean_length":43, + "gc_content":0.532957 + } + }, + "filtering_result": { + "passed_filter_reads": 464390, + "low_quality_reads": 13053, + "too_many_N_reads": 8, + "too_short_reads": 522549, + "too_long_reads": 0 + }, + "duplication": { + "rate": 0.251153, + "histogram": [503744,11613,7640,5342,3985,2834,2119,1608,1219,874,732,569,470,397,319,258,236,179,165,125,108,103,83,65,57,48,44,43,34,28,239], + "mean_gc": [0.480399,0.47184,0.467902,0.467371,0.464419,0.464187,0.462171,0.467381,0.465097,0.465648,0.461261,0.46912,0.45627,0.457875,0.47601,0.462183,0.452193,0.47061,0.474819,0.466855,0.445534,0.455968,0.464068,0.484163,0.466323,0.479167,0.455704,0.431555,0.458131,0.465266,0.457216] + }, + "adapter_cutting": { + "adapter_trimmed_reads": 598996, + "adapter_trimmed_bases": 20040284, + "read1_adapter_sequence": "TGGAATTCTCGGGTGCCAAGG", + "read1_adapter_counts": {"TGGAATTCTCGGGTGCC":13226, "TGGAATTCTCGGGTGCCA":9608, "TGGAATTCTCGGGTGCCAAGG":10676, "TGGAATTCTCGGGTGCCAAGGAACTCC":7569, "TGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":8351, "TGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCA":383032, "TGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAAT":18321, "others":148213} + }, + "read1_before_filtering": { + "total_reads": 1000000, + "total_bases": 45253865, + "q20_bases": 43967646, + "q30_bases": 43636909, + "total_cycles": 46, + "quality_curves": { + "A":[30.825,31.2657,31.4639,31.4486,31.4701,35.1037,35.0473,35.0462,29.2943,34.3377,35.4184,35.0449,35.0191,34.7388,34.8436,34.855,34.8743,35.0673,35.4237,35.407,35.4116,35.1336,35.3507,34.991,35.0165,35.1529,35.1368,35.248,35.2393,35.1017,35.0664,34.8135,34.7857,34.7447,34.8149,35.0829,35.1229,34.7796,34.6786,34.8595,34.783,34.7735,34.6327,33.8781,35.1474,34.6511], + "T":[31.5874,31.6519,31.7482,31.7856,31.7864,35.2857,35.2607,35.2695,34.93,35.4955,35.5748,35.463,35.3973,35.2732,35.2216,35.4814,35.3842,35.4626,35.5958,35.6074,35.6002,35.5315,35.5951,35.4782,35.4045,35.3112,35.3535,35.5531,35.538,35.3607,35.347,35.3206,35.392,35.3024,35.2876,35.288,35.469,35.4355,35.2452,35.2433,35.1889,34.8702,35.0138,35.1155,35.1567,34.7483], + "C":[31.6474,31.6396,31.7754,31.8059,31.8197,35.382,35.3296,35.3459,35.7253,35.6156,35.6202,35.6008,35.5569,35.6171,35.4983,35.3351,35.4399,35.4535,35.6175,35.5962,35.5956,35.5052,35.562,35.5001,35.4802,35.4274,35.4352,35.4928,35.4697,35.3313,35.2862,35.3946,35.2492,35.3685,35.362,35.305,35.3884,35.2054,35.3247,35.0867,35.2704,34.7263,35.0728,35.0187,34.9901,34.5319], + "G":[30.994,31.4042,31.6051,31.6401,31.6655,35.1563,35.0983,35.1032,35.1066,34.7424,35.1775,35.3779,35.3458,35.4484,35.3565,35.4238,35.3309,35.41,35.4303,35.4535,35.4857,35.4385,35.4623,35.4419,35.3814,35.2563,35.2569,35.4561,35.3765,35.2343,35.2151,35.2878,35.2521,35.2882,35.2342,35.1407,35.3602,35.1777,35.1811,35.0089,35.0724,34.8611,34.8826,34.8794,34.8105,34.685], + "mean":[31.0743,31.2937,31.4543,31.485,31.5004,35.02,34.9692,34.971,34.4948,34.7427,35.1241,35.0241,34.9936,35.0753,35.0282,35.1029,35.1163,35.1861,35.2667,35.274,35.2923,35.242,35.2635,35.199,35.1668,35.0124,35.0116,35.2275,35.1745,34.9748,34.9478,35.071,35.0514,35.0506,35.0396,35.1553,35.3492,35.2677,35.1959,34.9697,35.16,34.8248,34.9741,34.8271,35.0771,34.6511] + }, + "content_curves": { + "A":[0.261857,0.268095,0.211688,0.201831,0.201457,0.188008,0.204672,0.212125,0.065411,0.092826,0.141561,0.567159,0.552973,0.11433,0.113464,0.106365,0.107895,0.120065,0.110839,0.122845,0.125413,0.137053,0.140272,0.145609,0.15958,0.574379,0.559845,0.146432,0.154294,0.568209,0.552768,0.142272,0.133742,0.131647,0.144863,0.542575,0.132827,0.136031,0.149721,0.548434,0.138468,0.135123,0.143501,0.16222,0.566997,0], + "T":[0.241992,0.263236,0.214082,0.21003,0.212406,0.220349,0.234819,0.281611,0.556641,0.160461,0.147852,0.123155,0.164815,0.588928,0.584086,0.150477,0.557249,0.133987,0.133518,0.128561,0.145741,0.550515,0.128334,0.122974,0.126179,0.129226,0.127741,0.130084,0.132402,0.131377,0.134164,0.151636,0.548358,0.14436,0.136034,0.134135,0.149881,0.541099,0.13293,0.124204,0.126291,0.131345,0.130483,0.129414,0.137012,0.380379], + "C":[0.272413,0.215889,0.229589,0.264438,0.257089,0.260867,0.243539,0.190242,0.12897,0.146404,0.152226,0.177508,0.16473,0.158349,0.166135,0.606719,0.179492,0.580986,0.161947,0.15555,0.143524,0.142381,0.160735,0.581664,0.566584,0.144489,0.141001,0.140405,0.14183,0.146175,0.166327,0.565839,0.176678,0.580319,0.570976,0.161966,0.15826,0.173377,0.570445,0.175035,0.571023,0.182177,0.581659,0.575252,0.161032,0.363115], + "G":[0.216942,0.246339,0.338201,0.317263,0.32261,0.324327,0.31053,0.309584,0.24254,0.593871,0.551922,0.125738,0.111041,0.13195,0.129873,0.129998,0.148925,0.158524,0.587255,0.586595,0.578856,0.163609,0.564198,0.143307,0.141209,0.1454,0.164931,0.576626,0.565019,0.147773,0.14028,0.133802,0.134769,0.137225,0.141684,0.16131,0.559023,0.149488,0.146892,0.152326,0.164216,0.551324,0.144345,0.133098,0.134935,0.256432], + "N":[0.006796,0.006441,0.00644,0.006438,0.006438,0.006449,0.00644,0.006438,0.006438,0.006438,0.006439,0.00644,0.006441,0.006443,0.006442,0.006441,0.006439,0.006438,0.006441,0.006449,0.006466,0.006442,0.006461,0.006446,0.006448,0.006506,0.006482,0.006453,0.006455,0.006466,0.006461,0.006451,0.006453,0.006449,0.006443,1.41045e-05,9.07335e-06,5.04096e-06,1.3107e-05,1.00829e-06,2.01848e-06,3.23089e-05,1.21308e-05,1.62851e-05,2.42268e-05,7.40712e-05], + "GC":[0.489355,0.462228,0.56779,0.581701,0.579699,0.585194,0.554069,0.499826,0.37151,0.740275,0.704148,0.303246,0.275771,0.290299,0.296008,0.736717,0.328417,0.73951,0.749202,0.742145,0.72238,0.30599,0.724933,0.724971,0.707793,0.289889,0.305932,0.717031,0.706849,0.293948,0.306607,0.699641,0.311447,0.717544,0.71266,0.323276,0.717284,0.322865,0.717337,0.327361,0.735239,0.7335,0.726004,0.70835,0.295967,0.619547] + }, + "kmer_count": { + "AAAAA":55223, "AAAAT":34547, "AAAAC":26093, "AAAAG":24400, "AAATA":26058, "AAATT":25637, "AAATC":18572, "AAATG":29168, "AAACA":26239, "AAACT":21408, "AAACC":21078, "AAACG":6935, "AAAGA":23650, "AAAGT":22271, "AAAGC":19974, "AAAGG":23804, + "AATAA":22554, "AATAT":39601, "AATAC":15859, "AATAG":11613, "AATTA":19326, "AATTT":27811, "AATTC":623965, "AATTG":23892, "AATCA":16603, "AATCT":18208, "AATCC":20428, "AATCG":4840, "AATGA":17077, "AATGT":17382, "AATGC":16201, "AATGG":50661, + "AACAA":24529, "AACAT":18198, "AACAC":19622, "AACAG":18920, "AACTA":14428, "AACTT":17160, "AACTC":514868, "AACTG":21875, "AACCA":19983, "AACCT":20429, "AACCC":23604, "AACCG":7369, "AACGA":6285, "AACGT":6011, "AACGC":8988, "AACGG":7871, + "AAGAA":25562, "AAGAT":16706, "AAGAC":16120, "AAGAG":23269, "AAGTA":14183, "AAGTT":19949, "AAGTC":17665, "AAGTG":29348, "AAGCA":23623, "AAGCT":22927, "AAGCC":23918, "AAGCG":14431, "AAGGA":531891, "AAGGT":22558, "AAGGC":26058, "AAGGG":28271, + "ATAAA":23041, "ATAAT":17541, "ATAAC":10379, "ATAAG":11653, "ATATA":14677, "ATATT":19068, "ATATC":25228, "ATATG":19492, "ATACA":16417, "ATACT":14478, "ATACC":11131, "ATACG":4725, "ATAGA":9628, "ATAGT":12225, "ATAGC":11536, "ATAGG":12116, + "ATTAA":16504, "ATTAT":19022, "ATTAC":14205, "ATTAG":13156, "ATTTA":18483, "ATTTT":38693, "ATTTC":20098, "ATTTG":29632, "ATTCA":17817, "ATTCT":624362, "ATTCC":19174, "ATTCG":6470, "ATTGA":11418, "ATTGT":16318, "ATTGC":15796, "ATTGG":53560, + "ATCAA":15276, "ATCAT":15347, "ATCAC":17368, "ATCAG":13777, "ATCTA":12542, "ATCTT":19714, "ATCTC":29642, "ATCTG":21763, "ATCCA":20685, "ATCCT":21763, "ATCCC":24738, "ATCCG":8628, "ATCGA":5135, "ATCGT":5789, "ATCGC":8481, "ATCGG":7533, + "ATGAA":17596, "ATGAT":15870, "ATGAC":11553, "ATGAG":18127, "ATGTA":12373, "ATGTT":21508, "ATGTC":12858, "ATGTG":28088, "ATGCA":18294, "ATGCT":22940, "ATGCC":24502, "ATGCG":10366, "ATGGA":142965, "ATGGT":22893, "ATGGC":26245, "ATGGG":26040, + "ACAAA":28007, "ACAAT":17123, "ACAAC":15826, "ACAAG":19276, "ACATA":13069, "ACATT":19079, "ACATC":12613, "ACATG":25005, "ACACA":27195, "ACACT":19838, "ACACC":24140, "ACACG":10568, "ACAGA":22069, "ACAGT":24702, "ACAGC":26533, "ACAGG":27635, + "ACTAA":13820, "ACTAT":12654, "ACTAC":14681, "ACTAG":11335, "ACTTA":12028, "ACTTT":24353, "ACTTC":17640, "ACTTG":24807, "ACTCA":22583, "ACTCT":18707, "ACTCC":517231, "ACTCG":9284, "ACTGA":15887, "ACTGT":16278, "ACTGC":23006, "ACTGG":48473, + "ACCAA":20122, "ACCAT":21096, "ACCAC":25951, "ACCAG":24166, "ACCTA":13759, "ACCTT":22101, "ACCTC":27126, "ACCTG":32295, "ACCCA":27110, "ACCCT":24968, "ACCCC":28194, "ACCCG":18332, "ACCGA":7521, "ACCGT":8368, "ACCGC":17069, "ACCGG":11654, + "ACGAA":6843, "ACGAT":20578, "ACGAC":8975, "ACGAG":9792, "ACGTA":4394, "ACGTT":7984, "ACGTC":6315, "ACGTG":14559, "ACGCA":12090, "ACGCT":13007, "ACGCC":486805, "ACGCG":11420, "ACGGA":8816, "ACGGT":9158, "ACGGC":13456, "ACGGG":14626, + "AGAAA":28481, "AGAAT":20511, "AGAAC":15969, "AGAAG":22725, "AGATA":12273, "AGATT":16743, "AGATC":12925, "AGATG":24966, "AGACA":20304, "AGACT":17163, "AGACC":17802, "AGACG":9072, "AGAGA":25988, "AGAGT":23849, "AGAGC":24036, "AGAGG":32410, + "AGTAA":14291, "AGTAT":13368, "AGTAC":10385, "AGTAG":14769, "AGTTA":12904, "AGTTT":23612, "AGTTC":22459, "AGTTG":26660, "AGTCA":496175, "AGTCT":17780, "AGTCC":32302, "AGTCG":5872, "AGTGA":20525, "AGTGT":19842, "AGTGC":26523, "AGTGG":57726, + "AGCAA":23871, "AGCAT":22486, "AGCAC":24521, "AGCAG":32373, "AGCTA":21541, "AGCTT":26593, "AGCTC":25117, "AGCTG":44345, "AGCCA":34228, "AGCCT":43454, "AGCCC":37988, "AGCCG":21193, "AGCGA":15462, "AGCGT":14175, "AGCGC":24410, "AGCGG":20103, + "AGGAA":535101, "AGGAT":20197, "AGGAC":17593, "AGGAG":38355, "AGGTA":15526, "AGGTT":25980, "AGGTC":17425, "AGGTG":45422, "AGGCA":36601, "AGGCT":42129, "AGGCC":36280, "AGGCG":28626, "AGGGA":28642, "AGGGT":32152, "AGGGC":37922, "AGGGG":41749, + "TAAAA":27778, "TAAAT":20682, "TAAAC":13474, "TAAAG":15264, "TAATA":13511, "TAATT":20492, "TAATC":14672, "TAATG":19704, "TAACA":14478, "TAACT":14082, "TAACC":11400, "TAACG":5651, "TAAGA":13680, "TAAGT":14465, "TAAGC":13743, "TAAGG":16143, + "TATAA":14337, "TATAT":16827, "TATAC":10003, "TATAG":9624, "TATTA":13635, "TATTT":29547, "TATTC":13982, "TATTG":22622, "TATCA":11503, "TATCT":26182, "TATCC":13128, "TATCG":5363, "TATGA":11739, "TATGT":17052, "TATGC":14576, "TATGG":43613, + "TACAA":16263, "TACAT":15489, "TACAC":14312, "TACAG":25831, "TACTA":12355, "TACTT":17867, "TACTC":14971, "TACTG":21174, "TACCA":17699, "TACCT":19845, "TACCC":15186, "TACCG":7405, "TACGA":4960, "TACGT":6625, "TACGC":7389, "TACGG":7970, + "TAGAA":14700, "TAGAT":11129, "TAGAC":8577, "TAGAG":15821, "TAGTA":10838, "TAGTT":15873, "TAGTC":12728, "TAGTG":20570, "TAGCA":16185, "TAGCT":21497, "TAGCC":18677, "TAGCG":10544, "TAGGA":16220, "TAGGT":15912, "TAGGC":18717, "TAGGG":22573, + "TTAAA":23479, "TTAAT":17769, "TTAAC":12487, "TTAAG":14941, "TTATA":13954, "TTATT":23785, "TTATC":13594, "TTATG":21307, "TTACA":18116, "TTACT":16411, "TTACC":16110, "TTACG":5529, "TTAGA":12568, "TTAGT":15507, "TTAGC":16581, "TTAGG":17875, + "TTTAA":23308, "TTTAT":23585, "TTTAC":15439, "TTTAG":16446, "TTTTA":26959, "TTTTT":231675, "TTTTC":27328, "TTTTG":39731, "TTTCA":24188, "TTTCT":31504, "TTTCC":28384, "TTTCG":7712, "TTTGA":18362, "TTTGT":26430, "TTTGC":21832, "TTTGG":74998, + "TTCAA":21767, "TTCAT":19897, "TTCAC":21650, "TTCAG":23750, "TTCTA":23129, "TTCTT":29817, "TTCTC":621418, "TTCTG":31953, "TTCCA":27216, "TTCCT":32195, "TTCCC":32474, "TTCCG":11498, "TTCGA":5785, "TTCGT":6808, "TTCGC":9169, "TTCGG":10691, + "TTGAA":19443, "TTGAT":14643, "TTGAC":10795, "TTGAG":20864, "TTGTA":14447, "TTGTT":25042, "TTGTC":14986, "TTGTG":31359, "TTGCA":20299, "TTGCT":27827, "TTGCC":27693, "TTGCG":12518, "TTGGA":190740, "TTGGT":23636, "TTGGC":27637, "TTGGG":34514, + "TCAAA":21635, "TCAAT":15900, "TCAAC":13325, "TCAAG":21810, "TCATA":10935, "TCATT":18985, "TCATC":14051, "TCATG":21195, "TCACA":22013, "TCACT":25706, "TCACC":29214, "TCACG":486803, "TCAGA":20852, "TCAGT":18958, "TCAGC":26909, "TCAGG":25283, + "TCTAA":13321, "TCTAT":14094, "TCTAC":18502, "TCTAG":16086, "TCTTA":13142, "TCTTT":25929, "TCTTC":23016, "TCTTG":27552, "TCTCA":24185, "TCTCT":30903, "TCTCC":35162, "TCTCG":607957, "TCTGA":18462, "TCTGT":21662, "TCTGC":24477, "TCTGG":49989, + "TCCAA":20838, "TCCAT":22773, "TCCAC":25455, "TCCAG":513119, "TCCTA":14944, "TCCTT":27608, "TCCTC":31884, "TCCTG":39675, "TCCCA":42000, "TCCCT":34791, "TCCCC":38837, "TCCCG":24627, "TCCGA":22098, "TCCGT":9428, "TCCGC":20715, "TCCGG":16127, + "TCGAA":5968, "TCGAT":5653, "TCGAC":5195, "TCGAG":9898, "TCGTA":3647, "TCGTT":6922, "TCGTC":5945, "TCGTG":12590, "TCGCA":7880, "TCGCT":12952, "TCGCC":16597, "TCGCG":10913, "TCGGA":7559, "TCGGT":9723, "TCGGC":16094, "TCGGG":594588, + "TGAAA":21250, "TGAAT":20718, "TGAAC":15120, "TGAAG":16829, "TGATA":10203, "TGATT":16868, "TGATC":15183, "TGATG":21972, "TGACA":16981, "TGACT":17134, "TGACC":16566, "TGACG":6636, "TGAGA":21180, "TGAGT":19474, "TGAGC":25151, "TGAGG":31037, + "TGTAA":17462, "TGTAT":15760, "TGTAC":10890, "TGTAG":13266, "TGTTA":14013, "TGTTT":27543, "TGTTC":17401, "TGTTG":30744, "TGTCA":15963, "TGTCT":22150, "TGTCC":19858, "TGTCG":7704, "TGTGA":18777, "TGTGT":29039, "TGTGC":25742, "TGTGG":60798, + "TGCAA":22414, "TGCAT":20466, "TGCAC":23073, "TGCAG":31715, "TGCTA":17184, "TGCTT":29990, "TGCTC":23124, "TGCTG":48445, "TGCCA":569786, "TGCCT":46856, "TGCCC":38195, "TGCCG":17740, "TGCGA":9969, "TGCGT":14682, "TGCGC":20502, "TGCGG":18676, + "TGGAA":630261, "TGGAT":18801, "TGGAC":14118, "TGGAG":29964, "TGGTA":15609, "TGGTT":25359, "TGGTC":19268, "TGGTG":44823, "TGGCA":30392, "TGGCT":38145, "TGGCC":38538, "TGGCG":25253, "TGGGA":35090, "TGGGT":34602, "TGGGC":39605, "TGGGG":44512, + "CAAAA":30274, "CAAAT":22830, "CAAAC":19560, "CAAAG":25664, "CAATA":35724, "CAATT":20014, "CAATC":13655, "CAATG":28557, "CAACA":22947, "CAACT":19283, "CAACC":20281, "CAACG":8767, "CAAGA":22122, "CAAGT":25093, "CAAGC":25237, "CAAGG":550432, + "CATAA":12822, "CATAT":14999, "CATAC":11189, "CATAG":11331, "CATTA":13818, "CATTT":29453, "CATTC":18526, "CATTG":28533, "CATCA":15777, "CATCT":23093, "CATCC":20968, "CATCG":6711, "CATGA":16582, "CATGT":22666, "CATGC":23507, "CATGG":71747, + "CACAA":22440, "CACAT":22299, "CACAC":29770, "CACAG":30120, "CACTA":14297, "CACTT":27185, "CACTC":26548, "CACTG":40540, "CACCA":35285, "CACCT":36196, "CACCC":36291, "CACCG":18778, "CACGA":11889, "CACGT":12885, "CACGC":492868, "CACGG":17097, + "CAGAA":23939, "CAGAT":17269, "CAGAC":19700, "CAGAG":33691, "CAGTA":14132, "CAGTT":22652, "CAGTC":506526, "CAGTG":38787, "CAGCA":35685, "CAGCT":42816, "CAGCC":57090, "CAGCG":26376, "CAGGA":33839, "CAGGT":31441, "CAGGC":46277, "CAGGG":40292, + "CTAAA":16827, "CTAAT":15245, "CTAAC":11706, "CTAAG":14620, "CTATA":10862, "CTATT":18412, "CTATC":10905, "CTATG":23234, "CTACA":23601, "CTACT":21892, "CTACC":18373, "CTACG":8850, "CTAGA":13645, "CTAGT":15658, "CTAGC":18000, "CTAGG":22301, + "CTTAA":14475, "CTTAT":14705, "CTTAC":13391, "CTTAG":14010, "CTTTA":16602, "CTTTT":31572, "CTTTC":24367, "CTTTG":37161, "CTTCA":22202, "CTTCT":29743, "CTTCC":35151, "CTTCG":9888, "CTTGA":18180, "CTTGT":21766, "CTTGC":22475, "CTTGG":79049, + "CTCAA":23273, "CTCAT":17524, "CTCAC":28900, "CTCAG":35229, "CTCTA":15415, "CTCTT":23526, "CTCTC":32425, "CTCTG":39660, "CTCCA":517020, "CTCCT":40820, "CTCCC":54346, "CTCCG":23761, "CTCGA":9143, "CTCGT":13678, "CTCGC":18205, "CTCGG":605004, + "CTGAA":20060, "CTGAT":14406, "CTGAC":19167, "CTGAG":29895, "CTGTA":18034, "CTGTT":20631, "CTGTC":20668, "CTGTG":30926, "CTGCA":30993, "CTGCT":33104, "CTGCC":44179, "CTGCG":19441, "CTGGA":203162, "CTGGT":23048, "CTGGC":35364, "CTGGG":48625, + "CCAAA":26595, "CCAAT":76192, "CCAAC":21988, "CCAAG":551449, "CCATA":12671, "CCATT":26993, "CCATC":23226, "CCATG":45459, "CCACA":29577, "CCACT":35715, "CCACC":43528, "CCACG":20792, "CCAGA":26927, "CCAGT":507843, "CCAGC":56072, "CCAGG":51305, + "CCTAA":13607, "CCTAT":15887, "CCTAC":16811, "CCTAG":18100, "CCTTA":14433, "CCTTT":29102, "CCTTC":29351, "CCTTG":41094, "CCTCA":31312, "CCTCT":36045, "CCTCC":53848, "CCTCG":20018, "CCTGA":23658, "CCTGT":27633, "CCTGC":37128, "CCTGG":104012, + "CCCAA":30597, "CCCAT":29310, "CCCAC":39158, "CCCAG":59554, "CCCTA":15899, "CCCTT":30632, "CCCTC":35685, "CCCTG":54282, "CCCCA":45826, "CCCCT":37133, "CCCCC":41599, "CCCCG":36870, "CCCGA":16688, "CCCGT":18103, "CCCGC":45255, "CCCGG":38317, + "CCGAA":7795, "CCGAT":7933, "CCGAC":27348, "CCGAG":21329, "CCGTA":5029, "CCGTT":11320, "CCGTC":12724, "CCGTG":24105, "CCGCA":19706, "CCGCT":29088, "CCGCC":54750, "CCGCG":32697, "CCGGA":15047, "CCGGT":13067, "CCGGC":31844, "CCGGG":34316, + "CGAAA":6689, "CGAAT":6613, "CGAAC":7514, "CGAAG":9458, "CGATA":4113, "CGATT":8487, "CGATC":21759, "CGATG":15070, "CGACA":11568, "CGACT":9424, "CGACC":12210, "CGACG":22922, "CGAGA":12362, "CGAGT":13367, "CGAGC":17015, "CGAGG":24021, + "CGTAA":4222, "CGTAT":5837, "CGTAC":4800, "CGTAG":6245, "CGTTA":6142, "CGTTT":11239, "CGTTC":8845, "CGTTG":17667, "CGTCA":6863, "CGTCT":11002, "CGTCC":13963, "CGTCG":6103, "CGTGA":9959, "CGTGT":12995, "CGTGC":16397, "CGTGG":50964, + "CGCAA":11871, "CGCAT":13332, "CGCAC":14783, "CGCAG":24019, "CGCTA":10566, "CGCTT":20057, "CGCTC":21746, "CGCTG":36683, "CGCCA":483325, "CGCCT":32660, "CGCCC":41085, "CGCCG":34813, "CGCGA":11953, "CGCGT":15911, "CGCGC":35171, "CGCGG":28951, + "CGGAA":11198, "CGGAT":8250, "CGGAC":11312, "CGGAG":18027, "CGGTA":6818, "CGGTT":10985, "CGGTC":10507, "CGGTG":24345, "CGGCA":16149, "CGGCT":22832, "CGGCC":32538, "CGGCG":29175, "CGGGA":20815, "CGGGT":593174, "CGGGC":29840, "CGGGG":33211, + "GAAAA":24817, "GAAAT":20739, "GAAAC":17062, "GAAAG":18556, "GAATA":11875, "GAATT":632098, "GAATC":12606, "GAATG":20121, "GAACA":14577, "GAACT":517081, "GAACC":17164, "GAACG":6109, "GAAGA":18206, "GAAGT":16535, "GAAGC":20610, "GAAGG":22629, + "GATAA":10292, "GATAT":10852, "GATAC":7996, "GATAG":9691, "GATTA":13160, "GATTT":18560, "GATTC":14862, "GATTG":17938, "GATCA":16046, "GATCT":19389, "GATCC":20140, "GATCG":8837, "GATGA":14331, "GATGT":14664, "GATGC":15659, "GATGG":47696, + "GACAA":14671, "GACAT":12196, "GACAC":16969, "GACAG":20999, "GACTA":9495, "GACTT":15660, "GACTC":16682, "GACTG":19882, "GACCA":15374, "GACCT":17618, "GACCC":22910, "GACCG":9949, "GACGA":20673, "GACGT":6288, "GACGC":12396, "GACGG":11805, + "GAGAA":22236, "GAGAT":18674, "GAGAC":20606, "GAGAG":28092, "GAGTA":11847, "GAGTT":24827, "GAGTC":18574, "GAGTG":30765, "GAGCA":21670, "GAGCT":26523, "GAGCC":33293, "GAGCG":18176, "GAGGA":28457, "GAGGT":29950, "GAGGC":46973, "GAGGG":38666, + "GTAAA":12736, "GTAAT":16401, "GTAAC":9856, "GTAAG":11491, "GTATA":9543, "GTATT":16492, "GTATC":8714, "GTATG":17992, "GTACA":11164, "GTACT":12562, "GTACC":10782, "GTACG":5520, "GTAGA":11338, "GTAGT":13090, "GTAGC":14100, "GTAGG":13180, + "GTTAA":11897, "GTTAT":13401, "GTTAC":11243, "GTTAG":12784, "GTTTA":13873, "GTTTT":27741, "GTTTC":18673, "GTTTG":29490, "GTTCA":20459, "GTTCT":24846, "GTTCC":17722, "GTTCG":6865, "GTTGA":13305, "GTTGT":18113, "GTTGC":20166, "GTTGG":62287, + "GTCAA":11429, "GTCAT":12405, "GTCAC":496745, "GTCAG":16697, "GTCTA":10352, "GTCTT":17742, "GTCTC":23908, "GTCTG":22926, "GTCCA":16680, "GTCCT":20258, "GTCCC":26742, "GTCCG":24885, "GTCGA":5492, "GTCGT":5262, "GTCGC":10196, "GTCGG":9079, + "GTGAA":16405, "GTGAT":18835, "GTGAC":15708, "GTGAG":25447, "GTGTA":11527, "GTGTT":21718, "GTGTC":16644, "GTGTG":41502, "GTGCA":25764, "GTGCT":32606, "GTGCC":588167, "GTGCG":18233, "GTGGA":156486, "GTGGT":32497, "GTGGC":36802, "GTGGG":37668, + "GCAAA":20015, "GCAAT":20263, "GCAAC":18741, "GCAAG":23343, "GCATA":11407, "GCATT":22219, "GCATC":15223, "GCATG":37750, "GCACA":21639, "GCACT":26638, "GCACC":26735, "GCACG":15202, "GCAGA":22284, "GCAGT":28911, "GCAGC":45041, "GCAGG":40406, + "GCTAA":15136, "GCTAT":18284, "GCTAC":19990, "GCTAG":18093, "GCTTA":13983, "GCTTT":27592, "GCTTC":25286, "GCTTG":43193, "GCTCA":25633, "GCTCT":26900, "GCTCC":38171, "GCTCG":14899, "GCTGA":24042, "GCTGT":23618, "GCTGC":38663, "GCTGG":105129, + "GCCAA":601690, "GCCAT":33211, "GCCAC":36026, "GCCAG":36611, "GCCTA":17279, "GCCTT":32597, "GCCTC":48379, "GCCTG":67680, "GCCCA":39958, "GCCCT":39002, "GCCCC":50423, "GCCCG":37502, "GCCGA":15650, "GCCGT":15089, "GCCGC":47554, "GCCGG":27214, + "GCGAA":8846, "GCGAT":13749, "GCGAC":14582, "GCGAG":21402, "GCGTA":6966, "GCGTT":15587, "GCGTC":12333, "GCGTG":35552, "GCGCA":20418, "GCGCT":30547, "GCGCC":38792, "GCGCG":32830, "GCGGA":16573, "GCGGT":19194, "GCGGC":38456, "GCGGG":35615, + "GGAAA":23836, "GGAAT":633027, "GGAAC":521260, "GGAAG":25491, "GGATA":9722, "GGATT":20796, "GGATC":14193, "GGATG":26264, "GGACA":16457, "GGACT":18120, "GGACC":19201, "GGACG":11445, "GGAGA":26690, "GGAGT":26400, "GGAGC":30601, "GGAGG":53083, + "GGTAA":12273, "GGTAT":15668, "GGTAC":12166, "GGTAG":15281, "GGTTA":13345, "GGTTT":24730, "GGTTC":20147, "GGTTG":34735, "GGTCA":16415, "GGTCT":23372, "GGTCC":21522, "GGTCG":9147, "GGTGA":23533, "GGTGT":26195, "GGTGC":595350, "GGTGG":92124, + "GGCAA":22919, "GGCAT":26591, "GGCAC":26709, "GGCAG":43958, "GGCTA":18293, "GGCTT":29848, "GGCTC":35992, "GGCTG":60231, "GGCCA":34285, "GGCCT":41493, "GGCCC":46107, "GGCCG":31623, "GGCGA":18270, "GGCGT":23260, "GGCGC":37773, "GGCGG":41648, + "GGGAA":26512, "GGGAT":23710, "GGGAC":23254, "GGGAG":47972, "GGGTA":15757, "GGGTT":29311, "GGGTC":23396, "GGGTG":624958, "GGGCA":34457, "GGGCT":41166, "GGGCC":46250, "GGGCG":36118, "GGGGA":33765, "GGGGT":36877, "GGGGC":49693, "GGGGG":61798 + }, + "overrepresented_sequences": { + "AAAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":62, + "AAATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":44, + "AACATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":34, + "AACCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":49, + "AACGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":44, + "AACTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":36, + "AAGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":53, + "AAGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":32, + "AAGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":55, + "AAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":61, + "AAGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":40, + "AAGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":35, + "AAGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":43, + "AAGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":59, + "AAGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":64, + "AATATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":52, + "AATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA":25, + "AATGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":51, + "AATTCTCGGGTGCCAAGGAA":46, + "AATTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":64, + "ACAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":42, + "ACACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":29, + "ACAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":49, + "ACATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":65, + "ACCACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":36, + "ACCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":19, + "ACCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":24, + "ACCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":44, + "ACCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":52, + "ACGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":42, + "ACGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":45, + "ACGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":42, + "ACGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":41, + "ACTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":29, + "ACTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":20, + "ACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA":24, + "ACTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":20, + "ACTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":44, + "AGAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":33, + "AGACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":34, + "AGAGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":30, + "AGAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":55, + "AGATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":47, + "AGCAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":30, + "AGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":24, + "AGCATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":34, + "AGCCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":51, + "AGCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":57, + "AGCCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":26, + "AGCCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":52, + "AGCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":51, + "AGCGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":34, + "AGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":52, + "AGCTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":29, + "AGCTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":15, + "AGCTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":37, + "AGGAATTCTCGGGTGCCAAG":118, + "AGGAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":29, + "AGGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":86, + "AGGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":38, + "AGGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":42, + "AGGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":28, + "AGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":22, + "AGGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":38, + "AGGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":68, + "AGGGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":31, + "AGGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":37, + "AGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":26, + "AGGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":40, + "AGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":29, + "AGGTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":38, + "AGTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":59, + "AGTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":48, + "AGTGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":51, + "AGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA":32, + "AGTGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":43, + "AGTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":45, + "AGTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":57, + "ATAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":45, + "ATACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":49, + "ATAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":43, + "ATATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":57, + "ATCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":35, + "ATCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":56, + "ATCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":35, + "ATGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":56, + "ATGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":69, + "ATGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":135, + "ATGGAATTCTCGGGTGCCAA":5179, + "ATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAATATCT":58, + "ATGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":33, + "ATGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":37, + "ATGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":79, + "ATGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":59, + "ATTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":52, + "ATTCTCGGGTGCCAAGGAAC":43, + "ATTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":42, + "ATTGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":32, + "ATTGGAATTCTCGGGTGCCA":1375, + "ATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA":30, + "ATTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":61, + "ATTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":85, + "CAAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":75, + "CAAATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":10, + "CAACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":62, + "CAAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":31, + "CAAGGAACTCCAGTCACGCC":86, + "CAAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":78, + "CAATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":18, + "CACACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":23, + "CACATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":52, + "CACCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":48, + "CACCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":31, + "CACCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":48, + "CACCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":38, + "CACGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":34, + "CACGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":85, + "CACTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":22, + "CACTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":40, + "CAGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":46, + "CAGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":49, + "CAGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":40, + "CAGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":49, + "CAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":39, + "CAGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":60, + "CAGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":50, + "CAGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":49, + "CAGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":30, + "CAGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":42, + "CAGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":20, + "CATATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":74, + "CATCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":28, + "CATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA":18, + "CATGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":40, + "CATTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":20, + "CCAAGGAACTCCAGTCACGC":38, + "CCAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":31, + "CCAATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":28, + "CCACATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":51, + "CCACCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":23, + "CCACCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":53, + "CCACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":19, + "CCACTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":53, + "CCAGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":39, + "CCAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":35, + "CCAGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":35, + "CCAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":31, + "CCAGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":42, + "CCATCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":31, + "CCATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":37, + "CCATTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":64, + "CCCAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":49, + "CCCACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":69, + "CCCAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":32, + "CCCAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":46, + "CCCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":35, + "CCCATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":35, + "CCCCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":54, + "CCCCATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":27, + "CCCCCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":38, + "CCCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":44, + "CCCCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":64, + "CCCCTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":14, + "CCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":19, + "CCCCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":57, + "CCCGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":34, + "CCCGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":27, + "CCCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":39, + "CCCGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":47, + "CCCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":17, + "CCCGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":44, + "CCCTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":23, + "CCCTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":39, + "CCCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":47, + "CCCTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":58, + "CCGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":50, + "CCGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":41, + "CCGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":36, + "CCGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":23, + "CCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":35, + "CCGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":53, + "CCGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":25, + "CCGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":43, + "CCTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":33, + "CCTATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":27, + "CCTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":68, + "CCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA":7, + "CCTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":70, + "CCTTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":34, + "CCTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":31, + "CCTTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":45, + "CGAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":47, + "CGACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":31, + "CGAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":19, + "CGAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":18, + "CGATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":53, + "CGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":35, + "CGCCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":51, + "CGCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":49, + "CGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":38, + "CGCCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":48, + "CGCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":51, + "CGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":18, + "CGCGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":36, + "CGCTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":42, + "CGCTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":26, + "CGCTGCGATCTATTGAAAGTCAGCCCTCGACACAAGGGTT":24, + "CGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":39, + "CGCTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":39, + "CGGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":29, + "CGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":61, + "CGGGTGCCAAGGAACTCCAG":57, + "CGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":29, + "CGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":31, + "CGTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":49, + "CGTGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":47, + "CGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA":16, + "CGTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":36, + "CGTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":41, + "CTAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":60, + "CTACCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":57, + "CTACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":51, + "CTAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":62, + "CTATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":19, + "CTCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":43, + "CTCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":33, + "CTCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":47, + "CTCGGGTGCCAAGGAACTCC":39, + "CTCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":30, + "CTCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":26, + "CTGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":35, + "CTGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":54, + "CTGGAATTCTCGGGTGCCAA":6923, + "CTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAATATCT":35, + "CTGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":36, + "CTGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":32, + "CTTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":42, + "CTTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":47, + "CTTCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":22, + "CTTGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":34, + "CTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA":15, + "CTTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":16, + "CTTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":17, + "GAAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":42, + "GAATTCTCGGGTGCCAAGGA":39, + "GAATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":44, + "GACATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":25, + "GAGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":66, + "GAGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":30, + "GAGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":50, + "GAGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":27, + "GAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":33, + "GAGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":27, + "GAGGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":30, + "GAGGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":42, + "GAGGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":42, + "GAGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":52, + "GAGGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":34, + "GAGGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":35, + "GAGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":32, + "GAGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":16, + "GAGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":29, + "GAGTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":23, + "GAGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":99, + "GATATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":39, + "GATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA":13, + "GATGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":53, + "GATTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":62, + "GCAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":117, + "GCAATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":32, + "GCACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":75, + "GCAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":73, + "GCAGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":44, + "GCAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":61, + "GCAGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":31, + "GCATGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":23, + "GCATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":24, + "GCATTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":32, + "GCCAAGGAACTCCAGTCACG":39, + "GCCAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":44, + "GCCACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":88, + "GCCAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":41, + "GCCATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":50, + "GCCCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":86, + "GCCCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":29, + "GCCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":57, + "GCCCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":29, + "GCCCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":64, + "GCCCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":51, + "GCCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":38, + "GCCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":16, + "GCCTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":33, + "GCCTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":62, + "GCGAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":25, + "GCGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":52, + "GCGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":69, + "GCGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":63, + "GCGCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":37, + "GCGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":60, + "GCGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":56, + "GCGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":31, + "GCGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":44, + "GCGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":29, + "GCGTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":34, + "GCGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":65, + "GCGTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":42, + "GCTACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":45, + "GCTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":18, + "GCTATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":27, + "GCTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":64, + "GCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAATATC":20, + "GCTGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":29, + "GCTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":62, + "GCTTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":31, + "GCTTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":33, + "GCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCA":6, + "GCTTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":33, + "GCTTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":34, + "GGAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":52, + "GGAATTCTCGGGTGCCAAGG":162, + "GGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAATATCTCG":5, + "GGAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":37, + "GGAGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":29, + "GGAGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":39, + "GGAGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":28, + "GGAGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":24, + "GGAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":21, + "GGATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":58, + "GGCACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":30, + "GGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":17, + "GGCATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":43, + "GGCCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":48, + "GGCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":55, + "GGCCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":24, + "GGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":27, + "GGCCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":45, + "GGCGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":50, + "GGCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":39, + "GGCGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":19, + "GGCGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":55, + "GGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":18, + "GGCGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":47, + "GGCTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":37, + "GGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":24, + "GGCTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":60, + "GGGAGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCAC":27, + "GGGAGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":39, + "GGGAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":43, + "GGGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":65, + "GGGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":33, + "GGGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":36, + "GGGCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":28, + "GGGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":52, + "GGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":23, + "GGGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":28, + "GGGGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":47, + "GGGGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":21, + "GGGGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":35, + "GGGGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":40, + "GGGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":36, + "GGGGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":24, + "GGGGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":42, + "GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG":20, + "GGGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":85, + "GGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":17, + "GGGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":61, + "GGGTGCCAAGGAACTCCAGT":120, + "GGGTGCCTGGAATTCTCGGG":14, + "GGGTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":46, + "GGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":13, + "GGGTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":42, + "GGTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":69, + "GGTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":43, + "GGTGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":29, + "GGTGCCAAGGAACTCCAGTC":76, + "GGTGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":34, + "GGTGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":63, + "GGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA":6, + "GGTGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":28, + "GGTGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":38, + "GGTGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":52, + "GGTGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":30, + "GGTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":76, + "GGTGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":38, + "GGTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":16, + "GTAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":49, + "GTACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":48, + "GTATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":63, + "GTCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":31, + "GTCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":44, + "GTGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":35, + "GTGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":39, + "GTGCCAAGGAACTCCAGTCA":22, + "GTGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":67, + "GTGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":46, + "GTGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":70, + "GTGGAATTCTCGGGTGCCAA":4479, + "GTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAATATCT":47, + "GTGGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":28, + "GTGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":33, + "GTGGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":24, + "GTGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":29, + "GTGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":35, + "GTGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":28, + "GTGTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":34, + "GTGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":57, + "GTTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":67, + "GTTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":45, + "GTTGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":43, + "GTTGGAATTCTCGGGTGCCA":1640, + "GTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA":15, + "GTTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":64, + "GTTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":102, + "NNNNNNNNNNNNNNNNNNNN":317, + "TAAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":45, + "TAACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":38, + "TAAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":40, + "TAATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":63, + "TACATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":53, + "TACCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":28, + "TACCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":43, + "TACCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":53, + "TACGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":40, + "TACTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":53, + "TAGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":29, + "TAGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":54, + "TAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":94, + "TAGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":39, + "TAGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":55, + "TAGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":56, + "TATATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":53, + "TATCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":39, + "TATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA":20, + "TATGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":65, + "TATTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":78, + "TCACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":35, + "TCAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":25, + "TCCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":49, + "TCCCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":39, + "TCCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":40, + "TCCCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":23, + "TCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":42, + "TCCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":55, + "TCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":33, + "TCGGGTGCCAAGGAACTCCA":111, + "TCTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":39, + "TCTCGGGTGCCAAGGAACTC":75, + "TCTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":16, + "TCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA":22, + "TGAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":39, + "TGAATTCTCGGGTGCCAAGG":200, + "TGACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":36, + "TGAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":30, + "TGAGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":35, + "TGAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":71, + "TGATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":52, + "TGCAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":23, + "TGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":76, + "TGCATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":16, + "TGCCAAGGAACTCCAGTCAC":31, + "TGCCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":51, + "TGCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":67, + "TGCCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":30, + "TGCCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":60, + "TGCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":67, + "TGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":63, + "TGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":52, + "TGCTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":33, + "TGGAATTCTCGGGTGCCAAG":145, + "TGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAATATCTC":131, + "TGGAATTCTCGGGTGCCTGG":135, + "TGGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":72, + "TGGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":34, + "TGGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":77, + "TGGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":38, + "TGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":29, + "TGGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":51, + "TGGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":47, + "TGGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":42, + "TGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":55, + "TGGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":48, + "TGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":70, + "TGGTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":32, + "TGTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":45, + "TGTCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":11, + "TGTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":49, + "TGTGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":62, + "TGTGGAATTCTCGGGTGCCA":1254, + "TGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA":13, + "TGTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":42, + "TGTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":89, + "TTAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":52, + "TTACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":48, + "TTAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":37, + "TTATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":63, + "TTCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":49, + "TTCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":42, + "TTCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":61, + "TTCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":43, + "TTCTCGGGTGCCAAGGAACT":27, + "TTCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":36, + "TTGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":45, + "TTGCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG":32, + "TTGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":58, + "TTGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":36, + "TTGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":49, + "TTGGAATTCTCGGGTGCCAA":1870, + "TTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAATATCT":79, + "TTGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":79, + "TTGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":77, + "TTTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":58, + "TTTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":61, + "TTTGGAATTCTCGGGTGCCA":1831, + "TTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA":15, + "TTTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":72, + "TTTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC":58, + "TTTTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC":21, + "TTTTTTTTTTTTTTTTTTTT":247 } + }, + "read1_after_filtering": { + "total_reads": 464390, + "total_bases": 20168949, + "q20_bases": 19734976, + "q30_bases": 19583954, + "total_cycles": 46, + "quality_curves": { + "A":[31.2401,31.5022,31.636,31.6266,31.6418,35.3722,35.3044,35.163,29.4968,34.3459,35.4818,34.0262,33.623,34.9507,35.0877,35.1445,35.1238,35.2717,35.5328,35.5116,35.5107,35.2808,35.4546,35.1221,35.1075,33.931,33.9263,35.4028,35.393,34.2387,34.2948,35.0348,35.0266,34.9663,34.9694,33.8772,35.2847,35.0588,34.9437,34.0013,35.0035,34.9558,35.0212,34.3869,34.4151,34.9608], + "T":[31.7057,31.7317,31.8156,31.8333,31.8356,35.421,35.3998,35.4321,34.8953,35.5527,35.629,35.5163,35.4649,35.3396,35.1332,35.5055,35.18,35.4995,35.6472,35.663,35.6578,35.4918,35.6359,35.5049,35.4427,35.351,35.3955,35.6073,35.6008,35.4272,35.391,35.3695,35.2359,35.3385,35.3526,35.3373,35.5239,35.2352,35.2943,35.2832,35.2925,35.1967,35.1907,35.2366,35.2946,34.995], + "C":[31.7543,31.7341,31.8508,31.8611,31.8692,35.4989,35.4932,35.4685,35.7496,35.6681,35.6658,35.6331,35.5948,35.6448,35.5296,35.2787,35.4779,35.1619,35.6657,35.6526,35.6522,35.5465,35.6182,35.3801,35.2972,35.478,35.487,35.5555,35.5347,35.3807,35.3303,35.0579,35.301,35.2075,35.1599,35.3702,35.4638,35.2103,34.9253,35.1284,34.9168,35.1121,35.0812,34.9454,35.2082,35.079], + "G":[31.0929,31.5382,31.7071,31.7314,31.7502,35.3147,35.2504,35.2554,35.1647,34.9292,35.3012,35.4334,35.4166,35.4993,35.4229,35.4899,35.4124,35.4862,35.4727,35.5204,35.5427,35.4896,35.4576,35.4835,35.431,35.3145,35.3219,35.4564,35.4278,35.3371,35.3271,35.3734,35.3208,35.3572,35.3076,35.2383,35.3131,35.28,35.2836,35.1727,35.1823,35.0648,35.0097,35.0101,34.9348,34.7628], + "mean":[31.4558,31.6196,31.7461,31.7669,31.7776,35.3954,35.3472,35.3116,34.684,35.2227,35.5365,35.2027,35.0916,35.3874,35.3032,35.3529,35.3159,35.3461,35.5855,35.5899,35.5918,35.4528,35.5412,35.3698,35.3162,35.0235,35.0473,35.5045,35.4878,35.0899,35.091,35.2035,35.2252,35.2164,35.1948,34.9685,35.3989,35.1962,35.1021,34.9027,35.0913,35.0845,35.0762,34.9036,34.9953,34.9608] + }, + "content_curves": { + "A":[0.254181,0.281201,0.220347,0.193923,0.193531,0.181238,0.218304,0.215575,0.100622,0.156956,0.228741,0.224889,0.219301,0.2068,0.219699,0.204776,0.210054,0.226344,0.206144,0.233093,0.236616,0.250225,0.246739,0.24869,0.251351,0.24693,0.239311,0.241437,0.244322,0.254153,0.24345,0.237582,0.235991,0.23746,0.240977,0.241306,0.232234,0.241307,0.246552,0.242179,0.23706,0.232102,0.230151,0.230668,0.206967,0], + "T":[0.272721,0.293081,0.227787,0.219326,0.224266,0.243289,0.254695,0.298768,0.211518,0.283574,0.265848,0.211439,0.266345,0.255916,0.263931,0.238575,0.238397,0.237027,0.245843,0.229081,0.24257,0.23314,0.229204,0.232281,0.230001,0.234725,0.232644,0.232192,0.232769,0.230492,0.231413,0.244757,0.239029,0.23599,0.234994,0.233683,0.240108,0.23518,0.235476,0.23652,0.234816,0.247934,0.245417,0.242449,0.255816,0.353318], + "C":[0.256069,0.178262,0.208454,0.257818,0.24555,0.243065,0.193656,0.109692,0.250738,0.281783,0.292935,0.341932,0.3125,0.293178,0.285975,0.331596,0.298094,0.291979,0.298925,0.296802,0.27057,0.262282,0.273925,0.27391,0.268725,0.26832,0.268933,0.266767,0.26895,0.270127,0.281413,0.279585,0.283248,0.288293,0.282408,0.272267,0.278011,0.281316,0.279326,0.281201,0.280404,0.280907,0.279059,0.271034,0.279558,0.37276], + "G":[0.21665,0.247451,0.343412,0.328933,0.336652,0.332397,0.333343,0.375964,0.437122,0.277687,0.212477,0.221738,0.201848,0.244099,0.230393,0.225052,0.253455,0.24465,0.249084,0.241013,0.250219,0.254353,0.250117,0.245106,0.249915,0.249971,0.259048,0.259591,0.253943,0.245212,0.24371,0.238069,0.241722,0.238245,0.241617,0.252732,0.249644,0.24219,0.238641,0.2401,0.247717,0.239026,0.245357,0.255844,0.257645,0.273864], + "N":[0.000378992,4.30672e-06,0,0,0,1.07668e-05,2.15336e-06,0,0,0,0,2.15336e-06,6.46009e-06,6.46009e-06,2.15336e-06,0,0,0,4.30672e-06,1.07668e-05,2.58403e-05,0,1.50735e-05,1.29202e-05,8.61345e-06,5.38341e-05,6.30625e-05,1.32141e-05,1.57277e-05,1.59085e-05,1.37857e-05,6.96578e-06,9.38427e-06,1.1852e-05,4.79222e-06,1.21396e-05,2.45901e-06,7.46026e-06,5.03127e-06,0,2.58286e-06,3.10263e-05,1.55618e-05,5.27796e-06,1.41118e-05,5.7578e-05], + "GC":[0.472719,0.425713,0.551866,0.58675,0.582202,0.575462,0.526999,0.485656,0.687859,0.559469,0.505411,0.563671,0.514348,0.537277,0.516368,0.556649,0.551549,0.536629,0.548009,0.537815,0.520789,0.516635,0.524042,0.519016,0.51864,0.518291,0.527981,0.526358,0.522893,0.515339,0.525123,0.517655,0.52497,0.526538,0.524025,0.524999,0.527655,0.523506,0.517967,0.521301,0.528121,0.519933,0.524416,0.526878,0.537203,0.646624] + }, + "kmer_count": { + "AAAAA":46163, "AAAAT":28333, "AAAAC":21998, "AAAAG":21412, "AAATA":21873, "AAATT":19922, "AAATC":14853, "AAATG":19360, "AAACA":22163, "AAACT":18052, "AAACC":18971, "AAACG":5637, "AAAGA":20704, "AAAGT":18541, "AAAGC":16828, "AAAGG":19493, + "AATAA":18551, "AATAT":15644, "AATAC":12562, "AATAG":9861, "AATTA":15139, "AATTT":22023, "AATTC":22197, "AATTG":11227, "AATCA":13861, "AATCT":15143, "AATCC":17507, "AATCG":4218, "AATGA":14955, "AATGT":13898, "AATGC":13064, "AATGG":17482, + "AACAA":19988, "AACAT":15021, "AACAC":16486, "AACAG":16520, "AACTA":11040, "AACTT":14172, "AACTC":23899, "AACTG":15297, "AACCA":16493, "AACCT":17278, "AACCC":20854, "AACCG":6320, "AACGA":4833, "AACGT":4278, "AACGC":6871, "AACGG":6559, + "AAGAA":21865, "AAGAT":13547, "AAGAC":14755, "AAGAG":19645, "AAGTA":12101, "AAGTT":15154, "AAGTC":14140, "AAGTG":19735, "AAGCA":19542, "AAGCT":16794, "AAGCC":19319, "AAGCG":11802, "AAGGA":25402, "AAGGT":15328, "AAGGC":21035, "AAGGG":21961, + "ATAAA":19391, "ATAAT":14020, "ATAAC":8634, "ATAAG":9623, "ATATA":12781, "ATATT":15158, "ATATC":9190, "ATATG":11584, "ATACA":13741, "ATACT":10980, "ATACC":8745, "ATACG":3650, "ATAGA":8539, "ATAGT":9730, "ATAGC":9210, "ATAGG":9982, + "ATTAA":14132, "ATTAT":13970, "ATTAC":12424, "ATTAG":11143, "ATTTA":16578, "ATTTT":33163, "ATTTC":18327, "ATTTG":16557, "ATTCA":15187, "ATTCT":26675, "ATTCC":16914, "ATTCG":5265, "ATTGA":9366, "ATTGT":12200, "ATTGC":12419, "ATTGG":14591, + "ATCAA":12817, "ATCAT":13049, "ATCAC":15112, "ATCAG":12582, "ATCTA":11054, "ATCTT":17120, "ATCTC":20195, "ATCTG":16572, "ATCCA":17217, "ATCCT":18501, "ATCCC":21373, "ATCCG":7439, "ATCGA":4314, "ATCGT":4686, "ATCGC":7571, "ATCGG":5418, + "ATGAA":14643, "ATGAT":13001, "ATGAC":10271, "ATGAG":15146, "ATGTA":10896, "ATGTT":17137, "ATGTC":11487, "ATGTG":17982, "ATGCA":15255, "ATGCT":16559, "ATGCC":18223, "ATGCG":8035, "ATGGA":16826, "ATGGT":17461, "ATGGC":21147, "ATGGG":20627, + "ACAAA":23767, "ACAAT":12938, "ACAAC":12918, "ACAAG":15444, "ACATA":11234, "ACATT":15172, "ACATC":11437, "ACATG":16237, "ACACA":23199, "ACACT":15929, "ACACC":19878, "ACACG":8601, "ACAGA":20408, "ACAGT":19596, "ACAGC":22284, "ACAGG":24177, + "ACTAA":11757, "ACTAT":9982, "ACTAC":11271, "ACTAG":9522, "ACTTA":10692, "ACTTT":20723, "ACTTC":15895, "ACTTG":15496, "ACTCA":17505, "ACTCT":16761, "ACTCC":31951, "ACTCG":7774, "ACTGA":14832, "ACTGT":14390, "ACTGC":21205, "ACTGG":18239, + "ACCAA":16022, "ACCAT":15809, "ACCAC":21683, "ACCAG":20125, "ACCTA":11354, "ACCTT":17054, "ACCTC":24854, "ACCTG":23160, "ACCCA":22243, "ACCCT":20248, "ACCCC":23339, "ACCCG":15662, "ACCGA":6381, "ACCGT":6078, "ACCGC":14224, "ACCGG":10385, + "ACGAA":5295, "ACGAT":17571, "ACGAC":5683, "ACGAG":7731, "ACGTA":3573, "ACGTT":5564, "ACGTC":5644, "ACGTG":8114, "ACGCA":7851, "ACGCT":8740, "ACGCC":21613, "ACGCG":9027, "ACGGA":7799, "ACGGT":6806, "ACGGC":11067, "ACGGG":12330, + "AGAAA":25550, "AGAAT":17119, "AGAAC":14399, "AGAAG":20653, "AGATA":10404, "AGATT":13356, "AGATC":12108, "AGATG":16644, "AGACA":18371, "AGACT":15204, "AGACC":16907, "AGACG":8220, "AGAGA":23436, "AGAGT":18958, "AGAGC":20876, "AGAGG":25629, + "AGTAA":11580, "AGTAT":10190, "AGTAC":8891, "AGTAG":13467, "AGTTA":10943, "AGTTT":18747, "AGTTC":19686, "AGTTG":14186, "AGTCA":20589, "AGTCT":15184, "AGTCC":29006, "AGTCG":5232, "AGTGA":17853, "AGTGT":14853, "AGTGC":20653, "AGTGG":25650, + "AGCAA":19474, "AGCAT":15475, "AGCAC":21384, "AGCAG":27428, "AGCTA":17615, "AGCTT":18422, "AGCTC":23017, "AGCTG":27380, "AGCCA":27271, "AGCCT":32749, "AGCCC":31657, "AGCCG":18497, "AGCGA":12715, "AGCGT":8815, "AGCGC":19413, "AGCGG":16982, + "AGGAA":29613, "AGGAT":15945, "AGGAC":16073, "AGGAG":31702, "AGGTA":12891, "AGGTT":18927, "AGGTC":15680, "AGGTG":26485, "AGGCA":29942, "AGGCT":31644, "AGGCC":29663, "AGGCG":22554, "AGGGA":23698, "AGGGT":20788, "AGGGC":29652, "AGGGG":30877, + "TAAAA":24485, "TAAAT":16788, "TAAAC":11785, "TAAAG":13212, "TAATA":11618, "TAATT":16383, "TAATC":13535, "TAATG":11902, "TAACA":12510, "TAACT":11377, "TAACC":9676, "TAACG":3902, "TAAGA":12309, "TAAGT":11425, "TAAGC":10923, "TAAGG":12844, + "TATAA":12717, "TATAT":13779, "TATAC":8509, "TATAG":8348, "TATTA":12027, "TATTT":25099, "TATTC":12549, "TATTG":11958, "TATCA":10144, "TATCT":13378, "TATCC":10948, "TATCG":3066, "TATGA":10104, "TATGT":13410, "TATGC":11319, "TATGG":14508, + "TACAA":13900, "TACAT":12364, "TACAC":12081, "TACAG":21915, "TACTA":10663, "TACTT":14451, "TACTC":13454, "TACTG":13177, "TACCA":13833, "TACCT":14818, "TACCC":11867, "TACCG":5800, "TACGA":3929, "TACGT":4569, "TACGC":5566, "TACGG":6718, + "TAGAA":13223, "TAGAT":8980, "TAGAC":7792, "TAGAG":13540, "TAGTA":9530, "TAGTT":12294, "TAGTC":11480, "TAGTG":13123, "TAGCA":13282, "TAGCT":15959, "TAGCC":14546, "TAGCG":8019, "TAGGA":13526, "TAGGT":12159, "TAGGC":15135, "TAGGG":16210, + "TTAAA":21192, "TTAAT":14602, "TTAAC":10936, "TTAAG":12887, "TTATA":12266, "TTATT":19592, "TTATC":10682, "TTATG":12703, "TTACA":16267, "TTACT":13482, "TTACC":13495, "TTACG":4388, "TTAGA":11196, "TTAGT":12430, "TTAGC":13443, "TTAGG":14992, + "TTTAA":21456, "TTTAT":19840, "TTTAC":13674, "TTTAG":14415, "TTTTA":24989, "TTTTT":224474, "TTTTC":24927, "TTTTG":24575, "TTTCA":22600, "TTTCT":28038, "TTTCC":25192, "TTTCG":6225, "TTTGA":16096, "TTTGT":21909, "TTTGC":17737, "TTTGG":25898, + "TTCAA":19782, "TTCAT":17108, "TTCAC":19046, "TTCAG":21437, "TTCTA":19057, "TTCTT":25228, "TTCTC":32344, "TTCTG":22870, "TTCCA":23864, "TTCCT":27624, "TTCCC":27134, "TTCCG":9953, "TTCGA":4866, "TTCGT":5134, "TTCGC":7416, "TTCGG":9234, + "TTGAA":16094, "TTGAT":11562, "TTGAC":9399, "TTGAG":17721, "TTGTA":12851, "TTGTT":19908, "TTGTC":12925, "TTGTG":20109, "TTGCA":17199, "TTGCT":20622, "TTGCC":20775, "TTGCG":9656, "TTGGA":19320, "TTGGT":18316, "TTGGC":22980, "TTGGG":28479, + "TCAAA":19394, "TCAAT":13050, "TCAAC":11720, "TCAAG":17450, "TCATA":9879, "TCATT":16251, "TCATC":13187, "TCATG":15113, "TCACA":18947, "TCACT":21459, "TCACC":24751, "TCACG":15163, "TCAGA":19531, "TCAGT":15427, "TCAGC":24575, "TCAGG":22670, + "TCTAA":12292, "TCTAT":11948, "TCTAC":16611, "TCTAG":12668, "TCTTA":12255, "TCTTT":22915, "TCTTC":21828, "TCTTG":19193, "TCTCA":22317, "TCTCT":27703, "TCTCC":32224, "TCTCG":19433, "TCTGA":17633, "TCTGT":19957, "TCTGC":23150, "TCTGG":23126, + "TCCAA":18041, "TCCAT":18587, "TCCAC":22407, "TCCAG":35472, "TCCTA":13530, "TCCTT":23522, "TCCTC":29863, "TCCTG":30896, "TCCCA":36697, "TCCCT":27782, "TCCCC":31853, "TCCCG":20538, "TCCGA":20297, "TCCGT":7327, "TCCGC":18592, "TCCGG":14555, + "TCGAA":5055, "TCGAT":4330, "TCGAC":4659, "TCGAG":7956, "TCGTA":3054, "TCGTT":5350, "TCGTC":5587, "TCGTG":7104, "TCGCA":6669, "TCGCT":10527, "TCGCC":14921, "TCGCG":8993, "TCGGA":6337, "TCGGT":7254, "TCGGC":15112, "TCGGG":20728, + "TGAAA":19091, "TGAAT":13721, "TGAAC":14310, "TGAAG":15365, "TGATA":8960, "TGATT":13770, "TGATC":14371, "TGATG":14424, "TGACA":14639, "TGACT":14877, "TGACC":15240, "TGACG":5586, "TGAGA":19546, "TGAGT":15662, "TGAGC":21759, "TGAGG":26732, + "TGTAA":15903, "TGTAT":13240, "TGTAC":9644, "TGTAG":12312, "TGTTA":12372, "TGTTT":22704, "TGTTC":16032, "TGTTG":19119, "TGTCA":14420, "TGTCT":19437, "TGTCC":17629, "TGTCG":6593, "TGTGA":16628, "TGTGT":23808, "TGTGC":20517, "TGTGG":26887, + "TGCAA":18735, "TGCAT":15354, "TGCAC":20340, "TGCAG":28906, "TGCTA":14028, "TGCTT":22113, "TGCTC":21237, "TGCTG":29841, "TGCCA":30243, "TGCCT":31868, "TGCCC":29048, "TGCCG":14653, "TGCGA":8064, "TGCGT":9955, "TGCGC":16321, "TGCGG":16316, + "TGGAA":26044, "TGGAT":14412, "TGGAC":13226, "TGGAG":26291, "TGGTA":13506, "TGGTT":19286, "TGGTC":17676, "TGGTG":29402, "TGGCA":25260, "TGGCT":30028, "TGGCC":31916, "TGGCG":19312, "TGGGA":30756, "TGGGT":26008, "TGGGC":33262, "TGGGG":35311, + "CAAAA":25728, "CAAAT":17508, "CAAAC":17445, "CAAAG":21449, "CAATA":12816, "CAATT":14388, "CAATC":11393, "CAATG":14787, "CAACA":19425, "CAACT":15060, "CAACC":17202, "CAACG":6929, "CAAGA":18914, "CAAGT":17620, "CAAGC":19837, "CAAGG":29668, + "CATAA":10911, "CATAT":11391, "CATAC":9204, "CATAG":9755, "CATTA":11738, "CATTT":23575, "CATTC":16355, "CATTG":14635, "CATCA":14104, "CATCT":20037, "CATCC":17898, "CATCG":5979, "CATGA":14474, "CATGT":18005, "CATGC":18939, "CATGG":24996, + "CACAA":18710, "CACAT":16969, "CACAC":24907, "CACAG":26605, "CACTA":11851, "CACTT":21579, "CACTC":23382, "CACTG":26640, "CACCA":28653, "CACCT":29636, "CACCC":29613, "CACCG":15934, "CACGA":7793, "CACGT":9011, "CACGC":23214, "CACGG":13705, + "CAGAA":22397, "CAGAT":14406, "CAGAC":18220, "CAGAG":30455, "CAGTA":11839, "CAGTT":17251, "CAGTC":28691, "CAGTG":26556, "CAGCA":30451, "CAGCT":33266, "CAGCC":48284, "CAGCG":21733, "CAGGA":29425, "CAGGT":24133, "CAGGC":39502, "CAGGG":33676, + "CTAAA":14736, "CTAAT":11855, "CTAAC":10113, "CTAAG":12558, "CTATA":9492, "CTATT":14012, "CTATC":9257, "CTATG":12737, "CTACA":19389, "CTACT":17600, "CTACC":14348, "CTACG":7217, "CTAGA":12095, "CTAGT":11884, "CTAGC":13665, "CTAGG":16983, + "CTTAA":12931, "CTTAT":11195, "CTTAC":11569, "CTTAG":12172, "CTTTA":14760, "CTTTT":25600, "CTTTC":22259, "CTTTG":22099, "CTTCA":20193, "CTTCT":25091, "CTTCC":30693, "CTTCG":8641, "CTTGA":16094, "CTTGT":17469, "CTTGC":18103, "CTTGG":28243, + "CTCAA":19256, "CTCAT":15046, "CTCAC":26438, "CTCAG":31530, "CTCTA":14263, "CTCTT":20921, "CTCTC":30183, "CTCTG":30029, "CTCCA":38723, "CTCCT":36932, "CTCCC":46839, "CTCCG":22075, "CTCGA":7458, "CTCGT":7246, "CTCGC":16222, "CTCGG":27232, + "CTGAA":18346, "CTGAT":12561, "CTGAC":18092, "CTGAG":28133, "CTGTA":17081, "CTGTT":17738, "CTGTC":19265, "CTGTG":22727, "CTGCA":28661, "CTGCT":28373, "CTGCC":38305, "CTGCG":17138, "CTGGA":28402, "CTGGT":19003, "CTGGC":30767, "CTGGG":43295, + "CCAAA":22568, "CCAAT":18722, "CCAAC":18401, "CCAAG":30604, "CCATA":10321, "CCATT":18940, "CCATC":20316, "CCATG":23590, "CCACA":24772, "CCACT":25641, "CCACC":36398, "CCACG":16735, "CCAGA":24400, "CCAGT":26069, "CCAGC":47319, "CCAGG":43762, + "CCTAA":11907, "CCTAT":10828, "CCTAC":13764, "CCTAG":15063, "CCTTA":12483, "CCTTT":21580, "CCTTC":25916, "CCTTG":23147, "CCTCA":29044, "CCTCT":30384, "CCTCC":49129, "CCTCG":18079, "CCTGA":22282, "CCTGT":24047, "CCTGC":33652, "CCTGG":42223, + "CCCAA":25048, "CCCAT":18471, "CCCAC":31008, "CCCAG":51711, "CCCTA":12725, "CCCTT":21647, "CCCTC":31466, "CCCTG":32835, "CCCCA":36015, "CCCCT":25858, "CCCCC":31847, "CCCCG":30890, "CCCGA":14848, "CCCGT":10797, "CCCGC":35932, "CCCGG":34259, + "CCGAA":6801, "CCGAT":5232, "CCGAC":25046, "CCGAG":18683, "CCGTA":4067, "CCGTT":7087, "CCGTC":11500, "CCGTG":12163, "CCGCA":16243, "CCGCT":19884, "CCGCC":46992, "CCGCG":27624, "CCGGA":13590, "CCGGT":9474, "CCGGC":29259, "CCGGG":31322, + "CGAAA":5366, "CGAAT":3970, "CGAAC":6863, "CGAAG":7929, "CGATA":3044, "CGATT":5711, "CGATC":20305, "CGATG":7496, "CGACA":8196, "CGACT":7536, "CGACC":11100, "CGACG":20873, "CGAGA":10750, "CGAGT":9011, "CGAGC":13942, "CGAGG":19574, + "CGTAA":3343, "CGTAT":3806, "CGTAC":3986, "CGTAG":5475, "CGTTA":4869, "CGTTT":7702, "CGTTC":7749, "CGTTG":8050, "CGTCA":5927, "CGTCT":9441, "CGTCC":12580, "CGTCG":5746, "CGTGA":8371, "CGTGT":9007, "CGTGC":12459, "CGTGG":15840, + "CGCAA":7257, "CGCAT":7442, "CGCAC":12561, "CGCAG":21020, "CGCTA":7486, "CGCTT":12409, "CGCTC":19636, "CGCTG":19687, "CGCCA":26103, "CGCCT":24276, "CGCCC":32667, "CGCCG":32103, "CGCGA":9520, "CGCGT":9858, "CGCGC":27876, "CGCGG":26128, + "CGGAA":8627, "CGGAT":6323, "CGGAC":10893, "CGGAG":16748, "CGGTA":5866, "CGGTT":7700, "CGGTC":9517, "CGGTG":14790, "CGGCA":13463, "CGGCT":19030, "CGGCC":30281, "CGGCG":26684, "CGGGA":18308, "CGGGT":20288, "CGGGC":27461, "CGGGG":28730, + "GAAAA":22275, "GAAAT":15390, "GAAAC":15525, "GAAAG":16889, "GAATA":9763, "GAATT":21062, "GAATC":11594, "GAATG":12631, "GAACA":13163, "GAACT":21168, "GAACC":15913, "GAACG":5546, "GAAGA":16763, "GAAGT":13352, "GAAGC":18351, "GAAGG":19642, + "GATAA":8872, "GATAT":8203, "GATAC":6745, "GATAG":7862, "GATTA":11688, "GATTT":14988, "GATTC":13355, "GATTG":9469, "GATCA":14920, "GATCT":17695, "GATCC":18797, "GATCG":8191, "GATGA":12354, "GATGT":11359, "GATGC":12253, "GATGG":19031, + "GACAA":12219, "GACAT":10220, "GACAC":15359, "GACAG":19601, "GACTA":8716, "GACTT":13686, "GACTC":15282, "GACTG":14945, "GACCA":14062, "GACCT":15975, "GACCC":21120, "GACCG":9263, "GACGA":18910, "GACGT":4683, "GACGC":11086, "GACGG":10862, + "GAGAA":20672, "GAGAT":15051, "GAGAC":19406, "GAGAG":23726, "GAGTA":10180, "GAGTT":19014, "GAGTC":16623, "GAGTG":18658, "GAGCA":18313, "GAGCT":20580, "GAGCC":28623, "GAGCG":14889, "GAGGA":24219, "GAGGT":21763, "GAGGC":37903, "GAGGG":30945, + "GTAAA":11111, "GTAAT":13403, "GTAAC":7994, "GTAAG":9683, "GTATA":8301, "GTATT":12936, "GTATC":7875, "GTATG":10181, "GTACA":9823, "GTACT":10148, "GTACC":8957, "GTACG":4404, "GTAGA":10550, "GTAGT":11105, "GTAGC":12547, "GTAGG":11736, + "GTTAA":10349, "GTTAT":10134, "GTTAC":9700, "GTTAG":10821, "GTTTA":11968, "GTTTT":22981, "GTTTC":17144, "GTTTG":16352, "GTTCA":18643, "GTTCT":21146, "GTTCC":15610, "GTTCG":5902, "GTTGA":11178, "GTTGT":13501, "GTTGC":15862, "GTTGG":19633, + "GTCAA":9789, "GTCAT":10263, "GTCAC":20892, "GTCAG":15661, "GTCTA":9287, "GTCTT":15151, "GTCTC":22680, "GTCTG":16683, "GTCCA":14820, "GTCCT":17153, "GTCCC":23533, "GTCCG":22387, "GTCGA":4905, "GTCGT":4198, "GTCGC":9247, "GTCGG":8057, + "GTGAA":13661, "GTGAT":14989, "GTGAC":13330, "GTGAG":21599, "GTGTA":9975, "GTGTT":16130, "GTGTC":14762, "GTGTG":26527, "GTGCA":21184, "GTGCT":21686, "GTGCC":28588, "GTGCG":14228, "GTGGA":19922, "GTGGT":24587, "GTGGC":29811, "GTGGG":31312, + "GCAAA":16253, "GCAAT":13816, "GCAAC":16102, "GCAAG":18923, "GCATA":8993, "GCATT":15583, "GCATC":13450, "GCATG":19742, "GCACA":18819, "GCACT":21852, "GCACC":23909, "GCACG":12399, "GCAGA":20604, "GCAGT":22679, "GCAGC":38532, "GCAGG":34810, + "GCTAA":12429, "GCTAT":12274, "GCTAC":16479, "GCTAG":14299, "GCTTA":11281, "GCTTT":19844, "GCTTC":21906, "GCTTG":20629, "GCTCA":23611, "GCTCT":23270, "GCTCC":34942, "GCTCG":13409, "GCTGA":22253, "GCTGT":19081, "GCTGC":34454, "GCTGG":40283, + "GCCAA":30426, "GCCAT":20900, "GCCAC":29674, "GCCAG":31535, "GCCTA":13548, "GCCTT":22447, "GCCTC":44629, "GCCTG":38500, "GCCCA":31576, "GCCCT":27109, "GCCCC":41246, "GCCCG":31032, "GCCGA":13650, "GCCGT":10375, "GCCGC":42482, "GCCGG":25708, + "GCGAA":6835, "GCGAT":9123, "GCGAC":13088, "GCGAG":17274, "GCGTA":5485, "GCGTT":9790, "GCGTC":11200, "GCGTG":17112, "GCGCA":15816, "GCGCT":19500, "GCGCC":32624, "GCGCG":26827, "GCGGA":14813, "GCGGT":14115, "GCGGC":35299, "GCGGG":31090, + "GGAAA":20548, "GGAAT":21323, "GGAAC":21563, "GGAAG":22767, "GGATA":8416, "GGATT":16984, "GGATC":13390, "GGATG":15476, "GGACA":15699, "GGACT":15985, "GGACC":18288, "GGACG":10730, "GGAGA":24524, "GGAGT":20819, "GGAGC":26201, "GGAGG":43799, + "GGTAA":10515, "GGTAT":11631, "GGTAC":10168, "GGTAG":13543, "GGTTA":11492, "GGTTT":19013, "GGTTC":18148, "GGTTG":17453, "GGTCA":14870, "GGTCT":20492, "GGTCC":19281, "GGTCG":8410, "GGTGA":19357, "GGTGT":19003, "GGTGC":30432, "GGTGG":38473, + "GGCAA":18830, "GGCAT":18336, "GGCAC":23597, "GGCAG":37755, "GGCTA":14943, "GGCTT":20433, "GGCTC":33558, "GGCTG":40777, "GGCCA":29115, "GGCCT":31686, "GGCCC":40083, "GGCCG":28685, "GGCGA":14816, "GGCGT":14368, "GGCGC":30850, "GGCGG":36865, + "GGGAA":22073, "GGGAT":18421, "GGGAC":21923, "GGGAG":39709, "GGGTA":12936, "GGGTT":20459, "GGGTC":21113, "GGGTG":36912, "GGGCA":28700, "GGGCT":30790, "GGGCC":39935, "GGGCG":28673, "GGGGA":28966, "GGGGT":25149, "GGGGC":39229, "GGGGG":38089 + }, + "overrepresented_sequences": { + "ATTCTCGGGTGCCAAGGAAC":20, + "CAAGGAACTCCAGTCACGCC":45, + "CGCTGCGATCTATTGAAAGTCAGCCCTCGACACAAGGGTT":28, + "CGGGTGCCAAGGAACTCCAG":16, + "CTCGGGTGCCAAGGAACTCC":18, + "GCCAAGGAACTCCAGTCACG":12, + "GGGTGCCAAGGAACTCCAGT":33, + "GGTGCCAAGGAACTCCAGTC":43, + "TCGGGTGCCAAGGAACTCCA":19, + "TCTCGGGTGCCAAGGAACTC":51, + "TTCTCGGGTGCCAAGGAACT":18, + "TTTTTTTTTTTTTTTTTTTT":248 } + }, + "command": "fastp --overrepresentation_analysis --thread 1 --in1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1.fastq --adapter_sequence TGGAATTCTCGGGTGCCAAGG --length_required 26 --html /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.html --json /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.json --report_title tutorial -o /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R1_noadap.fastq " +} \ No newline at end of file diff --git a/docs/files/examples/tutorial/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.txt b/docs/files/examples/tutorial/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.txt new file mode 100644 index 0000000..da43c3b --- /dev/null +++ b/docs/files/examples/tutorial/results_pipeline/tutorial/fastqc/tutorial_R1_rmAdapter.txt @@ -0,0 +1,29 @@ +Streaming uncompressed output to STDOUT... + +Read1 before filtering: +total reads: 1000000 +total bases: 37678766 +Q20 bases: 34709953(92.1207%) +Q30 bases: 34018346(90.2852%) + +Read1 after filtering: +total reads: 439519 +total bases: 16134044 +Q20 bases: 15454671(95.7892%) +Q30 bases: 15178418(94.077%) + +Filtering result: +reads passed filter: 439519 +reads failed due to low quality: 66799 +reads failed due to too many N: 105 +reads failed due to too short: 493577 +reads with adapter trimmed: 540203 +bases trimmed due to adapters: 14696777 + +Duplication rate (may be overestimated since this is SE data): 28.6979% + +JSON report: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R2_rmAdapter.json +HTML report: /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R2_rmAdapter.html + +fastp --overrepresentation_analysis --thread 1 --in1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2.fastq --adapter_sequence GATCGTCGGACTGTAGAACTCTGAAC --length_required 26 --html /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R2_rmAdapter.html --json /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R2_rmAdapter.json --report_title tutorial --stdout +fastp v0.19.4, time used: 7 seconds diff --git a/docs/files/examples/tutorial/results_pipeline/tutorial/fastqc/tutorial_R2_rmAdapter.html b/docs/files/examples/tutorial/results_pipeline/tutorial/fastqc/tutorial_R2_rmAdapter.html new file mode 100644 index 0000000..0883100 --- /dev/null +++ b/docs/files/examples/tutorial/results_pipeline/tutorial/fastqc/tutorial_R2_rmAdapter.html @@ -0,0 +1,2725 @@ +fastp report at 2019-07-31 20:43:39 + + + +
+

tutorial +
+ +
+
General
+
+ + + + + + +
fastp version:0.19.4 (https://github.com/OpenGene/fastp)
sequencing:single end (38 cycles)
mean length before filtering:37bp
mean length after filtering:36bp
duplication rate:28.697855% (may be overestimated since this is SE data)
+
+
Before filtering
+
+ + + + + + +
total reads:1000.000000 K
total bases:37.678766 M
Q20 bases:34.709953 M (92.120727%)
Q30 bases:34.018346 M (90.285191%)
GC content:51.863917%
+
+
After filtering
+
+ + + + + + +
total reads:439.519000 K
total bases:16.134044 M
Q20 bases:15.454671 M (95.789196%)
Q30 bases:15.178418 M (94.076959%)
GC content:52.695090%
+
+
Filtering result
+
+ + + + + +
reads passed filters:439.519000 K (43.951900%)
reads with low quality:66.799000 K (6.679900%)
reads with too many N:105 (0.010500%)
reads too short:493.577000 K (49.357700%)
+
+
+
+
+ +
+
Adapter or bad ligation of read1
+
+ + + + + + + + + + +
SequenceOccurrences
GATCGTCGG14299
GATCGTCGGAC6547
GATCGTCGGACT5538
GATCGTCGGACTG5881
GATCGTCGGACTGT17243
GATCGTCGGACTGTAGAACTCTGAACGTG7306
GATCGTCGGACTGTAGAACTCTGAACGTGT404556
other adapter sequences78833
+
+
+
+
+ +
+
+
+
+ + +
+
+
+ +
+ +
+
Value of each position will be shown on mouse over.
+
+
+ + + +
+
Value of each position will be shown on mouse over.
+
+
+ + + +
+
Darker background means larger counts. The count will be shown on mouse over.
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AAATACAGTATTTCTGCACTCCCGGAGTGCGG
AAAAAAAAAAAATAAAACAAAAGAAATAAAATTAAATCAAATGAAACAAAACTAAACCAAACGAAAGAAAAGTAAAGCAAAGG
AATAATAAAATATAATACAATAGAATTAAATTTAATTCAATTGAATCAAATCTAATCCAATCGAATGAAATGTAATGCAATGG
AACAACAAAACATAACACAACAGAACTAAACTTAACTCAACTGAACCAAACCTAACCCAACCGAACGAAACGTAACGCAACGG
AAGAAGAAAAGATAAGACAAGAGAAGTAAAGTTAAGTCAAGTGAAGCAAAGCTAAGCCAAGCGAAGGAAAGGTAAGGCAAGGG
ATAATAAAATAATATAACATAAGATATAATATTATATCATATGATACAATACTATACCATACGATAGAATAGTATAGCATAGG
ATTATTAAATTATATTACATTAGATTTAATTTTATTTCATTTGATTCAATTCTATTCCATTCGATTGAATTGTATTGCATTGG
ATCATCAAATCATATCACATCAGATCTAATCTTATCTCATCTGATCCAATCCTATCCCATCCGATCGAATCGTATCGCATCGG
ATGATGAAATGATATGACATGAGATGTAATGTTATGTCATGTGATGCAATGCTATGCCATGCGATGGAATGGTATGGCATGGG
ACAACAAAACAATACAACACAAGACATAACATTACATCACATGACACAACACTACACCACACGACAGAACAGTACAGCACAGG
ACTACTAAACTATACTACACTAGACTTAACTTTACTTCACTTGACTCAACTCTACTCCACTCGACTGAACTGTACTGCACTGG
ACCACCAAACCATACCACACCAGACCTAACCTTACCTCACCTGACCCAACCCTACCCCACCCGACCGAACCGTACCGCACCGG
ACGACGAAACGATACGACACGAGACGTAACGTTACGTCACGTGACGCAACGCTACGCCACGCGACGGAACGGTACGGCACGGG
AGAAGAAAAGAATAGAACAGAAGAGATAAGATTAGATCAGATGAGACAAGACTAGACCAGACGAGAGAAGAGTAGAGCAGAGG
AGTAGTAAAGTATAGTACAGTAGAGTTAAGTTTAGTTCAGTTGAGTCAAGTCTAGTCCAGTCGAGTGAAGTGTAGTGCAGTGG
AGCAGCAAAGCATAGCACAGCAGAGCTAAGCTTAGCTCAGCTGAGCCAAGCCTAGCCCAGCCGAGCGAAGCGTAGCGCAGCGG
AGGAGGAAAGGATAGGACAGGAGAGGTAAGGTTAGGTCAGGTGAGGCAAGGCTAGGCCAGGCGAGGGAAGGGTAGGGCAGGGG
TAATAAAATAAATTAAACTAAAGTAATATAATTTAATCTAATGTAACATAACTTAACCTAACGTAAGATAAGTTAAGCTAAGG
TATTATAATATATTATACTATAGTATTATATTTTATTCTATTGTATCATATCTTATCCTATCGTATGATATGTTATGCTATGG
TACTACAATACATTACACTACAGTACTATACTTTACTCTACTGTACCATACCTTACCCTACCGTACGATACGTTACGCTACGG
TAGTAGAATAGATTAGACTAGAGTAGTATAGTTTAGTCTAGTGTAGCATAGCTTAGCCTAGCGTAGGATAGGTTAGGCTAGGG
TTATTAAATTAATTTAACTTAAGTTATATTATTTTATCTTATGTTACATTACTTTACCTTACGTTAGATTAGTTTAGCTTAGG
TTTTTTAATTTATTTTACTTTAGTTTTATTTTTTTTTCTTTTGTTTCATTTCTTTTCCTTTCGTTTGATTTGTTTTGCTTTGG
TTCTTCAATTCATTTCACTTCAGTTCTATTCTTTTCTCTTCTGTTCCATTCCTTTCCCTTCCGTTCGATTCGTTTCGCTTCGG
TTGTTGAATTGATTTGACTTGAGTTGTATTGTTTTGTCTTGTGTTGCATTGCTTTGCCTTGCGTTGGATTGGTTTGGCTTGGG
TCATCAAATCAATTCAACTCAAGTCATATCATTTCATCTCATGTCACATCACTTCACCTCACGTCAGATCAGTTCAGCTCAGG
TCTTCTAATCTATTCTACTCTAGTCTTATCTTTTCTTCTCTTGTCTCATCTCTTCTCCTCTCGTCTGATCTGTTCTGCTCTGG
TCCTCCAATCCATTCCACTCCAGTCCTATCCTTTCCTCTCCTGTCCCATCCCTTCCCCTCCCGTCCGATCCGTTCCGCTCCGG
TCGTCGAATCGATTCGACTCGAGTCGTATCGTTTCGTCTCGTGTCGCATCGCTTCGCCTCGCGTCGGATCGGTTCGGCTCGGG
TGATGAAATGAATTGAACTGAAGTGATATGATTTGATCTGATGTGACATGACTTGACCTGACGTGAGATGAGTTGAGCTGAGG
TGTTGTAATGTATTGTACTGTAGTGTTATGTTTTGTTCTGTTGTGTCATGTCTTGTCCTGTCGTGTGATGTGTTGTGCTGTGG
TGCTGCAATGCATTGCACTGCAGTGCTATGCTTTGCTCTGCTGTGCCATGCCTTGCCCTGCCGTGCGATGCGTTGCGCTGCGG
TGGTGGAATGGATTGGACTGGAGTGGTATGGTTTGGTCTGGTGTGGCATGGCTTGGCCTGGCGTGGGATGGGTTGGGCTGGGG
CAACAAAACAAATCAAACCAAAGCAATACAATTCAATCCAATGCAACACAACTCAACCCAACGCAAGACAAGTCAAGCCAAGG
CATCATAACATATCATACCATAGCATTACATTTCATTCCATTGCATCACATCTCATCCCATCGCATGACATGTCATGCCATGG
CACCACAACACATCACACCACAGCACTACACTTCACTCCACTGCACCACACCTCACCCCACCGCACGACACGTCACGCCACGG
CAGCAGAACAGATCAGACCAGAGCAGTACAGTTCAGTCCAGTGCAGCACAGCTCAGCCCAGCGCAGGACAGGTCAGGCCAGGG
CTACTAAACTAATCTAACCTAAGCTATACTATTCTATCCTATGCTACACTACTCTACCCTACGCTAGACTAGTCTAGCCTAGG
CTTCTTAACTTATCTTACCTTAGCTTTACTTTTCTTTCCTTTGCTTCACTTCTCTTCCCTTCGCTTGACTTGTCTTGCCTTGG
CTCCTCAACTCATCTCACCTCAGCTCTACTCTTCTCTCCTCTGCTCCACTCCTCTCCCCTCCGCTCGACTCGTCTCGCCTCGG
CTGCTGAACTGATCTGACCTGAGCTGTACTGTTCTGTCCTGTGCTGCACTGCTCTGCCCTGCGCTGGACTGGTCTGGCCTGGG
CCACCAAACCAATCCAACCCAAGCCATACCATTCCATCCCATGCCACACCACTCCACCCCACGCCAGACCAGTCCAGCCCAGG
CCTCCTAACCTATCCTACCCTAGCCTTACCTTTCCTTCCCTTGCCTCACCTCTCCTCCCCTCGCCTGACCTGTCCTGCCCTGG
CCCCCCAACCCATCCCACCCCAGCCCTACCCTTCCCTCCCCTGCCCCACCCCTCCCCCCCCCGCCCGACCCGTCCCGCCCCGG
CCGCCGAACCGATCCGACCCGAGCCGTACCGTTCCGTCCCGTGCCGCACCGCTCCGCCCCGCGCCGGACCGGTCCGGCCCGGG
CGACGAAACGAATCGAACCGAAGCGATACGATTCGATCCGATGCGACACGACTCGACCCGACGCGAGACGAGTCGAGCCGAGG
CGTCGTAACGTATCGTACCGTAGCGTTACGTTTCGTTCCGTTGCGTCACGTCTCGTCCCGTCGCGTGACGTGTCGTGCCGTGG
CGCCGCAACGCATCGCACCGCAGCGCTACGCTTCGCTCCGCTGCGCCACGCCTCGCCCCGCCGCGCGACGCGTCGCGCCGCGG
CGGCGGAACGGATCGGACCGGAGCGGTACGGTTCGGTCCGGTGCGGCACGGCTCGGCCCGGCGCGGGACGGGTCGGGCCGGGG
GAAGAAAAGAAATGAAACGAAAGGAATAGAATTGAATCGAATGGAACAGAACTGAACCGAACGGAAGAGAAGTGAAGCGAAGG
GATGATAAGATATGATACGATAGGATTAGATTTGATTCGATTGGATCAGATCTGATCCGATCGGATGAGATGTGATGCGATGG
GACGACAAGACATGACACGACAGGACTAGACTTGACTCGACTGGACCAGACCTGACCCGACCGGACGAGACGTGACGCGACGG
GAGGAGAAGAGATGAGACGAGAGGAGTAGAGTTGAGTCGAGTGGAGCAGAGCTGAGCCGAGCGGAGGAGAGGTGAGGCGAGGG
GTAGTAAAGTAATGTAACGTAAGGTATAGTATTGTATCGTATGGTACAGTACTGTACCGTACGGTAGAGTAGTGTAGCGTAGG
GTTGTTAAGTTATGTTACGTTAGGTTTAGTTTTGTTTCGTTTGGTTCAGTTCTGTTCCGTTCGGTTGAGTTGTGTTGCGTTGG
GTCGTCAAGTCATGTCACGTCAGGTCTAGTCTTGTCTCGTCTGGTCCAGTCCTGTCCCGTCCGGTCGAGTCGTGTCGCGTCGG
GTGGTGAAGTGATGTGACGTGAGGTGTAGTGTTGTGTCGTGTGGTGCAGTGCTGTGCCGTGCGGTGGAGTGGTGTGGCGTGGG
GCAGCAAAGCAATGCAACGCAAGGCATAGCATTGCATCGCATGGCACAGCACTGCACCGCACGGCAGAGCAGTGCAGCGCAGG
GCTGCTAAGCTATGCTACGCTAGGCTTAGCTTTGCTTCGCTTGGCTCAGCTCTGCTCCGCTCGGCTGAGCTGTGCTGCGCTGG
GCCGCCAAGCCATGCCACGCCAGGCCTAGCCTTGCCTCGCCTGGCCCAGCCCTGCCCCGCCCGGCCGAGCCGTGCCGCGCCGG
GCGGCGAAGCGATGCGACGCGAGGCGTAGCGTTGCGTCGCGTGGCGCAGCGCTGCGCCGCGCGGCGGAGCGGTGCGGCGCGGG
GGAGGAAAGGAATGGAACGGAAGGGATAGGATTGGATCGGATGGGACAGGACTGGACCGGACGGGAGAGGAGTGGAGCGGAGG
GGTGGTAAGGTATGGTACGGTAGGGTTAGGTTTGGTTCGGTTGGGTCAGGTCTGGTCCGGTCGGGTGAGGTGTGGTGCGGTGG
GGCGGCAAGGCATGGCACGGCAGGGCTAGGCTTGGCTCGGCTGGGCCAGGCCTGGCCCGGCCGGGCGAGGCGTGGCGCGGCGG
GGGGGGAAGGGATGGGACGGGAGGGGTAGGGTTGGGTCGGGTGGGGCAGGGCTGGGCCGGGCGGGGGAGGGGTGGGGCGGGGG
+
+ +
+
Sampling rate: 1 / 20
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
overrepresented sequencecount (% of bases)distribution: cycle 1 ~ cycle 38
AAAAAAAAAAAAAAAAAAAA78 (0.082805%)
AAAGATCGTCGGACTGTAGA233 (0.247354%)
AACGATCGTCGGACTGTAGA304 (0.322728%)
AAGGATCGTCGGACTGTAGA292 (0.309989%)
AATGATCGTCGGACTGTAGA322 (0.341837%)
ACAGATCGTCGGACTGTAGA183 (0.194274%)
ACCGATCGTCGGACTGTAGA203 (0.215506%)
ACCTGATCGTCGGACTGTAG144 (0.152871%)
ACGGATCGTCGGACTGTAGA198 (0.210198%)
ACTGATCGTCGGACTGTAGA162 (0.171980%)
ACTGTAGAACTCTGAACGTG18 (0.019109%)
AGATCGTCGGACTGTAGAAC38 (0.040341%)
AGCGATCGTCGGACTGTAGA427 (0.453306%)
AGCTGATCGTCGGACTGTAG152 (0.161364%)
AGGGATCGTCGGACTGTAGA291 (0.308927%)
AGTGATCGTCGGACTGTAGA232 (0.246293%)
ATAGATCGTCGGACTGTAGA294 (0.312112%)
ATCGATCGTCGGACTGTAGA188 (0.199582%)
ATCGTCGGACTGTAGAACTC36 (0.038218%)
ATGATCGTCGGACTGTAGAA17 (0.018047%)
ATGGATCGTCGGACTGTAGA204 (0.216568%)
ATTGATCGTCGGACTGTAGA306 (0.324851%)
CAAAGATCGTCGGACTGTAG136 (0.144378%)
CAAGATCGTCGGACTGTAGA191 (0.202767%)
CAAGGATCGTCGGACTGTAG138 (0.146502%)
CACGATCGTCGGACTGTAGA248 (0.263278%)
CACTGATCGTCGGACTGTAG182 (0.193212%)
CAGGATCGTCGGACTGTAGA105 (0.111469%)
CATCGATCGTCGGACTGTAG120 (0.127393%)
CATGATCGTCGGACTGTAGA191 (0.202767%)
CATGGATCGTCGGACTGTAG132 (0.140132%)
CCAAGATCGTCGGACTGTAG225 (0.238861%)
CCAGATCGTCGGACTGTAGA137 (0.145440%)
CCAGGATCGTCGGACTGTAG183 (0.194274%)
CCATGATCGTCGGACTGTAG187 (0.198520%)
CCCAGATCGTCGGACTGTAG212 (0.225060%)
CCCCTGATCGTCGGACTGTA138 (0.146502%)
CCCGATCGTCGGACTGTAGA334 (0.354576%)
CCCGGATCGTCGGACTGTAG115 (0.122085%)
CCCTGATCGTCGGACTGTAG251 (0.266463%)
CCGATCGTCGGACTGTAGAA92 (0.097668%)
CCGGATCGTCGGACTGTAGA108 (0.114653%)
CCTAGATCGTCGGACTGTAG178 (0.188966%)
CCTCGATCGTCGGACTGTAG171 (0.181535%)
CCTGGATCGTCGGACTGTAG256 (0.271771%)
CCTTGATCGTCGGACTGTAG195 (0.207013%)
CGAGATCGTCGGACTGTAGA136 (0.144378%)
CGATCGTCGGACTGTAGAAC26 (0.027602%)
CGCGATCGTCGGACTGTAGA212 (0.225060%)
CGCGGATCGTCGGACTGTAG115 (0.122085%)
CGCTGATCGTCGGACTGTAG134 (0.142255%)
CGGACTGTAGAACTCTGAAC77 (0.081744%)
CGGGATCGTCGGACTGTAGA243 (0.257970%)
CGGGGATCGTCGGACTGTAG125 (0.132701%)
CGTCGGACTGTAGAACTCTG68 (0.072189%)
CGTGATCGTCGGACTGTAGA250 (0.265401%)
CTAGATCGTCGGACTGTAGA168 (0.178350%)
CTAGGATCGTCGGACTGTAG113 (0.119961%)
CTCGATCGTCGGACTGTAGA322 (0.341837%)
CTCTGATCGTCGGACTGTAG144 (0.152871%)
CTGCGATCGTCGGACTGTAG124 (0.131639%)
CTGGATCGTCGGACTGTAGA162 (0.171980%)
CTGGGATCGTCGGACTGTAG227 (0.240985%)
CTGTGATCGTCGGACTGTAG134 (0.142255%)
CTTGATCGTCGGACTGTAGA205 (0.217629%)
CTTGGCACCCGAGAATTCCA146 (0.154994%)
CTTTGATCGTCGGACTGTAG123 (0.130578%)
GAAGATCGTCGGACTGTAGA264 (0.280264%)
GACGATCGTCGGACTGTAGA186 (0.197459%)
GACTGTAGAACTCTGAACGT20 (0.021232%)
GAGATCGTCGGACTGTAGAA95 (0.100853%)
GAGGATCGTCGGACTGTAGA116 (0.123146%)
GATCGTCGGACTGTAGAACT140 (0.148625%)
GATCGTCGGACTGTAGAACTCTGAACGTGTAGATCT247 (0.471990%)
GATGATCGTCGGACTGTAGA189 (0.200644%)
GCAAGATCGTCGGACTGTAG157 (0.166672%)
GCACGATCGTCGGACTGTAG149 (0.158179%)
GCAGATCGTCGGACTGTAGA194 (0.205952%)
GCAGGATCGTCGGACTGTAG165 (0.175165%)
GCATGATCGTCGGACTGTAG149 (0.158179%)
GCCAGATCGTCGGACTGTAG195 (0.207013%)
GCCGATCGTCGGACTGTAGA255 (0.270710%)
GCCTGATCGTCGGACTGTAG198 (0.210198%)
GCGCGATCGTCGGACTGTAG167 (0.177288%)
GCGGATCGTCGGACTGTAGA214 (0.227184%)
GCGGGATCGTCGGACTGTAG231 (0.245231%)
GCTAGATCGTCGGACTGTAG148 (0.157118%)
GCTGGATCGTCGGACTGTAG227 (0.240985%)
GCTTGATCGTCGGACTGTAG142 (0.150748%)
GGACTGTAGAACTCTGAACG77 (0.081744%)
GGAGATCGTCGGACTGTAGA161 (0.170919%)
GGAGGATCGTCGGACTGTAG136 (0.144378%)
GGATCGTCGGACTGTAGAAC19 (0.020171%)
GGCAGATCGTCGGACTGTAG150 (0.159241%)
GGCGATCGTCGGACTGTAGA267 (0.283449%)
GGCGGATCGTCGGACTGTAG210 (0.222937%)
GGCTGATCGTCGGACTGTAG193 (0.204890%)
GGGAGATCGTCGGACTGTAG164 (0.174103%)
GGGCGATCGTCGGACTGTAG241 (0.255847%)
GGGGATCGTCGGACTGTAGA111 (0.117838%)
GGGGGATCGTCGGACTGTAG273 (0.289818%)
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG607 (1.159911%)
GGTGATCGTCGGACTGTAGA358 (0.380055%)
GGTGGATCGTCGGACTGTAG163 (0.173042%)
GTAGATCGTCGGACTGTAGA294 (0.312112%)
GTCGATCGTCGGACTGTAGA151 (0.160302%)
GTCGGACTGTAGAACTCTGA90 (0.095545%)
GTGGATCGTCGGACTGTAGA224 (0.237800%)
GTGGGATCGTCGGACTGTAG135 (0.143317%)
GTTGATCGTCGGACTGTAGA232 (0.246293%)
NNNNNNNNNNNNNNNNNNNN829 (0.880071%)
TAAGATCGTCGGACTGTAGA318 (0.337591%)
TACGATCGTCGGACTGTAGA217 (0.230368%)
TAGATCGTCGGACTGTAGAA12 (0.012739%)
TAGGATCGTCGGACTGTAGA222 (0.235677%)
TATGATCGTCGGACTGTAGA234 (0.248416%)
TCAGATCGTCGGACTGTAGA147 (0.156056%)
TCCTGATCGTCGGACTGTAG146 (0.154994%)
TCGGACTGTAGAACTCTGAA85 (0.090237%)
TCGGATCGTCGGACTGTAGA211 (0.223999%)
TCGTCGGACTGTAGAACTCT51 (0.054142%)
TCTGATCGTCGGACTGTAGA171 (0.181535%)
TGAGATCGTCGGACTGTAGA201 (0.213383%)
TGATCGTCGGACTGTAGAAC30 (0.031848%)
TGCGATCGTCGGACTGTAGA264 (0.280264%)
TGCTGATCGTCGGACTGTAG149 (0.158179%)
TGGGATCGTCGGACTGTAGA195 (0.207013%)
TGGGGATCGTCGGACTGTAG181 (0.192151%)
TGTGATCGTCGGACTGTAGA216 (0.229307%)
TTAGATCGTCGGACTGTAGA258 (0.273894%)
TTCGATCGTCGGACTGTAGA189 (0.200644%)
TTGGATCGTCGGACTGTAGA318 (0.337591%)
TTTGATCGTCGGACTGTAGA146 (0.154994%)
+
+ +
+
+
+ +
+ +
+
Value of each position will be shown on mouse over.
+
+
+ + + +
+
Value of each position will be shown on mouse over.
+
+
+ + + +
+
Darker background means larger counts. The count will be shown on mouse over.
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AAATACAGTATTTCTGCACTCCCGGAGTGCGG
AAAAAAAAAAAATAAAACAAAAGAAATAAAATTAAATCAAATGAAACAAAACTAAACCAAACGAAAGAAAAGTAAAGCAAAGG
AATAATAAAATATAATACAATAGAATTAAATTTAATTCAATTGAATCAAATCTAATCCAATCGAATGAAATGTAATGCAATGG
AACAACAAAACATAACACAACAGAACTAAACTTAACTCAACTGAACCAAACCTAACCCAACCGAACGAAACGTAACGCAACGG
AAGAAGAAAAGATAAGACAAGAGAAGTAAAGTTAAGTCAAGTGAAGCAAAGCTAAGCCAAGCGAAGGAAAGGTAAGGCAAGGG
ATAATAAAATAATATAACATAAGATATAATATTATATCATATGATACAATACTATACCATACGATAGAATAGTATAGCATAGG
ATTATTAAATTATATTACATTAGATTTAATTTTATTTCATTTGATTCAATTCTATTCCATTCGATTGAATTGTATTGCATTGG
ATCATCAAATCATATCACATCAGATCTAATCTTATCTCATCTGATCCAATCCTATCCCATCCGATCGAATCGTATCGCATCGG
ATGATGAAATGATATGACATGAGATGTAATGTTATGTCATGTGATGCAATGCTATGCCATGCGATGGAATGGTATGGCATGGG
ACAACAAAACAATACAACACAAGACATAACATTACATCACATGACACAACACTACACCACACGACAGAACAGTACAGCACAGG
ACTACTAAACTATACTACACTAGACTTAACTTTACTTCACTTGACTCAACTCTACTCCACTCGACTGAACTGTACTGCACTGG
ACCACCAAACCATACCACACCAGACCTAACCTTACCTCACCTGACCCAACCCTACCCCACCCGACCGAACCGTACCGCACCGG
ACGACGAAACGATACGACACGAGACGTAACGTTACGTCACGTGACGCAACGCTACGCCACGCGACGGAACGGTACGGCACGGG
AGAAGAAAAGAATAGAACAGAAGAGATAAGATTAGATCAGATGAGACAAGACTAGACCAGACGAGAGAAGAGTAGAGCAGAGG
AGTAGTAAAGTATAGTACAGTAGAGTTAAGTTTAGTTCAGTTGAGTCAAGTCTAGTCCAGTCGAGTGAAGTGTAGTGCAGTGG
AGCAGCAAAGCATAGCACAGCAGAGCTAAGCTTAGCTCAGCTGAGCCAAGCCTAGCCCAGCCGAGCGAAGCGTAGCGCAGCGG
AGGAGGAAAGGATAGGACAGGAGAGGTAAGGTTAGGTCAGGTGAGGCAAGGCTAGGCCAGGCGAGGGAAGGGTAGGGCAGGGG
TAATAAAATAAATTAAACTAAAGTAATATAATTTAATCTAATGTAACATAACTTAACCTAACGTAAGATAAGTTAAGCTAAGG
TATTATAATATATTATACTATAGTATTATATTTTATTCTATTGTATCATATCTTATCCTATCGTATGATATGTTATGCTATGG
TACTACAATACATTACACTACAGTACTATACTTTACTCTACTGTACCATACCTTACCCTACCGTACGATACGTTACGCTACGG
TAGTAGAATAGATTAGACTAGAGTAGTATAGTTTAGTCTAGTGTAGCATAGCTTAGCCTAGCGTAGGATAGGTTAGGCTAGGG
TTATTAAATTAATTTAACTTAAGTTATATTATTTTATCTTATGTTACATTACTTTACCTTACGTTAGATTAGTTTAGCTTAGG
TTTTTTAATTTATTTTACTTTAGTTTTATTTTTTTTTCTTTTGTTTCATTTCTTTTCCTTTCGTTTGATTTGTTTTGCTTTGG
TTCTTCAATTCATTTCACTTCAGTTCTATTCTTTTCTCTTCTGTTCCATTCCTTTCCCTTCCGTTCGATTCGTTTCGCTTCGG
TTGTTGAATTGATTTGACTTGAGTTGTATTGTTTTGTCTTGTGTTGCATTGCTTTGCCTTGCGTTGGATTGGTTTGGCTTGGG
TCATCAAATCAATTCAACTCAAGTCATATCATTTCATCTCATGTCACATCACTTCACCTCACGTCAGATCAGTTCAGCTCAGG
TCTTCTAATCTATTCTACTCTAGTCTTATCTTTTCTTCTCTTGTCTCATCTCTTCTCCTCTCGTCTGATCTGTTCTGCTCTGG
TCCTCCAATCCATTCCACTCCAGTCCTATCCTTTCCTCTCCTGTCCCATCCCTTCCCCTCCCGTCCGATCCGTTCCGCTCCGG
TCGTCGAATCGATTCGACTCGAGTCGTATCGTTTCGTCTCGTGTCGCATCGCTTCGCCTCGCGTCGGATCGGTTCGGCTCGGG
TGATGAAATGAATTGAACTGAAGTGATATGATTTGATCTGATGTGACATGACTTGACCTGACGTGAGATGAGTTGAGCTGAGG
TGTTGTAATGTATTGTACTGTAGTGTTATGTTTTGTTCTGTTGTGTCATGTCTTGTCCTGTCGTGTGATGTGTTGTGCTGTGG
TGCTGCAATGCATTGCACTGCAGTGCTATGCTTTGCTCTGCTGTGCCATGCCTTGCCCTGCCGTGCGATGCGTTGCGCTGCGG
TGGTGGAATGGATTGGACTGGAGTGGTATGGTTTGGTCTGGTGTGGCATGGCTTGGCCTGGCGTGGGATGGGTTGGGCTGGGG
CAACAAAACAAATCAAACCAAAGCAATACAATTCAATCCAATGCAACACAACTCAACCCAACGCAAGACAAGTCAAGCCAAGG
CATCATAACATATCATACCATAGCATTACATTTCATTCCATTGCATCACATCTCATCCCATCGCATGACATGTCATGCCATGG
CACCACAACACATCACACCACAGCACTACACTTCACTCCACTGCACCACACCTCACCCCACCGCACGACACGTCACGCCACGG
CAGCAGAACAGATCAGACCAGAGCAGTACAGTTCAGTCCAGTGCAGCACAGCTCAGCCCAGCGCAGGACAGGTCAGGCCAGGG
CTACTAAACTAATCTAACCTAAGCTATACTATTCTATCCTATGCTACACTACTCTACCCTACGCTAGACTAGTCTAGCCTAGG
CTTCTTAACTTATCTTACCTTAGCTTTACTTTTCTTTCCTTTGCTTCACTTCTCTTCCCTTCGCTTGACTTGTCTTGCCTTGG
CTCCTCAACTCATCTCACCTCAGCTCTACTCTTCTCTCCTCTGCTCCACTCCTCTCCCCTCCGCTCGACTCGTCTCGCCTCGG
CTGCTGAACTGATCTGACCTGAGCTGTACTGTTCTGTCCTGTGCTGCACTGCTCTGCCCTGCGCTGGACTGGTCTGGCCTGGG
CCACCAAACCAATCCAACCCAAGCCATACCATTCCATCCCATGCCACACCACTCCACCCCACGCCAGACCAGTCCAGCCCAGG
CCTCCTAACCTATCCTACCCTAGCCTTACCTTTCCTTCCCTTGCCTCACCTCTCCTCCCCTCGCCTGACCTGTCCTGCCCTGG
CCCCCCAACCCATCCCACCCCAGCCCTACCCTTCCCTCCCCTGCCCCACCCCTCCCCCCCCCGCCCGACCCGTCCCGCCCCGG
CCGCCGAACCGATCCGACCCGAGCCGTACCGTTCCGTCCCGTGCCGCACCGCTCCGCCCCGCGCCGGACCGGTCCGGCCCGGG
CGACGAAACGAATCGAACCGAAGCGATACGATTCGATCCGATGCGACACGACTCGACCCGACGCGAGACGAGTCGAGCCGAGG
CGTCGTAACGTATCGTACCGTAGCGTTACGTTTCGTTCCGTTGCGTCACGTCTCGTCCCGTCGCGTGACGTGTCGTGCCGTGG
CGCCGCAACGCATCGCACCGCAGCGCTACGCTTCGCTCCGCTGCGCCACGCCTCGCCCCGCCGCGCGACGCGTCGCGCCGCGG
CGGCGGAACGGATCGGACCGGAGCGGTACGGTTCGGTCCGGTGCGGCACGGCTCGGCCCGGCGCGGGACGGGTCGGGCCGGGG
GAAGAAAAGAAATGAAACGAAAGGAATAGAATTGAATCGAATGGAACAGAACTGAACCGAACGGAAGAGAAGTGAAGCGAAGG
GATGATAAGATATGATACGATAGGATTAGATTTGATTCGATTGGATCAGATCTGATCCGATCGGATGAGATGTGATGCGATGG
GACGACAAGACATGACACGACAGGACTAGACTTGACTCGACTGGACCAGACCTGACCCGACCGGACGAGACGTGACGCGACGG
GAGGAGAAGAGATGAGACGAGAGGAGTAGAGTTGAGTCGAGTGGAGCAGAGCTGAGCCGAGCGGAGGAGAGGTGAGGCGAGGG
GTAGTAAAGTAATGTAACGTAAGGTATAGTATTGTATCGTATGGTACAGTACTGTACCGTACGGTAGAGTAGTGTAGCGTAGG
GTTGTTAAGTTATGTTACGTTAGGTTTAGTTTTGTTTCGTTTGGTTCAGTTCTGTTCCGTTCGGTTGAGTTGTGTTGCGTTGG
GTCGTCAAGTCATGTCACGTCAGGTCTAGTCTTGTCTCGTCTGGTCCAGTCCTGTCCCGTCCGGTCGAGTCGTGTCGCGTCGG
GTGGTGAAGTGATGTGACGTGAGGTGTAGTGTTGTGTCGTGTGGTGCAGTGCTGTGCCGTGCGGTGGAGTGGTGTGGCGTGGG
GCAGCAAAGCAATGCAACGCAAGGCATAGCATTGCATCGCATGGCACAGCACTGCACCGCACGGCAGAGCAGTGCAGCGCAGG
GCTGCTAAGCTATGCTACGCTAGGCTTAGCTTTGCTTCGCTTGGCTCAGCTCTGCTCCGCTCGGCTGAGCTGTGCTGCGCTGG
GCCGCCAAGCCATGCCACGCCAGGCCTAGCCTTGCCTCGCCTGGCCCAGCCCTGCCCCGCCCGGCCGAGCCGTGCCGCGCCGG
GCGGCGAAGCGATGCGACGCGAGGCGTAGCGTTGCGTCGCGTGGCGCAGCGCTGCGCCGCGCGGCGGAGCGGTGCGGCGCGGG
GGAGGAAAGGAATGGAACGGAAGGGATAGGATTGGATCGGATGGGACAGGACTGGACCGGACGGGAGAGGAGTGGAGCGGAGG
GGTGGTAAGGTATGGTACGGTAGGGTTAGGTTTGGTTCGGTTGGGTCAGGTCTGGTCCGGTCGGGTGAGGTGTGGTGCGGTGG
GGCGGCAAGGCATGGCACGGCAGGGCTAGGCTTGGCTCGGCTGGGCCAGGCCTGGCCCGGCCGGGCGAGGCGTGGCGCGGCGG
GGGGGGAAGGGATGGGACGGGAGGGGTAGGGTTGGGTCGGGTGGGGCAGGGCTGGGCCGGGCGGGGGAGGGGTGGGGCGGGGG
+
+ +
+
Sampling rate: 1 / 20
+ + + + + + +
overrepresented sequencecount (% of bases)distribution: cycle 1 ~ cycle 38
AAAAAAAAAAAAAAAAAAAA34 (0.084294%)
CTTGGCACCCGAGAATTCCA128 (0.317341%)
GTCGGACTGTAGAACTCTGA31 (0.076856%)
TCGGACTGTAGAACTCTGAA54 (0.133878%)
+
+ +
+
+ +

+ \ No newline at end of file diff --git a/docs/files/examples/tutorial/results_pipeline/tutorial/fastqc/tutorial_R2_rmAdapter.json b/docs/files/examples/tutorial/results_pipeline/tutorial/fastqc/tutorial_R2_rmAdapter.json new file mode 100644 index 0000000..f99137e --- /dev/null +++ b/docs/files/examples/tutorial/results_pipeline/tutorial/fastqc/tutorial_R2_rmAdapter.json @@ -0,0 +1,358 @@ +{ + "summary": { + "before_filtering": { + "total_reads":1000000, + "total_bases":37678766, + "q20_bases":34709953, + "q30_bases":34018346, + "q20_rate":0.921207, + "q30_rate":0.902852, + "read1_mean_length":37, + "gc_content":0.518639 + }, + "after_filtering": { + "total_reads":439519, + "total_bases":16134044, + "q20_bases":15454671, + "q30_bases":15178418, + "q20_rate":0.957892, + "q30_rate":0.94077, + "read1_mean_length":36, + "gc_content":0.526951 + } + }, + "filtering_result": { + "passed_filter_reads": 439519, + "low_quality_reads": 66799, + "too_many_N_reads": 105, + "too_short_reads": 493577, + "too_long_reads": 0 + }, + "duplication": { + "rate": 0.286979, + "histogram": [437812,16546,8852,5892,3938,2938,2123,1537,1168,918,718,552,445,368,315,274,220,184,152,137,120,87,94,90,79,61,49,39,34,34,295], + "mean_gc": [0.449334,0.458295,0.463191,0.461576,0.462608,0.464017,0.468745,0.467297,0.462957,0.463121,0.46369,0.469295,0.4685,0.457651,0.458724,0.475097,0.462531,0.457651,0.462126,0.454845,0.463007,0.469732,0.473467,0.462789,0.461703,0.471681,0.455542,0.464957,0.471742,0.467013,0.471545] + }, + "adapter_cutting": { + "adapter_trimmed_reads": 540203, + "adapter_trimmed_bases": 14696777, + "read1_adapter_sequence": "GATCGTCGGACTGTAGAACTCTGAAC", + "read1_adapter_counts": {"GATCGTCGG":14299, "GATCGTCGGAC":6547, "GATCGTCGGACT":5538, "GATCGTCGGACTG":5881, "GATCGTCGGACTGT":17243, "GATCGTCGGACTGTAGAACTCTGAACGTG":7306, "GATCGTCGGACTGTAGAACTCTGAACGTGT":404556, "others":78833} + }, + "read1_before_filtering": { + "total_reads": 1000000, + "total_bases": 37678766, + "q20_bases": 34709953, + "q30_bases": 34018346, + "total_cycles": 38, + "quality_curves": { + "A":[30.1023,29.9909,30.3424,30.3731,30.3951,33.7563,33.8171,33.7964,33.6769,34.2461,32.0416,32.2345,33.3671,31.4002,32.1319,33.9531,33.8651,34.3952,32.5273,31.4524,33.4457,31.626,34.0713,33.6001,34.1499,34.3216,32.0106,31.1379,31.4294,31.0495,33.149,34.0174,34.3201,32.2479,33.1344,30.9166,32.6897,34.06], + "T":[30.9601,30.7757,30.8734,30.8686,30.8783,34.3984,34.4052,34.4866,34.7508,34.6364,34.4516,34.4478,34.6493,34.0627,34.3648,34.7592,34.7462,34.717,34.5812,34.1128,34.6857,34.1296,34.6354,34.7421,34.6366,34.6568,34.4945,34.254,34.1913,33.9201,34.6827,34.6854,34.6539,34.5645,34.5903,33.921,34.6256,34.0429], + "C":[31.0626,30.9065,30.9966,31.0003,31.0258,34.5989,34.5798,34.6138,34.8344,34.713,34.6296,34.3718,34.7863,34.5195,34.3702,34.7335,34.8514,34.793,34.5575,34.5447,34.835,34.5791,34.7124,34.8038,34.7131,34.6841,34.6826,34.4275,34.1128,34.3422,34.7444,34.718,34.6531,34.6465,34.7181,34.5319,34.7889,34.3973], + "G":[30.5229,30.3815,30.5511,30.5992,30.5904,34.0087,34.0169,34.0197,33.9322,33.8345,34.3164,34.2746,33.6745,34.1624,34.1708,33.8907,34.0021,33.9368,34.3762,34.1284,33.6978,34.1745,33.7549,33.9866,33.8954,33.9569,34.3227,34.1765,34.0206,33.835,33.573,33.7451,33.8577,34.2241,33.6588,33.9831,33.671,34.0425], + "mean":[30.1568,30.0866,30.2723,30.2905,30.2976,33.7199,33.7054,33.7193,33.6292,33.7876,33.6127,33.5872,33.4341,33.3069,33.5387,33.6331,33.6975,33.9122,33.7498,33.3164,33.4659,33.324,33.6714,33.629,33.7399,33.8571,33.7149,33.356,33.2514,33.0513,33.3197,33.645,33.8238,33.7259,33.3852,33.6214,33.8441,34.06] + }, + "content_curves": { + "A":[0.314654,0.237083,0.219982,0.220298,0.215974,0.21456,0.233767,0.22907,0.137049,0.552003,0.141955,0.130698,0.12543,0.128143,0.132591,0.129813,0.141034,0.548306,0.138182,0.136471,0.133899,0.150379,0.552425,0.159106,0.562527,0.555956,0.14243,0.132202,0.133747,0.14431,0.14802,0.555425,0.5493,0.13679,0.12267,0.120523,0.10077,0], + "T":[0.194407,0.21312,0.219779,0.222531,0.216976,0.212131,0.226769,0.238401,0.123604,0.128531,0.541415,0.130619,0.137744,0.545369,0.124522,0.118915,0.120976,0.120502,0.130283,0.54418,0.13973,0.534456,0.124401,0.118367,0.121606,0.121829,0.132758,0.539629,0.136758,0.534435,0.132143,0.119065,0.121794,0.131477,0.14243,0.561881,0.156361,0.675335], + "C":[0.185744,0.249803,0.268543,0.269994,0.273495,0.28595,0.241631,0.219478,0.135682,0.129244,0.140163,0.554351,0.137444,0.137638,0.552921,0.145261,0.138754,0.143537,0.556207,0.136811,0.133065,0.129864,0.127386,0.132757,0.127862,0.147126,0.550559,0.148018,0.540736,0.131348,0.131496,0.134551,0.139989,0.54064,0.141824,0.132245,0.137366,0.157434], + "G":[0.290505,0.285286,0.276869,0.272243,0.27844,0.272174,0.282565,0.297718,0.58827,0.174806,0.16106,0.168924,0.583945,0.173419,0.174542,0.590603,0.583827,0.172221,0.159932,0.167123,0.577926,0.169892,0.180362,0.574324,0.172539,0.159606,0.1588,0.164682,0.173275,0.174395,0.572784,0.17539,0.173341,0.175547,0.57753,0.184419,0.604527,0.166027], + "N":[0.01469,0.014708,0.014827,0.014934,0.015115,0.015185,0.015268,0.015333,0.015395,0.015416,0.015407,0.015408,0.015437,0.015431,0.015424,0.015408,0.015409,0.015434,0.015396,0.015415,0.01538,0.015409,0.015426,0.015446,0.015466,0.015483,0.015453,0.015469,0.015484,0.015512,0.015557,0.015569,0.015576,0.015546,0.015546,0.000932911,0.000975171,0.00120431], + "GC":[0.476249,0.535089,0.545412,0.542237,0.551935,0.558124,0.524196,0.517196,0.723952,0.30405,0.301223,0.723275,0.721389,0.311057,0.727463,0.735864,0.722581,0.315758,0.716139,0.303934,0.710991,0.299756,0.307748,0.707081,0.300401,0.306732,0.709359,0.3127,0.714011,0.305743,0.70428,0.309941,0.31333,0.716187,0.719354,0.316664,0.741893,0.323461] + }, + "kmer_count": { + "AAAAA":144484, "AAAAT":41966, "AAAAC":29408, "AAAAG":30579, "AAATA":34195, "AAATT":26346, "AAATC":20102, "AAATG":25950, "AAACA":28214, "AAACT":23063, "AAACC":18676, "AAACG":11668, "AAAGA":36542, "AAAGT":23736, "AAAGC":19180, "AAAGG":26112, + "AATAA":29042, "AATAT":19418, "AATAC":13874, "AATAG":15272, "AATTA":19776, "AATTT":22841, "AATTC":43828, "AATTG":15119, "AATCA":15966, "AATCT":16819, "AATCC":16341, "AATCG":8257, "AATGA":25097, "AATGT":16807, "AATGC":14720, "AATGG":21075, + "AACAA":28818, "AACAT":19558, "AACAC":21331, "AACAG":18072, "AACTA":17082, "AACTT":17610, "AACTC":478972, "AACTG":19626, "AACCA":20754, "AACCT":20108, "AACCC":17788, "AACCG":7868, "AACGA":19520, "AACGT":455928, "AACGC":8679, "AACGG":10109, + "AAGAA":34505, "AAGAT":56306, "AAGAC":14603, "AAGAG":20627, "AAGTA":14735, "AAGTT":14634, "AAGTC":12450, "AAGTG":24529, "AAGCA":20377, "AAGCT":18340, "AAGCC":18960, "AAGCG":15372, "AAGGA":32982, "AAGGT":16410, "AAGGC":21495, "AAGGG":25562, + "ATAAA":29887, "ATAAT":16564, "ATAAC":13585, "ATAAG":13298, "ATATA":16168, "ATATT":16758, "ATATC":9312, "ATATG":13262, "ATACA":13990, "ATACT":11327, "ATACC":9943, "ATACG":4845, "ATAGA":19789, "ATAGT":12867, "ATAGC":10801, "ATAGG":13052, + "ATTAA":17682, "ATTAT":15122, "ATTAC":12235, "ATTAG":13620, "ATTTA":18097, "ATTTT":31976, "ATTTC":15787, "ATTTG":18503, "ATTCA":14109, "ATTCT":19452, "ATTCC":42087, "ATTCG":5973, "ATTGA":18343, "ATTGT":12522, "ATTGC":12604, "ATTGG":14767, + "ATCAA":13574, "ATCAT":13972, "ATCAC":13852, "ATCAG":13163, "ATCTA":10128, "ATCTT":15752, "ATCTC":20782, "ATCTG":18000, "ATCCA":13674, "ATCCT":16667, "ATCCC":15830, "ATCCG":6392, "ATCGA":15635, "ATCGT":542380, "ATCGC":7831, "ATCGG":8802, + "ATGAA":20171, "ATGAT":43413, "ATGAC":8922, "ATGAG":14408, "ATGTA":12627, "ATGTT":15273, "ATGTC":9768, "ATGTG":17801, "ATGCA":12654, "ATGCT":14772, "ATGCC":16021, "ATGCG":10654, "ATGGA":25691, "ATGGT":16030, "ATGGC":20975, "ATGGG":22150, + "ACAAA":29661, "ACAAT":14955, "ACAAC":17578, "ACAAG":17948, "ACATA":13881, "ACATT":15026, "ACATC":12294, "ACATG":18400, "ACACA":23204, "ACACT":18952, "ACACC":15764, "ACACG":10563, "ACAGA":26210, "ACAGT":18081, "ACAGC":17191, "ACAGG":22974, + "ACTAA":14398, "ACTAT":13566, "ACTAC":11620, "ACTAG":13307, "ACTTA":12049, "ACTTT":19765, "ACTTC":13895, "ACTTG":19480, "ACTCA":20479, "ACTCT":474997, "ACTCC":18489, "ACTCG":12108, "ACTGA":31461, "ACTGT":501830, "ACTGC":19241, "ACTGG":21126, + "ACCAA":17631, "ACCAT":16658, "ACCAC":24372, "ACCAG":20007, "ACCTA":11027, "ACCTT":14985, "ACCTC":22339, "ACCTG":26926, "ACCCA":20332, "ACCCT":18523, "ACCCC":21183, "ACCCG":33538, "ACCGA":11391, "ACCGT":5875, "ACCGC":11227, "ACCGG":10457, + "ACGAA":6533, "ACGAT":32428, "ACGAC":6008, "ACGAG":11228, "ACGTA":5034, "ACGTT":5024, "ACGTC":8464, "ACGTG":454222, "ACGCA":8560, "ACGCT":7954, "ACGCC":12704, "ACGCG":11123, "ACGGA":17532, "ACGGT":6356, "ACGGC":9578, "ACGGG":15203, + "AGAAA":34811, "AGAAT":47405, "AGAAC":496183, "AGAAG":26114, "AGATA":13075, "AGATT":13456, "AGATC":142833, "AGATG":20030, "AGACA":17801, "AGACT":14556, "AGACC":16518, "AGACG":10848, "AGAGA":28114, "AGAGT":15215, "AGAGC":21363, "AGAGG":31025, + "AGTAA":13148, "AGTAT":10798, "AGTAC":9212, "AGTAG":21211, "AGTTA":10454, "AGTTT":17371, "AGTTC":12673, "AGTTG":15031, "AGTCA":12538, "AGTCT":15214, "AGTCC":13646, "AGTCG":10460, "AGTGA":23819, "AGTGT":17235, "AGTGC":19604, "AGTGG":27459, + "AGCAA":18677, "AGCAT":15375, "AGCAC":18872, "AGCAG":28416, "AGCTA":15518, "AGCTT":15962, "AGCTC":19558, "AGCTG":35001, "AGCCA":27263, "AGCCT":28649, "AGCCC":25098, "AGCCG":19834, "AGCGA":19442, "AGCGT":8863, "AGCGC":18993, "AGCGG":25644, + "AGGAA":27049, "AGGAT":53354, "AGGAC":17886, "AGGAG":35210, "AGGTA":13563, "AGGTT":15994, "AGGTC":14255, "AGGTG":31386, "AGGCA":27981, "AGGCT":32224, "AGGCC":27173, "AGGCG":27600, "AGGGA":34585, "AGGGT":19220, "AGGGC":27068, "AGGGG":33235, + "TAAAA":35765, "TAAAT":19978, "TAAAC":14741, "TAAAG":17503, "TAATA":14160, "TAATT":16385, "TAATC":12247, "TAATG":13524, "TAACA":13962, "TAACT":12178, "TAACC":11011, "TAACG":6945, "TAAGA":21010, "TAAGT":10696, "TAAGC":11047, "TAAGG":14546, + "TATAA":15923, "TATAT":14329, "TATAC":8229, "TATAG":11206, "TATTA":13082, "TATTT":23598, "TATTC":10683, "TATTG":12148, "TATCA":9550, "TATCT":11282, "TATCC":8123, "TATCG":5489, "TATGA":17899, "TATGT":11193, "TATGC":8471, "TATGG":11673, + "TACAA":15459, "TACAT":10976, "TACAC":9495, "TACAG":14922, "TACTA":10237, "TACTT":13192, "TACTC":10826, "TACTG":12531, "TACCA":13386, "TACCT":12619, "TACCC":10580, "TACCG":5625, "TACGA":8716, "TACGT":3521, "TACGC":4513, "TACGG":5276, + "TAGAA":486704, "TAGAT":50743, "TAGAC":9056, "TAGAG":15013, "TAGTA":10696, "TAGTT":10449, "TAGTC":10523, "TAGTG":13167, "TAGCA":12903, "TAGCT":16527, "TAGCC":13996, "TAGCG":10166, "TAGGA":24174, "TAGGT":11336, "TAGGC":12723, "TAGGG":16871, + "TTAAA":24791, "TTAAT":14839, "TTAAC":10950, "TTAAG":14884, "TTATA":12889, "TTATT":20219, "TTATC":9461, "TTATG":12478, "TTACA":14145, "TTACT":12139, "TTACC":9976, "TTACG":4560, "TTAGA":18793, "TTAGT":11845, "TTAGC":12834, "TTAGG":14132, + "TTTAA":22090, "TTTAT":20901, "TTTAC":11268, "TTTAG":16069, "TTTTA":25993, "TTTTT":60972, "TTTTC":24680, "TTTTG":29302, "TTTCA":18908, "TTTCT":28255, "TTTCC":19687, "TTTCG":7174, "TTTGA":25543, "TTTGT":23016, "TTTGC":16130, "TTTGG":24354, + "TTCAA":15176, "TTCAT":14683, "TTCAC":13714, "TTCAG":17777, "TTCTA":14080, "TTCTT":23680, "TTCTC":21945, "TTCTG":23295, "TTCCA":45751, "TTCCT":22879, "TTCCC":20434, "TTCCG":9444, "TTCGA":8778, "TTCGT":6114, "TTCGC":6978, "TTCGG":9940, + "TTGAA":18355, "TTGAT":45462, "TTGAC":8681, "TTGAG":19065, "TTGTA":12727, "TTGTT":19727, "TTGTC":11709, "TTGTG":18936, "TTGCA":14867, "TTGCT":19533, "TTGCC":18106, "TTGCG":9890, "TTGGA":25599, "TTGGT":16045, "TTGGC":26079, "TTGGG":29382, + "TCAAA":18353, "TCAAT":9679, "TCAAC":12756, "TCAAG":17624, "TCATA":10834, "TCATT":14871, "TCATC":13295, "TCATG":15829, "TCACA":15955, "TCACT":18164, "TCACC":17458, "TCACG":9679, "TCAGA":23524, "TCAGT":14863, "TCAGC":18975, "TCAGG":22473, + "TCTAA":12056, "TCTAT":9173, "TCTAC":12029, "TCTAG":13691, "TCTTA":13304, "TCTTT":22567, "TCTTC":17909, "TCTTG":21402, "TCTCA":20348, "TCTCT":24309, "TCTCC":23147, "TCTCG":16985, "TCTGA":475138, "TCTGT":20211, "TCTGC":19048, "TCTGG":26603, + "TCCAA":22689, "TCCAT":19579, "TCCAC":22221, "TCCAG":30271, "TCCTA":12565, "TCCTT":17927, "TCCTC":23859, "TCCTG":31538, "TCCCA":25760, "TCCCT":22421, "TCCCC":24363, "TCCCG":18320, "TCCGA":9469, "TCCGT":6532, "TCCGC":12919, "TCCGG":14376, + "TCGAA":5924, "TCGAT":31835, "TCGAC":7635, "TCGAG":6851, "TCGTA":6275, "TCGTT":6663, "TCGTC":537241, "TCGTG":9662, "TCGCA":7552, "TCGCT":12966, "TCGCC":14597, "TCGCG":11833, "TCGGA":525350, "TCGGT":7960, "TCGGC":14622, "TCGGG":19774, + "TGAAA":24321, "TGAAT":14532, "TGAAC":469207, "TGAAG":24172, "TGATA":10338, "TGATT":13043, "TGATC":156719, "TGATG":14406, "TGACA":12265, "TGACT":12871, "TGACC":12689, "TGACG":6558, "TGAGA":25142, "TGAGT":15122, "TGAGC":21379, "TGAGG":29725, + "TGTAA":15457, "TGTAT":13675, "TGTAC":9233, "TGTAG":492200, "TGTTA":11708, "TGTTT":22400, "TGTTC":12383, "TGTTG":21040, "TGTCA":13672, "TGTCT":17210, "TGTCC":13547, "TGTCG":9491, "TGTGA":25390, "TGTGT":22935, "TGTGC":17483, "TGTGG":29891, + "TGCAA":15014, "TGCAT":13369, "TGCAC":16269, "TGCAG":26314, "TGCTA":11770, "TGCTT":19227, "TGCTC":17846, "TGCTG":33514, "TGCCA":21421, "TGCCT":29200, "TGCCC":25386, "TGCCG":14064, "TGCGA":16927, "TGCGT":7591, "TGCGC":16293, "TGCGG":19505, + "TGGAA":21938, "TGGAT":58712, "TGGAC":13925, "TGGAG":32296, "TGGTA":12989, "TGGTT":16961, "TGGTC":14221, "TGGTG":33546, "TGGCA":32232, "TGGCT":28035, "TGGCC":27238, "TGGCG":25986, "TGGGA":47654, "TGGGT":23316, "TGGGC":34607, "TGGGG":51519, + "CAAAA":30778, "CAAAT":18999, "CAAAC":16397, "CAAAG":24929, "CAATA":12939, "CAATT":11902, "CAATC":9848, "CAATG":17016, "CAACA":19853, "CAACT":15200, "CAACC":15639, "CAACG":11713, "CAAGA":32613, "CAAGT":14317, "CAAGC":17737, "CAAGG":22974, + "CATAA":13804, "CATAT":11895, "CATAC":9191, "CATAG":13990, "CATTA":11124, "CATTT":20116, "CATTC":12744, "CATTG":16368, "CATCA":13796, "CATCT":16488, "CATCC":13844, "CATCG":11363, "CATGA":25256, "CATGT":15346, "CATGC":16680, "CATGG":25409, + "CACAA":19972, "CACAT":16497, "CACAC":22796, "CACAG":24247, "CACTA":13222, "CACTT":18160, "CACTC":18355, "CACTG":32387, "CACCA":26053, "CACCT":24879, "CACCC":43667, "CACCG":14124, "CACGA":17513, "CACGT":7582, "CACGC":14114, "CACGG":14190, + "CAGAA":27364, "CAGAT":44774, "CAGAC":14725, "CAGAG":26086, "CAGTA":15799, "CAGTT":14343, "CAGTC":12840, "CAGTG":25398, "CAGCA":24473, "CAGCT":25164, "CAGCC":32868, "CAGCG":20972, "CAGGA":38895, "CAGGT":21356, "CAGGC":33821, "CAGGG":32654, + "CTAAA":16867, "CTAAT":11421, "CTAAC":10215, "CTAAG":14513, "CTATA":9905, "CTATT":10352, "CTATC":8389, "CTATG":12157, "CTACA":11399, "CTACT":13513, "CTACC":13186, "CTACG":6518, "CTAGA":25801, "CTAGT":8946, "CTAGC":12681, "CTAGG":17817, + "CTTAA":13732, "CTTAT":9928, "CTTAC":9538, "CTTAG":14233, "CTTTA":13262, "CTTTT":23679, "CTTTC":17284, "CTTTG":23566, "CTTCA":14519, "CTTCT":21017, "CTTCC":22333, "CTTCG":10417, "CTTGA":28851, "CTTGT":14784, "CTTGC":16771, "CTTGG":31941, + "CTCAA":19159, "CTCAT":15460, "CTCAC":21267, "CTCAG":30998, "CTCTA":14618, "CTCTT":20935, "CTCTC":24583, "CTCTG":485513, "CTCCA":21979, "CTCCT":31252, "CTCCC":36017, "CTCCG":16441, "CTCGA":18862, "CTCGT":8477, "CTCGC":17156, "CTCGG":23080, + "CTGAA":474969, "CTGAT":63544, "CTGAC":14219, "CTGAG":30506, "CTGTA":485196, "CTGTT":16720, "CTGTC":18520, "CTGTG":30020, "CTGCA":23205, "CTGCT":26450, "CTGCC":33331, "CTGCG":22352, "CTGGA":42266, "CTGGT":20479, "CTGGC":28242, "CTGGG":56393, + "CCAAA":23564, "CCAAT":13976, "CCAAC":16729, "CCAAG":28028, "CCATA":12688, "CCATT":16964, "CCATC":17603, "CCATG":26951, "CCACA":22590, "CCACT":24119, "CCACC":35529, "CCACG":16219, "CCAGA":33512, "CCAGT":16617, "CCAGC":35182, "CCAGG":44487, + "CCTAA":12604, "CCTAT":9065, "CCTAC":10059, "CCTAG":18930, "CCTTA":10949, "CCTTT":18851, "CCTTC":18265, "CCTTG":28086, "CCTCA":23627, "CCTCT":25981, "CCTCC":39791, "CCTCG":22434, "CCTGA":40004, "CCTGT":23234, "CCTGC":29170, "CCTGG":45845, + "CCCAA":21475, "CCCAT":17419, "CCCAC":24631, "CCCAG":43081, "CCCTA":13021, "CCCTT":20057, "CCCTC":27609, "CCCTG":37908, "CCCCA":29578, "CCCCT":27947, "CCCCC":33446, "CCCCG":26916, "CCCGA":40594, "CCCGT":9701, "CCCGC":25536, "CCCGG":30954, + "CCGAA":8112, "CCGAT":27287, "CCGAC":8455, "CCGAG":39957, "CCGTA":4284, "CCGTT":5544, "CCGTC":9547, "CCGTG":12875, "CCGCA":11481, "CCGCT":14521, "CCGCC":31892, "CCGCG":25505, "CCGGA":19515, "CCGGT":9665, "CCGGC":23388, "CCGGG":36482, + "CGAAA":6599, "CGAAT":5102, "CGAAC":7480, "CGAAG":9217, "CGATA":3224, "CGATT":3987, "CGATC":125904, "CGATG":6083, "CGACA":5475, "CGACT":6628, "CGACC":7864, "CGACG":10368, "CGAGA":39391, "CGAGT":10070, "CGAGC":12549, "CGAGG":17717, + "CGTAA":3963, "CGTAT":3720, "CGTAC":4630, "CGTAG":8584, "CGTTA":3478, "CGTTT":5739, "CGTTC":6542, "CGTTG":8596, "CGTCA":5439, "CGTCT":8598, "CGTCC":10725, "CGTCG":536775, "CGTGA":13893, "CGTGT":441413, "CGTGC":11462, "CGTGG":19487, + "CGCAA":7677, "CGCAT":6306, "CGCAC":13616, "CGCAG":17264, "CGCTA":6760, "CGCTT":10521, "CGCTC":14783, "CGCTG":24804, "CGCCA":16927, "CGCCT":21105, "CGCCC":27555, "CGCCG":28845, "CGCGA":17133, "CGCGT":8505, "CGCGC":26433, "CGCGG":34746, + "CGGAA":11680, "CGGAT":36972, "CGGAC":524782, "CGGAG":22495, "CGGTA":5664, "CGGTT":6823, "CGGTC":9780, "CGGTG":18619, "CGGCA":12751, "CGGCT":18403, "CGGCC":27257, "CGGCG":35972, "CGGGA":32334, "CGGGT":16928, "CGGGC":34426, "CGGGG":42861, + "GAAAA":28339, "GAAAT":22224, "GAAAC":17802, "GAAAG":26091, "GAATA":12092, "GAATT":42685, "GAATC":12536, "GAATG":18029, "GAACA":20902, "GAACT":482442, "GAACC":17777, "GAACG":464115, "GAAGA":31870, "GAAGT":15608, "GAAGC":20720, "GAAGG":28769, + "GATAA":11243, "GATAT":8100, "GATAC":6900, "GATAG":12579, "GATTA":11030, "GATTT":13539, "GATTC":10523, "GATTG":11687, "GATCA":12332, "GATCT":20365, "GATCC":12448, "GATCG":551311, "GATGA":16077, "GATGT":10792, "GATGC":11066, "GATGG":22922, + "GACAA":11935, "GACAT":10538, "GACAC":11824, "GACAG":23459, "GACTA":9618, "GACTT":12878, "GACTC":16779, "GACTG":512459, "GACCA":13961, "GACCT":14418, "GACCC":16237, "GACCG":9650, "GACGA":9157, "GACGT":6081, "GACGC":10169, "GACGG":17273, + "GAGAA":51564, "GAGAT":34097, "GAGAC":19581, "GAGAG":28918, "GAGTA":10263, "GAGTT":14000, "GAGTC":14195, "GAGTG":21729, "GAGCA":17611, "GAGCT":21426, "GAGCC":29376, "GAGCG":21901, "GAGGA":33883, "GAGGT":23792, "GAGGC":41912, "GAGGG":35618, + "GTAAA":13870, "GTAAT":12639, "GTAAC":8367, "GTAAG":12070, "GTATA":9086, "GTATT":11476, "GTATC":6684, "GTATG":10288, "GTACA":9535, "GTACT":8800, "GTACC":7805, "GTACG":5421, "GTAGA":499569, "GTAGT":10927, "GTAGC":14928, "GTAGG":18502, + "GTTAA":9963, "GTTAT":8381, "GTTAC":7267, "GTTAG":11241, "GTTTA":10542, "GTTTT":21786, "GTTTC":15355, "GTTTG":16413, "GTTCA":11950, "GTTCT":13584, "GTTCC":12937, "GTTCG":7459, "GTTGA":16891, "GTTGT":12445, "GTTGC":14921, "GTTGG":21693, + "GTCAA":8590, "GTCAT":10032, "GTCAC":11620, "GTCAG":15974, "GTCTA":6879, "GTCTT":14125, "GTCTC":19044, "GTCTG":17605, "GTCCA":10073, "GTCCT":14016, "GTCCC":17661, "GTCCG":10873, "GTCGA":8143, "GTCGT":7433, "GTCGC":13387, "GTCGG":540040, + "GTGAA":16778, "GTGAT":42240, "GTGAC":12400, "GTGAG":24846, "GTGTA":18142, "GTGTT":15422, "GTGTC":13707, "GTGTG":27617, "GTGCA":16964, "GTGCT":19439, "GTGCC":19810, "GTGCG":15220, "GTGGA":31188, "GTGGT":23955, "GTGGC":31938, "GTGGG":45251, + "GCAAA":16852, "GCAAT":12398, "GCAAC":14332, "GCAAG":21205, "GCATA":9940, "GCATT":12753, "GCATC":11716, "GCATG":21074, "GCACA":18789, "GCACT":19802, "GCACC":37336, "GCACG":15962, "GCAGA":28589, "GCAGT":19226, "GCAGC":31695, "GCAGG":37819, + "GCTAA":12663, "GCTAT":8957, "GCTAC":11088, "GCTAG":17326, "GCTTA":10006, "GCTTT":16609, "GCTTC":17957, "GCTTG":22702, "GCTCA":20075, "GCTCT":21409, "GCTCC":23657, "GCTCG":18296, "GCTGA":36860, "GCTGT":24422, "GCTGC":37634, "GCTGG":53769, + "GCCAA":18324, "GCCAT":19780, "GCCAC":25653, "GCCAG":34002, "GCCTA":12605, "GCCTT":19693, "GCCTC":37066, "GCCTG":41948, "GCCCA":26858, "GCCCT":27215, "GCCCC":35640, "GCCCG":26600, "GCCGA":20034, "GCCGT":9793, "GCCGC":32741, "GCCGG":33450, + "GCGAA":7034, "GCGAT":48678, "GCGAC":8299, "GCGAG":18556, "GCGTA":4535, "GCGTT":6984, "GCGTC":10868, "GCGTG":20100, "GCGCA":14680, "GCGCT":19659, "GCGCC":31402, "GCGCG":36411, "GCGGA":32288, "GCGGT":16489, "GCGGC":45598, "GCGGG":53076, + "GGAAA":25299, "GGAAT":17488, "GGAAC":15925, "GGAAG":32817, "GGATA":10515, "GGATT":15431, "GGATC":171012, "GGATG":19170, "GGACA":19682, "GGACT":522209, "GGACC":16086, "GGACG":14159, "GGAGA":37217, "GGAGT":22386, "GGAGC":33141, "GGAGG":53899, + "GGTAA":12198, "GGTAT":9070, "GGTAC":7691, "GGTAG":18427, "GGTTA":9300, "GGTTT":17854, "GGTTC":14222, "GGTTG":19222, "GGTCA":12380, "GGTCT":15849, "GGTCC":14689, "GGTCG":15766, "GGTGA":30707, "GGTGT":20157, "GGTGC":21795, "GGTGG":49925, + "GGCAA":19231, "GGCAT":17746, "GGCAC":36519, "GGCAG":40897, "GGCTA":12960, "GGCTT":18733, "GGCTC":28693, "GGCTG":56521, "GGCCA":28442, "GGCCT":27986, "GGCCC":34082, "GGCCG":32329, "GGCGA":27323, "GGCGT":15620, "GGCGC":35073, "GGCGG":64595, + "GGGAA":28548, "GGGAT":67168, "GGGAC":21828, "GGGAG":53607, "GGGTA":12539, "GGGTT":20153, "GGGTC":20951, "GGGTG":38420, "GGGCA":29542, "GGGCT":33928, "GGGCC":37599, "GGGCG":49766, "GGGGA":52154, "GGGGT":31489, "GGGGC":49488, "GGGGG":530960 + }, + "overrepresented_sequences": { + "AAAAAAAAAAAAAAAAAAAA":78, + "AAAGATCGTCGGACTGTAGA":233, + "AACGATCGTCGGACTGTAGA":304, + "AAGGATCGTCGGACTGTAGA":292, + "AATGATCGTCGGACTGTAGA":322, + "ACAGATCGTCGGACTGTAGA":183, + "ACCGATCGTCGGACTGTAGA":203, + "ACCTGATCGTCGGACTGTAG":144, + "ACGGATCGTCGGACTGTAGA":198, + "ACTGATCGTCGGACTGTAGA":162, + "ACTGTAGAACTCTGAACGTG":18, + "AGATCGTCGGACTGTAGAAC":38, + "AGCGATCGTCGGACTGTAGA":427, + "AGCTGATCGTCGGACTGTAG":152, + "AGGGATCGTCGGACTGTAGA":291, + "AGTGATCGTCGGACTGTAGA":232, + "ATAGATCGTCGGACTGTAGA":294, + "ATCGATCGTCGGACTGTAGA":188, + "ATCGTCGGACTGTAGAACTC":36, + "ATGATCGTCGGACTGTAGAA":17, + "ATGGATCGTCGGACTGTAGA":204, + "ATTGATCGTCGGACTGTAGA":306, + "CAAAGATCGTCGGACTGTAG":136, + "CAAGATCGTCGGACTGTAGA":191, + "CAAGGATCGTCGGACTGTAG":138, + "CACGATCGTCGGACTGTAGA":248, + "CACTGATCGTCGGACTGTAG":182, + "CAGGATCGTCGGACTGTAGA":105, + "CATCGATCGTCGGACTGTAG":120, + "CATGATCGTCGGACTGTAGA":191, + "CATGGATCGTCGGACTGTAG":132, + "CCAAGATCGTCGGACTGTAG":225, + "CCAGATCGTCGGACTGTAGA":137, + "CCAGGATCGTCGGACTGTAG":183, + "CCATGATCGTCGGACTGTAG":187, + "CCCAGATCGTCGGACTGTAG":212, + "CCCCTGATCGTCGGACTGTA":138, + "CCCGATCGTCGGACTGTAGA":334, + "CCCGGATCGTCGGACTGTAG":115, + "CCCTGATCGTCGGACTGTAG":251, + "CCGATCGTCGGACTGTAGAA":92, + "CCGGATCGTCGGACTGTAGA":108, + "CCTAGATCGTCGGACTGTAG":178, + "CCTCGATCGTCGGACTGTAG":171, + "CCTGGATCGTCGGACTGTAG":256, + "CCTTGATCGTCGGACTGTAG":195, + "CGAGATCGTCGGACTGTAGA":136, + "CGATCGTCGGACTGTAGAAC":26, + "CGCGATCGTCGGACTGTAGA":212, + "CGCGGATCGTCGGACTGTAG":115, + "CGCTGATCGTCGGACTGTAG":134, + "CGGACTGTAGAACTCTGAAC":77, + "CGGGATCGTCGGACTGTAGA":243, + "CGGGGATCGTCGGACTGTAG":125, + "CGTCGGACTGTAGAACTCTG":68, + "CGTGATCGTCGGACTGTAGA":250, + "CTAGATCGTCGGACTGTAGA":168, + "CTAGGATCGTCGGACTGTAG":113, + "CTCGATCGTCGGACTGTAGA":322, + "CTCTGATCGTCGGACTGTAG":144, + "CTGCGATCGTCGGACTGTAG":124, + "CTGGATCGTCGGACTGTAGA":162, + "CTGGGATCGTCGGACTGTAG":227, + "CTGTGATCGTCGGACTGTAG":134, + "CTTGATCGTCGGACTGTAGA":205, + "CTTGGCACCCGAGAATTCCA":146, + "CTTTGATCGTCGGACTGTAG":123, + "GAAGATCGTCGGACTGTAGA":264, + "GACGATCGTCGGACTGTAGA":186, + "GACTGTAGAACTCTGAACGT":20, + "GAGATCGTCGGACTGTAGAA":95, + "GAGGATCGTCGGACTGTAGA":116, + "GATCGTCGGACTGTAGAACT":140, + "GATCGTCGGACTGTAGAACTCTGAACGTGTAGATCT":247, + "GATGATCGTCGGACTGTAGA":189, + "GCAAGATCGTCGGACTGTAG":157, + "GCACGATCGTCGGACTGTAG":149, + "GCAGATCGTCGGACTGTAGA":194, + "GCAGGATCGTCGGACTGTAG":165, + "GCATGATCGTCGGACTGTAG":149, + "GCCAGATCGTCGGACTGTAG":195, + "GCCGATCGTCGGACTGTAGA":255, + "GCCTGATCGTCGGACTGTAG":198, + "GCGCGATCGTCGGACTGTAG":167, + "GCGGATCGTCGGACTGTAGA":214, + "GCGGGATCGTCGGACTGTAG":231, + "GCTAGATCGTCGGACTGTAG":148, + "GCTGGATCGTCGGACTGTAG":227, + "GCTTGATCGTCGGACTGTAG":142, + "GGACTGTAGAACTCTGAACG":77, + "GGAGATCGTCGGACTGTAGA":161, + "GGAGGATCGTCGGACTGTAG":136, + "GGATCGTCGGACTGTAGAAC":19, + "GGCAGATCGTCGGACTGTAG":150, + "GGCGATCGTCGGACTGTAGA":267, + "GGCGGATCGTCGGACTGTAG":210, + "GGCTGATCGTCGGACTGTAG":193, + "GGGAGATCGTCGGACTGTAG":164, + "GGGCGATCGTCGGACTGTAG":241, + "GGGGATCGTCGGACTGTAGA":111, + "GGGGGATCGTCGGACTGTAG":273, + "GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG":607, + "GGTGATCGTCGGACTGTAGA":358, + "GGTGGATCGTCGGACTGTAG":163, + "GTAGATCGTCGGACTGTAGA":294, + "GTCGATCGTCGGACTGTAGA":151, + "GTCGGACTGTAGAACTCTGA":90, + "GTGGATCGTCGGACTGTAGA":224, + "GTGGGATCGTCGGACTGTAG":135, + "GTTGATCGTCGGACTGTAGA":232, + "NNNNNNNNNNNNNNNNNNNN":829, + "TAAGATCGTCGGACTGTAGA":318, + "TACGATCGTCGGACTGTAGA":217, + "TAGATCGTCGGACTGTAGAA":12, + "TAGGATCGTCGGACTGTAGA":222, + "TATGATCGTCGGACTGTAGA":234, + "TCAGATCGTCGGACTGTAGA":147, + "TCCTGATCGTCGGACTGTAG":146, + "TCGGACTGTAGAACTCTGAA":85, + "TCGGATCGTCGGACTGTAGA":211, + "TCGTCGGACTGTAGAACTCT":51, + "TCTGATCGTCGGACTGTAGA":171, + "TGAGATCGTCGGACTGTAGA":201, + "TGATCGTCGGACTGTAGAAC":30, + "TGCGATCGTCGGACTGTAGA":264, + "TGCTGATCGTCGGACTGTAG":149, + "TGGGATCGTCGGACTGTAGA":195, + "TGGGGATCGTCGGACTGTAG":181, + "TGTGATCGTCGGACTGTAGA":216, + "TTAGATCGTCGGACTGTAGA":258, + "TTCGATCGTCGGACTGTAGA":189, + "TTGGATCGTCGGACTGTAGA":318, + "TTTGATCGTCGGACTGTAGA":146 } + }, + "read1_after_filtering": { + "total_reads": 439519, + "total_bases": 16134044, + "q20_bases": 15454671, + "q30_bases": 15178418, + "total_cycles": 38, + "quality_curves": { + "A":[30.6532,30.5453,30.8913,30.8849,30.9311,34.3902,34.3326,34.2759,34.6565,33.5438,33.4735,33.5068,34.5057,33.0241,33.5308,34.9244,34.8535,33.9026,33.836,33.0547,34.616,33.1939,32.4045,34.6388,33.0761,33.7631,33.4267,33.0139,32.9276,32.7339,34.3503,32.8285,33.5863,33.5355,34.4883,32.7721,34.1664,34.5141], + "T":[31.3078,31.1954,31.2971,31.318,31.3362,35.0028,35.0142,35.0109,35.2502,35.2586,34.5057,35.0355,35.1825,34.3324,34.9186,35.2775,35.2669,35.2803,35.1731,34.3213,35.1984,34.2713,35.1441,35.2433,35.1893,35.183,35.0639,34.2394,34.7854,33.9934,35.1507,35.2173,35.1709,35.0959,35.1152,34.2133,35.1085,33.9155], + "C":[31.3065,31.2402,31.3489,31.3552,31.3797,35.0545,35.0538,35.0951,35.3558,35.2595,35.2501,34.3734,35.2926,35.1488,34.1112,35.2777,35.3457,35.338,34.4882,35.0701,35.3257,35.1122,35.2467,35.3024,35.1783,35.2334,34.4872,34.9965,33.8475,34.8599,35.2382,35.157,35.2116,34.5276,35.1893,35.0442,35.2739,34.8959], + "G":[31.0271,30.9235,31.1206,31.1744,31.1499,34.778,34.7776,34.767,34.2991,34.8659,35.0226,35.0349,34.1258,34.9288,34.9755,34.3316,34.3558,34.9292,35.1251,34.9157,34.2145,34.8996,34.7812,34.3093,34.8709,34.882,35.012,34.8599,34.7999,34.6789,33.9708,34.788,34.82,34.9695,34.027,34.7688,34.0838,34.7812], + "mean":[30.9883,30.9649,31.1654,31.189,31.2038,34.8159,34.7988,34.7871,34.8567,34.7021,34.5837,34.5052,34.732,34.3846,34.3951,34.9203,34.9251,34.8506,34.6568,34.3723,34.8104,34.4034,34.393,34.8491,34.5659,34.7538,34.4988,34.3057,34.105,34.1008,34.6506,34.4881,34.6932,34.5402,34.6847,34.2513,34.6906,34.5141] + }, + "content_curves": { + "A":[0.369968,0.266667,0.243432,0.231772,0.231583,0.228707,0.232379,0.240816,0.222382,0.261274,0.233696,0.231985,0.233023,0.231692,0.229876,0.223333,0.223679,0.251853,0.234267,0.233034,0.236363,0.235403,0.246242,0.236588,0.250974,0.253052,0.243299,0.239327,0.236056,0.236394,0.233299,0.248975,0.246062,0.235566,0.22024,0.223857,0.179453,0], + "T":[0.207816,0.261224,0.266491,0.263752,0.249741,0.241496,0.229412,0.235335,0.22748,0.226129,0.254091,0.224052,0.233546,0.259008,0.229471,0.231046,0.228532,0.223046,0.219397,0.248556,0.228104,0.235906,0.225647,0.224771,0.22549,0.225194,0.223146,0.235225,0.225901,0.236901,0.233142,0.227017,0.22854,0.230398,0.234023,0.248826,0.265889,0.349438], + "C":[0.148023,0.225119,0.234859,0.242479,0.252608,0.261572,0.254742,0.246699,0.247864,0.237278,0.239373,0.26491,0.232438,0.235885,0.272118,0.251607,0.252492,0.249466,0.277665,0.249682,0.248986,0.252754,0.247628,0.253903,0.242044,0.249389,0.263877,0.251336,0.260841,0.252284,0.250995,0.250514,0.253489,0.267365,0.260156,0.25354,0.269998,0.362529], + "G":[0.274186,0.24699,0.255218,0.261998,0.266068,0.268225,0.283467,0.277151,0.302269,0.275301,0.272839,0.279051,0.300981,0.273406,0.268534,0.294005,0.295293,0.275626,0.268671,0.268712,0.286545,0.275931,0.280479,0.284732,0.281469,0.272352,0.269659,0.274086,0.277164,0.274372,0.282503,0.273437,0.271825,0.266595,0.285551,0.273712,0.284603,0.287846], + "N":[6.82564e-06,0,0,0,0,0,0,0,4.55043e-06,1.82017e-05,0,2.27521e-06,1.13761e-05,9.10086e-06,0,9.10086e-06,4.55043e-06,9.10086e-06,0,1.59265e-05,2.27521e-06,6.82564e-06,4.55043e-06,6.82564e-06,2.27521e-05,1.36513e-05,1.84418e-05,2.57565e-05,3.82753e-05,4.85115e-05,6.13363e-05,5.7072e-05,8.2911e-05,7.59955e-05,3.03982e-05,6.47944e-05,5.57543e-05,0.000187018], + "GC":[0.422209,0.472109,0.490077,0.504476,0.518676,0.529797,0.538209,0.52385,0.550133,0.512579,0.512212,0.543961,0.533419,0.509291,0.540652,0.545612,0.547785,0.525092,0.546336,0.518394,0.535531,0.528685,0.528107,0.538634,0.523513,0.521741,0.533537,0.525423,0.538005,0.526656,0.533498,0.52395,0.525314,0.53396,0.545706,0.527253,0.554602,0.650375] + }, + "kmer_count": { + "AAAAA":66178, "AAAAT":31082, "AAAAC":19402, "AAAAG":21480, "AAATA":23999, "AAATT":21294, "AAATC":13821, "AAATG":19489, "AAACA":19196, "AAACT":16973, "AAACC":14126, "AAACG":6086, "AAAGA":20768, "AAAGT":17811, "AAAGC":14513, "AAAGG":18422, + "AATAA":18974, "AATAT":14556, "AATAC":10573, "AATAG":10198, "AATTA":15204, "AATTT":19652, "AATTC":30943, "AATTG":10658, "AATCA":11846, "AATCT":12302, "AATCC":13743, "AATCG":4148, "AATGA":13965, "AATGT":12859, "AATGC":11141, "AATGG":14646, + "AACAA":17877, "AACAT":14107, "AACAC":12605, "AACAG":13790, "AACTA":10695, "AACTT":13395, "AACTC":17790, "AACTG":13290, "AACCA":15248, "AACCT":14395, "AACCC":13180, "AACCG":4700, "AACGA":5965, "AACGT":9237, "AACGC":5360, "AACGG":5503, + "AAGAA":23262, "AAGAT":14829, "AAGAC":12114, "AAGAG":17498, "AAGTA":11333, "AAGTT":12680, "AAGTC":10647, "AAGTG":18066, "AAGCA":15329, "AAGCT":13513, "AAGCC":14527, "AAGCG":8619, "AAGGA":19226, "AAGGT":13096, "AAGGC":16269, "AAGGG":17595, + "ATAAA":19526, "ATAAT":12482, "ATAAC":9130, "ATAAG":8598, "ATATA":12206, "ATATT":13982, "ATATC":6852, "ATATG":9178, "ATACA":10785, "ATACT":8813, "ATACC":7325, "ATACG":2112, "ATAGA":9411, "ATAGT":8887, "ATAGC":7494, "ATAGG":8305, + "ATTAA":13355, "ATTAT":12464, "ATTAC":9589, "ATTAG":9794, "ATTTA":15478, "ATTTT":29205, "ATTTC":14134, "ATTTG":14693, "ATTCA":11866, "ATTCT":17584, "ATTCC":29174, "ATTCG":3388, "ATTGA":9727, "ATTGT":10406, "ATTGC":9603, "ATTGG":9953, + "ATCAA":9445, "ATCAT":10679, "ATCAC":10846, "ATCAG":10175, "ATCTA":7590, "ATCTT":12950, "ATCTC":13227, "ATCTG":12549, "ATCCA":10671, "ATCCT":13260, "ATCCC":13214, "ATCCG":4775, "ATCGA":3847, "ATCGT":12862, "ATCGC":5155, "ATCGG":5211, + "ATGAA":14748, "ATGAT":11357, "ATGAC":7302, "ATGAG":11966, "ATGTA":9339, "ATGTT":13478, "ATGTC":8564, "ATGTG":13453, "ATGCA":9580, "ATGCT":10963, "ATGCC":12176, "ATGCG":4633, "ATGGA":14658, "ATGGT":12975, "ATGGC":16000, "ATGGG":14677, + "ACAAA":19315, "ACAAT":10158, "ACAAC":10776, "ACAAG":11559, "ACATA":9702, "ACATT":12145, "ACATC":8685, "ACATG":12781, "ACACA":16408, "ACACT":11989, "ACACC":11427, "ACACG":5522, "ACAGA":17382, "ACAGT":12982, "ACAGC":14182, "ACAGG":18830, + "ACTAA":10024, "ACTAT":8920, "ACTAC":8822, "ACTAG":8314, "ACTTA":9154, "ACTTT":16562, "ACTTC":11729, "ACTTG":13822, "ACTCA":13457, "ACTCT":18581, "ACTCC":15119, "ACTCG":6976, "ACTGA":15203, "ACTGT":17301, "ACTGC":15511, "ACTGG":14699, + "ACCAA":12113, "ACCAT":12393, "ACCAC":18234, "ACCAG":14361, "ACCTA":7715, "ACCTT":11513, "ACCTC":16266, "ACCTG":18347, "ACCCA":14624, "ACCCT":12751, "ACCCC":14774, "ACCCG":23831, "ACCGA":4832, "ACCGT":4250, "ACCGC":8520, "ACCGG":7277, + "ACGAA":4187, "ACGAT":4042, "ACGAC":3849, "ACGAG":6050, "ACGTA":2957, "ACGTT":3512, "ACGTC":4186, "ACGTG":11000, "ACGCA":5486, "ACGCT":4976, "ACGCC":9092, "ACGCG":6577, "ACGGA":7032, "ACGGT":4574, "ACGGC":7477, "ACGGG":8911, + "AGAAA":25438, "AGAAT":34885, "AGAAC":21303, "AGAAG":20450, "AGATA":10026, "AGATT":11866, "AGATC":13078, "AGATG":16953, "AGACA":15036, "AGACT":12529, "AGACC":14386, "AGACG":8328, "AGAGA":23034, "AGAGT":13757, "AGAGC":18857, "AGAGG":26889, + "AGTAA":10560, "AGTAT":8723, "AGTAC":7342, "AGTAG":13897, "AGTTA":8926, "AGTTT":15994, "AGTTC":11696, "AGTTG":12273, "AGTCA":10919, "AGTCT":13587, "AGTCC":12551, "AGTCG":6853, "AGTGA":16941, "AGTGT":13803, "AGTGC":16858, "AGTGG":21464, + "AGCAA":13504, "AGCAT":11500, "AGCAC":13510, "AGCAG":22948, "AGCTA":11784, "AGCTT":12752, "AGCTC":16033, "AGCTG":26248, "AGCCA":21384, "AGCCT":22960, "AGCCC":20145, "AGCCG":16397, "AGCGA":7827, "AGCGT":6106, "AGCGC":13808, "AGCGG":17719, + "AGGAA":22341, "AGGAT":15281, "AGGAC":13557, "AGGAG":30615, "AGGTA":10552, "AGGTT":13927, "AGGTC":12442, "AGGTG":24629, "AGGCA":21995, "AGGCT":27065, "AGGCC":22647, "AGGCG":20392, "AGGGA":23083, "AGGGT":16395, "AGGGC":20996, "AGGGG":22466, + "TAAAA":24421, "TAAAT":15906, "TAAAC":10335, "TAAAG":12427, "TAATA":10493, "TAATT":13759, "TAATC":9894, "TAATG":9462, "TAACA":10198, "TAACT":9088, "TAACC":8380, "TAACG":3253, "TAAGA":11026, "TAAGT":9077, "TAAGC":7759, "TAAGG":10453, + "TATAA":11307, "TATAT":11776, "TATAC":6218, "TATAG":7731, "TATTA":10506, "TATTT":21341, "TATTC":9135, "TATTG":8806, "TATCA":7389, "TATCT":9162, "TATCC":6346, "TATCG":2189, "TATGA":8636, "TATGT":9555, "TATGC":6020, "TATGG":8206, + "TACAA":11003, "TACAT":8886, "TACAC":7136, "TACAG":12482, "TACTA":7774, "TACTT":11162, "TACTC":8468, "TACTG":9152, "TACCA":10475, "TACCT":9477, "TACCC":7907, "TACCG":3621, "TACGA":2662, "TACGT":2506, "TACGC":2892, "TACGG":3302, + "TAGAA":18321, "TAGAT":8502, "TAGAC":7169, "TAGAG":12581, "TAGTA":8426, "TAGTT":9152, "TAGTC":7604, "TAGTG":9429, "TAGCA":9269, "TAGCT":12492, "TAGCC":10393, "TAGCG":4675, "TAGGA":11608, "TAGGT":8753, "TAGGC":9005, "TAGGG":11093, + "TTAAA":19911, "TTAAT":12420, "TTAAC":8276, "TTAAG":11225, "TTATA":10535, "TTATT":18031, "TTATC":7712, "TTATG":9233, "TTACA":11786, "TTACT":10051, "TTACC":7955, "TTACG":2320, "TTAGA":10371, "TTAGT":10448, "TTAGC":10160, "TTAGG":10689, + "TTTAA":19166, "TTTAT":18707, "TTTAC":9644, "TTTAG":12882, "TTTTA":23565, "TTTTT":55952, "TTTTC":23065, "TTTTG":25174, "TTTCA":17293, "TTTCT":26493, "TTTCC":18098, "TTTCG":4992, "TTTGA":16991, "TTTGT":21092, "TTTGC":13573, "TTTGG":20120, + "TTCAA":12830, "TTCAT":12970, "TTCAC":11740, "TTCAG":16082, "TTCTA":12648, "TTCTT":21961, "TTCTC":20188, "TTCTG":20450, "TTCCA":32011, "TTCCT":20481, "TTCCC":17864, "TTCCG":8045, "TTCGA":3559, "TTCGT":4723, "TTCGC":5249, "TTCGG":7671, + "TTGAA":15705, "TTGAT":11392, "TTGAC":7445, "TTGAG":16233, "TTGTA":10830, "TTGTT":17932, "TTGTC":10279, "TTGTG":14727, "TTGCA":12133, "TTGCT":15959, "TTGCC":14341, "TTGCG":5143, "TTGGA":14742, "TTGGT":13394, "TTGGC":21489, "TTGGG":21689, + "TCAAA":14203, "TCAAT":7264, "TCAAC":8919, "TCAAG":12804, "TCATA":8380, "TCATT":13191, "TCATC":10185, "TCATG":11703, "TCACA":12669, "TCACT":15245, "TCACC":14161, "TCACG":6017, "TCAGA":14967, "TCAGT":13460, "TCAGC":17032, "TCAGG":19605, + "TCTAA":9475, "TCTAT":7808, "TCTAC":10200, "TCTAG":9655, "TCTTA":11149, "TCTTT":20793, "TCTTC":15555, "TCTTG":16899, "TCTCA":17409, "TCTCT":21461, "TCTCC":20698, "TCTCG":9924, "TCTGA":18142, "TCTGT":18447, "TCTGC":16903, "TCTGG":21437, + "TCCAA":16359, "TCCAT":14610, "TCCAC":16238, "TCCAG":23361, "TCCTA":10189, "TCCTT":15705, "TCCTC":19642, "TCCTG":25158, "TCCCA":21862, "TCCCT":18022, "TCCCC":19742, "TCCCG":13960, "TCCGA":5246, "TCCGT":5605, "TCCGC":11489, "TCCGG":12589, + "TCGAA":3968, "TCGAT":3718, "TCGAC":3436, "TCGAG":5202, "TCGTA":3071, "TCGTT":4729, "TCGTC":13628, "TCGTG":6351, "TCGCA":4946, "TCGCT":10136, "TCGCC":10877, "TCGCG":7423, "TCGGA":17294, "TCGGT":6632, "TCGGC":12005, "TCGGG":13804, + "TGAAA":18630, "TGAAT":12042, "TGAAC":19197, "TGAAG":16676, "TGATA":7882, "TGATT":11635, "TGATC":14398, "TGATG":11646, "TGACA":10398, "TGACT":10989, "TGACC":10952, "TGACG":4378, "TGAGA":18385, "TGAGT":13993, "TGAGC":18405, "TGAGG":25463, + "TGTAA":12961, "TGTAT":11136, "TGTAC":7242, "TGTAG":16213, "TGTTA":10064, "TGTTT":20749, "TGTTC":11559, "TGTTG":16650, "TGTCA":12046, "TGTCT":15920, "TGTCC":12608, "TGTCG":6849, "TGTGA":15022, "TGTGT":20246, "TGTGC":14650, "TGTGG":21142, + "TGCAA":11448, "TGCAT":10311, "TGCAC":11914, "TGCAG":22628, "TGCTA":8786, "TGCTT":15837, "TGCTC":14419, "TGCTG":24729, "TGCCA":16209, "TGCCT":22857, "TGCCC":19517, "TGCCG":10090, "TGCGA":5639, "TGCGT":5499, "TGCGC":11627, "TGCGG":13537, + "TGGAA":17775, "TGGAT":14341, "TGGAC":10449, "TGGAG":27340, "TGGTA":9674, "TGGTT":14487, "TGGTC":12178, "TGGTG":25142, "TGGCA":25667, "TGGCT":22047, "TGGCC":22031, "TGGCG":18560, "TGGGA":28145, "TGGGT":19315, "TGGGC":25264, "TGGGG":32006, + "CAAAA":20513, "CAAAT":13843, "CAAAC":11484, "CAAAG":16274, "CAATA":8422, "CAATT":8895, "CAATC":6748, "CAATG":10496, "CAACA":13514, "CAACT":10299, "CAACC":10842, "CAACG":5261, "CAAGA":14737, "CAAGT":11765, "CAAGC":12619, "CAAGG":15485, + "CATAA":9377, "CATAT":8979, "CATAC":6452, "CATAG":7800, "CATTA":8110, "CATTT":17543, "CATTC":10742, "CATTG":10732, "CATCA":10260, "CATCT":13062, "CATCC":11081, "CATCG":4575, "CATGA":11190, "CATGT":12693, "CATGC":12062, "CATGG":17439, + "CACAA":12544, "CACAT":11769, "CACAC":15849, "CACAG":18124, "CACTA":9003, "CACTT":14269, "CACTC":13271, "CACTG":20585, "CACCA":18526, "CACCT":17693, "CACCC":30932, "CACCG":9077, "CACGA":5116, "CACGT":5465, "CACGC":9386, "CACGG":8492, + "CAGAA":19251, "CAGAT":12460, "CAGAC":12518, "CAGAG":23582, "CAGTA":10391, "CAGTT":12934, "CAGTC":11410, "CAGTG":21604, "CAGCA":19752, "CAGCT":21405, "CAGCC":29417, "CAGCG":14711, "CAGGA":24320, "CAGGT":18676, "CAGGC":29405, "CAGGG":27442, + "CTAAA":12254, "CTAAT":8689, "CTAAC":7558, "CTAAG":9315, "CTATA":7169, "CTATT":8464, "CTATC":5800, "CTATG":7627, "CTACA":9229, "CTACT":11376, "CTACC":10616, "CTACG":4116, "CTAGA":10367, "CTAGT":6958, "CTAGC":8790, "CTAGG":11623, + "CTTAA":10479, "CTTAT":7746, "CTTAC":7434, "CTTAG":9676, "CTTTA":10858, "CTTTT":21292, "CTTTC":15431, "CTTTG":18218, "CTTCA":12530, "CTTCT":18754, "CTTCC":19515, "CTTCG":6657, "CTTGA":13794, "CTTGT":12139, "CTTGC":12706, "CTTGG":24342, + "CTCAA":13846, "CTCAT":11841, "CTCAC":16483, "CTCAG":24063, "CTCTA":10760, "CTCTT":17027, "CTCTC":19460, "CTCTG":28216, "CTCCA":18022, "CTCCT":24788, "CTCCC":27859, "CTCCG":13475, "CTCGA":5494, "CTCGT":6019, "CTCGC":12839, "CTCGG":16886, + "CTGAA":21336, "CTGAT":11064, "CTGAC":11888, "CTGAG":26022, "CTGTA":18086, "CTGTT":14502, "CTGTC":16810, "CTGTG":22363, "CTGCA":19974, "CTGCT":21440, "CTGCC":27028, "CTGCG":16411, "CTGGA":22210, "CTGGT":16802, "CTGGC":24290, "CTGGG":42210, + "CCAAA":16638, "CCAAT":9677, "CCAAC":11691, "CCAAG":17497, "CCATA":8311, "CCATT":12924, "CCATC":12639, "CCATG":17822, "CCACA":16047, "CCACT":17507, "CCACC":25212, "CCACG":9682, "CCAGA":17125, "CCAGT":13847, "CCAGC":28836, "CCAGG":34696, + "CCTAA":9148, "CCTAT":6616, "CCTAC":8082, "CCTAG":10663, "CCTTA":7866, "CCTTT":15476, "CCTTC":15496, "CCTTG":18802, "CCTCA":18369, "CCTCT":19007, "CCTCC":30490, "CCTCG":13394, "CCTGA":17181, "CCTGT":19083, "CCTGC":23717, "CCTGG":33683, + "CCCAA":14766, "CCCAT":11817, "CCCAC":17536, "CCCAG":32080, "CCCTA":8256, "CCCTT":14269, "CCCTC":19771, "CCCTG":23004, "CCCCA":19837, "CCCCT":17361, "CCCCC":21116, "CCCCG":19164, "CCCGA":24427, "CCCGT":7837, "CCCGC":20756, "CCCGG":24345, + "CCGAA":6378, "CCGAT":4360, "CCGAC":6382, "CCGAG":30246, "CCGTA":2980, "CCGTT":4376, "CCGTC":8142, "CCGTG":9482, "CCGCA":8877, "CCGCT":11305, "CCGCC":26529, "CCGCG":21020, "CCGGA":11563, "CCGGT":8134, "CCGGC":21242, "CCGGG":28916, + "CGAAA":4511, "CGAAT":3777, "CGAAC":4775, "CGAAG":6416, "CGATA":1867, "CGATT":3180, "CGATC":7730, "CGATG":4454, "CGACA":3898, "CGACT":4689, "CGACC":6490, "CGACG":5187, "CGAGA":25624, "CGAGT":6511, "CGAGC":10696, "CGAGG":14202, + "CGTAA":2431, "CGTAT":2236, "CGTAC":2731, "CGTAG":4110, "CGTTA":2271, "CGTTT":4523, "CGTTC":5851, "CGTTG":4932, "CGTCA":3951, "CGTCT":6701, "CGTCC":8854, "CGTCG":14777, "CGTGA":6685, "CGTGT":8119, "CGTGC":8645, "CGTGG":12697, + "CGCAA":4297, "CGCAT":3776, "CGCAC":8674, "CGCAG":12701, "CGCTA":4081, "CGCTT":7951, "CGCTC":11169, "CGCTG":16593, "CGCCA":10675, "CGCCT":15080, "CGCCC":19700, "CGCCG":23592, "CGCGA":6616, "CGCGT":6402, "CGCGC":19913, "CGCGG":24896, + "CGGAA":7547, "CGGAT":5725, "CGGAC":18619, "CGGAG":19656, "CGGTA":3600, "CGGTT":5417, "CGGTC":8541, "CGGTG":13881, "CGGCA":9527, "CGGCT":15488, "CGGCC":23384, "CGGCG":29890, "CGGGA":16696, "CGGGT":13060, "CGGGC":25377, "CGGGG":27474, + "GAAAA":21213, "GAAAT":16427, "GAAAC":14522, "GAAAG":18036, "GAATA":9437, "GAATT":30707, "GAATC":10642, "GAATG":12807, "GAACA":13337, "GAACT":18080, "GAACC":13968, "GAACG":11796, "GAAGA":18744, "GAAGT":13329, "GAAGC":16741, "GAAGG":21545, + "GATAA":8648, "GATAT":6541, "GATAC":5628, "GATAG":7024, "GATTA":9462, "GATTT":12340, "GATTC":9404, "GATTG":8783, "GATCA":10262, "GATCT":11166, "GATCC":10490, "GATCG":15868, "GATGA":10348, "GATGT":9470, "GATGC":9066, "GATGG":17904, + "GACAA":9035, "GACAT":8510, "GACAC":9372, "GACAG":16639, "GACTA":7629, "GACTT":10980, "GACTC":13562, "GACTG":19322, "GACCA":11776, "GACCT":12234, "GACCC":13634, "GACCG":7389, "GACGA":4049, "GACGT":4429, "GACGC":8514, "GACGG":10813, + "GAGAA":38764, "GAGAT":14403, "GAGAC":17892, "GAGAG":24996, "GAGTA":9034, "GAGTT":13035, "GAGTC":13224, "GAGTG":19067, "GAGCA":15126, "GAGCT":18533, "GAGCC":26275, "GAGCG":17009, "GAGGA":24972, "GAGGT":20654, "GAGGC":37347, "GAGGG":27249, + "GTAAA":10547, "GTAAT":10439, "GTAAC":6545, "GTAAG":8358, "GTATA":6618, "GTATT":9656, "GTATC":5184, "GTATG":6880, "GTACA":7157, "GTACT":6630, "GTACC":6177, "GTACG":3118, "GTAGA":15905, "GTAGT":8953, "GTAGC":10969, "GTAGG":10541, + "GTTAA":8162, "GTTAT":6898, "GTTAC":6113, "GTTAG":8394, "GTTTA":9251, "GTTTT":19947, "GTTTC":14331, "GTTTG":14109, "GTTCA":11048, "GTTCT":12625, "GTTCC":11989, "GTTCG":6306, "GTTGA":9417, "GTTGT":10683, "GTTGC":12423, "GTTGG":15550, + "GTCAA":6635, "GTCAT":8479, "GTCAC":9947, "GTCAG":13613, "GTCTA":5814, "GTCTT":12926, "GTCTC":17522, "GTCTG":14793, "GTCCA":8907, "GTCCT":12884, "GTCCC":16234, "GTCCG":9116, "GTCGA":3284, "GTCGT":4582, "GTCGC":10819, "GTCGG":20716, + "GTGAA":14021, "GTGAT":13228, "GTGAC":10845, "GTGAG":20612, "GTGTA":8683, "GTGTT":13723, "GTGTC":12433, "GTGTG":21577, "GTGCA":13853, "GTGCT":16268, "GTGCC":16625, "GTGCG":10905, "GTGGA":17835, "GTGGT":19107, "GTGGC":25365, "GTGGG":27669, + "GCAAA":11570, "GCAAT":8364, "GCAAC":9518, "GCAAG":12213, "GCATA":6349, "GCATT":9597, "GCATC":8379, "GCATG":12684, "GCACA":12544, "GCACT":13288, "GCACC":26352, "GCACG":8101, "GCAGA":18007, "GCAGT":17097, "GCAGC":27068, "GCAGG":29259, + "GCTAA":9160, "GCTAT":6535, "GCTAC":9240, "GCTAG":8824, "GCTTA":7170, "GCTTT":13830, "GCTTC":15505, "GCTTG":14619, "GCTCA":16188, "GCTCT":16997, "GCTCC":19541, "GCTCG":11753, "GCTGA":19487, "GCTGT":18698, "GCTGC":30840, "GCTGG":38524, + "GCCAA":12734, "GCCAT":14328, "GCCAC":18332, "GCCAG":24206, "GCCTA":8674, "GCCTT":14931, "GCCTC":27897, "GCCTG":29958, "GCCCA":19883, "GCCCT":18959, "GCCCC":24258, "GCCCG":21372, "GCCGA":12085, "GCCGT":7955, "GCCGC":28683, "GCCGG":27462, + "GCGAA":4968, "GCGAT":7026, "GCGAC":7099, "GCGAG":14569, "GCGTA":2608, "GCGTT":5511, "GCGTC":9016, "GCGTG":12525, "GCGCA":10132, "GCGCT":14317, "GCGCC":24016, "GCGCG":24114, "GCGGA":15490, "GCGGT":12733, "GCGGC":38964, "GCGGG":32408, + "GGAAA":19795, "GGAAT":13251, "GGAAC":11879, "GGAAG":24410, "GGATA":7471, "GGATT":13082, "GGATC":15826, "GGATG":13940, "GGACA":13007, "GGACT":23052, "GGACC":13457, "GGACG":9852, "GGAGA":26088, "GGAGT":20345, "GGAGC":29087, "GGAGG":43542, + "GGTAA":9220, "GGTAT":6562, "GGTAC":6115, "GGTAG":10896, "GGTTA":7510, "GGTTT":15964, "GGTTC":13173, "GGTTG":13890, "GGTCA":10816, "GGTCT":14542, "GGTCC":13653, "GGTCG":10738, "GGTGA":18866, "GGTGT":16395, "GGTGC":18558, "GGTGG":33543, + "GGCAA":11866, "GGCAT":11781, "GGCAC":25609, "GGCAG":30713, "GGCTA":8781, "GGCTT":14573, "GGCTC":23270, "GGCTG":41510, "GGCCA":21231, "GGCCT":21138, "GGCCC":26729, "GGCCG":26847, "GGCGA":13090, "GGCGT":11751, "GGCGC":27804, "GGCGG":44764, + "GGGAA":21489, "GGGAT":16725, "GGGAC":17734, "GGGAG":39822, "GGGTA":8665, "GGGTT":17071, "GGGTC":17680, "GGGTG":25501, "GGGCA":19855, "GGGCT":24711, "GGGCC":29960, "GGGCG":29327, "GGGGA":27124, "GGGGT":20831, "GGGGC":33446, "GGGGG":31304 + }, + "overrepresented_sequences": { + "AAAAAAAAAAAAAAAAAAAA":34, + "CTTGGCACCCGAGAATTCCA":128, + "GTCGGACTGTAGAACTCTGA":31, + "TCGGACTGTAGAACTCTGAA":54 } + }, + "command": "fastp --overrepresentation_analysis --thread 1 --in1 /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastq/tutorial_R2.fastq --adapter_sequence GATCGTCGGACTGTAGAACTCTGAAC --length_required 26 --html /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R2_rmAdapter.html --json /sfs/lustre/allocations/shefflab/processed/peppro_tutorial/pe/07-31-19/results_pipeline/tutorial/fastqc/tutorial_R2_rmAdapter.json --report_title tutorial --stdout " +} \ No newline at end of file diff --git a/docs/files/examples/tutorial/results_pipeline/tutorial/objects.tsv b/docs/files/examples/tutorial/results_pipeline/tutorial/objects.tsv new file mode 100644 index 0000000..9fdc17a --- /dev/null +++ b/docs/files/examples/tutorial/results_pipeline/tutorial/objects.tsv @@ -0,0 +1,8 @@ +FastP_report fastqc/tutorial_R1_rmAdapter.html FastP_report None PEPPRO +Library complexity QC_hg38/tutorial_preseq_plot.pdf Library complexity QC_hg38/tutorial_preseq_plot.png PEPPRO +TSS enrichment QC_hg38/tutorial_TSSenrichment.pdf TSS enrichment QC_hg38/tutorial_TSSenrichment.png PEPPRO +Pause index QC_hg38/tutorial_pause_index.pdf Pause index QC_hg38/tutorial_pause_index.png PEPPRO +Fragment distribution QC_hg38/tutorial_fragLenDistribution.pdf Fragment distribution QC_hg38/tutorial_fragLenDistribution.png PEPPRO +Plus FRiF QC_hg38/tutorial_plus_frif.pdf Plus FRiF QC_hg38/tutorial_plus_frif.png PEPPRO +Minus FRiF QC_hg38/tutorial_minus_frif.pdf Minus FRiF QC_hg38/tutorial_minus_frif.png PEPPRO +mRNA contamination QC_hg38/tutorial_mRNA_contamination.pdf mRNA contamination QC_hg38/tutorial_mRNA_contamination.png PEPPRO diff --git a/docs/files/examples/tutorial/results_pipeline/tutorial/stats.tsv b/docs/files/examples/tutorial/results_pipeline/tutorial/stats.tsv new file mode 100644 index 0000000..d4de835 --- /dev/null +++ b/docs/files/examples/tutorial/results_pipeline/tutorial/stats.tsv @@ -0,0 +1,34 @@ +File_mb 50.42 PEPPRO +Read_type paired PEPPRO +Genome hg38 PEPPRO +Raw_reads 2000000 PEPPRO +Fastq_reads 2000000 PEPPRO +Reads_with_adapter 598996.0 PEPPRO +Pct_adapter_contamination 0.44 PEPPRO +Reads_too_short 522549.0 PEPPRO +Duplicate_reads 3022.0 PEPPRO +Trimmed_reads 461368 PEPPRO +Trim_loss_rate 76.93 PEPPRO +Aligned_reads_human_rDNA 68452.0 PEPPRO +Alignment_rate_human_rDNA 14.84 PEPPRO +Aligned_reads_rCRSd 12998.0 PEPPRO +Alignment_rate_rCRSd 2.82 PEPPRO +Mapped_reads 711524 PEPPRO +QC_filtered_reads 384789 PEPPRO +Aligned_reads 326735.0 PEPPRO +Alignment_rate 70.82 PEPPRO +Total_efficiency 16.34 PEPPRO +Read_depth 1.35 PEPPRO +Mitochondrial_reads 249 PEPPRO +NRF 1.0 PEPPRO +PBC1 164998.5 PEPPRO +PBC2 164998.5 PEPPRO +Unmapped_reads 44906 PEPPRO +TSS_Plus_Score 56.2 PEPPRO +TSS_Minus_Score 17.9 PEPPRO +Pause index 108.18 PEPPRO +Plus FRiP 0.37 PEPPRO +Minus FRiP 0.36 PEPPRO +mRNA contamination 0.63 PEPPRO +Time 0:14:01 PEPPRO +Success 07-31-20:57:16 PEPPRO diff --git a/docs/files/examples/tutorial/summary/tutorial_libComplexity.pdf b/docs/files/examples/tutorial/summary/tutorial_libComplexity.pdf new file mode 100644 index 0000000000000000000000000000000000000000..12bd6fc533a438ede19bd8449f499693bee7fb33 GIT binary patch literal 8290 zcmch7c|4SD+rJjvmO}OtgM=(IcFN3T$r2@0_GQcrDP}OE?E6kAEkq_1N+l_~LG~vJ9Fv7N_tp4aC%zu%F%rf;C2q^Qa+6+Rt4 z6HW;4xA$RJ0)PN$m)q>x+U!6*A0!Oxjz;Ojut+V<&x|IdM&pZnE7J8e6e)1Yd&a%FC6K^7*$bJS7f;Q9ShA6$+ANr z>_`-Xk%jW#*#Lmo{k@O?pdJhh^FX@+fY)GdNDM%Qu3!Q9w}Hlg88Gx1+CE4W_D^-7 z9vX$EKVkryzs-RbNDSK72Tu2=`XBxn3V)Tu6p3=f-U6tqs3`$}2JRkM`V4>u9`xeq zBjIQSl94wCORt$HyIIwX?Nh#`xOYTQJi}vM0au|+T;JhA%X&K!+fwF0*mX_U%@z8bV)twSICt#q6UA^D&W5t7189VJ{aC192tRwr|L_)%d zfRatc{ZXwCLYrAB=SlD|^U&vF#XO^=9NLSS^osN^5LKwcns{W#cnhL4 z&=d|_5_|G07oP;H!grFBD%YB~AA?^|lUyl3!#A9-MD9&2je|txEwO?3d4(%E@pVMq zrcVKoh9ldsA2AdaO&m{u&vm?5V1pm%?aO8G3eOCz+&47EzAX;*GY$5Nr|U=72N3gi z&a*;t#By?N*s|lH1X7gEiGA&2IAHdjqZ8 zgS+1FOTkCB-D_FP*(xyU2%(!3CsuN@l4AOKD!1Fb(X2wG6$-B)q`~pc53!7x=gI1; zY}(dN^XlU8oQ@}7lvbHf%N`Q3P8z+t@`JC>zqWKnHf!X;>C=+|gHTOxS=GDCbC+W} z_dw7aBAPt1qT|IslQ)_^SYbxxT6iV9VzL%~S#+w(`Q+Ofd9ShhxCK8hf54$(8xgEg zZe;^%)*6qC4}-nJ`qA1!`$s8UbKUVKvV97vpUo{VmvMP&53n9QNN$hZ<}WsEYH9#k zzL7RWWj%VfbBFVdj8uAMi{K|OHcH3L5qMsHkXQQ8FZUn&q*G`0#ipm0?{}*rGd>Gv zYau-?eI__s(o~*4)+R-5Ahw>8PL^;FrL$2q2HI=mW3_HUh*~)7^iI-+F(IvumMH2P znJEt*PqUn9`~riuZ%RMlh~2w9Stez56??9ig6kw7;`en6$HS4Kl>N{Xt#thA z85^3o4@^n4FshXc^>*E!OCD?NG9oDOjL3H2hzPa5C3HK&v2^16<3#TVGOZL#`x0eCrp%2{uU`dqH!_ z&2d9~C&VA0o}-k`rG2!Qwj|WAL8aHYP3k1h#ssjGfngGbZmFIGuIQS?)dR5CCWvd% z2D%-oJJDpb>Z>(~UAmAFU@&ZTAo54*Dsb3~dqlKK0`+m^h$Vqr;OKX&mu{0Ql%lP- za-0$xi^4PUkc@yBCsJ&j;6iA__yng2R|%DMnt4e$VfY~IwcBJNi3fO%uvZCX-0DSv zjG>vQni({~6>5xMIITS8wOE{Bp__BDG-GIpYFKj-tf%3UWePr3Km|Cy$PTZ?>wVFA z0#WJ7IY17jF($Oh#kO&H+hajc>oTE!Y)7ugR4AXsni0VAWL)`L?!m0;^^!iekJBkw zqd(e%P4ly1wulMNmxXSUHfBOb=7jp@w?Pr3(}=x^2P^ABx4a>SWq6gI-0b_W-DC^% ze!5)kQ&H4QHwD9m+-^c1e2`yrx(3m?S<_H&O0@AuYff->)mgsp7aqVu+LvGy04!!sK3e%E$O58smugHtY7@{= zpBlhY`glC`wVU(KZ>OfUmM_wqzHQ6m0Cx@^Rxg(ZpPA*&7^z=XJ8$rDp01+KGE6zd z*{WAo3vdj(mRgIqVL19)uT%j^k(R@?4c*+_;XGr39*Z47UL9&TqgRN5QEOPKIIfS z)tdJFK-TN6%d8+LADnLl(vX+v3B5r+I=pH%%ZngrOfz@6Ws?&8ri@&gd4INSJkknb zjrcja$0wAQw`cX(EVXu=p-oKj%MqPk+GE{Lk_S6a3giyaqQdP31F4yt@toyL!3?M9hk@*CY&4b!xaHtv6B*7oA;O!)>x{dL2A6`w4HU=8SUT z4-Ba~9O$E6>07eOyP@0eLP>ic6k*@_Rr({canu2~%DUhRfqCTE0)!TrOwHh9f)3zYIh{$&~qV|_RPXfDJR+A zwvp=iawSN#{0~PCoLi}ZC^b|7*)ZiULahH@gx8ZMCN5teMqIMXDz z}Rz%gA6WYG5-kEAsFcW=m zMzcBM9o%>C#tI3^CA@L??8Ca3^!pd@xW{#Ac4MweAL+^On;fUtYc2E|M0_nRkX!J( zl@_;;Z}5E%L)3e-7~{3ppN^gH%{UC7Ks(L9yh7ax$vX`GxD{p!=IA9oXKZ^Rf!EOA zd%Sr@>m0oVApZ(TvEg-y4#|%jh$vs*U~Kc~h1~>Guw>CeoLHfo_zxQ95$xft6UGA4 z;66wk$$DfKM?ru^%*MI2UP~et{SD}!3CW^5V_luAzRKJ3o%>MfSzg!BWDqc+XhNO+aRLOb)LYQAa4GqO|D9r)Dz|HW822X7;_2n z!F@?bBh&;fcR?+x%$WWOpl5aISlTKyAu3H|48O_dovCf_L_fToyy; zA~yh}U2;fn#to+%5S=Hq**8JDZ};BNtG%T~q(+VGguGKeTGGR2vyJt+GjIpoXgvj0Vt@|lvB@1H=3byhs?m!F5&6|(-_XZk2oo$r$IGO3Q}e`PL` zzkHp%5y@9&OwqvOj9j;$u1m)Zk@_B+#kC^H6Y4uAW(>t^bCh@w(zXluPCssk@f)%m zB9X8PtRk{~oXfj_V={4SZ(I$;@6sa&;?vs#wZA%T{xMjZk@6t66&`r9Te_Yk-ALcA z-%IC9DgL&kM38reJb1YupMJ}rv{+-=21oJK#Qi}epZCXSZS8MR^;Ix54&K)Y(P?M! zG6{-Uv?;HB+(_0>C)9OJ1xa-JB^295E*H6PdQlRJznZ^w8{4xH8A=GQwIR6Dj73FL z=1N7nrFD0R`95^NV|%tD74#V`4hKPR=zhpPMk&^Xak|WwN@?N%MbHNFQR{$9^d%l( zzYzDvnrK(^pwvkvHIx1UC%=Lryzd5f(|1J*k!{}sZ=Oqx2YD3#Tq7Ziqt~UiMQ0vK9LNPhr#3#R`ul13)tz{57Bxk6%q6lx=KxmA!|BA+McW>`{s!?~0qVF={w9ur zQq2k0M+-p`qTRsDJ`kRH;tl2bw6`>AsX>=*=;9?Yn~hsjlz3NE+G{uOmI5g)9H1I9 z&+CmBQ=rEosT~AeN}-ac#Q6BYS+{>w7H@qOvCHpDy5$%x)_m4RP9A@`+qk zn+vJ>wnFNkrQ)np3Mmr@HN`eN-}UBGyMImEb4fmhJI>Er2Lw7fZ(d>(?QsCUNe?oQ zFjUP?JbyN{X5k=h?j|?qH(n@e_j^}fqkQ(}TjO-U?>+mpR)1q6fy`x<_I~c+?>nQZN*vh?e zF|oT)uIxdb=y~cQY=`J9m=lr-`QIw;Zk}FR(rS2 z%GXilg5U2c)K$ndB|AXJKZuD^zmF{AMA3D#3dOjw(f!~++R7Zc`qa2r@3-Rg&xx>o zk_%Q3Cm0X;mRz*GUhG8MUHd`YHc2Gq%#eq(UhXbfgm}+~6%5|%-B&vq+`kt7kos$V zoL|&o94Y=81e+`XC#RtmbK{(D&GAa_IjHxi;d^c__$=o7Mfg?TnWJtinaTVVywNB9 zUJT+*#J|x-qy+___j<0X_a4vuHF6I<(KCIk0!YtIrNpV)X2g)nO@teAa#oSv?rn5s zT0uv%GACz8>d+H4@bb8MfxXt%SloMbap?Xm#F47;lB4D|9liMz2>BDoVZb#1f>Hj$ zasCD008QKx7=Rss0ozyr9O&>4+LsQ~(D9WkNQ65~7wreI1JTDcltBPBkgCH!kRAq7 z^A|Eh2bAEJNG!k(NQboO5s-dZ2X>$V9pwRNYXc3G0ZI%fzi}eqB|og8C6<9`X=^jw z(L;KmeJs6T@ZS<3#==k+p!S#gzmX+|h!M{YXsoBF3&S800Ck3z!(UhxM+0| z6e9>wA9>duj$}9mUZvwtz&}wWWi>7J|1XNf$mwqs>G_j;*DZ$yVhObxwbveUCp_x8 zbIane(Xm>i2a4yE*tjp(r!q;X>tFZMH-C`-hqBCMSf1X45{ZQ9L*^yRM}_qVyuJ8N zJuybS6P~E?U+>DC5Zej4gR3Qsxvd8eRxzdSM>2mgwPp+B%(3R1ns1J~pXlbydWiEE z(-9A*Nw3mUU4dPL!x@KzhLSuocy|SBtBwQ6lym*iqz0w~+@nex2_>d$=}GgOyTkUv zg6*1Mt1PK;y+^>b8u=DyYm ze9{AFVZr%7b}NGRhGOGyY7IM(s|& z`heD*1l|s==I%~g#S>==;)KuITgKc^<4v3*5U$K8Hg|%KYuuNdRvO9>wh@`~VR9wx z+wl2&3V)QiFr=xa3G!6%#LEnXI_zgY+`0S2F)DOTSYK?nkz^H;ag6ChKJxSMUaY4( zKa<1qp=;ID*e+)vQ^H5Q@9|)7(W)Rvi>7ILH@TwGQG1g^xI41Ih4nq$@lZXdAc6&c zY<(8yM@-Xvh*i>a)IhlgmJ(%kl?hDXR< ziM<)=&nbimTCi1xDXmT5OlUIPP+z&?gn9SMvwhpcssN@-7mqAmJhgCyxBh5ZJx>J_ z*W{7IIx=xby`7aNBluDe=>r7$!alzcdKB@_S-OzL_XUq?q`H?7HXJ^ws>!Mt-r;<7 z^pFMUcy^fVFZRxh+)>eO-24`?Sb$!e$j4~w)Kfo?FzfML6M6K9l%B59Vg8HDFDwd0 z-oz~BxGvZ&$Y4)aF&)z@e_?*>#2$YDt0agmzrpqcj|X$9vzg`}$x(t0?Z1>Y#S|mT z>mPd^3F2OhGHZM~$z#n94KLsc!q^FqkLjRBe4?Att74DRH1^>!~X zVdc*YKTlLNuzHc%b9$k4foDr|kDnzn2cD#qEEH-ga+bgJaH(+Vss3cGXyKM5SbmB1 z+w+4W%L&JteLlE&D3!4XatEFWWWJCb94R@C^(xbJve&*EC)adi($-7b%gT$lLb&F{ zIQM!IS2OWf#|CoOAc!mE4`?z@T!uG^?R}Jy?m3u3&chx9O_K@}KbuZ~dNa3Z-ja<*D%Z8s3_Y_~1el9U4Q42_GH$ZUtXxo^M>!Qx$#3!Wd%wL?d zK6g~+7vD{}0U7K$dvm}1I4jlbTi5O1rWaf1`00BaZM;6=*lra6uF2f?)%85=^~IRJ zPs%rj4YaOn>G_xXByKX#8uH0E$4%=^nJ36lWZY!n*Q4H;AuTHhd8a#1 z_gJ{U`h>m}`AL>PA>sMuPnWYV-~Z~(FMB%YRPT|6#VzGM*q-m+g&PVt%x>V9&VEz> zCikZJ+gzc4;l{Vi13$hQ42-{483-QeA1Hr)@AX9gMfY^~s5?Jzuk>mbZD5akCU=Oe zWj)l2ogW>HQtMKcRJFRb)-TeNHP|<}+5ffgP2c&v?dzHES96}fsnw%IkzO9Z(R#)3 zMXBEW%WilKdt=&z?n1*=1uo|$l#kMC;JwrXcSG#A) za-Kz;g_-3YOZl;l82LuNMu!+`O!57s`z}f9LcYRa<(n$ULERcCHT)f2b#DzD*FI;T zEZKYcN<~Vilw-S2cQVgacf~672wWA=O=L+tWqP7NEu+x`nQYsq z5UIeSP%V$M5w>o&^DJE|-@E0BevTTu72F!*!h6f|RzI9r^e#i;dsz$VhyAAgL}k(Z zT|zL*4b@sc0>9UveOt_>t^xm@78#ir*_P7<>+7vo>Ma@EU`cFYhkLp{zo&b_U+dl7 z^K)B+!wohoK|^Fg!F-cvCW#$+{w>5^;>r2@l}nXA_R9{hP@LuZ<+Uh_dk*)K10yL% zxPrN|4bxhq3SPUtnb#q>ISx8X6dy1C?%_tdOp--6jS#Av0()Yod1ozGF%wnGWIk%Bg ztBJ?vIp*(0NA!gCtmf=|Nosr&9W0j2#>G+07AgeeHRtZF3#)Q&k9fjdEKw`bA+fHX zp>LcUkjJ0Lo12;E)auvzsMQGm&c&+5F`++>x5>8^K9e_-Ib9&QCqG*0rQHC@(VW_o zn7QPis3<>ZorT}sJ<%+cC1rS`H(n`TA%0yeCyS+ft1s-;XOn^ok2S?L-fUJhEBfL3 zSKz$anaZ<|rNNi)UK!8U&X~@&c(8fBUf?=McEMi3;4A!9jw>TLk}UXaE%?aO2kG9| zjd=3eD9WEzh|000ouvt-FFUfHuG*_hv7b;w>J2A;tZr5vCJcl%>3?)oem3*OGL3jv zoGniQC7;f9(&};X??n9X~_SO8?y&FAmUKIscEf*`=g7Gcr zuJF%MpWW|-%6w9k2L@Ftx;mIWxY_$Gw`4nH*)EYk;Zn1PdWA>fNZb#ZABkjhaHgDK7U>c_PxAqbl>Vq;5*mV{2$+|{i};t zHir6d7TmD1-9Z&QuXhF1?RB%{#Uuo$2WwG8)eSUAp<{hvG{mY|gm^dFqc)qx^0`(u?-Y?h{ z4|y@eN)bEHa+>8rtVnDX@PfmdaJEL!bOPmZzg2B)BvwAk=Z!Z{K(@Eu)|rDtBN{>HIl-ug-5@8N`1-BRIZn-%R$pa7RW+d8*2qgX1I_e zJ5fZ+f3@0Lf48CRe^REGP;_?E9YyC%8ExyopRC+bIw*|$UjlZZzPqa{lFpMdh)_F# zsv6MK9p#GwXsH9eebHE?2htVGuB568M4;)^E(YTc0J{0W?$Uc)7~Gf9>cZW9;J%)& z9!Ng`5bN%Npo=_Va33@Z0Ce#|G8E~SFgTn}y|M!l?(|R?cMJfih(co#NLK*R=Xa8D zdgt%q0sDvimM_W;=Hu(>0rSNIfM_=~3VDYf4ffkJhS9k@{DU+8-Ru9=i2sW;{(TYv zTKc+Re{;wTA^nJP73N7#iGDixU6+697$H6GBC+mp7(4K;BT2Sok?e00My?yC3X5a=zq#oHI(QFi~p2q(P`)ZkZCcd^`A1; z|MCY?R-$v}|5Fd7to2_q4Rw|OilL#Y^^aVzJ}`F=q!0a%005w+djOI?UjWb;<%*`C l&KUIoTApcYNmi{r=v;s>*T%cvN@@f)L0*kWohv%n}5_n7W7w@2oJp z^&rR%L|#T(!!3Dr!qtsz@Jw=}J7Ge8{pQV^7ciDG0t_!;{9VfX zljeaf6LNw4vEL0@>D!n%s?7-A6~7+OD}A056T%IWaW(fZ-jousaGgK(@bWT0_S7<& z^qfz=)*{Rd&+K89cZOdG@g+_8Db=rv4Zrva{>K-MAH9$NR@Qm!;^E0MAt8ZiPwa{01;pMt4|A$D`E4`JIK6-bq1+hp-7*0JJ{T7HI5rkQoQ+dDLX2Ro*d=7(|Q(3&{Mn0O> zyjXGBnw4LJ}3CEGSJcUAm+qdHN|W%_#ILNBz-qVU27^WaRopO=W4RovLcj2a|8? z{^x;&G*OI}or!niju{yl-8?-T_I_DuJjcZ_4GW?Yw6z{}JKY@?7ZVE!2`TCp^E%i# z+FjWejUdo{OEmqtjxx^mY29s3&b7mZwEc~Z8<{5GUSs3p#?vZOO8V4BMyi;YOi%ot zuu*YK+LEjrGptMQeiOuL@P*%PW2&)HN=2o6ZK8%w(&r?V=w@bV!`T=2?Rg&`AMfM6 zI>))Tduu%ysvNxr7p5?1T;Z=2V?6ut~820gJG;^sz4Xn`5u#e%?g1WZ!nJwYe zz6aBRl4l2|ll9&P`ucb8-Q%E0^H{zuC|H@9N#Et}g(%kYtZX|uVmzV`eNlf%&HDnH_nD$x7O{W*;rZhZ;#FS&LkPqn#xVz0aQ{f_Dq&;MS?aPVaYZ!IUHEfaBy(k%J$Y)OW3vOgajR*4;vdBT88f59qTe#{Ba2G zk|Qjn1&9!1d%UZMhllX~Z5EarnfMf(+NHv<6Q&(oPH92P$wDS|OI@LH>zCW(b(WZe zBO|#^8HY;aUK3EmlLhKyQpG)Su(5S)PhoD9rna`W+Y8+d+nNV7Mk9~jD_$Zb{OqMf zNG(vLlq5j3cXRx(qf*naSg$g!ej7}~sK&)cR!wLDHrsaOLxx$+iL0yN{>hH5=Wb1% zf|{C|v9Ym?OmiHE9xpF1>j81gJF}SYe~#B1b9y}P0m=V*VpW#-dLF+0JjTi>A|DG!d2paQn$xIiex%*<>x&fY zzpvh4VtO4!NGE}|x9RE4%~m?ekwE(ezBCE%FV5sap`mQ2jVYq8S9`Fqmg3 zQx<nbF<7!ahy&2?*6TtH=DkA&$NW|re$|b><#Unf@KK# zoVY=Z3A@I}x)oyZ#d&jofAX`<7;M7U_BO;Ej|Femt()WdJGggc%Gl%UN6IZ!e0|Ts z^j3e@i83==%>H;w?(RCrw$NYmcd*?(7Tnuz2cHYxu*54}Fs{;77K< zKIIn{uAJ5nEu{I{P8e1@nrUl~q^R^2Xcksj4eN5v&(6LI4D3!8jt+{7iegeuJ~&z_ zE!C}9PO_^X{qkZ(+(@l-c>nL1>&j3uwV>^4Z$4!|#ydk1L z%fz1bq{GCl!DO^b4Ivrsd%5mwyj3YZ(UMnE@}7MwS5{tbrn5Hkab|0-oe%!;^0v7L z1qRAZe0hVunK_xotm9_q%D>$_}O@s1MHE{-l)at>1n%H1A>C6 zrl=MJ@mF$h#1uRO{z357`{JD6`;6T?4gL@q7+6zN13&fRKW-iuVdg5QEca#w#>Z>H z#x4&QuJ7eRB;5VjO1r(WaS;#CV?Mzmf=;qa`21wM`<8qe;S+GOP+BUfW*bxfcH-E{nV7P zo!$D&moNK<;}6#kBo}V}p0Agv+cKJ){TU6l2NWKgdwV|1`MC<+xV2;V$YgbD-5emg zd3i(1`)idil!uA9J~@f-k3&#{ki{VbvoA-=gTvgtdzU@*63yEYm34tQZnzJu`IQvx z#(Lut1eKzopdbQ^Sl%tcCUOzUOE!eMsLH^>!9ibtJX1EbK&$j@;E_sj1Qx;?$cm_@ zCf>2qjr*mQGd@24q3$4unyQEYfB(|J zfLBWQ{(bMiykKYgguk@36q32Pi+ScWP+~ADnWw@I_(-FT&)MO^-?7S2WsJ`Otj1g(d#l1PmIn%aC#szm zcw3;(dbG<$fb4Pc@jY_B@IknPyho&k(p1qI3Q}U6EKJ>8mXO7ZP=j8%|6l9CPs+Ld zhsVcoUj+G@j`u7jlO=BV6@sKI5m{NZg?XuHda=qy1M#5-*_Dh z*P>X{Et#T!c6KWL^SDczQY#S1WaVHv-u}0;lV2%{QU2>W7J?+c?kBONTF`gC03*EI zaIu2Wf&~ZZ5&DmX>)~&qM30r9&&czajQ&lS=qw+jvIt=w8F(=atgHogll3GdB+Sam+FzWPz)jh<@+N9rnVFb4^*)C=olOVQ zt&Ns5^YS`w&v(Y@&HVWT^^isT!2V5s{v9YZG9SU5j7OyHwHWS)Ee_;Af`lnA9}JbP zx_Tc}Rgn0%e_560WM{|JTUc8cz3_xO?%QjEXtU9uKP?w~GI)4+hLXT#Ds3lzyk#g{ z6OUPeQOL^5{(EOi@+!7=)*6UuWaQ-DP{F~JX}FE0#y;Dqq>5F$ZT>mjUeH^wHg0-p zGxk~M^CNY2v{Q{ip{J;%RPmdGiHS)}Y`nX>+oKcQRV7VANhUQlRdXW(He>A-t344q zeC$v9Hh{l4Ep&bV{#~cU+10gS?9^@y!%n=cbkzEHnOXbS0Q`rOzj9U5Am3f-eTj|F zDl7dps9&CTzX+*yqkNtH!e4 zjC+AliGx=rIF+!py;n-2r>AFEp`@mU2+ihTmv>nk>$~1W*>B?w{_B*~LYZVIim%@QRomT*zLc z|9G`=9wt@5j69elHe8nhF89xW4v&tOcZCYT3#W+h>Bgp}a*BXUjbQ(GpNwIY&*?6{ zj3hP+Cn#p#Lrpa4V}$=np850&A?$ei=ew+ihKy`LZQh%ZPfJ8Rj_(2b`tKsSoLrbJDCTEn zI7>PPW0O;U{tOTneH&W1Sc&I?3te#|4p{)jRaI%fxk(KT^mA^U4+(mkV31$k%6zFe zc@z*JBU56FzL`Nn=veW(o0gX23$x!69b0DW%Psl_KS$Az3B~`ZoH@yuccB2~VuFj& z=v}jmoz{(ymv#<3C4rcJwgwh+!3bP*G1(qrYuC-j@brTM=n(e?&ovLXJI^fXcARg;^v)M4yxMqDAW!h^o$sA_qj2}*DJ==qJ%}hhV&w_BOxrO}Qxh|@8Mg!Y<%b?h-z@TYGmuWQ(q~XW zt5_lwB7vL$^40ip6I{kVg?U`{O38LJwHTlOp_XaWP4x##-rD$A_5IzCgSsvvF6c{p z$*!^rmTavI$GoySX?c;F^sNB*;mwS`tX-Y>HFf)o!otB37m)~9$}C3tD>N9a9oF;m zm)a`WPL4F^ercw@ZNc={BDf^Di_}tBhw!uTE+A+bX zrf9sX1q^$ULB06bkxNSU8`YCFT$I8qR>YXg%_GtAkiNlD4X(7vmcN;?`c~vi*Thc6 zGPj*w?-C+a0mdWq$MSYt4u0Er{F5zrLk-5k5;k#lt;vEEvZISX%NCuH^h;2=k&=)& z05S&Mbg%TMPzy6wimuJjg_zIy1F?{T>jkL!ldX2HkjxR5el=_WVQ`etiNTI7W>OX>{v3$9)<(q94?L{6RG#cLe zG!iep{qk;`2-(B(rL!cABN|EW&C?euY)(_}N@X&=WYwend|2 A7A&2pM74z(BP% zZEwdOG{ijey}i&~_8dcfhWoUf>p@1O@d+KWiXPC9vM^E-P5RW>{A96=Tn zv5EZs`_w+F?rCELE3?48RW+NthwjBbfN|NLd@d2M$d=k z39Xc&5;ny^G%(>YZyAGmUN2#iXY1D$o%oDgcTLvB@2PlRNO!`16%#?VK`BjmmGtq2 z?(RotLQf>NsL9C{ihl_!B{vn|1`}c<#-#9+9QzXedgF*wO<`~Kf=Si$r@r|nq(wLv zkQevB!CT%fUfj#A8aZh-*|uv?l@Bg4kUNdWvgegTdM-l5i`w9;BuhN&Bnx7R=shXX@H~Uor6z zlsdSrtd$c^>?4Qwbd{tG-f2GS+D!6gAsC9f_0nWC3+4d(APES~RXmpr0iC%b^SQGz>uyM7WH&3ubW zkn&w`P8_VeS_t?vUm3bgZMQ{*wH*P_*9lt$GtU375%SE z-CRERzgl9?dyO9LvL9&<(YqdYlE|aXHXX=lI{o}a_zv~Pug3H3XF`R5+F&zMx;(v zu^UraLY4wK+Loe~XL3K@xc-n5NoP&RLrrjB3tt)D=umX;Q=DJAg&xpj@RuM)`Amj! z1GNl?U4^KWXjJR@WG+uRc!-W-j~<6je~$7z}G}B%#4n< zxY6>LtF!cIM~9BO3Q~e;7JlqMek2^s>pdq#=jP9*s3W3-_L>Y1j&)I8? zV0!DPbc=~8BtojW+Tq)9cJyopLoalas~7HLr!T+z?AzL}KKGVuTIeoZj-`nd1RYiy z#WbA7$VD<(T-TyR8Y9y2q%>8#Qg}`e{7=4W&(CqdNRbn)0@ULNQH;-T-BfwVQ)0wH zbgk*-y;oocC`VZJaB>RjVVR|xoi~a6q%_c3w*hYSxw(2XsZ?jz*kIo_^lPendxfx$4I_(Gw@ zy`lA)X?Av&Sk2b9guv*YT3FK15`%}y?hOQG+T?)EpOKgMV~EQ{Vuvq5>5Hwn%_(ex zYBe{E8D(LXxVIXEOW0Zh0}J$TsLHtVu70w}YJ#v3R^mE|3-S0MpfQh&wBNpcOF~I0 z1g+hhH*Z43+N=erFTcJQNa)Zd>bfTOe1IiISrB-$6&gjR{-I($n>bx$Zq?FfH$=?y z6}m;+xS@*OW-gF)zJ7jYx3@Y9e8waYY|uZ?cc&S>#a#m!n1{zY_0fHz`VTmZZqY?v+yDEkZJj3~D~Z z%>OUAq0j#U{#Evo&o)VBqPK2+|H77G-kF%6pFdRdy}22%WxyJBN`+yOJUm2500$f0 z`8)Dd3>CC6|8DQ^3o5|?Yu^oe^lUWzwvxp?T@JVAfa?O@YNsdT9>6Q?!+>{A{=Hf0 zy~G;wWRyFp6F_F2DtnV9z2PDqQ}-@bAyE_u;hkq^4mBk@_>Z&9b0qn|e6DHu)%>b) zT?d}xy-M2ebZIPlM^{&)YR8Fv*Ozt;K?<(S`>&|ML6B?r&8wptsnM$c-I%vf(k zI{i`r_vgM~@Td7v8 zab5JdA4TgKk01k5PMVFz+y{q;X6EL$W1l%#Sbj`SPI^2*D$0tU*~Zw%+JkfesyxN{Z;dD zc*ZEZU-N4@fJ8Js<9Sl*>gwyi>j2vZhJfekk2gN2M?ludJF|=xG$&-VRlBkN7_RvG z2EwbyGh2;x!#WQ@)1n!dfTsrT55U5T=lLfCUt$FwqJCU2*BdToehvQT<=Fyg!@pX9 z0U0MvK-{o_fO$+dmz(DE3%tC_VdgT9|DtMybhX#p+??fKF2v{{$r?RhAO#lJ*WVu+ z5(3mfTv}S%+qY`Lg{uRdUQ^5yrX<<%vbZq#w(RO^Oqto~X|-bAJ80{bBg(sx>h-AF zOL};k2aS!UM_HO_q@QeW%F<39nP*^7kJY+Cq=W$l1*&^|0IYODjDq10jGx6vbh9XmGrY$7OZo*2B2V zRQy3`Gn)CAg4_zF*q)+{GG^e8MUao7dok^Zp+lhF&2bIkw0fvv!?ei znM0WiSATu{M?5AuVWNr4o=n!*dWZrvi<&~_SkxScM7 zU!b;>4@I`mGh6H?&}RUZ^a7}69@7>wGBU*k-dptacb!?N!G-8EfgGO0pe?+9s`PyL zV;Lz}g?Fz$`42!=0q$PtN &1pov=&{q7doV-fY_PWEIkE9Mj!2M&X)VC#!<2`rm z%=}ehb>v`ms06GJ(#}tqB_$`ne>a2WkvuM)p`{F-d#m6!1hit>6RqR`ofA0{Vs^!v%H<6GwRr=4#A@jLdxE|7NlC~7gM$@j z?Qz$xU4u#c_y~PE`y10v5%i!Sl;JY;c4_kk2+85Wfwllpvdv5%_1Zp8=4=S;*faCM zt^}r6(_FZpnDk^3Ksircr`35~bAH3>=vyPH5EAQTv2%*^ ziyiHrG@apiQo=EOxj9qD^D}5J4EWMw4Zr5*=CjjdPft(Dqs1&hi647;d9_B+)YaBf znqJ23JEYtGNvf`m-+LPZhk|7eo?@!l;jaoSbUrON@2vMehGa)}^{NZlBFt-UZZ25a zf(^)!C`Lf}G#7s}MLX_&8u(Nle(xVMY}5BUJ>Itiidim_RtBgDx(e6}e*$SfEe@&|RioCG_I6qDEAQRFH}UZn{8X~J2=4oUtfH@2J^JL_RN;2@hx4E( z;54c~fkLcAzj_Od$@PWiLYQ#Ni1-2?%R-le%`Yt_TDJ$^0*Ol1ux11|P(C2>0?|m2 zGREEmuv73QD1^?|eb0|eeNWkhgbt>f{P`@p^y|H<7xe`)SlYzbO!!%~xK;wgi=u=! zJ|rh6gW84q4r)Lq1AOV*3E0H7_p@(j&>+w6sa)G_NusZF)0asg>wIIXmlU z*Mqw81G#_GhbQ0h;IkzV>A72K>(0;Sw>LMd_f;%*)j3n6m+uh6`dZ%-5%B;<1e`q6 zA7#+5PfjW9I6GeL6de^6wD@2ADY&t*(NmdhilY1B3pH$H;5K}+FIyfG!?VfXYx7u} z$=1+EyGz$E-jK>}V%<19UUyv``3Ob{)e+Q@d5?0tfUc4aEDP@F=(a55ZY3G&kn=F zF1LGwJY=*;hmYRz#S1h|1Z@Q^6&2N$D_fK2XTy)}1~ZPJlkfIK=V#VMEX2t;u4nve3=U0x~)}yHQoLIj{+kFZsfi&G*aRdP384 zTkT58%E~}-fe>Qs6t{~BmcZhDOQp*8#4Dksm2{F*pZBf?FMa?iiACRE$p&YUKgmvW z)4p+kM?NxuCNa04q?g*R*5uly8=0U!I69uBA`1==7k8Zf0o54fFe82alb+IioWw#* zX#dM>1ugp+Sy&b!8@iutwqoDEa<|$A4VAAgCo^NDOPiHYsFvvSmKf&yZdn?P5q`1{ z&a(y>Ax9+g3Q2bdw|Dtt!2_Ln*OkzO+?+%Kxpq(6q2clhAQO9438R!TBuVeIaVpT7dF0R63dd7aL0rpNxni z>GY63&lfQ)Q~-kb>7P1SVav=tnDVYP&8MgQz1X z_nS`&e{zM9r(oJbWyT_IqgozQ7_VcqN`u&2gKcor9d>?lDm?k)23aHXrQbL7Rp%_2 zRM!~POAOvV9|Wokq18`V!S48o+bL=5>fwNi?=532U@w%IBv1u{MUX=jfh23OHw$`D zS$q2pkcrKl%Q=5(Yo;t`FR3GK@JN`Zz(RfdlkB@c;aa(m!t(6&bZIlqO~-9K?HkW) zgd$Voa5frbO;^-FVGD&<9J`L=R3k=jHS6RAAy4zRqr38FjVyEW1win>QieuEaC(Qk zpBrvBooMntZn4j5O;Q{s0^Qd~&BGNH z_pi?LMoP|9_74)rq*Wm@q3Qnbke`4%$Ln~s8?&OtqXr1R_wJxpT-KkHa3|QYn1kp= zj16x7{eF9h?r3EfJNsoKB9P4`-Smt+P?jSnb1}lRSmJ9-48(V2ds<@tWURyjUruOtP zx?-t^cT|W;5{3zMBH(dTBX@1V!0n5^hhEWLdlJFYuQxF$>{G~As%zghxxz)=H zx>eNHc(oyFVU8**P5~0t&F;6^)oJ#|R*AieDGO%M_Q5W6M%X@&R zl6chB@7%<8H-F8u{3zcN9|(y*cm3L+)X*m65`wA{GK>5tlo)r)e9))Ju%1pcIgtvs=BkYGhiwY&)KJc z3WgWPEsHo0?S_$2Uj8KI)UV>E0~LPo*yH;fMT)lke_q`}Tz(jHD*~{<%-rfhfKEcI zqz09#ix{fd{DQ3MBw;)$%34QMsc!f12%E-D5l>PY8gbK>Fi@?2wsKt&GdXFwGegn- zqV9O9l+>&;)s6i0XUL%R-W<+VQ}c z>kEj|eE33zP>Kk}niZ?&CmJbO#L@;>jRYW9AnBI&$GIf085@&*A>R-SO8+UkaRRdbIfy2EQS&q^1eb-^hA1vuy3`)Y@bs*TR8*`3k-B@kXcMq<)=8#m*hz zYg!gdXGyp+ais?PJ;>iMF44&yJ`Mm0;TR!jb96ND_SIEE(4;-a@i&1UA2dKiRvoR8 ziS=VF4MK*%s2Owjumc=Wl>`vv9qYW$lAf-dks90<#ElZ#!}ySaU z(fK=fPRui3sbL_Z#(y#1PmDp!Ja?(z z;j${R@=8CB=501MHZHF9_4WX4G08|xe6sk9QvDEHqmq+P_RYGWqEb`7E=Poj0x{&H zu%$Gw75-EQ%4`l^%F7^&??VSBgU4k3^Sc0JxsQ|0|7GB(YUI!zl}~~DoxwrOlQ9LR8i*81Pdq)l`B@OXd{nDqa}mvld+!ADlzp}Q{(zLF z6Z3-?k{$wLEeix z-KGOT<~8|6Ut6{8`L)A?Hip(WwBpDrnG12A>QXhPf&wpo5hwR$lndAiz|o{6-R*Zu zblYA&|8ejBn^%(t#to|28WFinG;lc@pOC0jN~EGLHXr^+IZm{q)N@dI&iBAGL>zb4x6;M~snuY$xo2 z)uG=Qm(?&wP%rAF0Nw}=0%r5%Np*>H4Nk5cB0`XFmmxL>C_4>7EEA5#W3S6`jxmgfH4V&tsHxsfFy* zcL|xIEumu&xab*LQ{xGGN3*2doU-TdSP<1i@ba!S$@R50W$2K>{;X!DzvY;707LIa zoQLUJ;kmyCp*TAyXJS3;3MpwkhhB^D`NlV*{nb%`t*fEMY%d0lFDQr0rAHd(=I3=Q z-E~6-GAopf2&KwxcToq?Kx2wIXAfj2EXp867yEJ6S^4>$f4sRl6bjHC%#NDRyu+%r zE-orc{V4V0$B#pQL5K|6Y{fV;X69U&PfK&Nww*ee8A#CqBQJWnaTP=~hgyYY@mQ*L zX+B3kMV9Z&{6`ow?ZIly$iN%dgwp^36kF9*K?uaa!hss?Ih63B6kMF%-Prh7wJZO- z_>zp2l$4fsZDGNpZXS9t*K>et_SfwW-PL}Q1z4CH<6=me@laj{6!|l{Zj^j}WSa$b zW4_P5k4*^e6>S0oW)A{_JCOUQY26XObkh{~IR)1EQv)QjoFePAx73}94SMe&(M0J@sMVE$+CmU z6Bl7^f>Q>dj(l#wWh}7~eYijg(Lu+aptl!c#enH({Lc&tC|7M{o{oYV_8!PM1?_%! z2y2mo<4o5pwI^656%N=Kag%R&BBte5=j-FKA)ac2*v9{?2L%^6q&V`a(Mr-hbcE&zdmwmWE^4&7)*J9Kdok$n(!|`i zigz*pvtHeL3iT=tK_e3cx9|P^<=NTURaNgSviXc8lcR~JFa}DE&R0jvA=o|Ty*BJ4 zAAqfFn%g6(g^87SsQ^_lyRa}R(xQd~OSLg|a(bHopV6IB=W5Eu#@F07swr;wakjrD zOQVkMVRag~$jGU*IBwOkM|xZmM>L2urBZDF0%;ophOZ*F**w=C9~^{-uke_IfzHT% zma;Dk7j=|@mlv{o`68qzati}4)m&wo)OfwEQD%r>V%B6!&Jffzusg_A$>DHAJ5IME zvk@q4t16?JRp79c11vaD9ShaMEqOWWf4>}I+~Z!k`Uy)@N)t{-1_y!bS@1}L{&gIE zj!Y#*g#7yT4nDpxwKN5j&Ry>#7{L2!^~qyfZ9a&`IdP1>aa} zGv=0&k%9Aw#3cV`6kpUwo*3i${j%@6%}3e}*R^~xyurx$>c0eWCya~!kU^ptH;XR6 zhU8&(I1?#Zw1N#ldze+`jyLYIZY607K3Y4!`wxi@HkF$2b9sQ22Dg#6!gk^ajyUMmg>{-=7QO=?&@)A~B&c{cB1b}i7mrcbiBd(7MA9LI~%jWrYgNWw#9ZMz= zLX=w`=CVmXri{i(i!~gYVEGF+0`c^dH5+rpwMy$ZaLLXr?kcgMR@jaHmc9BIS@YmScnSz9ZA_b1kkqe%}xfCDbz;3WQ+ zIHixcTri?so}QVRSz80KWI|=+B0J(T4X342gdG0B(VSnEc6JbH+`E8KD}e>IF< zpi8Ecw^!M}CQBpq^veVJ{Xk2>VHpch1%W;XqD3Jsy9gO*obyn>ps;7BLu`2I&QliV z;_6@XJT5g9?_Z;tAMxLMWeE}!GuTO@E@6_*BKG-kRwU6>;zPWVh@Ea_;=&x9u$mjH zNKUGs%uE(y0^dHtl9|W)V48W+__W*)vO)GTFl`)RISe4!ag&ORr15nW~QwW^Q8$;doi(;hJ_-yBKs_ zyPyP`*(H)X#iXI_9e!3;eyG6sc%5xTmuc5IM5s{T09V(XP9`;f;1@@E`85F5lN4tM zDfNem3L(`$v#lnShqo{FRwLIh-N)9*gcE`?jP1Plv86=W7br%)yeO=x6y*A$#mnbx zBa)7bjB|zI<;ke4Um>Z3j$d04o9d(0FlW1mpNkR|S`!3C-MZkLodZ#Vsru>2@PgX2 z2gKX=$q}WXpdcYoD)cAbY?%wq#tGj&#U(M#yoVvgxOzi17(}{V!rfgh`WQVIDJbIK zHw}ifU44iKc4@M&D_UX+@EL#gc4Vz)*QMz27{b@cnR`93E4pf&3g-mR}7 zI#lKHZz86pHPqJrL25^-#Xj_6CErs_-I)am3}j8e0@2olLpQ3NPgpp#3)7esAWi^n z9OYH++~*kFT`u-y2YL{>)A&g`_6H!^KYkdec83tcg@7pdo7G8;Nu5JaxchGqpuv;6 z1;PELld?=l`$K3Qk`{sUQB+iP(z2LYW^wPa&)0d_8;lGbh)6S^?LXzDuxAu z!nn9hAZ8C9#O6k6>_%xgmgw-OIam}z*9#uQpB-r4t`i~q2E2b6CQzII*cx{o~drIlo@)V!fVnqePx$1Q%W~z3hbDc=MC(gvUaQoi5F(W`Q0NqySoD z4JlcDhXE6NWY?=MJjv&+?&qQXHD-{+5u0d8(J;#Qt?VAWz~1Y4#(#xGMP9(?v&`^k z2H4G0=rplrMh|LDuEdQiVWP~Ovrc8e!Ym43sJs+_r6oUWy=gG%_hslWs8ms7Cb)jz zLW6?d)Hs*&yg(nqF}sM5KUV+5y-+gp2UZ}g^$2qqo=`2|on7uyQYiEl&(?|rQ$?7F z+?7Gj33G`d&}^JeP-LPH(W_H{LlX@No#rXZx&Iqf=Fu&feBexvRI#nzuy;##qJOdm z2bA}|8gq*QfIC0aK#fkXb+2d<;{{l2Oig4JT)t879!}zC8|bRv&=zxvkRan&F2q7& zKzW{Y>9aFk@Z5m&{!rPxIDUC1F*-Vs&|E-?kj=B`n!aJ-%@DTgQw>0SMRdHea1>k!$l9R7*S2O{& zc?5?}RT709R`N_}zKFf2<0g}W)fcU@?72@0f?U>X1t?Y_)7umy#NY$>y$h@+<@ep}K*^fE z1)FF+3Zg>yo-6|fB`#ahj4oih%yT!CeN5fTxR%474(*t}1i zHW(iIgp%Ce9{Uh__RqusQCfa|RqTJ{a$Qhu_f!GG z<$v)WT{f~K#(H^}ge4zP)z!g-7|*kkh3}Mc>!nKQ{cG_fp!zrMcm3N$`3OgnS>$3~ z;1$>LDq&sPe~tYrk_W>^>_eN3ge9(x4ZDzx^K~Ro9X&=KrgkAcF|ndoMugThXNn7z6d%%! z(aTc+?rX~CasD?mbOBbN)%;hvsX}LC*S4e-5z@ni-Z?{6)C^vu|IGN#w@T0=%sM4Wvd~^meqvOqK|;3ZSP%$p}uM&#KfJSUt2qBy5cBJ zjyk?t=W`nNGn#ID|1GoPJ$M2fvcP?;uiqiuYI$keN48W?&~mk1ueHACaN@ibasq5p z6IeWd%hQm_PbOo{A0s=@i5JQ+k+1p~fi1!mG#J;zKQ>pH53Z<)aYoWURPM^`M^FY* zaGED9>dDMmbjyl_s~>5ECz6Jaw(=eZa(UrW@$VTcjI%++XrhMf^4q zwX8@AdROJRwHj}3c3kd%zpGvzryfq#Qc?Kx8ClB3)n7-0MqTd&ip`?A-4C|GPwhdz z-};S@PjRwnkjOnENPCy+ON2q#N)OId$&l~i+^l?by|0tu!tf;1CEr<$DVGD!rY3Dq zWP7*#y3vE@Jr`||wbvGAv}cZk`*wA|mnKV1CT=4!mz@5Q$o@BAspQGG0#}JQLA0y+ zZBI{*@ZC3@;M7#mti@~I7BbnlRQ!MPf4;91-K{$o-{A8<+6Z$t9mu8YO!7bHLDH{- zbaf0)dIH=6a1xrT0%;6@Okx{YbO-rujFNlXm}^iSDYkhpe@OIBx1Mmjdl}yCclkg!C_um(54Z8Yxj0uKc?9ufI0_hBL=- zi(8D0&1D84!5J7B$axq~NXcys=mA>R3+LvSM7gv-q$lJ4b`Rg}0!;%PMg}pX=kC$* z$Rnphf}+!?AWG9k4Ev2(Dkd4Ab=P9-Zv1|Z&()*I3NBNjntR#gUc^qZJ{H{D8l_o20CT&b@ z{*&DM_1d(VxhvhE-zS2YVbE*8IZn#~p3)2EDgS>Vw8iyJNPKED=egEPSZ6cOJAcz;;nZqhZrxfJ!6>tWYv(ggI3 zZfr|3me-vN~15% zx0#u7Z;}xctAdD2Uq6hPo&wFF;TDu+MEqG?WFfwI0n^V``U>qMV_Jj-PyX9tFp;E~ z1Li!)#flpZFw6ldo0ymYY4pVm+0d(SxETirhgQTnFFU*W+cyRd4kdR}>YP#=HJTt| zbptGv&+TQq@T>D<_3w-swgg?+5rhxx5r(-KEf);y=1o6c5J#6mU(*r}GEyNN`d1pm zNV;6B|u38Ak`y)sS??~+^q!H?Z43xb#vt$~OOK^_yl$3)&Gpuc*l zwsw3(4MEs(6|oU+=EK870Pp(uk_teOg;lGCAmt7KbHdJp5FkV*^Y?E<(?BeA(-QRY z9>Ro&z6}B7%ccI@H1JTs5n3X!-=SYpi(W9!G-gFmqbQJ9Hxf_Pfhr3@X)738!egFD>{~11mnfX4?bKlo}-`91) zgjPO;r{Vq^rs%_JkxQq|%*@Qq6F(f3rzh^z;oHa>5)u-(*?+awy=-mmoT{oSX~TcK zAek50_ypw6zUYtrFucKNYgM`T6|=1Bg+*ebIyzmM^@FyIL%$xl8^ix46lr_;`>WZ{Tn2$Gw4f%W$9N#}Q2N zWu`1Sh?km2;Rg^N5h19-r8T#(;9Tx`r8MtFeN+@-N21r1WR%qT4Ir!GUd8wJU+{*#aX(?7g5nO8LL~u@cZWq{k2^Rd3aP&u9GrafW@e)3UVM|AsloMg&bJp9 zz(}vkRu3|0oHo_G2M>-{udKFj-yUmWZ*TAB_8;*)6HO`kVR?D6{QP{xv>gHhNv-bq zLYuNy^Nb~UI4#<-ChTiPuQLGm3tt`*9~$?ZJ2c^`rRV7Q$BFaZEkN0z5IZ^DBIZ_y zeRcEnyc5S_sxD;}5wViC_ozHQI5_xT&1`&Jo{7#rYN?6%U@7UMU2pE?@%i5RHCxdn zZ;iIUQRA%et~CN@<(SWjYipnL z_P*o@#um(GGD1EN9dmM`Sx8PyPWn(nrPn?34p;JZmM%gQq~r@#`&t zaYpKqe7?=dJBpUf#w__Hyo z2k%(L`ww4b6&1J%J-w;Qh)?3;bj4)RTj(}}Y}3}>jtx{6RRcE%Mg#o)sqnI>gwtov zD9Ov8My5lz0R^W9n0jn`*yuY=*i0BxBrmT&6B9X!M$%~!VPSBffM1h|B##>v{%0Fv zEo^Oh=j)Xe6}O6{UcX*&fQw|}K>8!qUQJ#7Q~EaI-TeFuk>;Hnc1F4uFCB*cls1+G zl!rs2zm=ul=3#F_mp&yWWqN7~A|Fc|8+UkOV6o<{Er5_7-+_aSC;3K3SQWaS$bU?aHZU zT>K)3qxI{5?Fw7Qis;Q0-GC|nM)sE?vAza@W?mXQ$|f; zqYDi2%FF(fVaAjw;9248=;&y8>PSmTeVv&xGB&mz&RkvM8q|%wHX+!VbnRMBkTa&o zPoF)b^PfW8`lHdV2aT)V-i&M4bnDKXJ{<~FAm0re^c<^A4gv4Zx>MaDOrsigDRuLX{hAGNdPF;t; znhNGxk6@~Jo?-q$W>S=#c96-b-N(%(xLyrOzx1rzQ9V3 zQb0fe2-Vq7xYuYIw3#SF6E& z37L>#R@m6sxG@);anabNNbQFmP;kKFh1t-s8Ef$A#kCGl)jK+_IPMS@eqBmxM)Lw3 zFNil34jgC;-1yM3jWIC@d^IrXv!IbZIy!Li~u< zy;XsYblTct{W^o$8WR&U5;nSJ)@6O6s$So~VE9q!y|S{|ey?m(bMtYvzaM?6+sng_ zWZyqDv2amDl(XT5jE8Zt!V`HaA>RprrV=Zu*ns#7D zs~Rvch5_~tZ-_2x72~hQ6yMePK!j}MSmdbf3pp~D~ zASA>UivVh6*Go7K|A#k_9yAFml72M$io5%jb{ zH}vR5>>$ZK)JPA!g7r8DoJe<0+(Dyy4Sa^|h=WJLF z?#LHd*05iA2Lz1M^FSW+*W)%ew{NHsFCC|hKNBX`*4I-o<9S#{qk-&kakn13L)egY zH2A^ElSM^E;hMuOEgS8wgS_2nCpPewfA3SfQlzoi7nrB@ky#0@)VEAb_uZ`uct}&@ zkv z5qJsqkTUl7qat8#7)gHI(J>8e$~c_&fGtZ&Y5-qCU9faS=gx>e}N% zDCWaW7rTjFuE#Y(S=U-Fd-$-wy*;6_Pnh>0z4Q zq70R#sj2DMp|_y1uCMggt8riiWqtIhVQtOXMLFJAEiFbTPMpA}gZL7g6XXw{i&;uO zR$g8bB%8KcZ-!h5n`VrR$nNV~D8BPKX>;P9jP}+GckYP4pGRUIdji>z7m2hVtgUXX z{q(%ImtBkGNlnNPFU+}te79$^6O2E+d4t}}t>k1f=HhK_Z941A&jE|N>XYkb<6xy{ zXt)93R6Ek>T-P+->T%%<&&L-R7gO4?D;a!wZ|}Rs#j8KQP$&ouR}bzH6RTZYnS_he z8c6W4;2MdTlqE~B>R~P^1Z&g0yu7Na-r?b_h)y97VDl~>L)y~P5|v7YwhDXH5A#wa z*4&f)*EodKa&9O)gb{POM9yGvUs6(Xs{Tg^1g&j($tfxL+(m_jFb3@gro{2yGWu5g zw=VZfrBD2Mv3IhSe6}t#aT5r8^EA_e_4!9smX^MbZgYvWl;nXC=AHcfEu5SrDn4M$ z`SU`;!mR-uJ2WME*lTNR8DbY8K`*cImoF`!t~oOe93k(}mD35I-2>0Y?(SeD4dgj6 zw|A;@D5$7ZA{4r~xM*kBM=sAMCvWxDLCu1&4ZsQlPJY&py&wUN)P$G&zH57HIq9Kz z%)o&D?NjHiTelE|zl_wI4`wP@U!8%^q!v~@T9->ua0Ttv-T8~`k?`_^a0f>fOFI4O zlcn~xfiV7}LmJ2Yc|D8mPoDe?Pdb~T4Fn4V*QK>Bgr^oxPOmYJ0WP*3F>saHdf6Rf z4e|NiVoFL%5C(&fLg!#5r2N9UksxpERvHGy#F)!ORMH_)AAf&G2JUBJYUpBQ(V#S3 zDJi5W$+hN}FTaM?f4^0lx0F5g^ZIi+&WBLUs=15MK&_~(gnyOsxSU=(t)e0r%SuPT zXg}fKjC|}R3-fz=8Ke`~(OnWZ1quT0#s^Q|I+Ac?POg+btMu9@I4@)1sziXXyTKMp z^V_MLO>71gu`1u9&*=W(S9tN9`*ldW)`X9ozPAo7)J}<4S7$yw0CF5DDFA%9X1?jO z4>;KUr~jGFYPtd4g5z=ZdkuS#jr3!M>OPS#9iRmHINh1)0&51{<1 zQ~L(#A6_l-+DlYxH*@!IUAeH$Sw3VJK_q{nlg{xs*}m6CS76!4zpPP;w9}#Dii=OJ zb$3Xb$Dpog66=NybIXySL!z)Hi;;|s(`7_7s@mR@f4XJLlSgff>;hi@l@_9Qe%BFW z<0dzS<;@3OI)bG9fA{R>v%WZBg~AE@xF7>$lF0E}p=xD$yn6FIr&;O06V;FW%}*6j zUhN*6D(dMe-X~8xPAnHYyS5r08X7t~n6p<}I+l3C!Qp0{aJo;EJM}s(vk*uNBa&7R zYANK%H0yG^-d`6bueMo#J10f_?(<`R+qUfjY%2v-{@C)s7GYu4_A=s+G76_j37LZR z(x-ANi)03W*_i9{W8$c?vNEbx^tl3qf_7JV{py2LH`duUFmOCtw_$t^Qebz*>u6vB zVc5>`CNyC%I_ICy}J_WASYv7<~XN=h?fnu@OUDQ|sOO*a4N z00LMn^N@wxS^Lvp?PKrbsV7tQtVh{p+s? zOtc_K<{yoZX9vj&HFrgY?IQ}^awx4n^h;Ls&+XyTqs*JrH!y&bT2)2Gtz)H6^bY-A z+xEND((RQ@qgnmL!h83s%FDMygpa}xymt`xL!e~^3Vc{y-Qup;9f`DlxVFo9&e7wa zwHh3dM$9G$20lFVX)9fA_wJaL`G!nk+D7W1QL^$C5~+EIsE;!(8(mDFX;Mn=~7?h#_aLVYjIsl2K3Fvmg?%BSEDPX(xfWU?YJbzp$}B|9*6 zpdjkMpTgC@!%Rh8SWr;Z1t+)@7^=vzbIX=3V~W!kl`FCVeeT|sM9e|ujX82Ri^9o< zYOl&`C`I5Niyep1GB-B|*f1P1NrR0Y#PjkW&H|}Thy|ZY8GHARShD^uVIMOK3+2b8 z3+xE3#4uEFGd10!oE}*&7qHI3!O^u(nihXqLHzrYkF$dZO5e7f>q~|Y9nH@5?g$Ne zAbK~8`D#P8xuoG`{+JVkS+WGO);!yH_lsH+<_7Nz2&0!9WW3Tt)M&)~(%YL&rYXal zxW&7AdJ0YXNG1z5#YIJV!bxX$(K4wD<-FYc=aY?4@m{@}-s(=woqz0sR#pyGmA%-7v9m>vtSjA2;@1_8rP~T6Urt}2eWZA2S;7dxS78G1t{Nu$u28@ zTriM36C8Ykij0fXhnjIB-{EI`aF{bw zBUH|oyK>4~!|Q(zbzH#NNJIws$-%4#Ycys2>YzJ-A16e8y2qYu^(cD}S1dP;F zp4s=%_uk!^G_*WX6fSpx_FTqcj2aN2Tr6v9VDO6`7r+mt%hPZ#^Qe^TX6pA?a_S`o z{{6m7MXmiuX|!W5uE#54J&hM&qX|aE7}?bH3W6Yrt4dS%i(74?XqlNl(oqWMAlBw; zmpwx(5%8_@&+D=q=E@L#klnLy>D>u}Nzx{j)e2AXzOBb;=;NiOr>AFRY}eq5iCXAf zVf)#&Q+`?`_6>Zng9jUdxKomycbBK4rai^@9|6f!;RHS1?>@CL1q8yKmM+0HW^2Dq z9Y9C0wU + + + + + + + + + + + + + + + + + + Looper: tutorial summary + +
+ + + +
+
+

Looper tutorial summary

+ Stats summary file +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
sample_nameorganismprotocolread_typeread1read2File_mbRead_typeGenomeRaw_readsFastq_readsReads_with_adapterPct_adapter_contaminationReads_too_shortDuplicate_readsTrimmed_readsTrim_loss_rateAligned_reads_human_rDNAAlignment_rate_human_rDNAAligned_reads_rCRSdAlignment_rate_rCRSdMapped_readsQC_filtered_readsAligned_readsAlignment_rateTotal_efficiencyRead_depthMitochondrial_readsNRFPBC1PBC2Unmapped_readsTSS_Plus_ScoreTSS_Minus_ScorePause indexPlus FRiPMinus FRiPmRNA contaminationTimeSuccess
+ tutorial + + human + + PROSEQ + + paired + + /scratch/jps3dp/DATA/proseq/tutorial_r1.fq.gz + + /scratch/jps3dp/DATA/proseq/tutorial_r2.fq.gz + + 50.42 + + paired + + hg38 + + 2000000 + + 2000000 + + 598996.0 + + 0.44 + + 522549.0 + + 3022.0 + + 461368 + + 76.93 + + 68452.0 + + 14.84 + + 12998.0 + + 2.82 + + 711524 + + 384789 + + 326735.0 + + 70.82 + + 16.34 + + 1.35 + + 249 + + 1.0 + + 164998.5 + + 164998.5 + + 44906 + + 56.2 + + 17.9 + + 108.18 + + 0.37 + + 0.36 + + 0.63 + + 0:14:01 + + 07-31-20:57:16 +
+
+ +
+ +
+ +
+
+ +
+
+

Plot a column

+
+
+
    +
+
+
+
+
+
+ +
+
+
+
+ +
+

Looper project objects

+ + +
Figures
+ + + + +
+
+ +
+
+
+Generated with looper v0.12.5-dev +© 2018 Sheffield Computational Biology Lab + + + + + + + + + + + + + + + + +
+ \ No newline at end of file From 4c86a58e8775b57c95c5bd283d8b5f19c1e48c19 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Wed, 31 Jul 2019 21:41:14 -0400 Subject: [PATCH 044/207] change file name to match current --- docs/browse_output.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/browse_output.md b/docs/browse_output.md index e1cb7d1..167356d 100644 --- a/docs/browse_output.md +++ b/docs/browse_output.md @@ -77,7 +77,7 @@ This is an interactive display of exactly what results you'll get as output from * :fa-file-code-o: tutorial.yaml * :fa-file-text-o: peppro.py_tutorial.log * ??? danger ":fa-folder-open-o: summary/" - * :fa-file-pdf-o: [tutorial_library_complexity.pdf](../files/examples/tutorial/summary/tutorial_library_complexity.pdf) - * :fa-file-image-o: [tutorial_library_complexity.png](../files/examples/tutorial/summary/tutorial_library_complexity.png) + * :fa-file-pdf-o: [tutorial_libComplexity.pdf](../files/examples/tutorial/summary/tutorial_libComplexity.pdf) + * :fa-file-image-o: [tutorial_liComplexity.png](../files/examples/tutorial/summary/tutorial_libComplexity.png) * :fa-file-text-o: [tutorial_stats_summary.tsv](../files/examples/tutorial/tutorial_stats_summary.tsv) * :fa-file-code-o: [tutorial_summary.html](../files/examples/tutorial/tutorial_summary.html) From 33e8f320bb23cf5528f9a8afa530167ebe40e665 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Thu, 1 Aug 2019 09:53:12 -0400 Subject: [PATCH 045/207] keep all gene pause index as BED file and adjust plotting to match --- PEPPROr/R/PEPPROr.R | 2 +- pipelines/peppro.py | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/PEPPROr/R/PEPPROr.R b/PEPPROr/R/PEPPROr.R index 4e6d4ba..cc986f8 100644 --- a/PEPPROr/R/PEPPROr.R +++ b/PEPPROr/R/PEPPROr.R @@ -1135,7 +1135,7 @@ plotPI <- function(pi, name='pause indicies') { stop(paste0("FileExistsError: ", pi, " could not be found.")) quit(save = "no", status = 1, runLast = FALSE) } - colnames(PI) <- c("pi") + colnames(PI) <- c("chr", "start", "end", "name", "pi", "strand") q <- ggplot(data = PI, aes(x="", y=pi)) + stat_boxplot(geom ='errorbar', width = 0.25) + diff --git a/pipelines/peppro.py b/pipelines/peppro.py index fd527ff..ca7b251 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -2361,17 +2361,17 @@ def count_unmapped_reads(): # Determine pause index pause_index = os.path.join(QC_folder, args.sample_name + - "_pause_index.txt") - cmd = ("join -j4 -o 1.1 1.2 1.3 1.4 1.6 1.7 2.2 2.3 2.7 " + + "_pause_index.bed") + cmd = ("join --nocheck-order -j4 -o 1.1 1.2 1.3 1.4 1.6 1.7 2.2 2.3 2.7 " + TSS_density + " " + body_density + - " | awk '{print ($6/($3-$2))/($9/($8-$7))}' > " + + " | awk -v OFS='\t' '{print $1, $2, $3, $4, ($6/($3-$2))" + + "/($9/($8-$7)), $5}' | env LC_COLLATE=C sort -k1,1 -k2,2n > " + pause_index) pm.run(cmd, pause_index, nofail=True) - pm.clean_add(pause_index) - # Number of reads / window length - cmd = ("sort -n " + pause_index + - " | awk ' { a[i++]=$1; } END " + + # Median pause index + cmd = ("sort -k5,5n " + pause_index + + " | awk ' { a[i++]=$5; } END " + "{ x=int((i+1)/2); if (x < (i+1)/2) " + "print (a[x-1]+a[x])/2; else print a[x-1]; }'") val = pm.checkprint(cmd) From a0a26670c8f526ea3727df7320feb547af384e24 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Thu, 1 Aug 2019 11:55:29 -0400 Subject: [PATCH 046/207] save mRNA contamination output as BED file; adjust plotting to match --- PEPPROr/R/PEPPROr.R | 14 +++++----- pipelines/peppro.py | 65 ++++++++++++++++++++++++++++----------------- tools/PEPPRO.R | 28 +++++++++---------- 3 files changed, 62 insertions(+), 45 deletions(-) diff --git a/PEPPROr/R/PEPPROr.R b/PEPPROr/R/PEPPROr.R index cc986f8..bb3121b 100644 --- a/PEPPROr/R/PEPPROr.R +++ b/PEPPROr/R/PEPPROr.R @@ -1047,13 +1047,13 @@ mRNAcontamination <- function(rpkm, stop(paste0("FileExistsError: ", rpkm, " could not be found.")) quit(save = "no", status = 1, runLast = FALSE) } - colnames(RPKM) <- c("gene","intron","exon") + colnames(RPKM) <- c("chr", "start", "end", "gene","ratio","strand") - finite_rpkm <- RPKM[is.finite(RPKM$exon/RPKM$intron),] + finite_rpkm <- RPKM[is.finite(RPKM$ratio),] if (raw) { q <- ggplot(data = finite_rpkm, - aes(x="", y=(exon/intron))) + + aes(x="", y=(ratio))) + stat_boxplot(geom ='errorbar', width = 0.25) + geom_boxplot(width = 0.25, outlier.color='red', @@ -1062,7 +1062,7 @@ mRNAcontamination <- function(rpkm, shape = 1, size = 2) + labs(x=name, y=expression((over(exon[RPKM], intron[RPKM]))~X~Gene)) + - ylim(c(0, ceiling(summary(finite_rpkm$exon/finite_rpkm$intron)[5]))) + + ylim(c(0, ceiling(summary(finite_rpkm$ratio)[5]))) + theme_classic(base_size=14) + theme(axis.line = element_line(size = 0.5)) + theme(panel.grid.major = element_blank(), @@ -1072,7 +1072,7 @@ mRNAcontamination <- function(rpkm, fill=NA, size=0.5)) } else { q <- ggplot(data = finite_rpkm, - aes(x="", y=log10(exon/intron))) + + aes(x="", y=log10(ratio))) + stat_boxplot(geom ='errorbar', width = 0.25) + geom_boxplot(width = 0.25, outlier.color='red', @@ -1097,9 +1097,9 @@ mRNAcontamination <- function(rpkm, } label1 <- c(paste("'median'[log[10]]", ":~", - round(median(log10((finite_rpkm$exon/finite_rpkm$intron))), 2)), + round(median(log10((finite_rpkm$ratio))), 2)), paste("'median'[raw]", ":", - round(median(finite_rpkm$exon/finite_rpkm$intron), 2))) + round(median(finite_rpkm$ratio), 2))) max_y <- layer_scales(q)$y$range$range[2] diff --git a/pipelines/peppro.py b/pipelines/peppro.py index ca7b251..19ccf3b 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -2651,47 +2651,64 @@ def count_unmapped_reads(): scaling_factor = float(ar/1000000) exons_rpkm = os.path.join(QC_folder, args.sample_name + - "_exons_rpkm.tsv") + "_exons_rpkm.bed") introns_rpkm = os.path.join(QC_folder, args.sample_name + - "_introns_rpkm.tsv") + "_introns_rpkm.bed") # determine exonic RPKM for individual genes if os.path.exists(exons_cov): - cmd = ("awk -v OFS='\t' '{readCount[$4] += $7; " + - "exonCount[$4] += 1; geneSizeKB[$4] += " + - "(sqrt(($3-$2+0.00000001)^2)/1000); " + - "gene[$4] = $4} END { for (a in readCount) " + - "{ print gene[a], (readCount[a]/" + - str(scaling_factor) + ")/geneSizeKB[a]}}' " + exons_cov + - " | awk '$2>0' | sort -k1 > " + exons_rpkm) + cmd = ("awk -v OFS='\t' '{chrom[$4] = $1; " + + "if($4!=prev4) {chromStart[$4] = $2} " + + "strand[$4] = $6; " + + "readCount[$4] += $7; " + + "exonCount[$4] += 1; " + + "geneSizeKB[$4] += (sqrt(($3-$2+0.00000001)^2)/1000); " + + "gene[$4] = $4; " + + "chromEnd[$4]=$3; " + + "prev4=$4} END " + + "{ for (a in readCount) " + + "{ print chrom[a], chromStart[a], chromEnd[a], gene[a], " + + "(readCount[a]/" + str(scaling_factor) + + ")/geneSizeKB[a], strand[a]}}' " + + exons_cov + " | awk '$5>0' | sort -k4 > " + + exons_rpkm) pm.run(cmd, exons_rpkm, nofail=True) pm.clean_add(exons_rpkm) # determine intronic RPKM for individual genes if os.path.exists(introns_cov): - cmd = ("awk -v OFS='\t' '{readCount[$4] += $7; " + - "exonCount[$4] += 1; geneSizeKB[$4] += " + - "(sqrt(($3-$2+0.00000001)^2)/1000); " + - "gene[$4] = $4} END { for (a in readCount) " + - "{ print gene[a], (readCount[a]/" + - str(scaling_factor) + ")/geneSizeKB[a]}}' " + introns_cov + - " | awk '$2>0' | sort -k1 > " + introns_rpkm) + cmd = ("awk -v OFS='\t' '{chrom[$4] = $1; " + + "if($4!=prev4) {chromStart[$4] = $2} " + + "strand[$4] = $6; " + + "readCount[$4] += $7; " + + "exonCount[$4] += 1; " + + "geneSizeKB[$4] += (sqrt(($3-$2+0.00000001)^2)/1000); " + + "gene[$4] = $4; " + + "chromEnd[$4]=$3; " + + "prev4=$4} END " + + "{ for (a in readCount) " + + "{ print chrom[a], chromStart[a], chromEnd[a], gene[a], " + + "(readCount[a]/" + str(scaling_factor) + + ")/geneSizeKB[a], strand[a]}}' " + + introns_cov + " | awk '$5>0' | sort -k4 > " + + introns_rpkm) pm.run(cmd, introns_rpkm, nofail=True) pm.clean_add(introns_rpkm) - # join intron, exon RPKM on gene name + # join intron, exon RPKM on gene name and calculate ratio intron_exon = os.path.join(QC_folder, args.sample_name + - "_intron_exon.tsv") + "_exon_intron_ratios.bed") if os.path.exists(exons_rpkm) and os.path.exists(introns_rpkm): - cmd = ("join -a1 -a2 -j1 -e0 -o 0 1.2 2.2 " + - introns_rpkm + " " + exons_rpkm + " > " + intron_exon) + cmd = ("join --nocheck-order -a1 -a2 -j4 " + + introns_rpkm + " " + exons_rpkm + " | " + + "awk 'NF==11 {print $7, $8, $9, $1, ($10/$5), $11}'" + + " | sort -k1,1 -k2,2n > " + intron_exon) pm.run(cmd, intron_exon, nofail=True) - pm.clean_add(intron_exon) - # compare intron to exon RPKM and report result + # report median ratio if os.path.exists(intron_exon): - cmd = ("awk '$2>0' " + intron_exon + - " | awk '{print $3/$2}' | sort -n | awk ' { a[i++]=$1; }" + + cmd = ("awk '{print $5}' " + intron_exon + + " | sort -n | awk ' { a[i++]=$1; }" + " END { x=int((i+1)/2);" + " if (x < (i+1)/2) print (a[x-1]+a[x])/2;" + " else print a[x-1]; }'") diff --git a/tools/PEPPRO.R b/tools/PEPPRO.R index ef996c7..447f3da 100755 --- a/tools/PEPPRO.R +++ b/tools/PEPPRO.R @@ -168,11 +168,11 @@ if (is.na(subcmd) || grepl("/R", subcmd)) { # now save the plot pdf(file = paste0(tools::file_path_sans_ext(output_name), ".pdf"), width= 10, height = 7, useDingbats=F) - print(p) + suppressWarnings(print(p)) invisible(dev.off()) png(filename = paste0(tools::file_path_sans_ext(output_name), ".png"), width = 686, height = 480) - print(p) + suppressWarnings(print(p)) invisible(dev.off()) if (exists("p")) { @@ -222,11 +222,11 @@ if (is.na(subcmd) || grepl("/R", subcmd)) { pdf(file = paste0(tools::file_path_sans_ext(output_name), ".pdf"), width= 7, height = 7, useDingbats=F) - print(p) + suppressWarnings(print(p)) invisible(dev.off()) png(filename = paste0(tools::file_path_sans_ext(output_name), ".png"), width = 480, height = 480) - print(p) + suppressWarnings(print(p)) invisible(dev.off()) if (exists("p")) { @@ -283,12 +283,12 @@ if (is.na(subcmd) || grepl("/R", subcmd)) { png(filename = paste0(sample_name, "_TSSenrichment.png"), width = 480, height = 480) - print(p) + suppressWarnings(print(p)) invisible(dev.off()) pdf(file = paste0(sample_name, "_TSSenrichment.pdf"), width= 7, height = 7, useDingbats=F) - print(p) + suppressWarnings(print(p)) invisible(dev.off()) if (exists("p")) { @@ -335,13 +335,13 @@ if (is.na(subcmd) || grepl("/R", subcmd)) { # Save plot to pdf file pdf(file=fragL_name, width= 7, height = 7, useDingbats=F) - print(p) + suppressWarnings(print(p)) invisible(dev.off()) # Save plot to png file outfile_png <- gsub('pdf', 'png', fragL_name) png(filename=outfile_png, width = 480, height = 480) - print(p) + suppressWarnings(print(p)) invisible(dev.off()) if (exists("p")) { @@ -383,13 +383,13 @@ if (is.na(subcmd) || grepl("/R", subcmd)) { # Save plot to pdf file pdf(file=paste0(sample_name, "_mRNA_contamination.pdf"), width= 7, height = 7, useDingbats=F) - print(p) + suppressWarnings(suppressWarnings(print(p))) invisible(dev.off()) # Save plot to png file png(filename = paste0(sample_name, "_mRNA_contamination.png"), width = 480, height = 480) - print(p) + suppressWarnings(suppressWarnings(print(p))) invisible(dev.off()) if (exists("p")) { @@ -428,13 +428,13 @@ if (is.na(subcmd) || grepl("/R", subcmd)) { # Save plot to pdf file pdf(file=paste0(sample_name, "_pause_index.pdf"), width= 7, height = 7, useDingbats=F) - print(p) + suppressWarnings(print(p)) invisible(dev.off()) # Save plot to png file png(filename = paste0(sample_name, "_pause_index.png"), width = 480, height = 480) - print(p) + suppressWarnings(print(p)) invisible(dev.off()) if (exists("p")) { @@ -476,14 +476,14 @@ if (is.na(subcmd) || grepl("/R", subcmd)) { # Save plot to pdf file pdf(file=paste0(sample_name, "_adapter_insertion_distribution.pdf"), width= 7, height = 7, useDingbats=F) - print(p) + suppressWarnings(print(p)) invisible(dev.off()) # Save plot to png file png(filename = paste0(sample_name, "_adapter_insertion_distribution.png"), width = 480, height = 480) - print(p) + suppressWarnings(print(p)) invisible(dev.off()) if (exists("p")) { From 29445308c63c003a640fd48c3964d015863127e8 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Thu, 1 Aug 2019 11:57:47 -0400 Subject: [PATCH 047/207] output BED file as tab separated --- pipelines/peppro.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 19ccf3b..c299300 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -2701,7 +2701,8 @@ def count_unmapped_reads(): if os.path.exists(exons_rpkm) and os.path.exists(introns_rpkm): cmd = ("join --nocheck-order -a1 -a2 -j4 " + introns_rpkm + " " + exons_rpkm + " | " + - "awk 'NF==11 {print $7, $8, $9, $1, ($10/$5), $11}'" + + "awk -v OFS='\t' " + + "'NF==11 {print $7, $8, $9, $1, ($10/$5), $11}'" + " | sort -k1,1 -k2,2n > " + intron_exon) pm.run(cmd, intron_exon, nofail=True) From 1dcfcfe5163ca831a395c4691c44ea5a57b41fb3 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Thu, 1 Aug 2019 13:23:47 -0400 Subject: [PATCH 048/207] update naming for mRNA plotting to match new BED file format --- tools/PEPPRO.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/PEPPRO.R b/tools/PEPPRO.R index 447f3da..4f9875b 100755 --- a/tools/PEPPRO.R +++ b/tools/PEPPRO.R @@ -376,7 +376,7 @@ if (is.na(subcmd) || grepl("/R", subcmd)) { raw <- opt_get(name = c("raw", "w"), required=FALSE, default=FALSE, description="Plot raw ratios (Default = FALSE).") - sample_name <- sampleName(rpkm) + sample_name <- sampleName(rpkm, 3) name <- basename(sample_name) suppressWarnings(p <- mRNAcontamination(rpkm=rpkm, name=name, raw=raw)) From b3deb9a9ded9dcf0b35a2b35a886e23dcd9e0693 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Thu, 1 Aug 2019 13:32:44 -0400 Subject: [PATCH 049/207] update variable defining to account for no UMI SE samples --- pipelines/peppro.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index c299300..801f229 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -367,6 +367,8 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): dedup_cmd_chunks.extend(["-"]) dedup_cmd = build_command(dedup_cmd_chunks) + else: + dedup_cmd = "" # Create trimming and reverse complementing command(s). # TODO: Can also use seqkit for these steps instead of seqtk... @@ -1772,15 +1774,14 @@ def main(): unmap_genome_bam = os.path.join( map_genome_folder, args.sample_name + "_unmap.bam") - if args.complexity and args.umi_len > 0: - mapping_genome_bam_dups = os.path.join( - map_genome_folder, args.sample_name + "_sort_dups.bam") - mapping_genome_bam_temp_dups = os.path.join( - map_genome_folder, args.sample_name + "_temp_dups.bam") - failQC_genome_bam_dups = os.path.join( - map_genome_folder, args.sample_name + "_fail_qc_dups.bam") - unmap_genome_bam_dups = os.path.join( - map_genome_folder, args.sample_name + "_unmap_dups.bam") + mapping_genome_bam_dups = os.path.join( + map_genome_folder, args.sample_name + "_sort_dups.bam") + mapping_genome_bam_temp_dups = os.path.join( + map_genome_folder, args.sample_name + "_temp_dups.bam") + failQC_genome_bam_dups = os.path.join( + map_genome_folder, args.sample_name + "_fail_qc_dups.bam") + unmap_genome_bam_dups = os.path.join( + map_genome_folder, args.sample_name + "_unmap_dups.bam") bt2_options = " --very-sensitive" bt2_options += " -X 2000" @@ -1989,6 +1990,8 @@ def check_alignment_genome(temp_bam, bam): ############################################################################ # Calculate library complexity # ############################################################################ + QC_folder = os.path.join(param.outfolder, "QC_" + args.genome_assembly) + if args.complexity and args.umi_len > 0: if os.path.exists(mapping_genome_bam_temp_dups): if not os.path.exists(temp_mapping_index_dups): @@ -2040,7 +2043,6 @@ def check_alignment_genome(temp_bam, bam): mapping_genome_bam_dups = dups_pe1_bam pm.timestamp("### Calculate library complexity") - QC_folder = os.path.join(param.outfolder, "QC_" + args.genome_assembly) ngstk.make_dir(QC_folder) preseq_output = os.path.join( From e0709d761b665440a3627a4e3f18a4fe040c6ea4 Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 1 Aug 2019 14:27:00 -0400 Subject: [PATCH 050/207] don't put rgc into res. Fix #13 --- pipelines/peppro.py | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index c299300..a4980ed 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -1471,8 +1471,8 @@ def _add_resources(args, res): print(err.format(asset)) print(msg) - res.rgc = rgc - return res + # res.rgc = rgc + return res, rgc ############################################################################### @@ -1525,7 +1525,7 @@ def main(): pm.fail_pipeline(RuntimeError(err_msg)) # Set up reference resource according to genome prefix. - res = _add_resources(args, res) + res, rgc = _add_resources(args, res) # Adapter file can be set in the config; if left null, we use a default. # TODO: use this option or just specify directly the adapter sequence as I do now @@ -1694,7 +1694,7 @@ def main(): args, tools, args.paired_end, False, unmap_fq1, unmap_fq2, reference, assembly_bt2=os.path.join( - res.rgc.get_asset(reference, BT2_IDX_KEY), reference), + rgc.get_asset(reference, BT2_IDX_KEY), reference), outfolder=param.outfolder, aligndir="prealignments") @@ -1702,17 +1702,19 @@ def main(): args, tools, args.paired_end, False, unmap_fq1_dups, unmap_fq2_dups, reference, assembly_bt2=os.path.join( - res.rgc.get_asset(reference, BT2_IDX_KEY), reference), + rgc.get_asset(reference, BT2_IDX_KEY), reference), outfolder=param.outfolder, aligndir="prealignments", dups=True) else: + print(type(rgc)) + print(rgc) unmap_fq1, unmap_fq2 = _align_with_bt2( args, tools, args.paired_end, True, unmap_fq1, unmap_fq2, reference, assembly_bt2=os.path.join( - res.rgc.get_asset(reference, BT2_IDX_KEY), reference), + rgc.get_asset(reference, BT2_IDX_KEY), reference), outfolder=param.outfolder, aligndir="prealignments") @@ -1720,7 +1722,7 @@ def main(): args, tools, args.paired_end, True, unmap_fq1_dups, unmap_fq2_dups, reference, assembly_bt2=os.path.join( - res.rgc.get_asset(reference, BT2_IDX_KEY), reference), + rgc.get_asset(reference, BT2_IDX_KEY), reference), outfolder=param.outfolder, aligndir="prealignments", dups=True) @@ -1738,7 +1740,7 @@ def main(): args, tools, args.paired_end, False, unmap_fq1, unmap_fq2, reference, assembly_bt2=os.path.join( - res.rgc.get_asset(reference, BT2_IDX_KEY), reference), + rgc.get_asset(reference, BT2_IDX_KEY), reference), outfolder=param.outfolder, aligndir="prealignments") else: @@ -1746,7 +1748,7 @@ def main(): args, tools, args.paired_end, True, unmap_fq1, unmap_fq2, reference, assembly_bt2=os.path.join( - res.rgc.get_asset(reference, BT2_IDX_KEY), reference), + rgc.get_asset(reference, BT2_IDX_KEY), reference), outfolder=param.outfolder, aligndir="prealignments") if args.paired_end: @@ -1803,7 +1805,7 @@ def main(): cmd += bt2_options cmd += " --rg-id " + args.sample_name cmd += " -x " + os.path.join( - res.rgc.get_asset(args.genome_assembly, BT2_IDX_KEY), + rgc.get_asset(args.genome_assembly, BT2_IDX_KEY), args.genome_assembly) if args.paired_end: cmd += " --rf -1 " + unmap_fq1 + " -2 " + unmap_fq2 @@ -1828,7 +1830,7 @@ def main(): cmd_dups += bt2_options cmd_dups += " --rg-id " + args.sample_name cmd_dups += " -x " + os.path.join( - res.rgc.get_asset(args.genome_assembly, BT2_IDX_KEY), + rgc.get_asset(args.genome_assembly, BT2_IDX_KEY), args.genome_assembly) if args.paired_end: cmd_dups += " --rf -1 " + unmap_fq1_dups + " -2 " + unmap_fq2_dups @@ -2730,7 +2732,7 @@ def count_unmapped_reads(): ############################################################################ # Shift and produce BigWig's # ############################################################################ - genome_fq = os.path.join(res.rgc.genome_folder, + genome_fq = os.path.join(rgc.genome_folder, args.genome_assembly, (args.genome_assembly + ".fa")) signal_folder = os.path.join( @@ -2779,7 +2781,7 @@ def count_unmapped_reads(): # Do that in the $GENOMES folder, in a subfolder called "mappability" # Only need to do that once for each read-size of interest # default would be read-size 30 (args.max_len) - mappability_folder = os.path.join(res.rgc.genome_folder, + mappability_folder = os.path.join(rgc.genome_folder, args.genome_assembly, "mappability") ngstk.make_dir(mappability_folder) From 4283767e032cd45d8b14457106befa6b5227c340 Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 1 Aug 2019 14:31:28 -0400 Subject: [PATCH 051/207] remove debug printlines --- pipelines/peppro.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 72b3ec3..8c67def 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -1710,8 +1710,6 @@ def main(): dups=True) else: - print(type(rgc)) - print(rgc) unmap_fq1, unmap_fq2 = _align_with_bt2( args, tools, args.paired_end, True, unmap_fq1, unmap_fq2, reference, From 45c9d61792c9f9fb71db751acdc72307501ed838 Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 1 Aug 2019 17:49:08 -0400 Subject: [PATCH 052/207] add bulker manifest --- peppro_bulker_manifest.yaml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 peppro_bulker_manifest.yaml diff --git a/peppro_bulker_manifest.yaml b/peppro_bulker_manifest.yaml new file mode 100644 index 0000000..ea306f5 --- /dev/null +++ b/peppro_bulker_manifest.yaml @@ -0,0 +1,25 @@ +manifest: + name: peppro + commands: + - command: samtools + dockerargs: "-i" + docker_image: quay.io/biocontainers/samtools:1.9--h91753b0_8 + - command: bowtie2 + docker_image: quay.io/biocontainers/bowtie2:2.3.5--py37he860b03_0 + - command: seqkit + docker_image: quay.io/biocontainers/seqkit:0.10.2--0 + - command: fastp + docker_image: quay.io/biocontainers/fastp:0.20.0--hdbcaa40_0 + - command: seqtk + dockerargs: "-i" + docker_image: quay.io/biocontainers/seqtk:1.3--hed695b0_2 + - command: preseq + docker_image: quay.io/biocontainers/preseq:2.0.3--h26b358d_2 + - command: fastq-pair + docker_image: quay.io/biocontainers/fastq-pair:1.0--hf484d3e_02 + - command: wigToBigWig + docker_image: quay.io/biocontainers/ucsc-wigtobigwig:357--h35c10e6_3 + - command: wigToBigWig + docker_image: quay.io/biocontainers/ucsc-bigwigcat:377--h199ee4e_0 + - command: fastqc + docker_image: quay.io/biocontainers/fastqc:0.11.8--1 From 8e7571b60bd29f0f9523156dd4ef538b288ecd13 Mon Sep 17 00:00:00 2001 From: nsheff Date: Fri, 2 Aug 2019 17:38:22 -0400 Subject: [PATCH 053/207] fix manifest --- peppro_bulker_manifest.yaml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/peppro_bulker_manifest.yaml b/peppro_bulker_manifest.yaml index ea306f5..8769904 100644 --- a/peppro_bulker_manifest.yaml +++ b/peppro_bulker_manifest.yaml @@ -15,11 +15,15 @@ manifest: docker_image: quay.io/biocontainers/seqtk:1.3--hed695b0_2 - command: preseq docker_image: quay.io/biocontainers/preseq:2.0.3--h26b358d_2 - - command: fastq-pair - docker_image: quay.io/biocontainers/fastq-pair:1.0--hf484d3e_02 + - command: fastq_pair + docker_image: quay.io/biocontainers/fastq-pair:1.0--hf484d3e_0 - command: wigToBigWig docker_image: quay.io/biocontainers/ucsc-wigtobigwig:357--h35c10e6_3 - - command: wigToBigWig - docker_image: quay.io/biocontainers/ucsc-bigwigcat:377--h199ee4e_0 + - command: bigWigCat + docker_image: quay.io/biocontainers/ucsc-bigwigcat:357--1 - command: fastqc docker_image: quay.io/biocontainers/fastqc:0.11.8--1 + - command: pigz + docker_image: nsheff/pigz + - command: cutadapt + docker_image: quay.io/biocontainers/cutadapt:2.4--py37h14c3975_0 \ No newline at end of file From feaa93e073b7406b5a13878293514a70e2470ea8 Mon Sep 17 00:00:00 2001 From: Nathan Sheffield Date: Wed, 14 Aug 2019 16:21:25 -0400 Subject: [PATCH 054/207] Update pipeline_interface.yaml --- pipeline_interface.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pipeline_interface.yaml b/pipeline_interface.yaml index 9b94814..4239f27 100644 --- a/pipeline_interface.yaml +++ b/pipeline_interface.yaml @@ -7,6 +7,10 @@ protocol_mapping: PRO-seq: peppro PROSEQ: peppro proseq: peppro + groseq: peppro + GROSEQ: peppro + GRO-SEQ: peppro + GRO-seq: peppro pipelines: peppro: @@ -23,7 +27,7 @@ pipelines: "--single-or-paired": read_type optional_arguments: "--input2": read2 - "--runon": runon + "--protocol": protocol "--adapter": adapter "--dedup": dedup "--trimmer": trimmer From b1aefb9621053ec8a3cf23b49796886d21ee44e0 Mon Sep 17 00:00:00 2001 From: nsheff Date: Wed, 14 Aug 2019 17:48:45 -0400 Subject: [PATCH 055/207] several small changes: - accept any varaition for protocol - declare defaults - fix bug in adapter length image --- peppro_bulker_manifest.yaml | 1 + pipeline_interface.yaml | 1 + pipelines/peppro.py | 75 +++++++++++++++++++------------------ 3 files changed, 41 insertions(+), 36 deletions(-) diff --git a/peppro_bulker_manifest.yaml b/peppro_bulker_manifest.yaml index 8769904..08eb0c9 100644 --- a/peppro_bulker_manifest.yaml +++ b/peppro_bulker_manifest.yaml @@ -1,5 +1,6 @@ manifest: name: peppro + version: 1.0.0 commands: - command: samtools dockerargs: "-i" diff --git a/pipeline_interface.yaml b/pipeline_interface.yaml index 9b94814..9dfd6bd 100644 --- a/pipeline_interface.yaml +++ b/pipeline_interface.yaml @@ -44,6 +44,7 @@ pipelines: compute: singularity_image: ${SIMAGES}peppro docker_image: databio/peppro + bulker_crate: peppro summarizers: - tools/PEPPRO_summarizer.R summary_results: diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 8c67def..db27ff5 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -19,12 +19,15 @@ from refgenconf import RefGenConf as RGC, select_genome_config TOOLS_FOLDER = "tools" -RUNON_SOURCE = ["pro", "gro"] +RUNON_SOURCE_PRO = ["PRO", "pro", "PRO-SEQ", "PRO-seq", "proseq", "PROSEQ"] +RUNON_SOURCE_GRO = ["GRO", "gro", "groseq", "GROSEQ", "GRO-SEQ", "GRO-seq"] +RUNUN_SOURCE = RUNON_SOURCE_PRO + RUNON_SOURCE_GRO ADAPTER_REMOVAL = ["fastp", "cutadapt"] DEDUPLICATORS = ["seqkit", "fqdedup"] TRIMMERS = ["seqtk", "fastx"] BT2_IDX_KEY = "bowtie2_index" - +DEFAULT_UMI_LEN = 0 +DEFAULT_MAX_LEN = 30 def parse_arguments(): """ @@ -38,7 +41,7 @@ def parse_arguments(): required=["input", "genome", "sample-name", "output-parent"]) # Pipeline-specific arguments - parser.add_argument("--runon", dest="runon", + parser.add_argument("--protocol", dest="protocol", default="pro", choices=RUNON_SOURCE, help="Run on sequencing type.") @@ -57,16 +60,16 @@ def parse_arguments(): parser.add_argument("--umi", action='store_true', default=False, dest="umi", help="Remove umi with fastp") - + parser.add_argument("--umi_len", dest="umi_len", - default="8", type=int, + default=DEFAULT_UMI_LEN, type=int, help="Specify the length of the UMI." - "If your data does not utilize UMIs, set to 0.") + "If your data does not utilize UMIs, set to 0. Default: {}".format(DEFAULT_UMI_LEN)) parser.add_argument("--max_len", dest="max_len", - default="30", + default=DEFAULT_MAX_LEN, help="Trim reads to maximum length." - " Set to -1 to disable length trimming.") + " Set to -1 to disable length trimming. Default: {}".format(DEFAULT_MAX_LEN)) parser.add_argument("--sob", action='store_true', dest="sob", default=False, @@ -385,7 +388,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): ("-e", str(args.umi_len)) ] trim_cmd_chunks_R2.extend(["-"]) - if args.runon.lower() == "gro": + if args.protocol.lower() in RUNON_SOURCE_GRO: trim_cmd_chunks_R2.extend([ (">", trimmed_fastq_R2) ]) @@ -417,7 +420,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): else: trim_cmd_chunks.extend(["-"]) - if args.runon.lower() == "gro": + if args.protocol.lower() in RUNON_SOURCE_GRO: trim_cmd_chunks.extend([ (">", processed_fastq) ]) @@ -465,7 +468,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): trim_cmd_chunks_R2.extend([ ("-t", str(int(float(args.umi_len)))) ]) - if args.runon.lower() == "gro": + if args.protocol.lower() in RUNON_SOURCE_GRO: trim_cmd_chunks_R2.extend([ ("-o", trimmed_fastq_R2) ]) @@ -492,7 +495,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): ("-i", dedup_fastq) ]) - if args.runon.lower() == "gro": + if args.protocol.lower() in RUNON_SOURCE_GRO: trim_cmd_chunks.extend([ ("-o", processed_fastq) ]) @@ -530,7 +533,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): ("-L", str(args.max_len)) ]) trim_cmd_chunks_R2.extend(["-"]) - if args.runon.lower() == "gro": + if args.protocol.lower() in RUNON_SOURCE_GRO: trim_cmd_chunks_R2.extend([ (">", trimmed_fastq_R2) ]) @@ -561,7 +564,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): else: trim_cmd_chunks.extend(["-"]) - if args.runon.lower() == "gro": + if args.protocol.lower() in RUNON_SOURCE_GRO: trim_cmd_chunks.extend([ (">", processed_fastq) ]) @@ -602,7 +605,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): ("-L", args.max_len) ]) trim_cmd_chunks_R2.extend(["-"]) - if args.runon.lower() == "gro": + if args.protocol.lower() in RUNON_SOURCE_GRO: trim_cmd_chunks_R2.extend([ (">", trimmed_fastq_R2) ]) @@ -637,7 +640,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): ("-L", args.max_len) ]) trim_cmd_chunks_nodedup.extend(["-"]) - if args.runon.lower() == "gro": + if args.protocol.lower() in RUNON_SOURCE_GRO: trim_cmd_chunks_nodedup.extend([ (">", trimmed_fastq) ]) @@ -664,7 +667,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): ("-L", args.max_len) ]) trim_cmd_chunks.extend(["-"]) - if args.runon.lower() == "gro": + if args.protocol.lower() in RUNON_SOURCE_GRO: trim_cmd_chunks.extend([ (">", processed_fastq) ]) @@ -693,7 +696,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): ("-L", args.max_len) ]) trim_cmd_chunks.extend(["-"]) - if args.runon.lower() == "gro": + if args.protocol.lower() in RUNON_SOURCE_GRO: trim_cmd_chunks.extend([ (">", processed_fastq) ]) @@ -714,7 +717,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): ("-e", str(args.umi_len)) ] trim_cmd_chunks_R2.extend(["-"]) - if args.runon.lower() == "gro": + if args.protocol.lower() in RUNON_SOURCE_GRO: trim_cmd_chunks_R2.extend([ (">", trimmed_fastq_R2) ]) @@ -739,7 +742,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): #trim_cmd_chunks_nodedup = trim_cmd_chunks.copy() #python3 trim_cmd_chunks_nodedup = list(trim_cmd_chunks) trim_cmd_chunks_nodedup.extend([noadap_fastq]) - if args.runon.lower() == "gro": + if args.protocol.lower() in RUNON_SOURCE_GRO: trim_cmd_chunks_nodedup.extend([ (">", trimmed_fastq) ]) @@ -751,7 +754,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): (">", trimmed_fastq) ]) trim_cmd_chunks.extend([dedup_fastq]) - if args.runon.lower() == "gro": + if args.protocol.lower() in RUNON_SOURCE_GRO: trim_cmd_chunks.extend([ (">", processed_fastq) ]) @@ -764,7 +767,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): ]) else: trim_cmd_chunks.extend(["-"]) - if args.runon.lower() == "gro": + if args.protocol.lower() in RUNON_SOURCE_GRO: trim_cmd_chunks.extend([ (">", processed_fastq) ]) @@ -801,7 +804,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): trim_cmd_chunks_R2.extend([ ("-t", str(int(float(args.umi_len)))) ]) - if args.runon.lower() == "gro": + if args.protocol.lower() in RUNON_SOURCE_GRO: trim_cmd_chunks_R2.extend([ ("-o", trimmed_fastq_R2) ]) @@ -827,7 +830,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): trim_cmd_chunks.extend([ ("-i", dedup_fastq) ]) - if args.runon.lower() == "gro": + if args.protocol.lower() in RUNON_SOURCE_GRO: trim_cmd_chunks.extend([ ("-o", processed_fastq) ]) @@ -861,7 +864,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): ("-e", str(args.umi_len)) ] trim_cmd_chunks_R2.extend(["-"]) - if args.runon.lower() == "gro": + if args.protocol.lower() in RUNON_SOURCE_GRO: trim_cmd_chunks_R2.extend([ (">", trimmed_fastq_R2) ]) @@ -886,7 +889,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): #trim_cmd_chunks_nodedup = trim_cmd_chunks.copy() #python3 trim_cmd_chunks_nodedup = list(trim_cmd_chunks) trim_cmd_chunks_nodedup.extend([noadap_fastq]) - if args.runon.lower() == "gro": + if args.protocol.lower() in RUNON_SOURCE_GRO: trim_cmd_chunks_nodedup.extend([ (">", trimmed_fastq) ]) @@ -898,7 +901,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): (">", trimmed_fastq) ]) trim_cmd_chunks.extend([dedup_fastq]) - if args.runon.lower() == "gro": + if args.protocol.lower() in RUNON_SOURCE_GRO: trim_cmd_chunks.extend([ (">", processed_fastq) ]) @@ -911,7 +914,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): ]) else: trim_cmd_chunks.extend(["-"]) - if args.runon.lower() == "gro": + if args.protocol.lower() in RUNON_SOURCE_GRO: trim_cmd_chunks.extend([ (">", processed_fastq) ]) @@ -2454,7 +2457,7 @@ def count_unmapped_reads(): degradation_pdf = os.path.join(QC_folder, args.sample_name + "_adapter_insertion_distribution.pdf") degradation_png = os.path.join(QC_folder, - args.sample_name + "_adapter_insertion_distribution.pdf") + args.sample_name + "_adapter_insertion_distribution.png") cmd = (tools.Rscript + " " + tool_path("PEPPRO.R") + " cutadapt -i " + adapter_report + " -o " + QC_folder) pm.run(cmd, degradation_pdf, nofail=True) @@ -2730,7 +2733,7 @@ def count_unmapped_reads(): pm.report_object("mRNA contamination", mRNApdf, anchor_image=mRNApng) ############################################################################ - # Shift and produce BigWig's # + # Shift and produce BigWigs # ############################################################################ genome_fq = os.path.join(rgc.genome_folder, args.genome_assembly, @@ -2759,7 +2762,7 @@ def count_unmapped_reads(): cmd2 += " -o " + plus_bw # DEBUG formerly smoothed " -w " + plus_bw cmd2 += " -p " + str(int(max(1, int(pm.cores) * 2/3))) cmd2 += " --variable-step" - if args.runon.lower() == "pro": + if args.protocol.lower() in RUNON_SOURCE_PRO: cmd2 += " --tail-edge" pm.run([cmd1, cmd2], plus_bw) @@ -2770,7 +2773,7 @@ def count_unmapped_reads(): cmd4 += " -o " + minus_bw # DEBUG formerly smoothed " -w " + minus_bw cmd4 += " -p " + str(int(max(1, int(pm.cores) * 2/3))) cmd4 += " --variable-step" - if args.runon.lower() == "pro": + if args.protocol.lower() in RUNON_SOURCE_PRO: cmd4 += " --tail-edge" pm.run([cmd3, cmd4], minus_bw) else: @@ -2911,7 +2914,7 @@ def count_unmapped_reads(): "--skip-bed", str("--bw=" + plus_bw) ] - if args.runon.lower() == "pro": + if args.protocol.lower() in RUNON_SOURCE_PRO: scale_plus_chunks.extend([("--tail-edge")]) scale_plus_cmd = build_command(scale_plus_chunks) @@ -2922,7 +2925,7 @@ def count_unmapped_reads(): "--skip-bed", str("--bw=" + minus_bw), ] - if args.runon.lower() == "pro": + if args.protocol.lower() in RUNON_SOURCE_PRO: scale_minus_chunks.extend([("--tail-edge")]) scale_minus_cmd = build_command(scale_minus_chunks) else: @@ -2934,7 +2937,7 @@ def count_unmapped_reads(): "--skip-bed", str("--bw=" + plus_bw) ] - if args.runon.lower() == "pro": + if args.protocol.lower() in RUNON_SOURCE_PRO: scale_plus_chunks.extend([("--tail-edge")]) scale_plus_cmd = build_command(scale_plus_chunks) @@ -2946,7 +2949,7 @@ def count_unmapped_reads(): "--skip-bed", str("--bw=" + minus_bw), ] - if args.runon.lower() == "pro": + if args.protocol.lower() in RUNON_SOURCE_PRO: scale_minus_chunks.extend([("--tail-edge")]) scale_minus_cmd = build_command(scale_minus_chunks) From 602c21636f82188c6091af294e048efadac6f709 Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 15 Aug 2019 07:25:47 -0400 Subject: [PATCH 056/207] typo --- pipelines/peppro.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index db27ff5..7df9bfb 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -21,7 +21,7 @@ TOOLS_FOLDER = "tools" RUNON_SOURCE_PRO = ["PRO", "pro", "PRO-SEQ", "PRO-seq", "proseq", "PROSEQ"] RUNON_SOURCE_GRO = ["GRO", "gro", "groseq", "GROSEQ", "GRO-SEQ", "GRO-seq"] -RUNUN_SOURCE = RUNON_SOURCE_PRO + RUNON_SOURCE_GRO +RUNON_SOURCE = RUNON_SOURCE_PRO + RUNON_SOURCE_GRO ADAPTER_REMOVAL = ["fastp", "cutadapt"] DEDUPLICATORS = ["seqkit", "fqdedup"] TRIMMERS = ["seqtk", "fastx"] From 9696e12c1449a344d731da67c079487a69664abf Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 15 Aug 2019 09:02:23 -0400 Subject: [PATCH 057/207] remove dedup command for single-end, noUMI. See #20 --- pipelines/peppro.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 7df9bfb..2fd1b55 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -324,7 +324,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): adapter_cmd = build_command(adapter_cmd_chunks) # Create deduplication command(s). - if not read2 and not args.umi_len <=0: + if not read2 and not args.umi_len <= 0: if args.dedup == "seqkit": dedup_cmd_chunks = [ (tools.seqkit, "rmdup"), @@ -373,6 +373,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): else: dedup_cmd = "" + pm.debug("Dedup command: {}".format(dedup_cmd)) # Create trimming and reverse complementing command(s). # TODO: Can also use seqkit for these steps instead of seqtk... if args.umi: @@ -1019,7 +1020,7 @@ def report_fastq(): return processed_fastq, trimmed_fastq else: process_fastq_cmd = build_command([ - adapter_cmd, "|", dedup_cmd, "|", trim_cmd1]) + adapter_cmd, "|", trim_cmd1]) pm.run(process_fastq_cmd, processed_fastq, follow=ngstk.check_trim(processed_fastq, False, None)) return processed_fastq From 319eb07bceba2f7c535f6ed645a2fd4a01a82bf8 Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 15 Aug 2019 09:02:57 -0400 Subject: [PATCH 058/207] make QC folder earlier (caused bugs in no umi mode) --- pipelines/peppro.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 2fd1b55..080ab65 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -1995,6 +1995,7 @@ def check_alignment_genome(temp_bam, bam): # Calculate library complexity # ############################################################################ QC_folder = os.path.join(param.outfolder, "QC_" + args.genome_assembly) + ngstk.make_dir(QC_folder) if args.complexity and args.umi_len > 0: if os.path.exists(mapping_genome_bam_temp_dups): @@ -2047,7 +2048,6 @@ def check_alignment_genome(temp_bam, bam): mapping_genome_bam_dups = dups_pe1_bam pm.timestamp("### Calculate library complexity") - ngstk.make_dir(QC_folder) preseq_output = os.path.join( QC_folder, args.sample_name + "_preseq_out.txt") From 644ca073809813e1474793601a9b2df3acd4f74c Mon Sep 17 00:00:00 2001 From: nsheff Date: Fri, 16 Aug 2019 10:57:29 -0400 Subject: [PATCH 059/207] don't repair dups for no-umi. Fix #22 --- pipelines/peppro.py | 45 ++++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 080ab65..0c6f059 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -1643,27 +1643,30 @@ def main(): pm.run([cmd1, cmd2, cmd3], repair_target) pm.clean_add(repair_target) - r1_dups_repair = os.path.join( - fastq_folder, args.sample_name + "_R1_trimmed.fastq.paired.fq") - r2_dups_repair = os.path.join( - fastq_folder, args.sample_name + "_R2_trimmed_dups.fastq.paired.fq") - - r1_dups_repair_single = os.path.join( - fastq_folder, args.sample_name + "_R1_trimmed.fastq.single.fq") - r2_dups_repair_single = os.path.join( - fastq_folder, args.sample_name + "_R2_trimmed_dups.fastq.single.fq") - - cmd = (tools.fastqpair + " -t " + str(int(0.9*rr)) + " " + - unmap_fq1_dups + " " + unmap_fq2_dups) - pm.run(cmd, [r1_dups_repair, r2_dups_repair]) - pm.clean_add(r1_dups_repair_single) - pm.clean_add(r2_dups_repair_single) - cmd1 = ("mv " + r1_dups_repair + " " + unmap_fq1_dups) - cmd2 = ("mv " + r2_dups_repair + " " + unmap_fq2_dups) - dups_repair_target = os.path.join(fastq_folder, "dups_repaired.flag") - cmd3 = ("touch dups_repaired.flag") - pm.run([cmd1, cmd2, cmd3], dups_repair_target) - pm.clean_add(dups_repair_target) + # Re-pair the duplicates (but only if we could identify duplicates) + + if args.umi_len > 0: + r1_dups_repair = os.path.join( + fastq_folder, args.sample_name + "_R1_trimmed.fastq.paired.fq") + r2_dups_repair = os.path.join( + fastq_folder, args.sample_name + "_R2_trimmed_dups.fastq.paired.fq") + + r1_dups_repair_single = os.path.join( + fastq_folder, args.sample_name + "_R1_trimmed.fastq.single.fq") + r2_dups_repair_single = os.path.join( + fastq_folder, args.sample_name + "_R2_trimmed_dups.fastq.single.fq") + + cmd = (tools.fastqpair + " -t " + str(int(0.9*rr)) + " " + + unmap_fq1_dups + " " + unmap_fq2_dups) + pm.run(cmd, [r1_dups_repair, r2_dups_repair]) + pm.clean_add(r1_dups_repair_single) + pm.clean_add(r2_dups_repair_single) + cmd1 = ("mv " + r1_dups_repair + " " + unmap_fq1_dups) + cmd2 = ("mv " + r2_dups_repair + " " + unmap_fq2_dups) + dups_repair_target = os.path.join(fastq_folder, "dups_repaired.flag") + cmd3 = ("touch dups_repaired.flag") + pm.run([cmd1, cmd2, cmd3], dups_repair_target) + pm.clean_add(dups_repair_target) else: if args.complexity and args.umi_len > 0: unmap_fq1, unmap_fq1_dups = _process_fastq(args, tools, False, From ae27390f66f30cd67783027981fd8347e6a74976 Mon Sep 17 00:00:00 2001 From: nsheff Date: Fri, 16 Aug 2019 11:58:29 -0400 Subject: [PATCH 060/207] fix bamSitesToWig to use new pararead, fix limit bug --- tools/bamSitesToWig.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tools/bamSitesToWig.py b/tools/bamSitesToWig.py index b4320f5..2767af7 100755 --- a/tools/bamSitesToWig.py +++ b/tools/bamSitesToWig.py @@ -13,12 +13,11 @@ import os import subprocess import sys - +import logmuse import pararead import pysam -from pararead import add_logging_options, ParaReadProcessor -from pararead import logger_via_cli +from pararead import ParaReadProcessor MODES = ["dnase", "atac"] @@ -46,8 +45,9 @@ def __init__(self, reads_filename, chrom_sizes_file, temp_parent, nProc, _LOGGER.info("Cutting parallel chroms in half to accommodate two tracks.") nProc = max(int(nProc / 2), 1) - super(CutTracer,self).__init__(reads_filename, nProc, - self.resultAcronym, temp_parent, limit, allow_unaligned=False, + super(CutTracer,self).__init__(path_reads_file=reads_filename, cores=nProc, + action=self.resultAcronym, temp_folder_parent_path=temp_parent, + limit=limit, allow_unaligned=False, retain_temp=retain_temp) self.exactbw = exactbw self.summary_filename = summary_filename @@ -95,7 +95,7 @@ def __call__(self, chrom): chrom_size = self.get_chrom_size(chrom) #self.unbuffered_write("[Name: " + chrom + "; Size: " + str(chrom_size) + "]") - _LOGGER.info("[Name: " + chrom + "; Size: " + str(chrom_size) + "]") + _LOGGER.debug("[Name: " + chrom + "; Size: " + str(chrom_size) + "]") reads = self.fetch_chunk(chrom) chromOutFile = self._tempf(chrom) @@ -339,15 +339,16 @@ def parse_args(cmdl): parser.add_argument('--retain-temp', action='store_true', default=False, help="Retain temporary files? Default: False") - parser = add_logging_options(parser) - return parser.parse_args(cmdl) + parser = logmuse.add_logging_options(parser) + args = parser.parse_args(cmdl) + if not (args.exactbw or args.smoothbw): + parser.error('No output requested, use --exactbw and/or --smoothbw') + return args if __name__ == "__main__": args = parse_args(sys.argv[1:]) - if not (args.exactbw or args.smoothbw): - parser.error('No output requested, use --exactbw and/or --smoothbw') - _LOGGER = logger_via_cli(args) + _LOGGER = logmuse.logger_via_cli(args, make_root=True) if args.mode == "dnase": shift_factor = {"+":1, "-":0} # DNase @@ -355,7 +356,6 @@ def parse_args(cmdl): shift_factor = {"+":4, "-":-5} # ATAC else: shift_factor = {"+":0, "-":0} - ct = CutTracer( reads_filename=args.infile, chrom_sizes_file=args.chrom_sizes_file, summary_filename=args.summary_file, From 27631d6f909bde710fa41818c340e3242e82ed46 Mon Sep 17 00:00:00 2001 From: nsheff Date: Fri, 16 Aug 2019 11:59:09 -0400 Subject: [PATCH 061/207] remove code duplicate; fastp is default --- pipelines/peppro.py | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 0c6f059..b22940a 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -938,23 +938,7 @@ def report_fastq(): """ Report QC metrics on intermediate steps of fastq file preparation """ - if args.adapter == "fastp": - adapter_term = "reads with adapter trimmed:" - too_short_term = "reads failed due to too short:" - total_bases_term = "total bases:" - - ac_cmd = ("grep '" + adapter_term + "' " + - adapter_report + " | head -n 1 | awk '{print $NF}'") - ts_cmd = ("grep '" + too_short_term + "' " + - adapter_report + " | head -n 1 | awk '{print $NF}'") - bases = ("grep '" + total_bases_term + "' " + - adapter_report + " | head -n 1 | awk '{print $NF}'") - adapter_bases = ("grep 'bases trimmed due to adapters:' " + - adapter_report + " | awk '{print $NF}'") - - pm.report_object("FastP_report", adapter_html) - - elif args.adapter == "cutadapt": + if args.adapter == "cutadapt": adapter_term = "Reads with adapters:" too_short_term = "Reads that were too short:" total_bases_term = "Total basepairs processed:" @@ -1646,6 +1630,7 @@ def main(): # Re-pair the duplicates (but only if we could identify duplicates) if args.umi_len > 0: + r1_dups_repair = os.path.join( fastq_folder, args.sample_name + "_R1_trimmed.fastq.paired.fq") r2_dups_repair = os.path.join( From 57760569d54ccf36501ffde54aca835d9dd2f5b2 Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 22 Aug 2019 15:37:12 -0400 Subject: [PATCH 062/207] Change 'read2' to 'paired_end to be consistent --- pipelines/peppro.py | 43 ++++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index b22940a..b5437bc 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -147,7 +147,7 @@ def parse_arguments(): return args -def _process_fastq(args, tools, read2, fq_file, outfolder): +def _process_fastq(args, tools, paired_end, fq_file, outfolder): """ A helper function to prepare read files for downstream processing. @@ -155,7 +155,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): e.g. from parsing command-line options :param looper.models.AttributeDict tools: binding between tool name and value, e.g. for tools/resources used by the pipeline - :param bool read2: if True, use paired-end processing + :param bool paired_end: if True, use paired-end processing :param str fq_file: path to FASTQ file :param str outfolder: path to output directory for the pipeline :return (str, str): pair (R1, R2) of paths to FASTQ files @@ -164,6 +164,10 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): fastq_folder = os.path.join(outfolder, "fastq") fastqc_folder=os.path.join(outfolder, "fastqc") + + cutadap_report = os.path.join( + fastqc_folder, args.sample_name + "_R1_rmAdapter.txt") + noadap_fastq = os.path.join( fastq_folder, args.sample_name + "_R1_noadap.fastq") dedup_fastq = os.path.join( @@ -220,7 +224,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): ("--thread", str(pm.cores)), ("--in1", fq_file) ] - if read2: + if paired_end: adapter_cmd_chunks.extend([ ("--adapter_sequence", "GATCGTCGGACTGTAGAACTCTGAAC"), ("--length_required", (18 + int(float(args.umi_len)))), @@ -237,7 +241,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): ("--report_title", ("'" + args.sample_name + "'")) ]) - if args.complexity and not read2: + if args.complexity and not paired_end: adapter_cmd_chunks.extend([("-o", noadap_fastq)]) else: adapter_cmd_chunks.extend([("--stdout")]) @@ -251,7 +255,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): elif args.adapter == "cutadapt": cut_version = float(pm.checkprint("cutadapt --version")) - if read2: + if paired_end: adapter_cmd_chunks = [tools.cutadapt] # old versions of cutadapt can not use multiple cores if cut_version >= 1.15: @@ -282,7 +286,8 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): adapter_cmd_chunks.extend([ ("-m", (18 + int(float(args.umi_len)))), ("-a", "TGGAATTCTCGGGTGCCAAGG"), - fq_file + fq_file, + (">", adapter_report) ]) adapter_cmd = build_command(adapter_cmd_chunks) @@ -295,7 +300,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): ("--thread", str(pm.cores)), ("--in1", fq_file) ] - if read2: + if paired_end: adapter_cmd_chunks.extend([ ("--adapter_sequence", "GATCGTCGGACTGTAGAACTCTGAAC"), ("--length_required", (18 + int(float(args.umi_len)))), @@ -312,7 +317,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): ("--report_title", ("'" + args.sample_name + "'")) ]) - if args.complexity and not read2: + if args.complexity and not paired_end: adapter_cmd_chunks.extend([("-o", noadap_fastq)]) else: adapter_cmd_chunks.extend([("--stdout")]) @@ -324,7 +329,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): adapter_cmd = build_command(adapter_cmd_chunks) # Create deduplication command(s). - if not read2 and not args.umi_len <= 0: + if not paired_end and not args.umi_len <= 0: if args.dedup == "seqkit": dedup_cmd_chunks = [ (tools.seqkit, "rmdup"), @@ -382,7 +387,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): print("Defaulting to removing the first {} " "bp instead via trimming".format(str(args.umi_len))) if args.trimmer == "seqtk": - if read2: + if paired_end: trim_cmd_chunks_R2 = [ tools.seqtk, "trimfq", @@ -460,7 +465,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): trim_cmd_chunks.extend([ ("-l", (str(int(float(args.max_len)) + int(float(args.umi_len))))) ]) - if read2: + if paired_end: trim_cmd_chunks_R2 = [trim_tool] if encoding == "Illumina-1.8": trim_cmd_chunks_R2.extend([ @@ -523,7 +528,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): else: # Default to seqtk - if read2: + if paired_end: trim_cmd_chunks_R2 = [ tools.seqtk, "trimfq", @@ -588,13 +593,13 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): trimmed_fastq ]) else: - if read2: + if paired_end: trim_cmd_chunks_R2 = [ tools.fastp, ("--thread", str(pm.cores)), ("--stdin", "--stdout"), "--umi", - ("--umi_loc", "read2"), + ("--umi_loc", "paired_end"), ("--umi_len", args.umi_len), ("--html", umi_report_R2), ("--json", umi_json_R2), @@ -711,7 +716,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): else: if args.trimmer == "seqtk": - if read2: + if paired_end: trim_cmd_chunks_R2 = [ tools.seqtk, "trimfq", @@ -796,7 +801,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): ("-l", (str(int(float(args.max_len)) + int(float(args.umi_len))))) ]) - if read2: + if paired_end: trim_cmd_chunks_R2 = [trim_tool] if encoding == "Illumina-1.8": trim_cmd_chunks_R2.extend([ @@ -858,7 +863,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): else: # Default to seqtk - if read2: + if paired_end: trim_cmd_chunks_R2 = [ tools.seqtk, "trimfq", @@ -927,7 +932,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): (">", processed_fastq) ]) - if read2: + if paired_end: trim_cmd2 = build_command(trim_cmd_chunks_R2) else: trim_cmd1 = build_command(trim_cmd_chunks) @@ -984,7 +989,7 @@ def report_fastq(): pm.report_result("Duplicate_reads", dups) # Put it all together - if read2: + if paired_end: process_fastq_cmd2 = build_command([ adapter_cmd, "|", trim_cmd2]) #print("process_fastq_cmd2: {}".format(process_fastq_cmd2)) From bb60992f97d66bdf65d162af4066125da65d289d Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 22 Aug 2019 15:44:50 -0400 Subject: [PATCH 063/207] warn if changing settings. Also output cutadapt report always. See #26 --- pipelines/peppro.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index b5437bc..9fb2901 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -209,6 +209,8 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): # If single-end, must use cutadapt for plotting purposes if not args.paired_end: + if args.adapter != "cutadapt": + pm.warn("You must select cutadapt for adapter with single end data. Reset!") args.adapter = "cutadapt" # Check quality encoding for use with FastX_Tools @@ -279,7 +281,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): (">", adapter_report) ]) else: - adapter_cmd_chunks = [tools.cutadapt] + adapter_cmd_chunks = ["(" + tools.cutadapt] # old versions of cutadapt can not use multiple cores if cut_version >= 1.15: adapter_cmd_chunks.extend([("-j", str(pm.cores))]) @@ -287,6 +289,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ("-m", (18 + int(float(args.umi_len)))), ("-a", "TGGAATTCTCGGGTGCCAAGG"), fq_file, + ("-o", noadap_fastq + ")"), (">", adapter_report) ]) From 44b84dd264e61d46e5791e3de3d4367770306fd9 Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 22 Aug 2019 15:49:11 -0400 Subject: [PATCH 064/207] add cutadapt output --- pipelines/peppro.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 9fb2901..f349885 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -265,7 +265,9 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): adapter_cmd_chunks.extend([ ("-m", (18 + int(float(args.umi_len)))), ("-a", "GATCGTCGGACTGTAGAACTCTGAAC"), - fq_file + fq_file, + ("-o", noadap_fastq + ")"), + (">", adapter_report) ]) else: if args.complexity and args.umi_len > 0: From 8d6119f9a3eb1515814cb5459a395e1e5e7a9b89 Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 22 Aug 2019 15:54:48 -0400 Subject: [PATCH 065/207] make code fmt more concise --- pipelines/peppro.py | 67 ++++++++++++++++----------------------------- 1 file changed, 24 insertions(+), 43 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index f349885..42fccd0 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -163,49 +163,30 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): # Create names for processed FASTQ files. fastq_folder = os.path.join(outfolder, "fastq") fastqc_folder=os.path.join(outfolder, "fastqc") + sname = args.sample_name # for concise code + cutadapt_report = os.path.join(fastqc_folder, sname + "_cutadapt.txt") - - cutadap_report = os.path.join( - fastqc_folder, args.sample_name + "_R1_rmAdapter.txt") - - noadap_fastq = os.path.join( - fastq_folder, args.sample_name + "_R1_noadap.fastq") - dedup_fastq = os.path.join( - fastq_folder, args.sample_name + "_R1_dedup.fastq") - trimmed_fastq = os.path.join( - fastq_folder, args.sample_name + "_R1_trimmed.fastq") - processed_fastq = os.path.join( - fastq_folder, args.sample_name + "_R1_processed.fastq") + noadap_fastq = os.path.join(fastq_folder, sname + "_R1_noadap.fastq") + dedup_fastq = os.path.join(fastq_folder, sname + "_R1_dedup.fastq") + trimmed_fastq = os.path.join(fastq_folder, sname + "_R1_trimmed.fastq") + processed_fastq = os.path.join(fastq_folder, sname + "_R1_processed.fastq") - adapter_html = os.path.join( - fastqc_folder, args.sample_name + "_R1_rmAdapter.html") - adapter_json = os.path.join( - fastqc_folder, args.sample_name + "_R1_rmAdapter.json") - adapter_report = os.path.join( - fastqc_folder, args.sample_name + "_R1_rmAdapter.txt") - umi_report = os.path.join( - fastqc_folder, args.sample_name + "_R1_rmUmi.html") - umi_json = os.path.join( - fastqc_folder, args.sample_name + "_R1_rmUmi.json") + adapter_html = os.path.join(fastqc_folder, sname + "_R1_rmAdapter.html") + adapter_json = os.path.join(fastqc_folder, sname + "_R1_rmAdapter.json") + adapter_report = os.path.join(fastqc_folder, sname + "_R1_rmAdapter.txt") + umi_report = os.path.join(fastqc_folder, sname + "_R1_rmUmi.html") + umi_json = os.path.join(fastqc_folder, sname + "_R1_rmUmi.json") # PE2 names - noadap_fastq_R2 = os.path.join( - fastq_folder, args.sample_name + "_R2_noadap.fastq") - trimmed_fastq_R2 = os.path.join( - fastq_folder, args.sample_name + "_R2_trimmed.fastq") - trimmed_dups_fastq_R2 = os.path.join( - fastq_folder, args.sample_name + "_R2_trimmed_dups.fastq") - - adapter_html_R2 = os.path.join( - fastqc_folder, args.sample_name + "_R2_rmAdapter.html") - adapter_json_R2 = os.path.join( - fastqc_folder, args.sample_name + "_R2_rmAdapter.json") - adapter_report_R2 = os.path.join( - fastqc_folder, args.sample_name + "_R2_rmAdapter.txt") - umi_report_R2 = os.path.join( - fastqc_folder, args.sample_name + "_R2_rmUmi.html") - umi_json_R2 = os.path.join( - fastqc_folder, args.sample_name + "_R2_rmUmi.json") + noadap_fastq_R2 = os.path.join(fastq_folder, sname + "_R2_noadap.fastq") + trimmed_fastq_R2 = os.path.join(fastq_folder, sname + "_R2_trimmed.fastq") + trimmed_dups_fastq_R2 = os.path.join(fastq_folder, sname + "_R2_trimmed_dups.fastq") + + adapter_html_R2 = os.path.join(fastqc_folder, sname + "_R2_rmAdapter.html") + adapter_json_R2 = os.path.join(fastqc_folder, sname + "_R2_rmAdapter.json") + adapter_report_R2 = os.path.join(fastqc_folder, sname + "_R2_rmAdapter.txt") + umi_report_R2 = os.path.join(fastqc_folder, sname + "_R2_rmUmi.html") + umi_json_R2 = os.path.join(fastqc_folder, sname + "_R2_rmUmi.json") # If single-end, must use cutadapt for plotting purposes if not args.paired_end: @@ -232,7 +213,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ("--length_required", (18 + int(float(args.umi_len)))), ("--html", adapter_html_R2), ("--json", adapter_json_R2), - ("--report_title", ("'" + args.sample_name + "'")) + ("--report_title", ("'" + sname + "'")) ]) else: adapter_cmd_chunks.extend([ @@ -240,7 +221,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ("--length_required", (18 + int(float(args.umi_len)))), ("--html", adapter_html), ("--json", adapter_json), - ("--report_title", ("'" + args.sample_name + "'")) + ("--report_title", ("'" + sname + "'")) ]) if args.complexity and not paired_end: @@ -311,7 +292,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ("--length_required", (18 + int(float(args.umi_len)))), ("--html", adapter_html_R2), ("--json", adapter_json_R2), - ("--report_title", ("'" + args.sample_name + "'")) + ("--report_title", ("'" + sname + "'")) ]) else: adapter_cmd_chunks.extend([ @@ -319,7 +300,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ("--length_required", (18 + int(float(args.umi_len)))), ("--html", adapter_html), ("--json", adapter_json), - ("--report_title", ("'" + args.sample_name + "'")) + ("--report_title", ("'" + sname + "'")) ]) if args.complexity and not paired_end: From 6e225b287a51ec3ca355da719589bb1e3b96b576 Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 22 Aug 2019 15:56:11 -0400 Subject: [PATCH 066/207] make cutadapt report separate from other report. See #31 --- pipelines/peppro.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 42fccd0..5f877da 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -248,7 +248,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ("-a", "GATCGTCGGACTGTAGAACTCTGAAC"), fq_file, ("-o", noadap_fastq + ")"), - (">", adapter_report) + (">", cutadapt_report) ]) else: if args.complexity and args.umi_len > 0: @@ -261,7 +261,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ("-a", "TGGAATTCTCGGGTGCCAAGG"), fq_file, ("-o", noadap_fastq + ")"), - (">", adapter_report) + (">", cutadapt_report) ]) else: adapter_cmd_chunks = ["(" + tools.cutadapt] @@ -273,7 +273,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ("-a", "TGGAATTCTCGGGTGCCAAGG"), fq_file, ("-o", noadap_fastq + ")"), - (">", adapter_report) + (">", cutadapt_report) ]) adapter_cmd = build_command(adapter_cmd_chunks) From 85a136c5c93235b5e16835382039769fc5bef8a5 Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 22 Aug 2019 15:57:52 -0400 Subject: [PATCH 067/207] put cutadapt report in its own folder. See #31 --- pipelines/peppro.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 5f877da..0446140 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -162,9 +162,11 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): """ # Create names for processed FASTQ files. fastq_folder = os.path.join(outfolder, "fastq") - fastqc_folder=os.path.join(outfolder, "fastqc") + fastqc_folder = os.path.join(outfolder, "fastqc") + cutadapt_folder = os.path.join(outfolder, "fastqc") + sname = args.sample_name # for concise code - cutadapt_report = os.path.join(fastqc_folder, sname + "_cutadapt.txt") + cutadapt_report = os.path.join(cutadapt_folder, sname + "_cutadapt.txt") noadap_fastq = os.path.join(fastq_folder, sname + "_R1_noadap.fastq") dedup_fastq = os.path.join(fastq_folder, sname + "_R1_dedup.fastq") @@ -213,7 +215,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ("--length_required", (18 + int(float(args.umi_len)))), ("--html", adapter_html_R2), ("--json", adapter_json_R2), - ("--report_title", ("'" + sname + "'")) + ("--report_title", ("'" + args.sample_name + "'")) ]) else: adapter_cmd_chunks.extend([ @@ -221,7 +223,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ("--length_required", (18 + int(float(args.umi_len)))), ("--html", adapter_html), ("--json", adapter_json), - ("--report_title", ("'" + sname + "'")) + ("--report_title", ("'" + args.sample_name + "'")) ]) if args.complexity and not paired_end: @@ -237,7 +239,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): elif args.adapter == "cutadapt": cut_version = float(pm.checkprint("cutadapt --version")) - + ngstk.make_dir(cutadapt_folder) if paired_end: adapter_cmd_chunks = [tools.cutadapt] # old versions of cutadapt can not use multiple cores From 9e6cef29ccb5b7264b105833f451bf4686cd5478 Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 22 Aug 2019 16:17:45 -0400 Subject: [PATCH 068/207] fix warning; revert cutadapt report outputs... can't do that because later on these commands get piped to something else, sometimes --- pipelines/peppro.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 0446140..40668b4 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -5,7 +5,7 @@ __author__ = ["Jason Smith", "Nathan Sheffield", "Mike Guertin"] __email__ = "jasonsmith@virginia.edu" -__version__ = "0.8.0" +__version__ = "0.8.1" from argparse import ArgumentParser @@ -163,7 +163,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): # Create names for processed FASTQ files. fastq_folder = os.path.join(outfolder, "fastq") fastqc_folder = os.path.join(outfolder, "fastqc") - cutadapt_folder = os.path.join(outfolder, "fastqc") + cutadapt_folder = os.path.join(outfolder, "cutadapt") sname = args.sample_name # for concise code cutadapt_report = os.path.join(cutadapt_folder, sname + "_cutadapt.txt") @@ -193,7 +193,8 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): # If single-end, must use cutadapt for plotting purposes if not args.paired_end: if args.adapter != "cutadapt": - pm.warn("You must select cutadapt for adapter with single end data. Reset!") + pm.warning("You set adapter arg to '{}' but you must select 'cutadapt'" + " for single end data. Overriding.".format(args.adapter)) args.adapter = "cutadapt" # Check quality encoding for use with FastX_Tools @@ -248,9 +249,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): adapter_cmd_chunks.extend([ ("-m", (18 + int(float(args.umi_len)))), ("-a", "GATCGTCGGACTGTAGAACTCTGAAC"), - fq_file, - ("-o", noadap_fastq + ")"), - (">", cutadapt_report) + fq_file ]) else: if args.complexity and args.umi_len > 0: @@ -266,16 +265,14 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): (">", cutadapt_report) ]) else: - adapter_cmd_chunks = ["(" + tools.cutadapt] + adapter_cmd_chunks = [tools.cutadapt] # old versions of cutadapt can not use multiple cores if cut_version >= 1.15: adapter_cmd_chunks.extend([("-j", str(pm.cores))]) adapter_cmd_chunks.extend([ ("-m", (18 + int(float(args.umi_len)))), ("-a", "TGGAATTCTCGGGTGCCAAGG"), - fq_file, - ("-o", noadap_fastq + ")"), - (">", cutadapt_report) + fq_file ]) adapter_cmd = build_command(adapter_cmd_chunks) From be2be4b56d63fb426839345d55074cdf5f51d1c7 Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 22 Aug 2019 16:43:41 -0400 Subject: [PATCH 069/207] remove duplicated code. Fix #36 --- pipelines/peppro.py | 83 +++++---------------------------------------- 1 file changed, 9 insertions(+), 74 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 40668b4..0d57fa3 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -847,75 +847,8 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ]) else: - # Default to seqtk - if paired_end: - trim_cmd_chunks_R2 = [ - tools.seqtk, - "trimfq", - ("-e", str(args.umi_len)) - ] - trim_cmd_chunks_R2.extend(["-"]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks_R2.extend([ - (">", trimmed_fastq_R2) - ]) - else: - trim_cmd_chunks_R2.extend([ - "|", - (tools.seqtk, "seq"), - ("-r", "-"), - (">", trimmed_fastq_R2) - ]) - else: - trim_cmd_chunks = [ - tools.seqtk, - "trimfq", - ("-b", str(args.umi_len)) - ] - if args.max_len != -1: - trim_cmd_chunks.extend([ - ("-L", str(args.max_len)) - ]) - if args.complexity and args.umi_len > 0: - #trim_cmd_chunks_nodedup = trim_cmd_chunks.copy() #python3 - trim_cmd_chunks_nodedup = list(trim_cmd_chunks) - trim_cmd_chunks_nodedup.extend([noadap_fastq]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks_nodedup.extend([ - (">", trimmed_fastq) - ]) - else: - trim_cmd_chunks_nodedup.extend([ - "|", - (tools.seqtk, "seq"), - ("-r", "-"), - (">", trimmed_fastq) - ]) - trim_cmd_chunks.extend([dedup_fastq]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([ - (">", processed_fastq) - ]) - else: - trim_cmd_chunks.extend([ - "|", - (tools.seqtk, "seq"), - ("-r", "-"), - (">", processed_fastq) - ]) - else: - trim_cmd_chunks.extend(["-"]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([ - (">", processed_fastq) - ]) - else: - trim_cmd_chunks.extend([ - "|", - (tools.seqtk, "seq"), - ("-r", "-"), - (">", processed_fastq) - ]) + pm.fail_pipeline("I don't understand '{}' for args.trimmer ".format(args.trimmer ))) + # This should never happen... if paired_end: trim_cmd2 = build_command(trim_cmd_chunks_R2) @@ -975,8 +908,10 @@ def report_fastq(): # Put it all together if paired_end: + # cutadapt directs its report to stderr if the command lacks + # a -o and the actual reads are directed to stdout. process_fastq_cmd2 = build_command([ - adapter_cmd, "|", trim_cmd2]) + "(", adapter_cmd, "|", trim_cmd1, ") 2> ", cutadapt_report]) #print("process_fastq_cmd2: {}".format(process_fastq_cmd2)) pm.run(process_fastq_cmd2, trimmed_fastq_R2) cp_cmd = ("cp " + trimmed_fastq_R2 + " " + trimmed_dups_fastq_R2) @@ -994,7 +929,7 @@ def report_fastq(): return processed_fastq, trimmed_fastq else: process_fastq_cmd = build_command([ - adapter_cmd, "|", trim_cmd1]) + "(", adapter_cmd, "|", trim_cmd1, ") 2> ", cutadapt_report]) pm.run(process_fastq_cmd, processed_fastq, follow=ngstk.check_trim(processed_fastq, False, None)) return processed_fastq @@ -2429,16 +2364,16 @@ def count_unmapped_reads(): if not args.adapter == "cutadapt": print("Skipping sample degradation plotting...") print("This requires the use of 'cutadapt' for adapter clipping.") - elif not os.path.exists(adapter_report): + elif not os.path.exists(cutadapt_report): print("Skipping sample degradation plotting...") - print("Could not find {}.`".format(adapter_report)) + print("Could not find {}.`".format(cutadapt_report)) else: degradation_pdf = os.path.join(QC_folder, args.sample_name + "_adapter_insertion_distribution.pdf") degradation_png = os.path.join(QC_folder, args.sample_name + "_adapter_insertion_distribution.png") cmd = (tools.Rscript + " " + tool_path("PEPPRO.R") + - " cutadapt -i " + adapter_report + " -o " + QC_folder) + " cutadapt -i " + cutadapt_report + " -o " + QC_folder) pm.run(cmd, degradation_pdf, nofail=True) pm.report_object("Adapter insertion distribution", degradation_pdf, anchor_image=degradation_png) From 4fd87cefe166f9fb7bba234011f4a925c918fefa Mon Sep 17 00:00:00 2001 From: nsheff Date: Fri, 23 Aug 2019 16:15:44 -0400 Subject: [PATCH 070/207] centralize cutadapt - move output to same folder - move processing to same area See #31. Fix #26 --- pipelines/peppro.py | 54 +++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 0d57fa3..a01bbed 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -163,10 +163,10 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): # Create names for processed FASTQ files. fastq_folder = os.path.join(outfolder, "fastq") fastqc_folder = os.path.join(outfolder, "fastqc") - cutadapt_folder = os.path.join(outfolder, "cutadapt") - sname = args.sample_name # for concise code - cutadapt_report = os.path.join(cutadapt_folder, sname + "_cutadapt.txt") + + cutadapt_folder = os.path.join(outfolder, "cutadapt") + cutadapt_report = os.path.join(cutadapt_folder, args.sample_name + "_cutadapt.txt") noadap_fastq = os.path.join(fastq_folder, sname + "_R1_noadap.fastq") dedup_fastq = os.path.join(fastq_folder, sname + "_R1_dedup.fastq") @@ -847,7 +847,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ]) else: - pm.fail_pipeline("I don't understand '{}' for args.trimmer ".format(args.trimmer ))) + pm.fail_pipeline("I don't understand '{}' for args.trimmer ".format(args.trimmer )) # This should never happen... if paired_end: @@ -1511,9 +1511,8 @@ def main(): # Process read files # ############################################################################ pm.timestamp("### FASTQ processing: ") - - adapter_report = os.path.join( - fastqc_folder, args.sample_name + "_R1_rmAdapter.txt") + cutadapt_folder = os.path.join(outfolder, "cutadapt") + cutadapt_report = os.path.join(cutadapt_folder, args.sample_name + "_cutadapt.txt") if args.paired_end: if args.complexity and args.umi_len > 0: @@ -1590,6 +1589,27 @@ def main(): outfolder=param.outfolder) unmap_fq2 = "" + + pm.timestamp("### Plot adapter insertion distribution") + if not args.adapter == "cutadapt": + pm.info("Skipping sample degradation plotting...") + pm.info("This requires using 'cutadapt' for adapter clipping.") + elif not os.path.exists(cutadapt_report): + pm.info("Skipping sample degradation plotting...") + pm.info("Could not find {}.`".format(cutadapt_report)) + else: + degradation_pdf = os.path.join(cutadapt_folder, + args.sample_name + "_adapter_insertion_distribution.pdf") + degradation_png = os.path.join(cutadapt_folder, + args.sample_name + "_adapter_insertion_distribution.png") + cmd = (tools.Rscript + " " + tool_path("PEPPRO.R") + + " cutadapt -i " + cutadapt_report + " -o " + cutadapt_folder) + pm.run(cmd, degradation_pdf, nofail=True) + pm.report_object("Adapter insertion distribution", degradation_pdf, + anchor_image=degradation_png) + + + pm.clean_add(os.path.join(fastq_folder, "*.fq"), conditional=True) pm.clean_add(os.path.join(fastq_folder, "*.fastq"), conditional=True) pm.clean_add(os.path.join(fastq_folder, "*.log"), conditional=True) @@ -2360,23 +2380,9 @@ def count_unmapped_reads(): pm.report_object("Fragment distribution", fragL_dis1, anchor_image=fragL_png) else: - pm.timestamp("### Plot adapter insertion distribution") - if not args.adapter == "cutadapt": - print("Skipping sample degradation plotting...") - print("This requires the use of 'cutadapt' for adapter clipping.") - elif not os.path.exists(cutadapt_report): - print("Skipping sample degradation plotting...") - print("Could not find {}.`".format(cutadapt_report)) - else: - degradation_pdf = os.path.join(QC_folder, - args.sample_name + "_adapter_insertion_distribution.pdf") - degradation_png = os.path.join(QC_folder, - args.sample_name + "_adapter_insertion_distribution.png") - cmd = (tools.Rscript + " " + tool_path("PEPPRO.R") + - " cutadapt -i " + cutadapt_report + " -o " + QC_folder) - pm.run(cmd, degradation_pdf, nofail=True) - pm.report_object("Adapter insertion distribution", degradation_pdf, - anchor_image=degradation_png) + pass + # Used to plot adapter distribution here, but moved to cutadapt. + ############################################################################ # Extract genomic features # From 529888049add73cef993a1a1ad2c00825ec630cf Mon Sep 17 00:00:00 2001 From: nsheff Date: Mon, 26 Aug 2019 09:55:25 -0400 Subject: [PATCH 071/207] add all reads trimmed gut check. Fix #28 --- pipeline_interface.yaml | 2 ++ pipelines/peppro.py | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/pipeline_interface.yaml b/pipeline_interface.yaml index 836c45f..ecb90f4 100644 --- a/pipeline_interface.yaml +++ b/pipeline_interface.yaml @@ -49,6 +49,8 @@ pipelines: singularity_image: ${SIMAGES}peppro docker_image: databio/peppro bulker_crate: peppro + outputs: + cutadapt_report: "cutadapt_folder/{sample.sample_name}_cutadapt.txt" summarizers: - tools/PEPPRO_summarizer.R summary_results: diff --git a/pipelines/peppro.py b/pipelines/peppro.py index a01bbed..5f607ae 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -1414,6 +1414,7 @@ def main(): tools = pm.config.tools param = pm.config.parameters res = pm.config.resources + #sstructure = pm.sample_structure # maybe possible in the future? # Check that the required tools are callable by the pipeline tool_list = [v for k,v in tools.items()] # extract tool list @@ -1836,6 +1837,13 @@ def check_alignment_genome(temp_bam, bam): pm.run([cmd_dups, cmd2_dups], mapping_genome_bam_dups, container=pm.container) + # + tr = float(pm.get_stat("Trimmed_reads")) + if (tr < 1): + pm.fail_pipeline("No reads left after trimming. Check trimmer settings") + + + pm.timestamp("### Compress all unmapped read files") for unmapped_fq in to_compress: # Compress unmapped fastq reads From d2c4ffaff36092d6f7762948ad7e7fd84f083721 Mon Sep 17 00:00:00 2001 From: nsheff Date: Mon, 26 Aug 2019 09:58:10 -0400 Subject: [PATCH 072/207] use different trim cmd var. Maybe Fix #39? --- pipelines/peppro.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 5f607ae..020d7c7 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -911,7 +911,7 @@ def report_fastq(): # cutadapt directs its report to stderr if the command lacks # a -o and the actual reads are directed to stdout. process_fastq_cmd2 = build_command([ - "(", adapter_cmd, "|", trim_cmd1, ") 2> ", cutadapt_report]) + "(", adapter_cmd, "|", trim_cmd2, ") 2> ", cutadapt_report]) #print("process_fastq_cmd2: {}".format(process_fastq_cmd2)) pm.run(process_fastq_cmd2, trimmed_fastq_R2) cp_cmd = ("cp " + trimmed_fastq_R2 + " " + trimmed_dups_fastq_R2) From 7564ab270065d77c9e86c3a5ad10f7ddf1cbf934 Mon Sep 17 00:00:00 2001 From: nsheff Date: Mon, 26 Aug 2019 10:07:05 -0400 Subject: [PATCH 073/207] fix gut check --- pipelines/peppro.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 020d7c7..520d58d 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -847,7 +847,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ]) else: - pm.fail_pipeline("I don't understand '{}' for args.trimmer ".format(args.trimmer )) + pm.fail_pipeline(RuntimeError("I don't understand '{}' for args.trimmer ".format(args.trimmer))) # This should never happen... if paired_end: @@ -1528,6 +1528,14 @@ def main(): untrimmed_fastq2, outfolder=param.outfolder) + # Gut check + # Processing fastq should have trimmed the reads. + tr = float(pm.get_stat("Trimmed_reads")) + if (tr < 1): + pm.fail_pipeline(RuntimeError("No reads left after trimming. Check trimmer settings")) + + + # Re-pair fastq files r1_repair = os.path.join( fastq_folder, args.sample_name + "_R1_processed.fastq.paired.fq") @@ -1837,11 +1845,6 @@ def check_alignment_genome(temp_bam, bam): pm.run([cmd_dups, cmd2_dups], mapping_genome_bam_dups, container=pm.container) - # - tr = float(pm.get_stat("Trimmed_reads")) - if (tr < 1): - pm.fail_pipeline("No reads left after trimming. Check trimmer settings") - pm.timestamp("### Compress all unmapped read files") From 7f560743912dd5b28ae63bcac0fc3c96f08072aa Mon Sep 17 00:00:00 2001 From: nsheff Date: Mon, 26 Aug 2019 11:38:12 -0400 Subject: [PATCH 074/207] add early note for protocol detected --- pipelines/peppro.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 520d58d..3a8e178 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -167,6 +167,8 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): cutadapt_folder = os.path.join(outfolder, "cutadapt") cutadapt_report = os.path.join(cutadapt_folder, args.sample_name + "_cutadapt.txt") + if args.adapter == "cutadapt": + ngstk.make_dir(cutadapt_folder) noadap_fastq = os.path.join(fastq_folder, sname + "_R1_noadap.fastq") dedup_fastq = os.path.join(fastq_folder, sname + "_R1_dedup.fastq") @@ -240,7 +242,6 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): elif args.adapter == "cutadapt": cut_version = float(pm.checkprint("cutadapt --version")) - ngstk.make_dir(cutadapt_folder) if paired_end: adapter_cmd_chunks = [tools.cutadapt] # old versions of cutadapt can not use multiple cores @@ -1487,6 +1488,14 @@ def main(): # PRO-seq pipeline # Each (major) step should have its own subfolder + + if args.protocol.lower() in RUNON_SOURCE_GRO: + pm.info("Detected GRO input") + elif args.protocol.lower() in RUNON_SOURCE_PRO: + pm.info("Detected PRO input") + else: + pm.fail_pipeline(RuntimeError("Input protocol must be GRO or PRO.")) + raw_folder = os.path.join(param.outfolder, "raw") fastq_folder = os.path.join(param.outfolder, "fastq") fastqc_folder=os.path.join(param.outfolder, "fastqc") From c88f354932cd7b91f4b794715d098861c76b2933 Mon Sep 17 00:00:00 2001 From: nsheff Date: Mon, 26 Aug 2019 12:49:21 -0400 Subject: [PATCH 075/207] use logmuse --- pipelines/peppro.py | 5 +++-- tools/bamQC.py | 9 ++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 3a8e178..352eb31 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -167,8 +167,6 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): cutadapt_folder = os.path.join(outfolder, "cutadapt") cutadapt_report = os.path.join(cutadapt_folder, args.sample_name + "_cutadapt.txt") - if args.adapter == "cutadapt": - ngstk.make_dir(cutadapt_folder) noadap_fastq = os.path.join(fastq_folder, sname + "_R1_noadap.fastq") dedup_fastq = os.path.join(fastq_folder, sname + "_R1_dedup.fastq") @@ -199,6 +197,9 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): " for single end data. Overriding.".format(args.adapter)) args.adapter = "cutadapt" + if args.adapter == "cutadapt": + ngstk.make_dir(cutadapt_folder) + # Check quality encoding for use with FastX_Tools if args.trimmer == "fastx": encoding = _guess_encoding(fq_file) diff --git a/tools/bamQC.py b/tools/bamQC.py index 7dc75cf..cc82aa5 100755 --- a/tools/bamQC.py +++ b/tools/bamQC.py @@ -13,9 +13,8 @@ import sys import pararead -#from pararead.processor import _LOGGER -from pararead import add_logging_options, ParaReadProcessor -from pararead import logger_via_cli +import logmuse +from pararead import ParaReadProcessor import pandas as _pd import numpy as np @@ -231,7 +230,7 @@ def parse_args(cmdl): parser.add_argument('-c', '--cores', dest='cores', default=20, type=int, help="Number of processors to use. Default=20") - parser = add_logging_options(parser) + parser = logmuse.add_logging_options(parser) return parser.parse_args(cmdl) @@ -239,7 +238,7 @@ def parse_args(cmdl): if __name__ == "__main__": args = parse_args(sys.argv[1:]) - _LOGGER = logger_via_cli(args) + _LOGGER = logmuse.ogger_via_cli(args) qc = bamQC(reads_filename=args.infile, out_filename=args.outfile, From 3325d5ea39b0f0cb0c2fe3106df619d4a30f2743 Mon Sep 17 00:00:00 2001 From: nsheff Date: Mon, 26 Aug 2019 13:39:33 -0400 Subject: [PATCH 076/207] typo --- tools/bamQC.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/bamQC.py b/tools/bamQC.py index cc82aa5..2eaadf9 100755 --- a/tools/bamQC.py +++ b/tools/bamQC.py @@ -238,7 +238,7 @@ def parse_args(cmdl): if __name__ == "__main__": args = parse_args(sys.argv[1:]) - _LOGGER = logmuse.ogger_via_cli(args) + _LOGGER = logmuse.logger_via_cli(args) qc = bamQC(reads_filename=args.infile, out_filename=args.outfile, From 7cd57b4220ab91d0412bef5f8f64f67c21254879 Mon Sep 17 00:00:00 2001 From: nsheff Date: Mon, 26 Aug 2019 13:44:48 -0400 Subject: [PATCH 077/207] add defaults to help --- pipelines/peppro.py | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 352eb31..db9c91e 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -22,9 +22,15 @@ RUNON_SOURCE_PRO = ["PRO", "pro", "PRO-SEQ", "PRO-seq", "proseq", "PROSEQ"] RUNON_SOURCE_GRO = ["GRO", "gro", "groseq", "GROSEQ", "GRO-SEQ", "GRO-seq"] RUNON_SOURCE = RUNON_SOURCE_PRO + RUNON_SOURCE_GRO -ADAPTER_REMOVAL = ["fastp", "cutadapt"] + +ADAPTER_REMOVERS = ["fastp", "cutadapt"] DEDUPLICATORS = ["seqkit", "fqdedup"] TRIMMERS = ["seqtk", "fastx"] + +DEFAULT_REMOVER = "fastp" +DEFAULT_DEDUPLICATOR = "seqkit" +DEFAULT_TRIMMER = "seqtk" + BT2_IDX_KEY = "bowtie2_index" DEFAULT_UMI_LEN = 0 DEFAULT_MAX_LEN = 30 @@ -46,16 +52,19 @@ def parse_arguments(): help="Run on sequencing type.") parser.add_argument("--adapter", dest="adapter", - default="fastp", choices=ADAPTER_REMOVAL, - help="Name of adapter removal program") + default=DEFAULT_REMOVER, choices=ADAPTER_REMOVERS, + help="Name of adapter removal program." + "Default: {}".format(DEFAULT_REMOVER)) parser.add_argument("--dedup", dest="dedup", - default="seqkit", choices=DEDUPLICATORS, - help="Name of program that removes duplicate reads") + default=DEFAULT_DEDUPLICATOR, choices=DEDUPLICATORS, + help="Name of program that removes duplicate reads. " + "Default: {}".format(DEFAULT_DEDUPLICATOR)) parser.add_argument("--trimmer", dest="trimmer", - default="seqtk", choices=TRIMMERS, - help="Name of read trimming program") + default=DEFAULT_TRIMMER, choices=TRIMMERS, + help="Name of read trimming program. " + "Default: {}".format(DEFAULT_TRIMMER)) parser.add_argument("--umi", action='store_true', default=False, dest="umi", @@ -64,12 +73,14 @@ def parse_arguments(): parser.add_argument("--umi_len", dest="umi_len", default=DEFAULT_UMI_LEN, type=int, help="Specify the length of the UMI." - "If your data does not utilize UMIs, set to 0. Default: {}".format(DEFAULT_UMI_LEN)) + "If your data does not utilize UMIs, set to 0. " + "Default: {}".format(DEFAULT_UMI_LEN)) parser.add_argument("--max_len", dest="max_len", default=DEFAULT_MAX_LEN, - help="Trim reads to maximum length." - " Set to -1 to disable length trimming. Default: {}".format(DEFAULT_MAX_LEN)) + help="Trim reads to maximum length. " + "Set to -1 to disable length trimming. " + "Default: {}".format(DEFAULT_MAX_LEN)) parser.add_argument("--sob", action='store_true', dest="sob", default=False, From 41662aac5173053cdcc9b1c72dda95c902737714 Mon Sep 17 00:00:00 2001 From: nsheff Date: Mon, 26 Aug 2019 13:45:28 -0400 Subject: [PATCH 078/207] use hyphens in cmd names --- pipeline_interface.yaml | 4 ++-- pipelines/peppro.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pipeline_interface.yaml b/pipeline_interface.yaml index ecb90f4..fd81ad5 100644 --- a/pipeline_interface.yaml +++ b/pipeline_interface.yaml @@ -32,8 +32,8 @@ pipelines: "--dedup": dedup "--trimmer": trimmer "--umi": umi - "--umi_len": umi_len - "--max_len": max_len + "--umi-len": umi_len + "--max-len": max_len "--sob": sob "--scale": scale "--parts": parts diff --git a/pipelines/peppro.py b/pipelines/peppro.py index db9c91e..fa7561b 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -70,13 +70,13 @@ def parse_arguments(): dest="umi", help="Remove umi with fastp") - parser.add_argument("--umi_len", dest="umi_len", + parser.add_argument("--umi-len", default=DEFAULT_UMI_LEN, type=int, help="Specify the length of the UMI." "If your data does not utilize UMIs, set to 0. " "Default: {}".format(DEFAULT_UMI_LEN)) - parser.add_argument("--max_len", dest="max_len", + parser.add_argument("--max-len", default=DEFAULT_MAX_LEN, help="Trim reads to maximum length. " "Set to -1 to disable length trimming. " From 83203eb0af8b7294d1ee998c0cb0c6d2ff78542f Mon Sep 17 00:00:00 2001 From: nsheff Date: Mon, 26 Aug 2019 13:47:18 -0400 Subject: [PATCH 079/207] rename umi arg to uma-fastp. See #21 --- pipelines/peppro.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index fa7561b..50a417b 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -66,7 +66,7 @@ def parse_arguments(): help="Name of read trimming program. " "Default: {}".format(DEFAULT_TRIMMER)) - parser.add_argument("--umi", action='store_true', default=False, + parser.add_argument("--umi-fastp", action='store_true', default=False, dest="umi", help="Remove umi with fastp") @@ -379,7 +379,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): pm.debug("Dedup command: {}".format(dedup_cmd)) # Create trimming and reverse complementing command(s). # TODO: Can also use seqkit for these steps instead of seqtk... - if args.umi: + if args.umi_fastp: if args.adapter != "fastp": print("To remove UMI intelligently, you must process your reads using 'fastp'") print("Defaulting to removing the first {} " From 3438db5e6f9c40e70c339f7f1bfddc1fd45fa83f Mon Sep 17 00:00:00 2001 From: nsheff Date: Mon, 26 Aug 2019 13:55:26 -0400 Subject: [PATCH 080/207] help msgs --- pipelines/peppro.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 50a417b..0dd8a58 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -58,7 +58,7 @@ def parse_arguments(): parser.add_argument("--dedup", dest="dedup", default=DEFAULT_DEDUPLICATOR, choices=DEDUPLICATORS, - help="Name of program that removes duplicate reads. " + help="Program to use to duplicate reads. " "Default: {}".format(DEFAULT_DEDUPLICATOR)) parser.add_argument("--trimmer", dest="trimmer", @@ -67,8 +67,8 @@ def parse_arguments(): "Default: {}".format(DEFAULT_TRIMMER)) parser.add_argument("--umi-fastp", action='store_true', default=False, - dest="umi", - help="Remove umi with fastp") + help="Use fastp to remove UMIs. Default: Use " + "tool selected for 'trimmer' option.") parser.add_argument("--umi-len", default=DEFAULT_UMI_LEN, type=int, @@ -381,7 +381,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): # TODO: Can also use seqkit for these steps instead of seqtk... if args.umi_fastp: if args.adapter != "fastp": - print("To remove UMI intelligently, you must process your reads using 'fastp'") + print("To remove UMI intelligently, you must process adapters using 'fastp'") print("Defaulting to removing the first {} " "bp instead via trimming".format(str(args.umi_len))) if args.trimmer == "seqtk": From f3c8ba81e74ff157383eae00824f32c86f63798e Mon Sep 17 00:00:00 2001 From: nsheff Date: Mon, 26 Aug 2019 14:17:10 -0400 Subject: [PATCH 081/207] only plot complexity for files that have it. Fix #42 --- tools/PEPPRO_summarizer.R | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/tools/PEPPRO_summarizer.R b/tools/PEPPRO_summarizer.R index c89130d..75f24c3 100755 --- a/tools/PEPPRO_summarizer.R +++ b/tools/PEPPRO_summarizer.R @@ -66,18 +66,32 @@ rc <- paste(config(prj)$metadata$output_dir, paste0("QC_", samples(prj)$genome), paste0(samples(prj)$sample_name, "_preseq_counts.txt"), sep="/") + +hasBoth =file.exists(cc) & file.exists(rc) + +ccSub = cc[hasBoth] +rcSub = rc[hasBoth] +message(ccSub, rcSub) +message(paste0(length(ccSub), " of ", length(cc), " files available")) + output_name = paste(config(prj)$metadata$output_dir, "summary", paste0(config(prj)$name, "_libComplexity"), sep="/") -p <- plotComplexityCurves(ccurves = cc, coverage = 0, read_length = 0, - real_counts_path = rc, ignore_unique = FALSE) -pdf(file = paste0(tools::file_path_sans_ext(output_name), ".pdf"), - width= 10, height = 7, useDingbats=F) -print(p) -invisible(dev.off()) -png(filename = paste0(tools::file_path_sans_ext(output_name), ".png"), - width = 686, height = 480) -print(p) -invisible(dev.off()) +if (sum(hasBoth) > 0){ + + p <- plotComplexityCurves(ccurves = ccSub, coverage = 0, read_length = 0, + real_counts_path = rcSub, ignore_unique = FALSE) + + pdf(file = paste0(tools::file_path_sans_ext(output_name), ".pdf"), + width= 10, height = 7, useDingbats=F) + print(p) + invisible(dev.off()) + png(filename = paste0(tools::file_path_sans_ext(output_name), ".png"), + width = 686, height = 480) + print(p) + invisible(dev.off()) +} else { + message("No samples have available library complexity files.") +} ############################################################################### From f5c42af9c78429d984ec91b4a87013c2972816dc Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 5 Sep 2019 15:03:33 -0400 Subject: [PATCH 082/207] use cutadapt report --- pipelines/peppro.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 0dd8a58..628d0e0 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -880,13 +880,13 @@ def report_fastq(): total_bases_term = "Total basepairs processed:" ac_cmd = ("grep '" + adapter_term + "' " + - adapter_report + " | awk '{print $(NF-1)}'") + cutadapt_report + " | awk '{print $(NF-1)}'") ts_cmd = ("grep '" + too_short_term + "' " + - adapter_report + " | awk '{print $(NF-1)}'") + cutadapt_report + " | awk '{print $(NF-1)}'") bases = ("grep '" + total_bases_term + "' " + - adapter_report + " | awk '{print $(NF-1)}'") + cutadapt_report + " | awk '{print $(NF-1)}'") adapter_bases = ("awk '{sum+=$1*$2} END {printf \"%.0f\", sum}' " + - adapter_report) + cutadapt_report) else: # default to fastp adapter_term = "reads with adapter trimmed:" From c840ebcc22ae56baf3ffb8306beac8ad9c2d68d4 Mon Sep 17 00:00:00 2001 From: nsheff Date: Thu, 12 Sep 2019 13:45:18 -0400 Subject: [PATCH 083/207] change refgenie obj --- pipelines/peppro.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 628d0e0..2370409 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -1290,8 +1290,17 @@ def _add_resources(args, res): """ rgc = RGC(select_genome_config(res.get("genome_config"))) # REQ - for asset in ["chrom_sizes", BT2_IDX_KEY]: - res[asset] = rgc.get_asset(args.genome_assembly, asset) + refgenie_assets = [ + ("fasta", "chrom_sizes", None), + (BT2_IDX_KEY, None, None)] + + for asset, seek_key, tag in refgenie_assets: + if not seek_key: + res[asset] = rgc.get_asset(args.genome_assembly, asset, tag_name=tag) + else: + res[seek_key] = rgc.get_asset(args.genome_assembly, asset, + tag_name=tag, + seek_key=seek_key) for reference in args.prealignments: for asset in [BT2_IDX_KEY]: From b2a837836a800342373de08313501695dbf6503b Mon Sep 17 00:00:00 2001 From: nsheff Date: Tue, 15 Oct 2019 10:56:23 -0400 Subject: [PATCH 084/207] divide out fastp report --- pipelines/peppro.py | 72 +++++++++++++++++++++++++--------------- tools/GRO-seq_adapter.fa | 2 ++ 2 files changed, 47 insertions(+), 27 deletions(-) create mode 100644 tools/GRO-seq_adapter.fa diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 628d0e0..6b11a67 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -179,27 +179,41 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): cutadapt_folder = os.path.join(outfolder, "cutadapt") cutadapt_report = os.path.join(cutadapt_folder, args.sample_name + "_cutadapt.txt") + + fastp_folder = os.path.join(outfolder, "fastp") + + fastp_pfx_R2 = os.path.join(fastp_folder, sname + "_R2_fastp_adapter") + fastp_pfx = os.path.join(fastp_folder, sname + "_R1_fastp_adapter") + fastp_report_txt = fastp_pfx + ".txt" + fastp_report_html = fastp_pfx + ".html" + fastp_report_json = fastp_pfx + ".json" + fastp_report_txt_R2 = fastp_pfx_R2 + ".txt" + fastp_report_html_R2 = fastp_pfx_R2 + ".html" + fastp_report_json_R2 = fastp_pfx_R2 + ".json" + + noadap_fastq = os.path.join(fastq_folder, sname + "_R1_noadap.fastq") dedup_fastq = os.path.join(fastq_folder, sname + "_R1_dedup.fastq") trimmed_fastq = os.path.join(fastq_folder, sname + "_R1_trimmed.fastq") processed_fastq = os.path.join(fastq_folder, sname + "_R1_processed.fastq") - adapter_html = os.path.join(fastqc_folder, sname + "_R1_rmAdapter.html") - adapter_json = os.path.join(fastqc_folder, sname + "_R1_rmAdapter.json") - adapter_report = os.path.join(fastqc_folder, sname + "_R1_rmAdapter.txt") - umi_report = os.path.join(fastqc_folder, sname + "_R1_rmUmi.html") - umi_json = os.path.join(fastqc_folder, sname + "_R1_rmUmi.json") + # fastp_report_html = os.path.join(fastqc_folder, sname + "_R1_rmAdapter.html") + # fastp_report_json = os.path.join(fastqc_folder, sname + "_R1_rmAdapter.json") + # adapter_report = os.path.join(fastqc_folder, sname + "_R1_rmAdapter.txt") + umi_report = os.path.join(fastp_folder, sname + "_R1_rmUmi.html") + umi_json = os.path.join(fastp_folder, sname + "_R1_rmUmi.json") # PE2 names noadap_fastq_R2 = os.path.join(fastq_folder, sname + "_R2_noadap.fastq") trimmed_fastq_R2 = os.path.join(fastq_folder, sname + "_R2_trimmed.fastq") trimmed_dups_fastq_R2 = os.path.join(fastq_folder, sname + "_R2_trimmed_dups.fastq") - adapter_html_R2 = os.path.join(fastqc_folder, sname + "_R2_rmAdapter.html") - adapter_json_R2 = os.path.join(fastqc_folder, sname + "_R2_rmAdapter.json") - adapter_report_R2 = os.path.join(fastqc_folder, sname + "_R2_rmAdapter.txt") - umi_report_R2 = os.path.join(fastqc_folder, sname + "_R2_rmUmi.html") - umi_json_R2 = os.path.join(fastqc_folder, sname + "_R2_rmUmi.json") + # fastp_report_html_R2 = os.path.join(fastqc_folder, sname + "_R2_rmAdapter.html") + # fastp_report_json_R2 = os.path.join(fastqc_folder, sname + "_R2_rmAdapter.json") + # fastp_report_txt_R2 = os.path.join(fastqc_folder, sname + "_R2_rmAdapter.txt") + + umi_report_R2 = os.path.join(fastp_folder, sname + "_R2_rmUmi.html") + umi_json_R2 = os.path.join(fastp_folder, sname + "_R2_rmUmi.json") # If single-end, must use cutadapt for plotting purposes if not args.paired_end: @@ -210,6 +224,10 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): if args.adapter == "cutadapt": ngstk.make_dir(cutadapt_folder) + adapter_report = cutadapt_report + elif args.adapter == "fastp": + ngstk.make_dir(fastp_folder) + adapter_report = fastp_report_txt # Check quality encoding for use with FastX_Tools if args.trimmer == "fastx": @@ -228,16 +246,16 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): adapter_cmd_chunks.extend([ ("--adapter_sequence", "GATCGTCGGACTGTAGAACTCTGAAC"), ("--length_required", (18 + int(float(args.umi_len)))), - ("--html", adapter_html_R2), - ("--json", adapter_json_R2), + ("--html", fastp_report_html_R2), + ("--json", fastp_report_json_R2), ("--report_title", ("'" + args.sample_name + "'")) ]) else: adapter_cmd_chunks.extend([ ("--adapter_sequence", "TGGAATTCTCGGGTGCCAAGG"), ("--length_required", (18 + int(float(args.umi_len)))), - ("--html", adapter_html), - ("--json", adapter_json), + ("--html", fastp_report_html), + ("--json", fastp_report_json), ("--report_title", ("'" + args.sample_name + "'")) ]) @@ -247,7 +265,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): adapter_cmd_chunks.extend([("--stdout")]) adapter_cmd_chunks.extend([ - (") 2>", adapter_report) + (") 2>", fastp_report_txt) ]) adapter_cmd = build_command(adapter_cmd_chunks) @@ -302,16 +320,16 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): adapter_cmd_chunks.extend([ ("--adapter_sequence", "GATCGTCGGACTGTAGAACTCTGAAC"), ("--length_required", (18 + int(float(args.umi_len)))), - ("--html", adapter_html_R2), - ("--json", adapter_json_R2), + ("--html", fastp_report_html_R2), + ("--json", fastp_report_json_R2), ("--report_title", ("'" + sname + "'")) ]) else: adapter_cmd_chunks.extend([ ("--adapter_sequence", "TGGAATTCTCGGGTGCCAAGG"), ("--length_required", (18 + int(float(args.umi_len)))), - ("--html", adapter_html), - ("--json", adapter_json), + ("--html", fastp_report_html), + ("--json", fastp_report_json), ("--report_title", ("'" + sname + "'")) ]) @@ -321,7 +339,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): adapter_cmd_chunks.extend([("--stdout")]) adapter_cmd_chunks.extend([ - (") 2>", adapter_report) + (") 2>", fastp_report_txt) ]) adapter_cmd = build_command(adapter_cmd_chunks) @@ -894,15 +912,15 @@ def report_fastq(): total_bases_term = "total bases:" ac_cmd = ("grep '" + adapter_term + "' " + - adapter_report + " | head -n 1 | awk '{print $NF}'") + fastp_report_txt + " | head -n 1 | awk '{print $NF}'") ts_cmd = ("grep '" + too_short_term + "' " + - adapter_report + " | head -n 1 | awk '{print $NF}'") + fastp_report_txt + " | head -n 1 | awk '{print $NF}'") bases = ("grep '" + total_bases_term + "' " + - adapter_report + " | head -n 1 | awk '{print $NF}'") + fastp_report_txt + " | head -n 1 | awk '{print $NF}'") adapter_bases = ("grep 'bases trimmed due to adapters:' " + - adapter_report + " | awk '{print $NF}'") + fastp_report_txt + " | awk '{print $NF}'") - pm.report_object("FastP_report", adapter_html) + pm.report_object("FastP_report", fastp_report_html) ac = float(pm.checkprint(ac_cmd).replace(',','')) pm.report_result("Reads_with_adapter", ac) @@ -924,7 +942,7 @@ def report_fastq(): # cutadapt directs its report to stderr if the command lacks # a -o and the actual reads are directed to stdout. process_fastq_cmd2 = build_command([ - "(", adapter_cmd, "|", trim_cmd2, ") 2> ", cutadapt_report]) + "(", adapter_cmd, "|", trim_cmd2, ") 2> ", adapter_report]) #print("process_fastq_cmd2: {}".format(process_fastq_cmd2)) pm.run(process_fastq_cmd2, trimmed_fastq_R2) cp_cmd = ("cp " + trimmed_fastq_R2 + " " + trimmed_dups_fastq_R2) @@ -942,7 +960,7 @@ def report_fastq(): return processed_fastq, trimmed_fastq else: process_fastq_cmd = build_command([ - "(", adapter_cmd, "|", trim_cmd1, ") 2> ", cutadapt_report]) + "(", adapter_cmd, "|", trim_cmd1, ") 2> ", adapter_report]) pm.run(process_fastq_cmd, processed_fastq, follow=ngstk.check_trim(processed_fastq, False, None)) return processed_fastq diff --git a/tools/GRO-seq_adapter.fa b/tools/GRO-seq_adapter.fa new file mode 100644 index 0000000..a4868ec --- /dev/null +++ b/tools/GRO-seq_adapter.fa @@ -0,0 +1,2 @@ +>5prime +TGGAATTCTCGGGTGCCAAGG \ No newline at end of file From 6927b49b498f917dd5d20823a77579b4015a6fde Mon Sep 17 00:00:00 2001 From: nsheff Date: Tue, 15 Oct 2019 12:02:51 -0400 Subject: [PATCH 085/207] new way to check assets --- pipelines/peppro.py | 238 +++++++++++++++++++++++++------------------- 1 file changed, 138 insertions(+), 100 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 9e929a3..b00ffca 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -1312,6 +1312,9 @@ def _add_resources(args, res): ("fasta", "chrom_sizes", None), (BT2_IDX_KEY, None, None)] + + # Loop to find missing assets + for asset, seek_key, tag in refgenie_assets: if not seek_key: res[asset] = rgc.get_asset(args.genome_assembly, asset, tag_name=tag) @@ -1325,106 +1328,140 @@ def _add_resources(args, res): res[asset] = rgc.get_asset(reference, asset) # OPT - msg = "The '{}' asset is not present in your REFGENIE config file." - err = "The '{}' asset does not exist." - - asset = "refgene_tss" - if args.TSS_name: - res[asset] = os.path.abspath(args.TSS_name) - else: - try: - res[asset] = rgc.get_asset(args.genome_assembly, asset) - except KeyError: - print(msg.format(asset)) - except: - msg = ("Update your REFGENIE config file to include this asset, or " - "point directly to the file using --TSS-name.\n") - print(err.format(asset)) - print(msg) - - asset = "ensembl_tss" - if args.ensembl_tss: - res[asset] = os.path.abspath(args.ensembl_tss) - else: - try: - res[asset] = rgc.get_asset(args.genome_assembly, asset) - except KeyError: - print(msg.format(asset)) - except: - msg = ("Update your REFGENIE config file to include this asset, or " - "point directly to the file using --pi-tss.\n") - print(err.format(asset)) - print(msg) - - asset = "ensembl_gene_body" - if args.ensembl_gene_body: - res[asset] = os.path.abspath(args.ensembl_gene_body) - else: - try: - res[asset] = rgc.get_asset(args.genome_assembly, asset) - except KeyError: - print(msg.format(asset)) - except: - msg = ("Update your REFGENIE config file to include this asset, or " - "point directly to the file using --pi-body.\n") - print(err.format(asset)) - print(msg) - - asset = "refgene_pre_mRNA" - if args.pre_name: - res[asset] = os.path.abspath(args.pre_name) - else: - try: - res[asset] = rgc.get_asset(args.genome_assembly, asset) - except KeyError: - print(msg.format(asset)) - except: - msg = ("Update your REFGENIE config file to include this asset, or " - "point directly to the file using --pre-name.\n") - print(err.format(asset)) - print(msg) - - asset = "feat_annotation" - if args.anno_name: - res[asset] = os.path.abspath(args.anno_name) - else: - try: - res[asset] = rgc.get_asset(args.genome_assembly, asset) - except KeyError: - print(msg.format(asset)) - except: - msg = ("Update your REFGENIE config file to include this asset, or " - "point directly to the file using --anno-name.\n") - print(err.format(asset)) - print(msg) - - asset = "refgene_exon" - if args.exon_name: - res[asset] = os.path.abspath(args.exon_name) - else: - try: - res[asset] = rgc.get_asset(args.genome_assembly, asset) - except KeyError: - print(msg.format(asset)) - except: - msg = ("Update your REFGENIE config file to include this asset, or " - "point directly to the file using --exon-name.\n") - print(err.format(asset)) - print(msg) - - asset = "refgene_intron" - if args.intron_name: - res[asset] = os.path.abspath(args.intron_name) - else: - try: - res[asset] = rgc.get_asset(args.genome_assembly, asset) - except KeyError: - print(msg.format(asset)) - except: - msg = ("Update your REFGENIE config file to include this asset, or " - "point directly to the file using --intron-name.\n") - print(err.format(asset)) - print(msg) + check_list = [ + {"asset":"refgene_tss", "arg":"TSS_name", "user_arg":"TSS-name"}, + {"asset":"ensembl_tss", "arg":"ensembl_tss", "user_arg":"pi-tss"}, + {"asset":"ensembl_gene_body", "arg":"ensembl_gene_body", "user_arg":"pi-body"}, + {"asset":"refgene_pre_mRNA", "arg":"pre_name", "user_arg":"pre-name"}, + {"asset":"feat_annotation", "arg":"anno_name", "user_arg":"anno-name"}, + {"asset":"refgene_exon", "arg":"exon_name", "user_arg":"exon-name"}, + {"asset":"refgene_intron", "arg":"intron_name", "user_arg":"intron-name"} + ] + + key_errors = [] + exist_errors = [] + for item in check_list: + asset = item["asset"] + arg = item["arg"] + user_arg = item["user_arg"] + if hasattr(args, arg) and getattr(args, arg): + res[asset] = os.path.abspath(getattr(args, arg)) + else: + try: + res[asset] = rgc.get_asset(args.genome_assembly, asset) + except KeyError: + key_errors.append(item) + except: + exist_errors.append(item) + + if len(key_errors) > 0 or len(exist_errors) > 0: + print("Some assets are not found. You can update your REFGENIE config" + " file or point directly to the file using the noted command-line arguments:") + + if len(key_errors) > 0: + print(" Assets missing from REFGENIE config file: {}".format(", ".join(key_errors))) + + if len(exist_errors) > 0: + print(" Assets not existing: {}".format(", ".join(["{asset} (--{user_arg})".format(**x) for x in exist_errors]))) + + + # asset = "refgene_tss" + # if args.TSS_name: + # res[asset] = os.path.abspath(args.TSS_name) + # else: + # try: + # res[asset] = rgc.get_asset(args.genome_assembly, asset) + # except KeyError: + # print(msg.format(asset)) + # except: + # msg = ("Update your REFGENIE config file to include this asset, or " + # "point directly to the file using --TSS-name.\n") + # print(err.format(asset)) + # print(msg) + + # asset = "ensembl_tss" + # if args.ensembl_tss: + # res[asset] = os.path.abspath(args.ensembl_tss) + # else: + # try: + # res[asset] = rgc.get_asset(args.genome_assembly, asset) + # except KeyError: + # print(msg.format(asset)) + # except: + # msg = ("Update your REFGENIE config file to include this asset, or " + # "point directly to the file using --pi-tss.\n") + # print(err.format(asset)) + # print(msg) + + # asset = "ensembl_gene_body" + # if args.ensembl_gene_body: + # res[asset] = os.path.abspath(args.ensembl_gene_body) + # else: + # try: + # res[asset] = rgc.get_asset(args.genome_assembly, asset) + # except KeyError: + # print(msg.format(asset)) + # except: + # msg = ("Update your REFGENIE config file to include this asset, or " + # "point directly to the file using --pi-body.\n") + # print(err.format(asset)) + # print(msg) + + # asset = "refgene_pre_mRNA" + # if args.pre_name: + # res[asset] = os.path.abspath(args.pre_name) + # else: + # try: + # res[asset] = rgc.get_asset(args.genome_assembly, asset) + # except KeyError: + # print(msg.format(asset)) + # except: + # msg = ("Update your REFGENIE config file to include this asset, or " + # "point directly to the file using --pre-name.\n") + # print(err.format(asset)) + # print(msg) + + # asset = "feat_annotation" + # if args.anno_name: + # res[asset] = os.path.abspath(args.anno_name) + # else: + # try: + # res[asset] = rgc.get_asset(args.genome_assembly, asset) + # except KeyError: + # print(msg.format(asset)) + # except: + # msg = ("Update your REFGENIE config file to include this asset, or " + # "point directly to the file using --anno-name.\n") + # print(err.format(asset)) + # print(msg) + + # asset = "refgene_exon" + # if args.exon_name: + # res[asset] = os.path.abspath(args.exon_name) + # else: + # try: + # res[asset] = rgc.get_asset(args.genome_assembly, asset) + # except KeyError: + # print(msg.format(asset)) + # except: + # msg = ("Update your REFGENIE config file to include this asset, or " + # "point directly to the file using --exon-name.\n") + # print(err.format(asset)) + # print(msg) + + # asset = "refgene_intron" + # if args.intron_name: + # res[asset] = os.path.abspath(args.intron_name) + # else: + # try: + # res[asset] = rgc.get_asset(args.genome_assembly, asset) + # except KeyError: + # print(msg.format(asset)) + # except: + # msg = ("Update your REFGENIE config file to include this asset, or " + # "point directly to the file using --intron-name.\n") + # print(err.format(asset)) + # print(msg) # res.rgc = rgc return res, rgc @@ -2112,6 +2149,7 @@ def check_alignment_genome(temp_bam, bam): bamQC = os.path.join(QC_folder, args.sample_name + "_bamQC.tsv") cmd = tool_path("bamQC.py") + cmd += " --silent" cmd += " -i " + mapping_genome_bam cmd += " -c " + str(pm.cores) cmd += " -o " + bamQC From 25ac97fb79584ece8f011481410f3a76cbc4ecbe Mon Sep 17 00:00:00 2001 From: nsheff Date: Mon, 21 Oct 2019 10:26:45 -0400 Subject: [PATCH 086/207] update key tags --- pipelines/peppro.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 9e929a3..9f34066 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -1309,8 +1309,8 @@ def _add_resources(args, res): rgc = RGC(select_genome_config(res.get("genome_config"))) # REQ refgenie_assets = [ - ("fasta", "chrom_sizes", None), - (BT2_IDX_KEY, None, None)] + ("fasta", "chrom_sizes", "default"), + (BT2_IDX_KEY, None, "default")] for asset, seek_key, tag in refgenie_assets: if not seek_key: From cff8f43a095b04846745cca658c000a0da582570 Mon Sep 17 00:00:00 2001 From: nsheff Date: Mon, 21 Oct 2019 10:28:08 -0400 Subject: [PATCH 087/207] make bamqc silent --- pipelines/peppro.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 9f34066..d4cf85a 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -2115,6 +2115,7 @@ def check_alignment_genome(temp_bam, bam): cmd += " -i " + mapping_genome_bam cmd += " -c " + str(pm.cores) cmd += " -o " + bamQC + cmd += " --silent" def report_bam_qc(bamqc_log): # Reported BAM QC metrics via the bamQC metrics file From 4df28d3e7e6ec6d36bee384a50c46f1aab101bdd Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Tue, 29 Oct 2019 11:01:41 -0400 Subject: [PATCH 088/207] change settings --- examples/meta/peppro_test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/meta/peppro_test.yaml b/examples/meta/peppro_test.yaml index 9716332..9b71c33 100644 --- a/examples/meta/peppro_test.yaml +++ b/examples/meta/peppro_test.yaml @@ -15,7 +15,7 @@ implied_columns: organism: human: genome: hg38 - prealignments: human_rDNA rCRSd + prealignments: human_rDNA adapter: fastp # Default dedup: seqkit # Default trimmer: seqtk # Default From 23ca633d8e3cec0e6dd1aaf8580cd1475004b6c1 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Tue, 29 Oct 2019 11:02:03 -0400 Subject: [PATCH 089/207] rework _process_fastq into multiple sub-functions --- pipelines/peppro.py | 576 +++++++++++++++++++++++++------------------- 1 file changed, 331 insertions(+), 245 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 346dad2..ccfdff3 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -158,63 +158,39 @@ def parse_arguments(): return args -def _process_fastq(args, tools, paired_end, fq_file, outfolder): +def _remove_adapters(args, tools, read2, fq_file, outfolder): """ - A helper function to prepare read files for downstream processing. + A helper function to build a command for adapter removal. :param argparse.Namespace args: binding between option name and argument, e.g. from parsing command-line options :param looper.models.AttributeDict tools: binding between tool name and value, e.g. for tools/resources used by the pipeline - :param bool paired_end: if True, use paired-end processing + :param bool read2: if True, do not deduplicate and do not retain + intermediate files :param str fq_file: path to FASTQ file :param str outfolder: path to output directory for the pipeline - :return (str, str): pair (R1, R2) of paths to FASTQ files + :return str: command to remove adapters """ - # Create names for processed FASTQ files. - fastq_folder = os.path.join(outfolder, "fastq") - fastqc_folder = os.path.join(outfolder, "fastqc") + sname = args.sample_name # for concise code cutadapt_folder = os.path.join(outfolder, "cutadapt") - cutadapt_report = os.path.join(cutadapt_folder, args.sample_name + "_cutadapt.txt") + cutadapt_report = os.path.join(cutadapt_folder, sname + "_cutadapt.txt") + fastp_folder = os.path.join(outfolder, "fastp") + fastq_folder = os.path.join(outfolder, "fastq") + noadap_fastq = os.path.join(fastq_folder, sname + "_R1_noadap.fastq") - fastp_folder = os.path.join(outfolder, "fastp") - - fastp_pfx_R2 = os.path.join(fastp_folder, sname + "_R2_fastp_adapter") fastp_pfx = os.path.join(fastp_folder, sname + "_R1_fastp_adapter") + fastp_pfx_R2 = os.path.join(fastp_folder, sname + "_R2_fastp_adapter") + fastp_report_txt = fastp_pfx + ".txt" fastp_report_html = fastp_pfx + ".html" fastp_report_json = fastp_pfx + ".json" - fastp_report_txt_R2 = fastp_pfx_R2 + ".txt" fastp_report_html_R2 = fastp_pfx_R2 + ".html" fastp_report_json_R2 = fastp_pfx_R2 + ".json" - - noadap_fastq = os.path.join(fastq_folder, sname + "_R1_noadap.fastq") - dedup_fastq = os.path.join(fastq_folder, sname + "_R1_dedup.fastq") - trimmed_fastq = os.path.join(fastq_folder, sname + "_R1_trimmed.fastq") - processed_fastq = os.path.join(fastq_folder, sname + "_R1_processed.fastq") - - # fastp_report_html = os.path.join(fastqc_folder, sname + "_R1_rmAdapter.html") - # fastp_report_json = os.path.join(fastqc_folder, sname + "_R1_rmAdapter.json") - # adapter_report = os.path.join(fastqc_folder, sname + "_R1_rmAdapter.txt") - umi_report = os.path.join(fastp_folder, sname + "_R1_rmUmi.html") - umi_json = os.path.join(fastp_folder, sname + "_R1_rmUmi.json") - - # PE2 names - noadap_fastq_R2 = os.path.join(fastq_folder, sname + "_R2_noadap.fastq") - trimmed_fastq_R2 = os.path.join(fastq_folder, sname + "_R2_trimmed.fastq") - trimmed_dups_fastq_R2 = os.path.join(fastq_folder, sname + "_R2_trimmed_dups.fastq") - - # fastp_report_html_R2 = os.path.join(fastqc_folder, sname + "_R2_rmAdapter.html") - # fastp_report_json_R2 = os.path.join(fastqc_folder, sname + "_R2_rmAdapter.json") - # fastp_report_txt_R2 = os.path.join(fastqc_folder, sname + "_R2_rmAdapter.txt") - - umi_report_R2 = os.path.join(fastp_folder, sname + "_R2_rmUmi.html") - umi_json_R2 = os.path.join(fastp_folder, sname + "_R2_rmUmi.json") - # If single-end, must use cutadapt for plotting purposes if not args.paired_end: if args.adapter != "cutadapt": @@ -222,6 +198,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): " for single end data. Overriding.".format(args.adapter)) args.adapter = "cutadapt" + # Setup report output folders if args.adapter == "cutadapt": ngstk.make_dir(cutadapt_folder) adapter_report = cutadapt_report @@ -233,7 +210,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): if args.trimmer == "fastx": encoding = _guess_encoding(fq_file) #print("Encoding: {}".format(str(encoding))) # DEBUG - + # Create adapter trimming command(s). if args.adapter == "fastp": adapter_cmd_chunks = [ @@ -242,13 +219,13 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ("--thread", str(pm.cores)), ("--in1", fq_file) ] - if paired_end: + if read2: adapter_cmd_chunks.extend([ ("--adapter_sequence", "GATCGTCGGACTGTAGAACTCTGAAC"), ("--length_required", (18 + int(float(args.umi_len)))), ("--html", fastp_report_html_R2), ("--json", fastp_report_json_R2), - ("--report_title", ("'" + args.sample_name + "'")) + ("--report_title", ("'" + sname + "'")) ]) else: adapter_cmd_chunks.extend([ @@ -256,10 +233,11 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ("--length_required", (18 + int(float(args.umi_len)))), ("--html", fastp_report_html), ("--json", fastp_report_json), - ("--report_title", ("'" + args.sample_name + "'")) + ("--report_title", ("'" + sname + "'")) ]) - - if args.complexity and not paired_end: + # If calculating library complexity and this is read 1 or single-end, + # must produce an intermediate file. + if args.complexity and args.umi_len > 0 and not read2 : adapter_cmd_chunks.extend([("-o", noadap_fastq)]) else: adapter_cmd_chunks.extend([("--stdout")]) @@ -272,7 +250,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): elif args.adapter == "cutadapt": cut_version = float(pm.checkprint("cutadapt --version")) - if paired_end: + if read2: adapter_cmd_chunks = [tools.cutadapt] # old versions of cutadapt can not use multiple cores if cut_version >= 1.15: @@ -316,7 +294,7 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ("--thread", str(pm.cores)), ("--in1", fq_file) ] - if paired_end: + if read2: adapter_cmd_chunks.extend([ ("--adapter_sequence", "GATCGTCGGACTGTAGAACTCTGAAC"), ("--length_required", (18 + int(float(args.umi_len)))), @@ -332,8 +310,9 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ("--json", fastp_report_json), ("--report_title", ("'" + sname + "'")) ]) - - if args.complexity and not paired_end: + # If calculating library complexity and this is read 1 or single-end, + # must produce a physical output file. + if args.complexity and not read2: adapter_cmd_chunks.extend([("-o", noadap_fastq)]) else: adapter_cmd_chunks.extend([("--stdout")]) @@ -344,8 +323,27 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): adapter_cmd = build_command(adapter_cmd_chunks) + return adapter_cmd + + +def _deduplicate(args, tools, fq_file, outfolder): + """ + A helper function to build a command for deduplication. + + :param argparse.Namespace args: binding between option name and argument, + e.g. from parsing command-line options + :param looper.models.AttributeDict tools: binding between tool name and + value, e.g. for tools/resources used by the pipeline + :param str fq_file: path to FASTQ file + :param str outfolder: path to output directory for the pipeline + :return str: command to remove adapters + """ + sname = args.sample_name # for concise code + fastq_folder = os.path.join(outfolder, "fastq") + noadap_fastq = os.path.join(fastq_folder, sname + "_R1_noadap.fastq") + dedup_fastq = os.path.join(fastq_folder, sname + "_R1_dedup.fastq") # Create deduplication command(s). - if not paired_end and not args.umi_len <= 0: + if args.complexity and args.umi_len > 0: if args.dedup == "seqkit": dedup_cmd_chunks = [ (tools.seqkit, "rmdup"), @@ -354,26 +352,18 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): "--ignore-case", "-o" ] - if args.complexity and args.umi_len > 0: + if args.complexity: dedup_cmd_chunks.extend([ (dedup_fastq, noadap_fastq) ]) else: dedup_cmd_chunks.extend(["-"]) - dedup_cmd = build_command(dedup_cmd_chunks) - elif args.dedup == "fqdedup": dedup_cmd_chunks = [tools.fqdedup] - if args.complexity and args.umi_len > 0: - dedup_cmd_chunks.extend([("-i", noadap_fastq)]) - dedup_cmd_chunks.extend([("-o", dedup_fastq)]) - else: - dedup_cmd_chunks.extend([("-i", "-")]) - dedup_cmd_chunks.extend([("-o", "-")]) - + dedup_cmd_chunks.extend([("-i", noadap_fastq)]) + dedup_cmd_chunks.extend([("-o", dedup_fastq)]) dedup_cmd = build_command(dedup_cmd_chunks) - else: # Default to seqkit dedup_cmd_chunks = [ @@ -383,27 +373,55 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): "--ignore-case", "-o" ] - if args.complexity and args.umi_len > 0: - dedup_cmd_chunks.extend([ - (dedup_fastq, noadap_fastq) - ]) - else: - dedup_cmd_chunks.extend(["-"]) - + dedup_cmd_chunks.extend([ + (dedup_fastq, noadap_fastq) + ]) dedup_cmd = build_command(dedup_cmd_chunks) else: + # Don't deduplicate a read2 file nor deduplicate if there are no UMI's dedup_cmd = "" - pm.debug("Dedup command: {}".format(dedup_cmd)) + return dedup_cmd + + +def _trim_reads(args, tools, read2, fq_file, outfolder): + """ + A helper function to build a command for read trimming. + + :param argparse.Namespace args: binding between option name and argument, + e.g. from parsing command-line options + :param looper.models.AttributeDict tools: binding between tool name and + value, e.g. for tools/resources used by the pipeline + :param bool read2: if True, do not deduplicate and do not retain + intermediate files + :param str fq_file: path to FASTQ file + :param str outfolder: path to output directory for the pipeline + :return str: command to remove adapters + """ + sname = args.sample_name # for concise code + fastq_folder = os.path.join(outfolder, "fastq") + fastp_folder = os.path.join(outfolder, "fastp") + + trimmed_fastq = os.path.join(fastq_folder, sname + "_R1_trimmed.fastq") + processed_fastq = os.path.join(fastq_folder, sname + "_R1_processed.fastq") + umi_report = os.path.join(fastp_folder, sname + "_R1_rmUmi.html") + umi_json = os.path.join(fastp_folder, sname + "_R1_rmUmi.json") + + # TODO: split into two paths, one for read1 and one for read2? + trimmed_fastq_R2 = os.path.join(fastq_folder, sname + "_R2_trimmed.fastq") + trimmed_dups_fastq_R2 = os.path.join(fastq_folder, sname + "_R2_trimmed_dups.fastq") + umi_report_R2 = os.path.join(fastp_folder, sname + "_R2_rmUmi.html") + umi_json_R2 = os.path.join(fastp_folder, sname + "_R2_rmUmi.json") + # Create trimming and reverse complementing command(s). # TODO: Can also use seqkit for these steps instead of seqtk... - if args.umi_fastp: - if args.adapter != "fastp": - print("To remove UMI intelligently, you must process adapters using 'fastp'") - print("Defaulting to removing the first {} " - "bp instead via trimming".format(str(args.umi_len))) - if args.trimmer == "seqtk": - if paired_end: + if read2: + if args.umi_fastp: + if args.adapter != "fastp": + print("To remove UMI intelligently, you must process adapters using 'fastp'") + print("Defaulting to removing the first {} " + "bp instead via trimming".format(str(args.umi_len))) + if args.trimmer == "seqtk": trim_cmd_chunks_R2 = [ tools.seqtk, "trimfq", @@ -421,8 +439,169 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ("seq", "-r"), ("-", ">"), trimmed_fastq_R2 - ]) + ]) + elif args.trimmer == "fastx": + trim_tool = tools.fastx + "_trimmer" + rc_tool = tools.fastx + "_reverse_complement" + trim_cmd_chunks = [trim_tool] + + if encoding == "Illumina-1.8": + trim_cmd_chunks.extend([ + ("-Q", str(33)) + ]) + trim_cmd_chunks.extend([ + ("-f", str(int(float(args.umi_len)) + 1)) + ]) + if args.max_len != -1: + trim_cmd_chunks.extend([ + ("-l", (str(int(float(args.max_len)) + int(float(args.umi_len))))) + ]) + trim_cmd_chunks_R2 = [trim_tool] + if encoding == "Illumina-1.8": + trim_cmd_chunks_R2.extend([ + ("-Q", str(33)) + ]) + trim_cmd_chunks_R2.extend([ + ("-t", str(int(float(args.umi_len)))) + ]) + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks_R2.extend([ + ("-o", trimmed_fastq_R2) + ]) + else: + trim_cmd_chunks_R2.extend([ + ("|", rc_tool) + ]) + if encoding == "Illumina-1.8": + trim_cmd_chunks_R2.extend([ + ("-Q", str(33)) + ]) + trim_cmd_chunks_R2.extend([ + ("-o", trimmed_fastq_R2) + ]) + else: + # Default to seqtk + trim_cmd_chunks_R2 = [ + tools.seqtk, + "trimfq", + ("-e", str(args.umi_len)) + ] + if args.max_len != -1: + trim_cmd_chunks_R2.extend([ + ("-L", str(args.max_len)) + ]) + trim_cmd_chunks_R2.extend(["-"]) + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks_R2.extend([ + (">", trimmed_fastq_R2) + ]) + else: + trim_cmd_chunks_R2.extend(["|"]) + trim_cmd_chunks_R2.extend([ + tools.seqtk, + ("seq", "-r"), + ("-", ">"), + trimmed_fastq_R2 + ]) + else: + trim_cmd_chunks_R2 = [ + tools.fastp, + ("--thread", str(pm.cores)), + ("--stdin", "--stdout"), + "--umi", + ("--umi_loc", "paired_end"), + ("--umi_len", args.umi_len), + ("--html", umi_report_R2), + ("--json", umi_json_R2), + "|", + (tools.seqtk, "trimfq") + ] + if args.max_len != -1: + trim_cmd_chunks_R2.extend([ + ("-L", args.max_len) + ]) + trim_cmd_chunks_R2.extend(["-"]) + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks_R2.extend([ + (">", trimmed_fastq_R2) + ]) + else: + trim_cmd_chunks_R2.extend([ + "|", + (tools.seqtk, "seq"), + ("-r", "-"), + (">", trimmed_fastq_R2) + ]) + else: + if args.trimmer == "seqtk": + trim_cmd_chunks_R2 = [ + tools.seqtk, + "trimfq", + ("-e", str(args.umi_len)) + ] + trim_cmd_chunks_R2.extend(["-"]) + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks_R2.extend([ + (">", trimmed_fastq_R2) + ]) + else: + trim_cmd_chunks_R2.extend([ + "|", + (tools.seqtk, "seq"), + ("-r", "-"), + (">", trimmed_fastq_R2) + ]) + elif args.trimmer == "fastx": + trim_tool = tools.fastx + "_trimmer" + rc_tool = tools.fastx + "_reverse_complement" + trim_cmd_chunks = [trim_tool] + if encoding == "Illumina-1.8": + trim_cmd_chunks.extend([ + ("-Q", str(33)) + ]) + trim_cmd_chunks.extend([ + ("-f", str(int(float(args.umi_len)) + 1)) + ]) + if args.max_len != -1: + trim_cmd_chunks.extend([ + ("-l", (str(int(float(args.max_len)) + int(float(args.umi_len))))) + ]) + trim_cmd_chunks_R2 = [trim_tool] + if encoding == "Illumina-1.8": + trim_cmd_chunks_R2.extend([ + ("-Q", str(33)) + ]) + trim_cmd_chunks_R2.extend([ + ("-t", str(int(float(args.umi_len)))) + ]) + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks_R2.extend([ + ("-o", trimmed_fastq_R2) + ]) else: + trim_cmd_chunks_R2.extend([ + ("|", rc_tool) + ]) + if encoding == "Illumina-1.8": + trim_cmd_chunks_R2.extend([ + ("-Q", str(33)) + ]) + trim_cmd_chunks_R2.extend([ + ("-o", trimmed_fastq_R2) + ]) + else: + pm.fail_pipeline(RuntimeError("I don't understand '{}' for args.trimmer ".format(args.trimmer))) + + trim_cmd = build_command(trim_cmd_chunks_R2) + return trim_cmd + # If args.complexity and args.umi_len > 0 retain intermediate files + else: + if args.umi_fastp: + if args.adapter != "fastp": + print("To remove UMI intelligently, you must process adapters using 'fastp'") + print("Defaulting to removing the first {} " + "bp instead via trimming".format(str(args.umi_len))) + if args.trimmer == "seqtk": trim_cmd_chunks = [ tools.seqtk, "trimfq", @@ -464,48 +643,22 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ("-", ">"), trimmed_fastq ]) + elif args.trimmer == "fastx": + trim_tool = tools.fastx + "_trimmer" + rc_tool = tools.fastx + "_reverse_complement" + trim_cmd_chunks = [trim_tool] - elif args.trimmer == "fastx": - trim_tool = tools.fastx + "_trimmer" - rc_tool = tools.fastx + "_reverse_complement" - trim_cmd_chunks = [trim_tool] - - if encoding == "Illumina-1.8": - trim_cmd_chunks.extend([ - ("-Q", str(33)) - ]) - trim_cmd_chunks.extend([ - ("-f", str(int(float(args.umi_len)) + 1)) - ]) - if args.max_len != -1: - trim_cmd_chunks.extend([ - ("-l", (str(int(float(args.max_len)) + int(float(args.umi_len))))) - ]) - if paired_end: - trim_cmd_chunks_R2 = [trim_tool] if encoding == "Illumina-1.8": - trim_cmd_chunks_R2.extend([ + trim_cmd_chunks.extend([ ("-Q", str(33)) ]) - trim_cmd_chunks_R2.extend([ - ("-t", str(int(float(args.umi_len)))) + trim_cmd_chunks.extend([ + ("-f", str(int(float(args.umi_len)) + 1)) ]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks_R2.extend([ - ("-o", trimmed_fastq_R2) - ]) - else: - trim_cmd_chunks_R2.extend([ - ("|", rc_tool) - ]) - if encoding == "Illumina-1.8": - trim_cmd_chunks_R2.extend([ - ("-Q", str(33)) - ]) - trim_cmd_chunks_R2.extend([ - ("-o", trimmed_fastq_R2) + if args.max_len != -1: + trim_cmd_chunks.extend([ + ("-l", (str(int(float(args.max_len)) + int(float(args.umi_len))))) ]) - else: if args.complexity and args.umi_len > 0: # Need undeduplicated results for complexity calculation #trim_cmd_chunks_nodedup = trim_cmd_chunks.copy() #python3 @@ -541,33 +694,8 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): trim_cmd_chunks_nodedup.extend([ ("-o", trimmed_fastq) ]) - - else: - # Default to seqtk - if paired_end: - trim_cmd_chunks_R2 = [ - tools.seqtk, - "trimfq", - ("-e", str(args.umi_len)) - ] - if args.max_len != -1: - trim_cmd_chunks_R2.extend([ - ("-L", str(args.max_len)) - ]) - trim_cmd_chunks_R2.extend(["-"]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks_R2.extend([ - (">", trimmed_fastq_R2) - ]) - else: - trim_cmd_chunks_R2.extend(["|"]) - trim_cmd_chunks_R2.extend([ - tools.seqtk, - ("seq", "-r"), - ("-", ">"), - trimmed_fastq_R2 - ]) else: + # Default to seqtk trim_cmd_chunks = [ tools.seqtk, "trimfq", @@ -608,36 +736,6 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ("-", ">"), trimmed_fastq ]) - else: - if paired_end: - trim_cmd_chunks_R2 = [ - tools.fastp, - ("--thread", str(pm.cores)), - ("--stdin", "--stdout"), - "--umi", - ("--umi_loc", "paired_end"), - ("--umi_len", args.umi_len), - ("--html", umi_report_R2), - ("--json", umi_json_R2), - "|", - (tools.seqtk, "trimfq") - ] - if args.max_len != -1: - trim_cmd_chunks_R2.extend([ - ("-L", args.max_len) - ]) - trim_cmd_chunks_R2.extend(["-"]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks_R2.extend([ - (">", trimmed_fastq_R2) - ]) - else: - trim_cmd_chunks_R2.extend([ - "|", - (tools.seqtk, "seq"), - ("-r", "-"), - (">", trimmed_fastq_R2) - ]) else: if args.complexity and args.umi_len > 0: trim_cmd_chunks = [ @@ -729,28 +827,9 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ("-r", "-"), (">", processed_fastq) ]) - - else: - if args.trimmer == "seqtk": - if paired_end: - trim_cmd_chunks_R2 = [ - tools.seqtk, - "trimfq", - ("-e", str(args.umi_len)) - ] - trim_cmd_chunks_R2.extend(["-"]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks_R2.extend([ - (">", trimmed_fastq_R2) - ]) - else: - trim_cmd_chunks_R2.extend([ - "|", - (tools.seqtk, "seq"), - ("-r", "-"), - (">", trimmed_fastq_R2) - ]) - else: + # Do not remove umi using fastp + else: + if args.trimmer == "seqtk": trim_cmd_chunks = [ tools.seqtk, "trimfq", @@ -800,48 +879,21 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ("-r", "-"), (">", processed_fastq) ]) - - elif args.trimmer == "fastx": - trim_tool = tools.fastx + "_trimmer" - rc_tool = tools.fastx + "_reverse_complement" - trim_cmd_chunks = [trim_tool] - if encoding == "Illumina-1.8": - trim_cmd_chunks.extend([ - ("-Q", str(33)) - ]) - trim_cmd_chunks.extend([ - ("-f", str(int(float(args.umi_len)) + 1)) - ]) - if args.max_len != -1: - trim_cmd_chunks.extend([ - ("-l", (str(int(float(args.max_len)) + int(float(args.umi_len))))) - ]) - - if paired_end: - trim_cmd_chunks_R2 = [trim_tool] + elif args.trimmer == "fastx": + trim_tool = tools.fastx + "_trimmer" + rc_tool = tools.fastx + "_reverse_complement" + trim_cmd_chunks = [trim_tool] if encoding == "Illumina-1.8": - trim_cmd_chunks_R2.extend([ + trim_cmd_chunks.extend([ ("-Q", str(33)) ]) - trim_cmd_chunks_R2.extend([ - ("-t", str(int(float(args.umi_len)))) + trim_cmd_chunks.extend([ + ("-f", str(int(float(args.umi_len)) + 1)) ]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks_R2.extend([ - ("-o", trimmed_fastq_R2) - ]) - else: - trim_cmd_chunks_R2.extend([ - ("|", rc_tool) - ]) - if encoding == "Illumina-1.8": - trim_cmd_chunks_R2.extend([ - ("-Q", str(33)) - ]) - trim_cmd_chunks_R2.extend([ - ("-o", trimmed_fastq_R2) + if args.max_len != -1: + trim_cmd_chunks.extend([ + ("-l", (str(int(float(args.max_len)) + int(float(args.umi_len))))) ]) - else: if args.complexity and args.umi_len > 0: # Need undeduplicated results for complexity calculation #trim_cmd_chunks_nodedup = trim_cmd_chunks.copy() #python3 @@ -877,16 +929,54 @@ def _process_fastq(args, tools, paired_end, fq_file, outfolder): ("-o", trimmed_fastq) ]) - else: - pm.fail_pipeline(RuntimeError("I don't understand '{}' for args.trimmer ".format(args.trimmer))) - # This should never happen... - - if paired_end: - trim_cmd2 = build_command(trim_cmd_chunks_R2) - else: - trim_cmd1 = build_command(trim_cmd_chunks) + trim_cmd = build_command(trim_cmd_chunks) + pm.info("trim_cmd: {}".format(build_command(trim_cmd_chunks))) if args.complexity and args.umi_len > 0: - trim_cmd_nodedup = build_command(trim_cmd_chunks_nodedup) + trim_cmd = build_command(trim_cmd_chunks_nodedup) + pm.info("trim_cmd_nodedup: {}".format(build_command(trim_cmd_chunks_nodedup))) + + return trim_cmd + + +def _process_fastq(args, tools, read2, fq_file, outfolder): + """ + A helper function to prepare read files for downstream processing. + + :param argparse.Namespace args: binding between option name and argument, + e.g. from parsing command-line options + :param looper.models.AttributeDict tools: binding between tool name and + value, e.g. for tools/resources used by the pipeline + :param bool read2: if True, do not deduplicate and do not retain + intermediate files + :param str fq_file: path to FASTQ file + :param str outfolder: path to output directory for the pipeline + :return (str, str): pair (R1, R2) of paths to FASTQ files + """ + # Create names for processed FASTQ files. + fastq_folder = os.path.join(outfolder, "fastq") + fastqc_folder = os.path.join(outfolder, "fastqc") + sname = args.sample_name # for concise code + + noadap_fastq = os.path.join(fastq_folder, sname + "_R1_noadap.fastq") + adapter_command = _remove_adapters(args, tools, read2, fq_file, outfolder) + pm.info("Adapter command: {}".format(adapter_command)) + pm.info("Read2 status: {}".format(read2)) + + dedup_fastq = os.path.join(fastq_folder, sname + "_R1_dedup.fastq") + if not read2 and args.complexity and args.umi_len > 0: + deduplicate_command = _deduplicate(args, tools, fq_file, outfolder) + #pm.debug("Dedup command: {}".format(deduplicate_command)) + pm.info("Dedup command: {}".format(deduplicate_command)) + + trimmed_fastq = os.path.join(fastq_folder, sname + "_R1_trimmed.fastq") + trimmed_fastq_R2 = os.path.join(fastq_folder, sname + "_R2_trimmed.fastq") + trimmed_dups_fastq_R2 = os.path.join(fastq_folder, sname + "_R2_trimmed_dups.fastq") + processed_fastq = os.path.join(fastq_folder, sname + "_R1_processed.fastq") + trim_command = _trim_reads(args, tools, read2, fq_file, outfolder) + if args.complexity and args.umi_len > 0: + trim_command2 = _trim_reads(args, tools, read2, fq_file, outfolder) + + adapter_report = os.path.join(fastqc_folder, sname + "_R1_rmAdapter.txt") def report_fastq(): """ @@ -938,29 +1028,29 @@ def report_fastq(): pm.report_result("Duplicate_reads", dups) # Put it all together - if paired_end: + if read2: # cutadapt directs its report to stderr if the command lacks # a -o and the actual reads are directed to stdout. process_fastq_cmd2 = build_command([ - "(", adapter_cmd, "|", trim_cmd2, ") 2> ", adapter_report]) - #print("process_fastq_cmd2: {}".format(process_fastq_cmd2)) + "(", adapter_command, "|", trim_command, ") 2> ", adapter_report]) + pm.debug("process_fastq_cmd2: {}".format(process_fastq_cmd2)) pm.run(process_fastq_cmd2, trimmed_fastq_R2) cp_cmd = ("cp " + trimmed_fastq_R2 + " " + trimmed_dups_fastq_R2) pm.run(cp_cmd, trimmed_dups_fastq_R2) return trimmed_fastq_R2, trimmed_dups_fastq_R2 else: if args.complexity and args.umi_len > 0: - pm.run([adapter_cmd, dedup_cmd, trim_cmd_nodedup], - trimmed_fastq, follow=report_fastq) - pm.run(trim_cmd1, processed_fastq, + pm.run(trim_command, processed_fastq, follow=ngstk.check_trim(processed_fastq, False, None)) + pm.run([adapter_command, deduplicate_command, trim_command2], + trimmed_fastq, follow=report_fastq) pm.clean_add(noadap_fastq) pm.clean_add(dedup_fastq) pm.clean_add(trimmed_fastq) return processed_fastq, trimmed_fastq else: process_fastq_cmd = build_command([ - "(", adapter_cmd, "|", trim_cmd1, ") 2> ", adapter_report]) + "(", adapter_command, "|", trim_command, ") 2> ", adapter_report]) pm.run(process_fastq_cmd, processed_fastq, follow=ngstk.check_trim(processed_fastq, False, None)) return processed_fastq @@ -1648,7 +1738,6 @@ def main(): # Re-pair the duplicates (but only if we could identify duplicates) if args.umi_len > 0: - r1_dups_repair = os.path.join( fastq_folder, args.sample_name + "_R1_trimmed.fastq.paired.fq") r2_dups_repair = os.path.join( @@ -1683,7 +1772,6 @@ def main(): outfolder=param.outfolder) unmap_fq2 = "" - pm.timestamp("### Plot adapter insertion distribution") if not args.adapter == "cutadapt": pm.info("Skipping sample degradation plotting...") @@ -1702,8 +1790,6 @@ def main(): pm.report_object("Adapter insertion distribution", degradation_pdf, anchor_image=degradation_png) - - pm.clean_add(os.path.join(fastq_folder, "*.fq"), conditional=True) pm.clean_add(os.path.join(fastq_folder, "*.fastq"), conditional=True) pm.clean_add(os.path.join(fastq_folder, "*.log"), conditional=True) From 5ac748975104a389aac7bc61bf065d2fa42c0945 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Tue, 29 Oct 2019 16:48:06 -0400 Subject: [PATCH 090/207] update _add_resources to handle refgenie updates --- pipelines/peppro.py | 136 +++++--------------------------------------- 1 file changed, 13 insertions(+), 123 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index ccfdff3..fac62a4 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -407,7 +407,6 @@ def _trim_reads(args, tools, read2, fq_file, outfolder): umi_report = os.path.join(fastp_folder, sname + "_R1_rmUmi.html") umi_json = os.path.join(fastp_folder, sname + "_R1_rmUmi.json") - # TODO: split into two paths, one for read1 and one for read2? trimmed_fastq_R2 = os.path.join(fastq_folder, sname + "_R2_trimmed.fastq") trimmed_dups_fastq_R2 = os.path.join(fastq_folder, sname + "_R2_trimmed_dups.fastq") umi_report_R2 = os.path.join(fastp_folder, sname + "_R2_rmUmi.html") @@ -1402,9 +1401,7 @@ def _add_resources(args, res): ("fasta", "chrom_sizes", "default"), (BT2_IDX_KEY, None, "default")] - # Loop to find missing assets - for asset, seek_key, tag in refgenie_assets: if not seek_key: res[asset] = rgc.get_asset(args.genome_assembly, asset, tag_name=tag) @@ -1419,26 +1416,31 @@ def _add_resources(args, res): # OPT check_list = [ - {"asset":"refgene_tss", "arg":"TSS_name", "user_arg":"TSS-name"}, - {"asset":"ensembl_tss", "arg":"ensembl_tss", "user_arg":"pi-tss"}, - {"asset":"ensembl_gene_body", "arg":"ensembl_gene_body", "user_arg":"pi-body"}, - {"asset":"refgene_pre_mRNA", "arg":"pre_name", "user_arg":"pre-name"}, - {"asset":"feat_annotation", "arg":"anno_name", "user_arg":"anno-name"}, - {"asset":"refgene_exon", "arg":"exon_name", "user_arg":"exon-name"}, - {"asset":"refgene_intron", "arg":"intron_name", "user_arg":"intron-name"} + {"asset":"refgene_anno", "seek_key":"refgene_tss", "arg":"TSS_name", "user_arg":"TSS-name"}, + {"asset":"ensembl_gtf", "seek_key":"ensembl_tss", "arg":"ensembl_tss", "user_arg":"pi-tss"}, + {"asset":"ensembl_gtf", "seek_key":"ensembl_gene_body", "arg":"ensembl_gene_body", "user_arg":"pi-body"}, + {"asset":"refgene_anno", "seek_key":"refgene_pre_mRNA", "arg":"pre_name", "user_arg":"pre-name"}, + {"asset":"feat_annotation", "seek_key":"feat_annotation", "arg":"anno_name", "user_arg":"anno-name"}, + {"asset":"refgene_anno", "seek_key":"refgene_exon", "arg":"exon_name", "user_arg":"exon-name"}, + {"asset":"refgene_anno", "seek_key":"refgene_intron", "arg":"intron_name", "user_arg":"intron-name"} ] key_errors = [] exist_errors = [] for item in check_list: asset = item["asset"] + seek_key = item["seek_key"] arg = item["arg"] user_arg = item["user_arg"] + if hasattr(args, arg) and getattr(args, arg): res[asset] = os.path.abspath(getattr(args, arg)) else: try: - res[asset] = rgc.get_asset(args.genome_assembly, asset) + pm.debug("asset key: {}".format(asset)) + res[asset] = rgc.get_asset(args.genome_assembly, asset, + seek_key=seek_key) + pm.debug("res[asset]: {}".format(res[asset])) except KeyError: key_errors.append(item) except: @@ -1454,106 +1456,6 @@ def _add_resources(args, res): if len(exist_errors) > 0: print(" Assets not existing: {}".format(", ".join(["{asset} (--{user_arg})".format(**x) for x in exist_errors]))) - - # asset = "refgene_tss" - # if args.TSS_name: - # res[asset] = os.path.abspath(args.TSS_name) - # else: - # try: - # res[asset] = rgc.get_asset(args.genome_assembly, asset) - # except KeyError: - # print(msg.format(asset)) - # except: - # msg = ("Update your REFGENIE config file to include this asset, or " - # "point directly to the file using --TSS-name.\n") - # print(err.format(asset)) - # print(msg) - - # asset = "ensembl_tss" - # if args.ensembl_tss: - # res[asset] = os.path.abspath(args.ensembl_tss) - # else: - # try: - # res[asset] = rgc.get_asset(args.genome_assembly, asset) - # except KeyError: - # print(msg.format(asset)) - # except: - # msg = ("Update your REFGENIE config file to include this asset, or " - # "point directly to the file using --pi-tss.\n") - # print(err.format(asset)) - # print(msg) - - # asset = "ensembl_gene_body" - # if args.ensembl_gene_body: - # res[asset] = os.path.abspath(args.ensembl_gene_body) - # else: - # try: - # res[asset] = rgc.get_asset(args.genome_assembly, asset) - # except KeyError: - # print(msg.format(asset)) - # except: - # msg = ("Update your REFGENIE config file to include this asset, or " - # "point directly to the file using --pi-body.\n") - # print(err.format(asset)) - # print(msg) - - # asset = "refgene_pre_mRNA" - # if args.pre_name: - # res[asset] = os.path.abspath(args.pre_name) - # else: - # try: - # res[asset] = rgc.get_asset(args.genome_assembly, asset) - # except KeyError: - # print(msg.format(asset)) - # except: - # msg = ("Update your REFGENIE config file to include this asset, or " - # "point directly to the file using --pre-name.\n") - # print(err.format(asset)) - # print(msg) - - # asset = "feat_annotation" - # if args.anno_name: - # res[asset] = os.path.abspath(args.anno_name) - # else: - # try: - # res[asset] = rgc.get_asset(args.genome_assembly, asset) - # except KeyError: - # print(msg.format(asset)) - # except: - # msg = ("Update your REFGENIE config file to include this asset, or " - # "point directly to the file using --anno-name.\n") - # print(err.format(asset)) - # print(msg) - - # asset = "refgene_exon" - # if args.exon_name: - # res[asset] = os.path.abspath(args.exon_name) - # else: - # try: - # res[asset] = rgc.get_asset(args.genome_assembly, asset) - # except KeyError: - # print(msg.format(asset)) - # except: - # msg = ("Update your REFGENIE config file to include this asset, or " - # "point directly to the file using --exon-name.\n") - # print(err.format(asset)) - # print(msg) - - # asset = "refgene_intron" - # if args.intron_name: - # res[asset] = os.path.abspath(args.intron_name) - # else: - # try: - # res[asset] = rgc.get_asset(args.genome_assembly, asset) - # except KeyError: - # print(msg.format(asset)) - # except: - # msg = ("Update your REFGENIE config file to include this asset, or " - # "point directly to the file using --intron-name.\n") - # print(err.format(asset)) - # print(msg) - - # res.rgc = rgc return res, rgc @@ -1963,20 +1865,11 @@ def main(): # -q 10: skip alignments with MAPQ less than 10 cmd2 = (tools.samtools + " view -q 10 -b -@ " + str(pm.cores) + " -U " + failQC_genome_bam + " ") - #if args.paired_end: - # add a step to accept only reads mapped in proper pair - # ?not appropriate with reverse complemented proseq reads? - #cmd2 += "-f 2 " - cmd2 += mapping_genome_bam_temp + " > " + mapping_genome_bam if args.complexity and args.umi_len > 0: cmd2_dups = (tools.samtools + " view -q 10 -b -@ " + str(pm.cores) + " -U " + failQC_genome_bam_dups + " ") - #if args.paired_end: - # add a step to accept only reads mapped in proper pair - #cmd2_dups += "-f 2 " - cmd2_dups += mapping_genome_bam_temp_dups + " > " + mapping_genome_bam_dups pm.clean_add(failQC_genome_bam_dups) @@ -2016,8 +1909,6 @@ def check_alignment_genome(temp_bam, bam): pm.run([cmd_dups, cmd2_dups], mapping_genome_bam_dups, container=pm.container) - - pm.timestamp("### Compress all unmapped read files") for unmapped_fq in to_compress: # Compress unmapped fastq reads @@ -2029,7 +1920,6 @@ def check_alignment_genome(temp_bam, bam): unmapped_fq = unmapped_fq + ".gz" pm.run(cmd, unmapped_fq) - temp_mapping_index = os.path.join(mapping_genome_bam_temp + ".bai") temp_mapping_index_dups = os.path.join(mapping_genome_bam_temp_dups + ".bai") From ece5dbff8ef5009d942298aa7e577554a2e6a8b1 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Mon, 4 Nov 2019 15:58:16 -0500 Subject: [PATCH 091/207] add checks for re-runs and new-starts --- pipelines/peppro.py | 2314 +++++++++++++++++++++---------------------- 1 file changed, 1132 insertions(+), 1182 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index fac62a4..9f06f55 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -209,7 +209,6 @@ def _remove_adapters(args, tools, read2, fq_file, outfolder): # Check quality encoding for use with FastX_Tools if args.trimmer == "fastx": encoding = _guess_encoding(fq_file) - #print("Encoding: {}".format(str(encoding))) # DEBUG # Create adapter trimming command(s). if args.adapter == "fastp": @@ -339,9 +338,11 @@ def _deduplicate(args, tools, fq_file, outfolder): :return str: command to remove adapters """ sname = args.sample_name # for concise code + fastq_folder = os.path.join(outfolder, "fastq") noadap_fastq = os.path.join(fastq_folder, sname + "_R1_noadap.fastq") dedup_fastq = os.path.join(fastq_folder, sname + "_R1_dedup.fastq") + # Create deduplication command(s). if args.complexity and args.umi_len > 0: if args.dedup == "seqkit": @@ -384,557 +385,472 @@ def _deduplicate(args, tools, fq_file, outfolder): return dedup_cmd -def _trim_reads(args, tools, read2, fq_file, outfolder): +def _trim_deduplicated_files(args, tools, fq_file, outfolder): """ - A helper function to build a command for read trimming. + A helper function to build a command for read trimming using fastq files + that have been deduplicated. :param argparse.Namespace args: binding between option name and argument, e.g. from parsing command-line options :param looper.models.AttributeDict tools: binding between tool name and value, e.g. for tools/resources used by the pipeline - :param bool read2: if True, do not deduplicate and do not retain - intermediate files :param str fq_file: path to FASTQ file :param str outfolder: path to output directory for the pipeline - :return str: command to remove adapters + :return str: command to trim adapter trimmed and deduplicated reads """ + + # Only call this when args.complexity and args.umi_len > 0 sname = args.sample_name # for concise code + fastq_folder = os.path.join(outfolder, "fastq") - fastp_folder = os.path.join(outfolder, "fastp") + dedup_fastq = os.path.join(fastq_folder, sname + "_R1_dedup.fastq") + #processed_fastq = os.path.join(fastq_folder, sname + "_R1_processed.fastq") + #trimmed_fastq = os.path.join(fastq_folder, sname + "_R1_trimmed.fastq") + processed_fastq = os.path.join(fastq_folder, sname + "_R1_trimmed.fastq") - trimmed_fastq = os.path.join(fastq_folder, sname + "_R1_trimmed.fastq") - processed_fastq = os.path.join(fastq_folder, sname + "_R1_processed.fastq") + fastp_folder = os.path.join(outfolder, "fastp") umi_report = os.path.join(fastp_folder, sname + "_R1_rmUmi.html") umi_json = os.path.join(fastp_folder, sname + "_R1_rmUmi.json") - trimmed_fastq_R2 = os.path.join(fastq_folder, sname + "_R2_trimmed.fastq") - trimmed_dups_fastq_R2 = os.path.join(fastq_folder, sname + "_R2_trimmed_dups.fastq") - umi_report_R2 = os.path.join(fastp_folder, sname + "_R2_rmUmi.html") - umi_json_R2 = os.path.join(fastp_folder, sname + "_R2_rmUmi.json") + # Check quality encoding for use with FastX_Tools + if args.trimmer == "fastx": + encoding = _guess_encoding(fq_file) - # Create trimming and reverse complementing command(s). - # TODO: Can also use seqkit for these steps instead of seqtk... - if read2: - if args.umi_fastp: - if args.adapter != "fastp": - print("To remove UMI intelligently, you must process adapters using 'fastp'") - print("Defaulting to removing the first {} " - "bp instead via trimming".format(str(args.umi_len))) - if args.trimmer == "seqtk": - trim_cmd_chunks_R2 = [ - tools.seqtk, - "trimfq", - ("-e", str(args.umi_len)) - ] - trim_cmd_chunks_R2.extend(["-"]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks_R2.extend([ - (">", trimmed_fastq_R2) - ]) - else: - trim_cmd_chunks_R2.extend(["|"]) - trim_cmd_chunks_R2.extend([ - tools.seqtk, - ("seq", "-r"), - ("-", ">"), - trimmed_fastq_R2 - ]) - elif args.trimmer == "fastx": - trim_tool = tools.fastx + "_trimmer" - rc_tool = tools.fastx + "_reverse_complement" - trim_cmd_chunks = [trim_tool] - - if encoding == "Illumina-1.8": - trim_cmd_chunks.extend([ - ("-Q", str(33)) - ]) - trim_cmd_chunks.extend([ - ("-f", str(int(float(args.umi_len)) + 1)) - ]) - if args.max_len != -1: - trim_cmd_chunks.extend([ - ("-l", (str(int(float(args.max_len)) + int(float(args.umi_len))))) - ]) - trim_cmd_chunks_R2 = [trim_tool] - if encoding == "Illumina-1.8": - trim_cmd_chunks_R2.extend([ - ("-Q", str(33)) - ]) - trim_cmd_chunks_R2.extend([ - ("-t", str(int(float(args.umi_len)))) - ]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks_R2.extend([ - ("-o", trimmed_fastq_R2) - ]) - else: - trim_cmd_chunks_R2.extend([ - ("|", rc_tool) - ]) - if encoding == "Illumina-1.8": - trim_cmd_chunks_R2.extend([ - ("-Q", str(33)) - ]) - trim_cmd_chunks_R2.extend([ - ("-o", trimmed_fastq_R2) - ]) - else: - # Default to seqtk - trim_cmd_chunks_R2 = [ - tools.seqtk, - "trimfq", - ("-e", str(args.umi_len)) - ] - if args.max_len != -1: - trim_cmd_chunks_R2.extend([ - ("-L", str(args.max_len)) - ]) - trim_cmd_chunks_R2.extend(["-"]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks_R2.extend([ - (">", trimmed_fastq_R2) - ]) - else: - trim_cmd_chunks_R2.extend(["|"]) - trim_cmd_chunks_R2.extend([ - tools.seqtk, - ("seq", "-r"), - ("-", ">"), - trimmed_fastq_R2 - ]) + if args.umi_fastp and args.adapter == "fastp": + trim_cmd_chunks = [ + tools.fastp, + ("--thread", str(pm.cores)), + ("-i", dedup_fastq), + "--stdout", + "--umi", + ("--umi_loc", "read1"), + ("--umi_len", args.umi_len), + ("--html", umi_report), + ("--json", umi_json), + "|", + (tools.seqtk, "trimfq") + ] + + if args.max_len != -1: + trim_cmd_chunks.extend([("-L", args.max_len)]) + + trim_cmd_chunks.extend(["-"]) + + # Do not reverse complement for GRO-seq + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([(">", processed_fastq)]) + else: + trim_cmd_chunks.extend([ + "|", + (tools.seqtk, "seq"), + ("-r", "-"), + (">", processed_fastq) + ]) + else: + if args.umi_fastp and args.adapter != "fastp": + print("To remove UMI intelligently, you must process adapters using 'fastp'") + print("Defaulting to removing the first {} " + "bp instead via trimming".format(str(args.umi_len))) + if args.trimmer == "seqtk": + trim_cmd_chunks = [ + tools.seqtk, + "trimfq", + ("-b", str(args.umi_len)) + ] + + if args.max_len != -1: + trim_cmd_chunks.extend([("-L", str(args.max_len))]) + + trim_cmd_chunks.extend([dedup_fastq]) + + # Do not reverse complement for GRO-seq + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([(">", processed_fastq)]) else: - trim_cmd_chunks_R2 = [ - tools.fastp, - ("--thread", str(pm.cores)), - ("--stdin", "--stdout"), - "--umi", - ("--umi_loc", "paired_end"), - ("--umi_len", args.umi_len), - ("--html", umi_report_R2), - ("--json", umi_json_R2), + trim_cmd_chunks.extend([ "|", - (tools.seqtk, "trimfq") - ] - if args.max_len != -1: - trim_cmd_chunks_R2.extend([ - ("-L", args.max_len) - ]) - trim_cmd_chunks_R2.extend(["-"]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks_R2.extend([ - (">", trimmed_fastq_R2) - ]) - else: - trim_cmd_chunks_R2.extend([ - "|", - (tools.seqtk, "seq"), - ("-r", "-"), - (">", trimmed_fastq_R2) - ]) - else: - if args.trimmer == "seqtk": - trim_cmd_chunks_R2 = [ tools.seqtk, - "trimfq", - ("-e", str(args.umi_len)) - ] - trim_cmd_chunks_R2.extend(["-"]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks_R2.extend([ - (">", trimmed_fastq_R2) - ]) - else: - trim_cmd_chunks_R2.extend([ - "|", - (tools.seqtk, "seq"), - ("-r", "-"), - (">", trimmed_fastq_R2) - ]) - elif args.trimmer == "fastx": - trim_tool = tools.fastx + "_trimmer" - rc_tool = tools.fastx + "_reverse_complement" - trim_cmd_chunks = [trim_tool] + ("seq", "-r"), + ("-", ">"), + processed_fastq + ]) + elif args.trimmer == "fastx": + trim_tool = tools.fastx + "_trimmer" + rc_tool = tools.fastx + "_reverse_complement" + trim_cmd_chunks = [trim_tool] + + if encoding == "Illumina-1.8": + trim_cmd_chunks.extend([ + ("-Q", str(33)) + ]) + + trim_cmd_chunks.extend([("-f", str(int(float(args.umi_len)) + 1))]) + + if args.max_len != -1: + trim_cmd_chunks.extend([ + ("-l", (str(int(float(args.max_len)) + int(float(args.umi_len))))) + ]) + + trim_cmd_chunks.extend([("-i", dedup_fastq)]) + + # Do not reverse complement if GRO-seq + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([("-o", processed_fastq)]) + else: + trim_cmd_chunks.extend([("|", rc_tool)]) if encoding == "Illumina-1.8": trim_cmd_chunks.extend([ ("-Q", str(33)) ]) + trim_cmd_chunks.extend([("-o", processed_fastq)]) + else: + # Default to seqtk + trim_cmd_chunks = [ + tools.seqtk, + "trimfq", + ("-b", str(args.umi_len)) + ] + + if args.max_len != -1: + trim_cmd_chunks.extend([("-L", str(args.max_len))]) + + trim_cmd_chunks.extend([dedup_fastq]) + + # Do not reverse complement for GRO-seq + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([(">", processed_fastq)]) + else: trim_cmd_chunks.extend([ - ("-f", str(int(float(args.umi_len)) + 1)) + "|", + tools.seqtk, + ("seq", "-r"), + ("-", ">"), + processed_fastq ]) - if args.max_len != -1: - trim_cmd_chunks.extend([ - ("-l", (str(int(float(args.max_len)) + int(float(args.umi_len))))) - ]) - trim_cmd_chunks_R2 = [trim_tool] + + trim_cmd = build_command(trim_cmd_chunks) + pm.debug("trim_deduplicated_cmd: {}".format(build_command(trim_cmd_chunks))) + + return trim_cmd + + +def _trim_adapter_files(args, tools, fq_file, outfolder): + """ + A helper function to build a command for read trimming using fastq files + without deduplication. + + :param argparse.Namespace args: binding between option name and argument, + e.g. from parsing command-line options + :param looper.models.AttributeDict tools: binding between tool name and + value, e.g. for tools/resources used by the pipeline + :param str fq_file: path to FASTQ file + :param str outfolder: path to output directory for the pipeline + :return str: command to trim adapter trimmed files + """ + # Need undeduplicated results for complexity calculation + sname = args.sample_name # for concise code + + fastq_folder = os.path.join(outfolder, "fastq") + noadap_fastq = os.path.join(fastq_folder, sname + "_R1_noadap.fastq") + trimmed_fastq = os.path.join(fastq_folder, sname + "_R1_processed.fastq") + #trimmed_fastq = os.path.join(fastq_folder, sname + "_R1_trimmed.fastq") + #processed_fastq = os.path.join(fastq_folder, sname + "_R1_processed.fastq") + + fastp_folder = os.path.join(outfolder, "fastp") + umi_report = os.path.join(fastp_folder, sname + "_R1_rmUmi.html") + umi_json = os.path.join(fastp_folder, sname + "_R1_rmUmi.json") + + # Check quality encoding for use with FastX_Tools + if args.trimmer == "fastx": + encoding = _guess_encoding(fq_file) + + if args.umi_fastp and args.adapter == "fastp": + # Use FastP + # Still requires seqtk for reverse complementation + trim_cmd_chunks = [ + tools.fastp, + ("--thread", str(pm.cores)), + ("-i", noadap_fastq), + "--stdout", + "--umi", + ("--umi_loc", "read1"), + ("--umi_len", args.umi_len), + ("--html", umi_report), + ("--json", umi_json), + "|", + (tools.seqtk, "trimfq") + ] + + if args.max_len != -1: + trim_cmd_chunks.extend([("-L", args.max_len)]) + + trim_cmd_chunks.extend(["-"]) + + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([ + (">", trimmed_fastq) + ]) + else: + trim_cmd_chunks.extend([ + "|", + (tools.seqtk, "seq"), + ("-r", "-"), + (">", trimmed_fastq) + ]) + else: + if args.umi_fastp and args.adapter != "fastp": + print("To remove UMI intelligently, you must process adapters using 'fastp'") + print("Defaulting to removing the first {} " + "bp instead via trimming".format(str(args.umi_len))) + if args.trimmer == "seqtk": + trim_cmd_chunks = [ + tools.seqtk, + "trimfq", + ("-b", str(args.umi_len)) + ] + if args.max_len != -1: + trim_cmd_chunks.extend([ + ("-L", str(args.max_len)) + ]) + + trim_cmd_chunks.extend([noadap_fastq]) + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([ + (">", trimmed_fastq) + ]) + else: + trim_cmd_chunks.extend([ + "|", + (tools.seqtk, "seq"), + ("-r", "-"), + (">", trimmed_fastq) + ]) + elif args.trimmer == "fastx": + trim_tool = tools.fastx + "_trimmer" + rc_tool = tools.fastx + "_reverse_complement" + trim_cmd_chunks = [trim_tool] + if encoding == "Illumina-1.8": + trim_cmd_chunks.extend([ + ("-Q", str(33)) + ]) + trim_cmd_chunks.extend([ + ("-f", str(int(float(args.umi_len)) + 1)) + ]) + if args.max_len != -1: + trim_cmd_chunks.extend([ + ("-l", (str(int(float(args.max_len)) + int(float(args.umi_len))))) + ]) + # Need undeduplicated results for complexity calculation + + trim_cmd_chunks.extend([ + ("-i", noadap_fastq) + ]) + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([ + ("-o", trimmed_fastq) + ]) + else: if encoding == "Illumina-1.8": - trim_cmd_chunks_R2.extend([ + trim_cmd_chunks.extend([ ("-Q", str(33)) ]) - trim_cmd_chunks_R2.extend([ - ("-t", str(int(float(args.umi_len)))) + trim_cmd_chunks.extend([ + ("-o", trimmed_fastq) + ]) + # Default to seqtk + else: + trim_cmd_chunks = [ + tools.seqtk, + "trimfq", + ("-b", str(args.umi_len)) + ] + if args.max_len != -1: + trim_cmd_chunks.extend([ + ("-L", str(args.max_len)) + ]) + + trim_cmd_chunks.extend([noadap_fastq]) + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([ + (">", trimmed_fastq) ]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks_R2.extend([ - ("-o", trimmed_fastq_R2) - ]) - else: - trim_cmd_chunks_R2.extend([ - ("|", rc_tool) - ]) - if encoding == "Illumina-1.8": - trim_cmd_chunks_R2.extend([ - ("-Q", str(33)) - ]) - trim_cmd_chunks_R2.extend([ - ("-o", trimmed_fastq_R2) - ]) else: - pm.fail_pipeline(RuntimeError("I don't understand '{}' for args.trimmer ".format(args.trimmer))) + trim_cmd_chunks.extend([ + "|", + (tools.seqtk, "seq"), + ("-r", "-"), + (">", trimmed_fastq) + ]) + + trim_cmd = build_command(trim_cmd_chunks) + pm.debug("trim_cmd_nodedup: {}".format(build_command(trim_cmd_chunks))) + + return trim_cmd - trim_cmd = build_command(trim_cmd_chunks_R2) - return trim_cmd + +def _trim_pipes(args, tools, read2, fq_file, outfolder): + """ + A helper function to build a command for read trimming using pipes. + + :param argparse.Namespace args: binding between option name and argument, + e.g. from parsing command-line options + :param looper.models.AttributeDict tools: binding between tool name and + value, e.g. for tools/resources used by the pipeline + :param bool read2: if True, do not deduplicate and do not retain + intermediate files + :param str fq_file: path to FASTQ file + :param str outfolder: path to output directory for the pipeline + :return str: command to trim adapter trimmed and deduplicated reads + """ + + # Only call this when NOT args.complexity or NOT args.umi_len > 0 + sname = args.sample_name # for concise code + + fastq_folder = os.path.join(outfolder, "fastq") + if read2: + processed_fastq = os.path.join(fastq_folder, sname + "_R2_trimmed.fastq") + else: + processed_fastq = os.path.join(fastq_folder, sname + "_R1_processed.fastq") + + fastp_folder = os.path.join(outfolder, "fastp") + if read2: + umi_report = os.path.join(fastp_folder, sname + "_R2_rmUmi.html") + umi_json = os.path.join(fastp_folder, sname + "_R2_rmUmi.json") + else: + umi_report = os.path.join(fastp_folder, sname + "_R1_rmUmi.html") + umi_json = os.path.join(fastp_folder, sname + "_R1_rmUmi.json") + + # Check quality encoding for use with FastX_Tools + if args.trimmer == "fastx": + encoding = _guess_encoding(fq_file) + + if args.umi_fastp and args.adapter == "fastp": + # There are no intermediate files, just pipes + trim_cmd_chunks = [ + tools.fastp, + ("--thread", str(pm.cores)), + ("--stdin", "--stdout"), + "--umi" + ] + + if read2: + trim_cmd_chunks.extend([("--umi_loc", "paired_end")]) + else: + trim_cmd_chunks.extend([("--umi_loc", "read1")]) + + trim_cmd_chunks.extend([ + ("--umi_len", args.umi_len), + ("--html", umi_report), + ("--json", umi_json), + "|", + (tools.seqtk, "trimfq") + ]) + + if args.max_len != -1: + trim_cmd_chunks.extend([("-L", args.max_len)]) + + trim_cmd_chunks.extend(["-"]) + + # Do not reverse complement for GRO-seq + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([(">", processed_fastq)]) + else: + trim_cmd_chunks.extend([ + "|", + (tools.seqtk, "seq"), + ("-r", "-"), + (">", processed_fastq) + ]) # If args.complexity and args.umi_len > 0 retain intermediate files else: - if args.umi_fastp: - if args.adapter != "fastp": - print("To remove UMI intelligently, you must process adapters using 'fastp'") - print("Defaulting to removing the first {} " - "bp instead via trimming".format(str(args.umi_len))) - if args.trimmer == "seqtk": - trim_cmd_chunks = [ - tools.seqtk, - "trimfq", - ("-b", str(args.umi_len)) - ] - - if args.max_len != -1: - trim_cmd_chunks.extend([ - ("-L", str(args.max_len)) - ]) - if args.complexity and args.umi_len > 0: - # Need undeduplicated results for complexity calculation - #trim_cmd_chunks_nodedup = trim_cmd_chunks.copy() # python3 - trim_cmd_chunks_nodedup = list(trim_cmd_chunks) - trim_cmd_chunks_nodedup.extend([noadap_fastq]) - trim_cmd_chunks.extend([dedup_fastq]) - else: - trim_cmd_chunks.extend(["-"]) - - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([ - (">", processed_fastq) - ]) - trim_cmd_chunks_nodedup.extend([ - (">", trimmed_fastq) - ]) - else: - trim_cmd_chunks.extend(["|"]) - trim_cmd_chunks.extend([ - tools.seqtk, - ("seq", "-r"), - ("-", ">"), - processed_fastq - ]) - trim_cmd_chunks_nodedup.extend(["|"]) - trim_cmd_chunks_nodedup.extend([ - tools.seqtk, - ("seq", "-r"), - ("-", ">"), - trimmed_fastq - ]) - elif args.trimmer == "fastx": - trim_tool = tools.fastx + "_trimmer" - rc_tool = tools.fastx + "_reverse_complement" - trim_cmd_chunks = [trim_tool] - - if encoding == "Illumina-1.8": - trim_cmd_chunks.extend([ - ("-Q", str(33)) - ]) - trim_cmd_chunks.extend([ - ("-f", str(int(float(args.umi_len)) + 1)) - ]) - if args.max_len != -1: - trim_cmd_chunks.extend([ - ("-l", (str(int(float(args.max_len)) + int(float(args.umi_len))))) - ]) - if args.complexity and args.umi_len > 0: - # Need undeduplicated results for complexity calculation - #trim_cmd_chunks_nodedup = trim_cmd_chunks.copy() #python3 - trim_cmd_chunks_nodedup = list(trim_cmd_chunks) - trim_cmd_chunks_nodedup.extend([ - ("-i", noadap_fastq) - ]) - trim_cmd_chunks.extend([ - ("-i", dedup_fastq) - ]) - - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([ - ("-o", processed_fastq) - ]) - trim_cmd_chunks_nodedup.extend([ - ("-o", trimmed_fastq) - ]) - else: - trim_cmd_chunks.extend([ - ("|", rc_tool) - ]) - if encoding == "Illumina-1.8": - trim_cmd_chunks.extend([ - ("-Q", str(33)) - ]) - trim_cmd_chunks_nodedup.extend([ - ("-Q", str(33)) - ]) - trim_cmd_chunks.extend([ - ("-o", processed_fastq) - ]) - trim_cmd_chunks_nodedup.extend([ - ("-o", trimmed_fastq) - ]) - else: - # Default to seqtk - trim_cmd_chunks = [ - tools.seqtk, - "trimfq", - ("-b", str(args.umi_len)) - ] - if args.max_len != -1: - trim_cmd_chunks.extend([ - ("-L", str(args.max_len)) - ]) - if args.complexity and args.umi_len > 0: - # Need undeduplicated results for complexity calculation - #trim_cmd_chunks_nodedup = trim_cmd_chunks.copy() # python3 - trim_cmd_chunks_nodedup = list(trim_cmd_chunks) - trim_cmd_chunks_nodedup.extend([noadap_fastq]) - trim_cmd_chunks.extend([dedup_fastq]) - else: - trim_cmd_chunks.extend(["-"]) - - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([ - (">", processed_fastq) - ]) - trim_cmd_chunks_nodedup.extend([ - (">", trimmed_fastq) - ]) - else: - trim_cmd_chunks.extend(["|"]) - trim_cmd_chunks.extend([ - tools.seqtk, - ("seq", "-r"), - ("-", ">"), - processed_fastq - ]) - trim_cmd_chunks_nodedup.extend(["|"]) - trim_cmd_chunks_nodedup.extend([ - tools.seqtk, - ("seq", "-r"), - ("-", ">"), - trimmed_fastq - ]) + if args.umi_fastp and args.adapter != "fastp": + print("To remove UMI intelligently, you must process adapters using 'fastp'") + print("Defaulting to removing the first {} " + "bp instead via trimming".format(str(args.umi_len))) + if args.trimmer == "seqtk": + trim_cmd_chunks = [ + tools.seqtk, + "trimfq" + ] + + if read2: + trim_cmd_chunks.extend([("-e", str(args.umi_len))]) else: - if args.complexity and args.umi_len > 0: - trim_cmd_chunks = [ - tools.fastp, - ("--thread", str(pm.cores)) - ] - #trim_cmd_chunks_nodedup = trim_cmd_chunks.copy() #python3 - trim_cmd_chunks_nodedup = list(trim_cmd_chunks) - trim_cmd_chunks_nodedup.extend([ - ("-i", noadap_fastq), - "--stdout", - "--umi", - ("--umi_loc", "read1"), - ("--umi_len", args.umi_len), - ("--html", umi_report), - ("--json", umi_json), - "|", - (tools.seqtk, "trimfq") - ]) - if args.max_len != -1: - trim_cmd_chunks_nodedup.extend([ - ("-L", args.max_len) - ]) - trim_cmd_chunks_nodedup.extend(["-"]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks_nodedup.extend([ - (">", trimmed_fastq) - ]) - else: - trim_cmd_chunks_nodedup.extend([ - "|", - (tools.seqtk, "seq"), - ("-r", "-"), - (">", trimmed_fastq) - ]) - trim_cmd_chunks.extend([ - ("-i", dedup_fastq), - "--stdout", - "--umi", - ("--umi_loc", "read1"), - ("--umi_len", args.umi_len), - ("--html", umi_report), - ("--json", umi_json), - "|", - (tools.seqtk, "trimfq") - ]) - if args.max_len != -1: - trim_cmd_chunks.extend([ - ("-L", args.max_len) - ]) - trim_cmd_chunks.extend(["-"]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([ - (">", processed_fastq) - ]) - else: - trim_cmd_chunks.extend([ - "|", - (tools.seqtk, "seq"), - ("-r", "-"), - (">", processed_fastq) - ]) - else: - trim_cmd_chunks = [ - tools.fastp, - ("--thread", str(pm.cores)), - ("--stdin", "--stdout"), - "--umi", - ("--umi_loc", "read1"), - ("--umi_len", args.umi_len), - ("--html", umi_report), - ("--json", umi_json), - "|", - (tools.seqtk, "trimfq") - ] - if args.max_len != -1: - trim_cmd_chunks.extend([ - ("-L", args.max_len) - ]) - trim_cmd_chunks.extend(["-"]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([ - (">", processed_fastq) - ]) - else: - trim_cmd_chunks.extend([ - "|", - (tools.seqtk, "seq"), - ("-r", "-"), - (">", processed_fastq) - ]) - # Do not remove umi using fastp - else: - if args.trimmer == "seqtk": - trim_cmd_chunks = [ - tools.seqtk, - "trimfq", - ("-b", str(args.umi_len)) - ] + trim_cmd_chunks.extend([("-b", str(args.umi_len))]) if args.max_len != -1: - trim_cmd_chunks.extend([ - ("-L", str(args.max_len)) - ]) - if args.complexity and args.umi_len > 0: - #trim_cmd_chunks_nodedup = trim_cmd_chunks.copy() #python3 - trim_cmd_chunks_nodedup = list(trim_cmd_chunks) - trim_cmd_chunks_nodedup.extend([noadap_fastq]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks_nodedup.extend([ - (">", trimmed_fastq) - ]) - else: - trim_cmd_chunks_nodedup.extend([ - "|", - (tools.seqtk, "seq"), - ("-r", "-"), - (">", trimmed_fastq) - ]) - trim_cmd_chunks.extend([dedup_fastq]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([ - (">", processed_fastq) - ]) - else: - trim_cmd_chunks.extend([ - "|", - (tools.seqtk, "seq"), - ("-r", "-"), - (">", processed_fastq) - ]) - else: - trim_cmd_chunks.extend(["-"]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([ - (">", processed_fastq) - ]) - else: - trim_cmd_chunks.extend([ - "|", - (tools.seqtk, "seq"), - ("-r", "-"), - (">", processed_fastq) - ]) - elif args.trimmer == "fastx": - trim_tool = tools.fastx + "_trimmer" - rc_tool = tools.fastx + "_reverse_complement" - trim_cmd_chunks = [trim_tool] - if encoding == "Illumina-1.8": - trim_cmd_chunks.extend([ - ("-Q", str(33)) - ]) + trim_cmd_chunks.extend([("-L", str(args.max_len))]) + + trim_cmd_chunks.extend(["-"]) + + # Do not reverse complement for GRO-seq + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([(">", processed_fastq)]) + else: trim_cmd_chunks.extend([ - ("-f", str(int(float(args.umi_len)) + 1)) + "|", + tools.seqtk, + ("seq", "-r"), + ("-", ">"), + processed_fastq ]) + elif args.trimmer == "fastx": + trim_tool = tools.fastx + "_trimmer" + rc_tool = tools.fastx + "_reverse_complement" + trim_cmd_chunks = [trim_tool] + + if encoding == "Illumina-1.8": + trim_cmd_chunks.extend([("-Q", str(33))]) + + if read2: + trim_cmd_chunks.extend([("-t", str(int(float(args.umi_len))))]) + else: + trim_cmd_chunks.extend([("-f", str(int(float(args.umi_len)) + 1))]) if args.max_len != -1: trim_cmd_chunks.extend([ ("-l", (str(int(float(args.max_len)) + int(float(args.umi_len))))) ]) - if args.complexity and args.umi_len > 0: - # Need undeduplicated results for complexity calculation - #trim_cmd_chunks_nodedup = trim_cmd_chunks.copy() #python3 - trim_cmd_chunks_nodedup = list(trim_cmd_chunks) - trim_cmd_chunks_nodedup.extend([ - ("-i", noadap_fastq) - ]) - trim_cmd_chunks.extend([ - ("-i", dedup_fastq) - ]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([ - ("-o", processed_fastq) - ]) - trim_cmd_chunks_nodedup.extend([ - ("-o", trimmed_fastq) - ]) - else: - trim_cmd_chunks.extend([ - ("|", rc_tool) - ]) - if encoding == "Illumina-1.8": - trim_cmd_chunks.extend([ - ("-Q", str(33)) - ]) - trim_cmd_chunks_nodedup.extend([ - ("-Q", str(33)) - ]) - trim_cmd_chunks.extend([ - ("-o", processed_fastq) - ]) - trim_cmd_chunks_nodedup.extend([ - ("-o", trimmed_fastq) - ]) - trim_cmd = build_command(trim_cmd_chunks) - pm.info("trim_cmd: {}".format(build_command(trim_cmd_chunks))) - if args.complexity and args.umi_len > 0: - trim_cmd = build_command(trim_cmd_chunks_nodedup) - pm.info("trim_cmd_nodedup: {}".format(build_command(trim_cmd_chunks_nodedup))) + # Do not reverse complement for GRO-seq + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([("-o", processed_fastq)]) + else: + trim_cmd_chunks.extend([("|", rc_tool)]) + if encoding == "Illumina-1.8": + trim_cmd_chunks.extend([("-Q", str(33))]) + trim_cmd_chunks.extend([("-o", processed_fastq)]) + else: + # Default to seqtk + trim_cmd_chunks = [ + tools.seqtk, + "trimfq" + ] + + if read2: + trim_cmd_chunks.extend([("-e", str(args.umi_len))]) + else: + trim_cmd_chunks.extend([("-b", str(args.umi_len))]) + if args.max_len != -1: + trim_cmd_chunks.extend([("-L", str(args.max_len))]) - return trim_cmd + trim_cmd_chunks.extend(["-"]) + + # Do not reverse complement for GRO-seq + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([(">", processed_fastq)]) + else: + trim_cmd_chunks.extend([ + "|", + tools.seqtk, + ("seq", "-r"), + ("-", ">"), + processed_fastq + ]) + + trim_cmd = build_command(trim_cmd_chunks) + pm.debug("trim_pipes_cmd: {}".format(build_command(trim_cmd_chunks))) + pm.debug("trim_pipes_cmd read2 status: {}".format(read2)) + + return trim_cmd def _process_fastq(args, tools, read2, fq_file, outfolder): @@ -954,28 +870,37 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): # Create names for processed FASTQ files. fastq_folder = os.path.join(outfolder, "fastq") fastqc_folder = os.path.join(outfolder, "fastqc") + fastp_folder = os.path.join(outfolder, "fastp") + sname = args.sample_name # for concise code noadap_fastq = os.path.join(fastq_folder, sname + "_R1_noadap.fastq") - adapter_command = _remove_adapters(args, tools, read2, fq_file, outfolder) - pm.info("Adapter command: {}".format(adapter_command)) - pm.info("Read2 status: {}".format(read2)) - dedup_fastq = os.path.join(fastq_folder, sname + "_R1_dedup.fastq") - if not read2 and args.complexity and args.umi_len > 0: - deduplicate_command = _deduplicate(args, tools, fq_file, outfolder) - #pm.debug("Dedup command: {}".format(deduplicate_command)) - pm.info("Dedup command: {}".format(deduplicate_command)) - trimmed_fastq = os.path.join(fastq_folder, sname + "_R1_trimmed.fastq") trimmed_fastq_R2 = os.path.join(fastq_folder, sname + "_R2_trimmed.fastq") trimmed_dups_fastq_R2 = os.path.join(fastq_folder, sname + "_R2_trimmed_dups.fastq") processed_fastq = os.path.join(fastq_folder, sname + "_R1_processed.fastq") - trim_command = _trim_reads(args, tools, read2, fq_file, outfolder) - if args.complexity and args.umi_len > 0: - trim_command2 = _trim_reads(args, tools, read2, fq_file, outfolder) adapter_report = os.path.join(fastqc_folder, sname + "_R1_rmAdapter.txt") + fastp_pfx = os.path.join(fastp_folder, sname + "_R1_fastp_adapter") + fastp_report_txt = fastp_pfx + ".txt" + fastp_report_html = fastp_pfx + ".html" + cutadapt_folder = os.path.join(outfolder, "cutadapt") + cutadapt_report = os.path.join(cutadapt_folder, sname + "_cutadapt.txt") + + adapter_command = _remove_adapters(args, tools, read2, fq_file, outfolder) + pm.debug("Adapter command: {}".format(adapter_command)) + pm.debug("Read2 status: {}".format(read2)) + + if read2: + trim_command = _trim_pipes(args, tools, True, fq_file, outfolder) + elif args.complexity and args.umi_len > 0: + deduplicate_command = _deduplicate(args, tools, fq_file, outfolder) + pm.debug("Dedup command: {}".format(deduplicate_command)) + trim_command = _trim_adapter_files(args, tools, fq_file, outfolder) + trim_command2 = _trim_deduplicated_files(args, tools, fq_file, outfolder) + else: + trim_command = _trim_pipes(args, tools, False, fq_file, outfolder) def report_fastq(): """ @@ -1039,8 +964,12 @@ def report_fastq(): return trimmed_fastq_R2, trimmed_dups_fastq_R2 else: if args.complexity and args.umi_len > 0: - pm.run(trim_command, processed_fastq, + # This trim command DOES need the adapter file... + pm.debug("\ntrim_command1: {} + {}\n".format(adapter_command, trim_command)) + pm.run([adapter_command, trim_command], processed_fastq, follow=ngstk.check_trim(processed_fastq, False, None)) + # This needs to produce the trimmed_fastq file + pm.debug("\ntrim_command2: {} + {} + {}\n".format(adapter_command, deduplicate_command, trim_command2)) pm.run([adapter_command, deduplicate_command, trim_command2], trimmed_fastq, follow=report_fastq) pm.clean_add(noadap_fastq) @@ -1048,6 +977,7 @@ def report_fastq(): pm.clean_add(trimmed_fastq) return processed_fastq, trimmed_fastq else: + pm.debug("\nELSE: trim_command: {} + {}\n".format(adapter_command, trim_command)) process_fastq_cmd = build_command([ "(", adapter_command, "|", trim_command, ") 2> ", adapter_report]) pm.run(process_fastq_cmd, processed_fastq, @@ -1109,8 +1039,9 @@ def _align_with_bt2(args, tools, paired, useFIFO, unmap_fq1, unmap_fq2, out_fastq_r1 = out_fastq_pre + '_unmap_R1.fq' out_fastq_r2 = out_fastq_pre + '_unmap_R2.fq' - out_fastq_r1_gz = out_fastq_r1 + '.gz' - out_fastq_r2_gz = out_fastq_r2 + '.gz' + # Use the undeduplicated even for duplicates on re-runs + out_fastq_r1_gz = out_fastq_pre + '_unmap_R1.fq.gz' + out_fastq_r2_gz = out_fastq_pre + '_unmap_R2.fq.gz' if useFIFO and paired and not args.keep: if dups: @@ -1132,7 +1063,7 @@ def _align_with_bt2(args, tools, paired, useFIFO, unmap_fq1, unmap_fq2, else: out_fastq_tmp = out_fastq_pre + '_unmap.fq' - out_fastq_tmp_gz = out_fastq_tmp + ".gz" + out_fastq_tmp_gz = out_fastq_pre + '_unmap.fq.gz' filter_pair = build_command([tools.perl, tool_path("filter_paired_fq.pl"), out_fastq_tmp, @@ -1366,14 +1297,14 @@ def calc_frip(bamfile, ftfile, frip_func, pipeline_manager, """ Calculate the fraction of reads in feature file. - Use the given function and data from an aligned reads file and a called - peaks file, along with a PipelineManager, to calculate. + Use the given function and data from an aligned reads file and a features + file, along with a PipelineManager, to calculate. - :param str peakfile: path to called peaks file + :param str bamfile: path to aligned reads file + :param str ftfile: path to features of interest to calculate overlap :param callable frip_func: how to calculate the fraction of reads in feat; this must accept the path to the aligned reads file and the path to the called peaks file as arguments. - :param str bamfile: path to aligned reads file :param pypiper.PipelineManager pipeline_manager: the PipelineManager in use for the pipeline calling this function :param str aligned_reads_key: name of the key from a stats (key-value) file @@ -1387,6 +1318,24 @@ def calc_frip(bamfile, ftfile, frip_func, pipeline_manager, return float(num_in_reads) / float(num_aligned_reads) +def _itsa_file(anyfile): + """ + Helper function to confirm a file exists and is not empty. + + :param str anyfile: path to a file + """ + return(os.path.isfile(anyfile) and os.stat(anyfile).st_size > 0) + + +def _itsa_empty_file(anyfile): + """ + Helper function to confirm a file exists but is empty. + + :param str anyfile: path to a file + """ + return(os.path.isfile(anyfile) and os.stat(anyfile).st_size == 0) + + def _add_resources(args, res): """ Add additional resources needed for pipeline. @@ -1437,10 +1386,10 @@ def _add_resources(args, res): res[asset] = os.path.abspath(getattr(args, arg)) else: try: - pm.debug("asset key: {}".format(asset)) - res[asset] = rgc.get_asset(args.genome_assembly, asset, + pm.debug("asset key: {}".format(seek_key)) + res[seek_key] = rgc.get_asset(args.genome_assembly, asset, seek_key=seek_key) - pm.debug("res[asset]: {}".format(res[asset])) + pm.debug("res[seek_key]: {}".format(res[seek_key])) except KeyError: key_errors.append(item) except: @@ -1519,9 +1468,9 @@ def main(): param.outfolder = outfolder # Check that the input file(s) exist before continuing - if os.path.isfile(args.input[0]) and os.stat(args.input[0]).st_size > 0: + if _itsa_file(args.input[0]): print("Local input file: " + args.input[0]) - elif os.path.isfile(args.input[0]) and os.stat(args.input[0]).st_size == 0: + elif _itsa_empty_file(args.input[0]): # The read1 file exists but is empty err_msg = "File exists but is empty: {}" pm.fail_pipeline(IOError(err_msg.format(args.input[0]))) @@ -1531,9 +1480,9 @@ def main(): pm.fail_pipeline(IOError(err_msg.format(args.input[0]))) if args.input2: - if os.path.isfile(args.input2[0]) and os.stat(args.input2[0]).st_size > 0: + if _itsa_file(args.input2[0]): print("Local input file: " + args.input2[0]) - elif os.path.isfile(args.input2[0]) and os.stat(args.input2[0]).st_size == 0: + elif _itsa_empty_file(args.input2[0]): # The read1 file exists but is empty err_msg = "File exists but is empty: {}" pm.fail_pipeline(IOError(err_msg.format(args.input2[0]))) @@ -1555,8 +1504,6 @@ def main(): # PRO-seq pipeline # Each (major) step should have its own subfolder - - if args.protocol.lower() in RUNON_SOURCE_GRO: pm.info("Detected GRO input") elif args.protocol.lower() in RUNON_SOURCE_PRO: @@ -1576,12 +1523,13 @@ def main(): [args.input, args.input2], raw_folder, args.sample_name) cmd, out_fastq_pre, unaligned_fastq = ngstk.input_to_fastq( local_input_files, args.sample_name, args.paired_end, fastq_folder) - pm.run(cmd, unaligned_fastq, - follow=ngstk.check_fastq( - local_input_files, unaligned_fastq, args.paired_end), - container=pm.container) - pm.clean_add(out_fastq_pre + "*.fastq", conditional=True) - print(local_input_files) + if not pm.get_stat("Raw_reads") or args.new_start: + pm.run(cmd, unaligned_fastq, + follow=ngstk.check_fastq( + local_input_files, unaligned_fastq, args.paired_end), + container=pm.container) + pm.clean_add(out_fastq_pre + "*.fastq", conditional=True) + pm.info(local_input_files) untrimmed_fastq1 = out_fastq_pre + "_R1.fastq" untrimmed_fastq2 = out_fastq_pre + "_R2.fastq" if args.paired_end else None @@ -1591,88 +1539,86 @@ def main(): pm.timestamp("### FASTQ processing: ") cutadapt_folder = os.path.join(outfolder, "cutadapt") cutadapt_report = os.path.join(cutadapt_folder, args.sample_name + "_cutadapt.txt") + repair_target = os.path.join(fastq_folder, "repaired.flag") + dups_repair_target = os.path.join(fastq_folder, "dups_repaired.flag") - if args.paired_end: - if args.complexity and args.umi_len > 0: - unmap_fq1, unmap_fq1_dups = _process_fastq(args, tools, False, - untrimmed_fastq1, - outfolder=param.outfolder) - else: - unmap_fq1 = _process_fastq(args, tools, False, - untrimmed_fastq1, - outfolder=param.outfolder) - unmap_fq2, unmap_fq2_dups = _process_fastq(args, tools, True, - untrimmed_fastq2, - outfolder=param.outfolder) - - # Gut check - # Processing fastq should have trimmed the reads. - tr = float(pm.get_stat("Trimmed_reads")) - if (tr < 1): - pm.fail_pipeline(RuntimeError("No reads left after trimming. Check trimmer settings")) - - - - # Re-pair fastq files - r1_repair = os.path.join( - fastq_folder, args.sample_name + "_R1_processed.fastq.paired.fq") - r2_repair = os.path.join( - fastq_folder, args.sample_name + "_R2_trimmed.fastq.paired.fq") - - r1_repair_single = os.path.join( - fastq_folder, args.sample_name + "_R1_processed.fastq.single.fq") - r2_repair_single = os.path.join( - fastq_folder, args.sample_name + "_R2_trimmed.fastq.single.fq") - - rr = float(pm.get_stat("Raw_reads")) - cmd = (tools.fastqpair + " -t " + str(int(0.9*rr)) + " " + unmap_fq1 + - " " + unmap_fq2) - pm.run(cmd, [r1_repair, r2_repair]) - pm.clean_add(r1_repair_single) - pm.clean_add(r2_repair_single) - cmd1 = ("mv " + r1_repair + " " + unmap_fq1) - cmd2 = ("mv " + r2_repair + " " + unmap_fq2) - repair_target = os.path.join(fastq_folder, "repaired.flag") - cmd3 = ("touch repaired.flag") - pm.run([cmd1, cmd2, cmd3], repair_target) - pm.clean_add(repair_target) - - # Re-pair the duplicates (but only if we could identify duplicates) - - if args.umi_len > 0: - r1_dups_repair = os.path.join( - fastq_folder, args.sample_name + "_R1_trimmed.fastq.paired.fq") - r2_dups_repair = os.path.join( - fastq_folder, args.sample_name + "_R2_trimmed_dups.fastq.paired.fq") - - r1_dups_repair_single = os.path.join( - fastq_folder, args.sample_name + "_R1_trimmed.fastq.single.fq") - r2_dups_repair_single = os.path.join( - fastq_folder, args.sample_name + "_R2_trimmed_dups.fastq.single.fq") - - cmd = (tools.fastqpair + " -t " + str(int(0.9*rr)) + " " + - unmap_fq1_dups + " " + unmap_fq2_dups) - pm.run(cmd, [r1_dups_repair, r2_dups_repair]) - pm.clean_add(r1_dups_repair_single) - pm.clean_add(r2_dups_repair_single) - cmd1 = ("mv " + r1_dups_repair + " " + unmap_fq1_dups) - cmd2 = ("mv " + r2_dups_repair + " " + unmap_fq2_dups) - dups_repair_target = os.path.join(fastq_folder, "dups_repaired.flag") - cmd3 = ("touch dups_repaired.flag") - pm.run([cmd1, cmd2, cmd3], dups_repair_target) - pm.clean_add(dups_repair_target) - else: - if args.complexity and args.umi_len > 0: - unmap_fq1, unmap_fq1_dups = _process_fastq(args, tools, False, - untrimmed_fastq1, + # If we've already aligned to the primary genome, skip these steps unless + # it's a --new-start + if not pm.get_stat("Aligned_reads") or args.new_start: + if args.paired_end: + if args.complexity and args.umi_len > 0: + unmap_fq1, unmap_fq1_dups = _process_fastq(args, tools, False, + untrimmed_fastq1, + outfolder=param.outfolder) + else: + unmap_fq1 = _process_fastq(args, tools, False, + untrimmed_fastq1, + outfolder=param.outfolder) + unmap_fq2, unmap_fq2_dups = _process_fastq(args, tools, True, + untrimmed_fastq2, outfolder=param.outfolder) - unmap_fq2 = "" - unmap_fq2_dups = "" + + # Gut check + # Processing fastq should have trimmed the reads. + tr = float(pm.get_stat("Trimmed_reads")) + if (tr < 1): + pm.fail_pipeline(RuntimeError("No reads left after trimming. Check trimmer settings")) + + # Re-pair fastq files + r1_repair = os.path.join( + fastq_folder, args.sample_name + "_R1_processed.fastq.paired.fq") + r2_repair = os.path.join( + fastq_folder, args.sample_name + "_R2_trimmed.fastq.paired.fq") + + r1_repair_single = os.path.join( + fastq_folder, args.sample_name + "_R1_processed.fastq.single.fq") + r2_repair_single = os.path.join( + fastq_folder, args.sample_name + "_R2_trimmed.fastq.single.fq") + + rr = float(pm.get_stat("Raw_reads")) + cmd = (tools.fastqpair + " -t " + str(int(0.9*rr)) + " " + unmap_fq1 + + " " + unmap_fq2) + pm.run(cmd, [r1_repair, r2_repair]) + pm.clean_add(r1_repair_single) + pm.clean_add(r2_repair_single) + cmd1 = ("mv " + r1_repair + " " + unmap_fq1) + cmd2 = ("mv " + r2_repair + " " + unmap_fq2) + cmd3 = ("touch repaired.flag") + pm.run([cmd1, cmd2, cmd3], repair_target) + + # Re-pair the duplicates (but only if we could identify duplicates) + if args.umi_len > 0: + r1_dups_repair = os.path.join( + fastq_folder, args.sample_name + "_R1_trimmed.fastq.paired.fq") + r2_dups_repair = os.path.join( + fastq_folder, args.sample_name + "_R2_trimmed_dups.fastq.paired.fq") + + r1_dups_repair_single = os.path.join( + fastq_folder, args.sample_name + "_R1_trimmed.fastq.single.fq") + r2_dups_repair_single = os.path.join( + fastq_folder, args.sample_name + "_R2_trimmed_dups.fastq.single.fq") + + cmd = (tools.fastqpair + " -t " + str(int(0.9*rr)) + " " + + unmap_fq1_dups + " " + unmap_fq2_dups) + pm.run(cmd, [r1_dups_repair, r2_dups_repair]) + pm.clean_add(r1_dups_repair_single) + pm.clean_add(r2_dups_repair_single) + cmd1 = ("mv " + r1_dups_repair + " " + unmap_fq1_dups) + cmd2 = ("mv " + r2_dups_repair + " " + unmap_fq2_dups) + cmd3 = ("touch dups_repaired.flag") + pm.run([cmd1, cmd2, cmd3], dups_repair_target) else: - unmap_fq1 = _process_fastq(args, tools, False, - untrimmed_fastq1, - outfolder=param.outfolder) - unmap_fq2 = "" + if args.complexity and args.umi_len > 0: + unmap_fq1, unmap_fq1_dups = _process_fastq(args, tools, False, + untrimmed_fastq1, + outfolder=param.outfolder) + unmap_fq2 = "" + unmap_fq2_dups = "" + else: + unmap_fq1 = _process_fastq(args, tools, False, + untrimmed_fastq1, + outfolder=param.outfolder) + unmap_fq2 = "" pm.timestamp("### Plot adapter insertion distribution") if not args.adapter == "cutadapt": @@ -1701,80 +1647,86 @@ def main(): ############################################################################ # We recommend mapping to human_rDNA first for PRO-seq data pm.timestamp("### Prealignments") + to_compress = [] - if len(args.prealignments) == 0: - print("You may use `--prealignments` to align to references before " - "the genome alignment step. See docs.") - else: - print("Prealignment assemblies: " + str(args.prealignments)) - # Loop through any prealignment references and map to them sequentially - for reference in args.prealignments: - if args.complexity and args.umi_len > 0: - if args.no_fifo: - unmap_fq1, unmap_fq2 = _align_with_bt2( - args, tools, args.paired_end, False, unmap_fq1, - unmap_fq2, reference, - assembly_bt2=os.path.join( - rgc.get_asset(reference, BT2_IDX_KEY), reference), - outfolder=param.outfolder, - aligndir="prealignments") - - unmap_fq1_dups, unmap_fq2_dups = _align_with_bt2( - args, tools, args.paired_end, False, unmap_fq1_dups, - unmap_fq2_dups, reference, - assembly_bt2=os.path.join( - rgc.get_asset(reference, BT2_IDX_KEY), reference), - outfolder=param.outfolder, - aligndir="prealignments", - dups=True) - - else: - unmap_fq1, unmap_fq2 = _align_with_bt2( - args, tools, args.paired_end, True, unmap_fq1, - unmap_fq2, reference, - assembly_bt2=os.path.join( - rgc.get_asset(reference, BT2_IDX_KEY), reference), - outfolder=param.outfolder, - aligndir="prealignments") - - unmap_fq1_dups, unmap_fq2_dups = _align_with_bt2( - args, tools, args.paired_end, True, unmap_fq1_dups, - unmap_fq2_dups, reference, - assembly_bt2=os.path.join( - rgc.get_asset(reference, BT2_IDX_KEY), reference), - outfolder=param.outfolder, - aligndir="prealignments", - dups=True) - if args.paired_end: - to_compress.append(unmap_fq1_dups) - to_compress.append(unmap_fq2_dups) - to_compress.append(unmap_fq1) - to_compress.append(unmap_fq2) - else: - to_compress.append(unmap_fq1_dups) - to_compress.append(unmap_fq1) - else: - if args.no_fifo: - unmap_fq1, unmap_fq2 = _align_with_bt2( - args, tools, args.paired_end, False, - unmap_fq1, unmap_fq2, reference, - assembly_bt2=os.path.join( - rgc.get_asset(reference, BT2_IDX_KEY), reference), - outfolder=param.outfolder, - aligndir="prealignments") - else: - unmap_fq1, unmap_fq2 = _align_with_bt2( - args, tools, args.paired_end, True, - unmap_fq1, unmap_fq2, reference, - assembly_bt2=os.path.join( - rgc.get_asset(reference, BT2_IDX_KEY), reference), - outfolder=param.outfolder, - aligndir="prealignments") - if args.paired_end: - to_compress.append(unmap_fq1) - to_compress.append(unmap_fq2) + if not pm.get_stat("Aligned_reads") or args.new_start: + if len(args.prealignments) == 0: + print("You may use `--prealignments` to align to references before " + "the genome alignment step. See docs.") + else: + print("Prealignment assemblies: " + str(args.prealignments)) + # Loop through any prealignment references and map to them sequentially + for reference in args.prealignments: + # fq1_gz = os.path.join(param.outfolder, "prealignments", + # args.sample_name + "_" + + # reference + "_unmap_R1.fq.gz") + #if not _itsa_file(fq1_gz) or args.new_start: + if args.complexity and args.umi_len > 0: + if args.no_fifo: + unmap_fq1, unmap_fq2 = _align_with_bt2( + args, tools, args.paired_end, False, unmap_fq1, + unmap_fq2, reference, + assembly_bt2=os.path.join( + rgc.get_asset(reference, BT2_IDX_KEY), reference), + outfolder=param.outfolder, + aligndir="prealignments") + + unmap_fq1_dups, unmap_fq2_dups = _align_with_bt2( + args, tools, args.paired_end, False, unmap_fq1_dups, + unmap_fq2_dups, reference, + assembly_bt2=os.path.join( + rgc.get_asset(reference, BT2_IDX_KEY), reference), + outfolder=param.outfolder, + aligndir="prealignments", + dups=True) + + else: + unmap_fq1, unmap_fq2 = _align_with_bt2( + args, tools, args.paired_end, True, unmap_fq1, + unmap_fq2, reference, + assembly_bt2=os.path.join( + rgc.get_asset(reference, BT2_IDX_KEY), reference), + outfolder=param.outfolder, + aligndir="prealignments") + + unmap_fq1_dups, unmap_fq2_dups = _align_with_bt2( + args, tools, args.paired_end, True, unmap_fq1_dups, + unmap_fq2_dups, reference, + assembly_bt2=os.path.join( + rgc.get_asset(reference, BT2_IDX_KEY), reference), + outfolder=param.outfolder, + aligndir="prealignments", + dups=True) + if args.paired_end: + to_compress.append(unmap_fq1_dups) + to_compress.append(unmap_fq2_dups) + to_compress.append(unmap_fq1) + to_compress.append(unmap_fq2) + else: + to_compress.append(unmap_fq1_dups) + to_compress.append(unmap_fq1) else: - to_compress.append(unmap_fq1) + if args.no_fifo: + unmap_fq1, unmap_fq2 = _align_with_bt2( + args, tools, args.paired_end, False, + unmap_fq1, unmap_fq2, reference, + assembly_bt2=os.path.join( + rgc.get_asset(reference, BT2_IDX_KEY), reference), + outfolder=param.outfolder, + aligndir="prealignments") + else: + unmap_fq1, unmap_fq2 = _align_with_bt2( + args, tools, args.paired_end, True, + unmap_fq1, unmap_fq2, reference, + assembly_bt2=os.path.join( + rgc.get_asset(reference, BT2_IDX_KEY), reference), + outfolder=param.outfolder, + aligndir="prealignments") + if args.paired_end: + to_compress.append(unmap_fq1) + to_compress.append(unmap_fq2) + else: + to_compress.append(unmap_fq1) ############################################################################ # Map to primary genome # @@ -1810,308 +1762,304 @@ def main(): os.chmod(tempdir, 0o771) pm.clean_add(tempdir) - # check input for zipped or not - if pypiper.is_gzipped_fastq(unmap_fq1): - cmd = (ngstk.ziptool + " -d " + (unmap_fq1 + ".gz")) - pm.run(cmd, mapping_genome_bam) - if args.paired_end: - if pypiper.is_gzipped_fastq(unmap_fq2): - cmd = (ngstk.ziptool + " -d " + (unmap_fq2 + ".gz")) - pm.run(cmd, mapping_genome_bam) - - cmd = tools.bowtie2 + " -p " + str(pm.cores) - cmd += bt2_options - cmd += " --rg-id " + args.sample_name - cmd += " -x " + os.path.join( - rgc.get_asset(args.genome_assembly, BT2_IDX_KEY), - args.genome_assembly) - if args.paired_end: - cmd += " --rf -1 " + unmap_fq1 + " -2 " + unmap_fq2 - else: - cmd += " -U " + unmap_fq1 - cmd += " | " + tools.samtools + " view -bS - -@ 1 " - cmd += " | " + tools.samtools + " sort - -@ 1" - cmd += " -T " + tempdir - cmd += " -o " + mapping_genome_bam_temp - - if args.complexity and args.umi_len > 0: + if not pm.get_stat("Aligned_reads") or args.new_start: # check input for zipped or not - if pypiper.is_gzipped_fastq(unmap_fq1_dups): - cmd = (ngstk.ziptool + " -d " + (unmap_fq1_dups + ".gz")) + if pypiper.is_gzipped_fastq(unmap_fq1): + cmd = (ngstk.ziptool + " -d " + (unmap_fq1 + ".gz")) pm.run(cmd, mapping_genome_bam) if args.paired_end: - if pypiper.is_gzipped_fastq(unmap_fq2_dups): - cmd = (ngstk.ziptool + " -d " + (unmap_fq2_dups + ".gz")) + if pypiper.is_gzipped_fastq(unmap_fq2): + cmd = (ngstk.ziptool + " -d " + (unmap_fq2 + ".gz")) pm.run(cmd, mapping_genome_bam) - cmd_dups = tools.bowtie2 + " -p " + str(pm.cores) - cmd_dups += bt2_options - cmd_dups += " --rg-id " + args.sample_name - cmd_dups += " -x " + os.path.join( + cmd = tools.bowtie2 + " -p " + str(pm.cores) + cmd += bt2_options + cmd += " --rg-id " + args.sample_name + cmd += " -x " + os.path.join( rgc.get_asset(args.genome_assembly, BT2_IDX_KEY), args.genome_assembly) if args.paired_end: - cmd_dups += " --rf -1 " + unmap_fq1_dups + " -2 " + unmap_fq2_dups + cmd += " --rf -1 " + unmap_fq1 + " -2 " + unmap_fq2 else: - cmd_dups += " -U " + unmap_fq1_dups - cmd_dups += " | " + tools.samtools + " view -bS - -@ 1 " - cmd_dups += " | " + tools.samtools + " sort - -@ 1" - cmd_dups += " -T " + tempdir - cmd_dups += " -o " + mapping_genome_bam_temp_dups - - # Split genome mapping result bamfile into two: high-quality aligned - # reads (keepers) and unmapped reads (in case we want to analyze the - # altogether unmapped reads) - # -q 10: skip alignments with MAPQ less than 10 - cmd2 = (tools.samtools + " view -q 10 -b -@ " + str(pm.cores) + - " -U " + failQC_genome_bam + " ") - cmd2 += mapping_genome_bam_temp + " > " + mapping_genome_bam + cmd += " -U " + unmap_fq1 + cmd += " | " + tools.samtools + " view -bS - -@ 1 " + cmd += " | " + tools.samtools + " sort - -@ 1" + cmd += " -T " + tempdir + cmd += " -o " + mapping_genome_bam_temp - if args.complexity and args.umi_len > 0: - cmd2_dups = (tools.samtools + " view -q 10 -b -@ " + str(pm.cores) + - " -U " + failQC_genome_bam_dups + " ") - cmd2_dups += mapping_genome_bam_temp_dups + " > " + mapping_genome_bam_dups - pm.clean_add(failQC_genome_bam_dups) - - def check_alignment_genome(temp_bam, bam): - mr = ngstk.count_mapped_reads(temp_bam, args.paired_end) - ar = ngstk.count_mapped_reads(bam, args.paired_end) - if args.paired_end: - ar = float(ar)/2 - rr = float(pm.get_stat("Raw_reads")) - tr = float(pm.get_stat("Trimmed_reads")) - if os.path.exists(res.refgene_pre_mRNA): - cmd = (tools.samtools + " depth -b " + - res.refgene_pre_mRNA + " " + bam + - " | awk '{counter++;sum+=$3}END{print sum/counter}'") - rd = pm.checkprint(cmd) - else: - cmd = (tools.samtools + " depth " + bam + - " | awk '{counter++;sum+=$3}END{print sum/counter}'") - rd = pm.checkprint(cmd) - pm.report_result("Mapped_reads", mr) - pm.report_result("QC_filtered_reads", - round(float(mr)) - round(float(ar))) - pm.report_result("Aligned_reads", ar) - pm.report_result("Alignment_rate", round(float(ar) * 100 / - float(tr), 2)) - pm.report_result("Total_efficiency", round(float(ar) * 100 / - float(rr), 2)) - if rd and rd.strip(): - pm.report_result("Read_depth", round(float(rd), 2)) - - pm.run([cmd, cmd2], mapping_genome_bam, - follow=lambda: check_alignment_genome(mapping_genome_bam_temp, - mapping_genome_bam), - container=pm.container) - - if args.complexity and args.umi_len > 0: - pm.run([cmd_dups, cmd2_dups], mapping_genome_bam_dups, - container=pm.container) + if args.complexity and args.umi_len > 0: + # check input for zipped or not + if pypiper.is_gzipped_fastq(unmap_fq1_dups): + cmd = (ngstk.ziptool + " -d " + (unmap_fq1_dups + ".gz")) + pm.run(cmd, mapping_genome_bam) + if args.paired_end: + if pypiper.is_gzipped_fastq(unmap_fq2_dups): + cmd = (ngstk.ziptool + " -d " + (unmap_fq2_dups + ".gz")) + pm.run(cmd, mapping_genome_bam) + + cmd_dups = tools.bowtie2 + " -p " + str(pm.cores) + cmd_dups += bt2_options + cmd_dups += " --rg-id " + args.sample_name + cmd_dups += " -x " + os.path.join( + rgc.get_asset(args.genome_assembly, BT2_IDX_KEY), + args.genome_assembly) + if args.paired_end: + cmd_dups += " --rf -1 " + unmap_fq1_dups + " -2 " + unmap_fq2_dups + else: + cmd_dups += " -U " + unmap_fq1_dups + cmd_dups += " | " + tools.samtools + " view -bS - -@ 1 " + cmd_dups += " | " + tools.samtools + " sort - -@ 1" + cmd_dups += " -T " + tempdir + cmd_dups += " -o " + mapping_genome_bam_temp_dups + + # Split genome mapping result bamfile into two: high-quality aligned + # reads (keepers) and unmapped reads (in case we want to analyze the + # altogether unmapped reads) + # -q 10: skip alignments with MAPQ less than 10 + cmd2 = (tools.samtools + " view -q 10 -b -@ " + str(pm.cores) + + " -U " + failQC_genome_bam + " ") + cmd2 += mapping_genome_bam_temp + " > " + mapping_genome_bam - pm.timestamp("### Compress all unmapped read files") - for unmapped_fq in to_compress: - # Compress unmapped fastq reads - if not pypiper.is_gzipped_fastq(unmapped_fq) and not unmapped_fq == '': - if 'unmap_dups' in unmapped_fq: - pm.clean_add(unmapped_fq) + if args.complexity and args.umi_len > 0: + cmd2_dups = (tools.samtools + " view -q 10 -b -@ " + str(pm.cores) + + " -U " + failQC_genome_bam_dups + " ") + cmd2_dups += mapping_genome_bam_temp_dups + " > " + mapping_genome_bam_dups + pm.clean_add(failQC_genome_bam_dups) + + def check_alignment_genome(temp_bam, bam): + mr = ngstk.count_mapped_reads(temp_bam, args.paired_end) + ar = ngstk.count_mapped_reads(bam, args.paired_end) + if args.paired_end: + ar = float(ar)/2 + rr = float(pm.get_stat("Raw_reads")) + tr = float(pm.get_stat("Trimmed_reads")) + if os.path.exists(res.refgene_pre_mRNA): + cmd = (tools.samtools + " depth -b " + + res.refgene_pre_mRNA + " " + bam + + " | awk '{counter++;sum+=$3}END{print sum/counter}'") + rd = pm.checkprint(cmd) else: - cmd = (ngstk.ziptool + " " + unmapped_fq) - unmapped_fq = unmapped_fq + ".gz" - pm.run(cmd, unmapped_fq) + cmd = (tools.samtools + " depth " + bam + + " | awk '{counter++;sum+=$3}END{print sum/counter}'") + rd = pm.checkprint(cmd) + pm.report_result("Mapped_reads", mr) + pm.report_result("QC_filtered_reads", + round(float(mr)) - round(float(ar))) + pm.report_result("Aligned_reads", ar) + pm.report_result("Alignment_rate", round(float(ar) * 100 / + float(tr), 2)) + pm.report_result("Total_efficiency", round(float(ar) * 100 / + float(rr), 2)) + if rd and rd.strip(): + pm.report_result("Read_depth", round(float(rd), 2)) + + pm.run([cmd, cmd2], mapping_genome_bam, + follow=lambda: check_alignment_genome(mapping_genome_bam_temp, + mapping_genome_bam), + container=pm.container) - temp_mapping_index = os.path.join(mapping_genome_bam_temp + ".bai") - temp_mapping_index_dups = os.path.join(mapping_genome_bam_temp_dups + ".bai") + if args.complexity and args.umi_len > 0: + pm.run([cmd_dups, cmd2_dups], mapping_genome_bam_dups, + container=pm.container) + + pm.timestamp("### Compress all unmapped read files") + for unmapped_fq in to_compress: + # Compress unmapped fastq reads + if not pypiper.is_gzipped_fastq(unmapped_fq) and not unmapped_fq == '': + if 'unmap_dups' in unmapped_fq: + pm.clean_add(unmapped_fq) + else: + cmd = (ngstk.ziptool + " " + unmapped_fq) + unmapped_fq = unmapped_fq + ".gz" + pm.run(cmd, unmapped_fq) - if not args.prealignments and os.path.exists(mapping_genome_bam_temp): - # Index the temporary bam file - cmd = tools.samtools + " index " + mapping_genome_bam_temp - pm.run(cmd, temp_mapping_index) - pm.clean_add(temp_mapping_index) + temp_mapping_index = os.path.join(mapping_genome_bam_temp + ".bai") + temp_mapping_index_dups = os.path.join(mapping_genome_bam_temp_dups + ".bai") - if args.complexity and args.umi_len > 0: - cmd_dups = tools.samtools + " index " + mapping_genome_bam_temp_dups - pm.run(cmd_dups, temp_mapping_index_dups) - pm.clean_add(temp_mapping_index_dups) - pm.clean_add(mapping_genome_bam_temp_dups) - - # Determine mitochondrial read counts - # TODO: instead do this to rDNA? - mito_name = ["chrM", "chrMT", "M", "MT", "rCRSd", "rCRSd_3k"] - if os.path.exists(mapping_genome_bam_temp): - if not os.path.exists(temp_mapping_index): + if not args.prealignments and os.path.exists(mapping_genome_bam_temp): + # Index the temporary bam file cmd = tools.samtools + " index " + mapping_genome_bam_temp pm.run(cmd, temp_mapping_index) pm.clean_add(temp_mapping_index) - cmd = (tools.samtools + " idxstats " + mapping_genome_bam_temp + - " | grep") - for name in mito_name: - cmd += " -we '" + name + "'" - cmd += "| cut -f 3" - mr = pm.checkprint(cmd) - - # If there are mitochondrial reads, report and remove them - if mr and mr.strip(): - pm.report_result("Mitochondrial_reads", round(float(mr))) - # Index the sort'ed BAM file first - mapping_genome_index = os.path.join(mapping_genome_bam + ".bai") - noMT_mapping_genome_bam = os.path.join( - map_genome_folder, args.sample_name + "_noMT.bam") - - cmd1 = tools.samtools + " index " + mapping_genome_bam - cmd2 = (tools.samtools + " idxstats " + mapping_genome_bam + - " | cut -f 1 | grep") - for name in mito_name: - cmd2 += " -vwe '" + name + "'" - cmd2 += ("| xargs " + tools.samtools + " view -b -@ " + - str(pm.cores) + " " + mapping_genome_bam + " > " + - noMT_mapping_genome_bam) - cmd3 = ("mv " + noMT_mapping_genome_bam + " " + mapping_genome_bam) - cmd4 = tools.samtools + " index " + mapping_genome_bam - pm.run([cmd1, cmd2, cmd3, cmd4], noMT_mapping_genome_bam) - pm.clean_add(mapping_genome_index) - - # Determine maximum read length - cmd = (tools.samtools + " stats " + mapping_genome_bam + - " | grep '^SN' | cut -f 2- | grep 'maximum length:' | cut -f 2-") - max_len = int(pm.checkprint(cmd)) - - if args.max_len != -1: - max_len = args.max_len - - # Remove PE2 reads - if args.paired_end: - pm.timestamp("### Split BAM file") - mapping_pe1_bam = os.path.join( - map_genome_folder, args.sample_name + "_PE1.bam") - mapping_pe2_bam = os.path.join( - map_genome_folder, args.sample_name + "_PE2.bam") - cmd1 = (tools.samtools + " view -b -f 64 " + mapping_genome_bam + - " | " + tools.samtools + " sort - -@ " + str(pm.cores) + - " > " + mapping_pe1_bam) - cmd2 = (tools.samtools + " view -b -f 128 " + mapping_genome_bam + - " | " + tools.samtools + " sort - -@ " + str(pm.cores) + - " > " + mapping_pe2_bam) - pm.run([cmd1, cmd2], [mapping_pe1_bam, mapping_pe2_bam]) - mapping_genome_bam = mapping_pe1_bam - - ############################################################################ - # Calculate library complexity # - ############################################################################ - QC_folder = os.path.join(param.outfolder, "QC_" + args.genome_assembly) - ngstk.make_dir(QC_folder) - - if args.complexity and args.umi_len > 0: - if os.path.exists(mapping_genome_bam_temp_dups): - if not os.path.exists(temp_mapping_index_dups): - cmd = tools.samtools + " index " + mapping_genome_bam_temp_dups - pm.run(cmd, temp_mapping_index_dups) + if args.complexity and args.umi_len > 0: + cmd_dups = tools.samtools + " index " + mapping_genome_bam_temp_dups + pm.run(cmd_dups, temp_mapping_index_dups) pm.clean_add(temp_mapping_index_dups) - - cmd_dups = (tools.samtools + " idxstats " + - mapping_genome_bam_temp_dups + " | grep") + pm.clean_add(mapping_genome_bam_temp_dups) + + # Determine mitochondrial read counts + mito_name = ["chrM", "chrMT", "M", "MT", "rCRSd", "rCRSd_3k"] + if os.path.exists(mapping_genome_bam_temp): + if not os.path.exists(temp_mapping_index): + cmd = tools.samtools + " index " + mapping_genome_bam_temp + pm.run(cmd, temp_mapping_index) + pm.clean_add(temp_mapping_index) + + cmd = (tools.samtools + " idxstats " + mapping_genome_bam_temp + + " | grep") for name in mito_name: - cmd_dups += " -we '" + name + "'" - cmd_dups += "| cut -f 3" - mr_dups = pm.checkprint(cmd_dups) - - if mr_dups and mr_dups.strip(): + cmd += " -we '" + name + "'" + cmd += "| cut -f 3" + mr = pm.checkprint(cmd) + + # If there are mitochondrial reads, report and remove them + if mr and mr.strip(): + pm.report_result("Mitochondrial_reads", round(float(mr))) # Index the sort'ed BAM file first - mapping_genome_index_dups = os.path.join( - mapping_genome_bam_dups + ".bai") - noMT_mapping_genome_bam_dups = os.path.join( - map_genome_folder, args.sample_name + "_noMT_dups.bam") - - cmd1 = tools.samtools + " index " + mapping_genome_bam_dups - cmd2 = (tools.samtools + " idxstats " + - mapping_genome_bam_dups + " | cut -f 1 | grep") + mapping_genome_index = os.path.join(mapping_genome_bam + ".bai") + noMT_mapping_genome_bam = os.path.join( + map_genome_folder, args.sample_name + "_noMT.bam") + + cmd1 = tools.samtools + " index " + mapping_genome_bam + cmd2 = (tools.samtools + " idxstats " + mapping_genome_bam + + " | cut -f 1 | grep") for name in mito_name: cmd2 += " -vwe '" + name + "'" cmd2 += ("| xargs " + tools.samtools + " view -b -@ " + - str(pm.cores) + " " + mapping_genome_bam_dups + - " > " + noMT_mapping_genome_bam_dups) - cmd3 = ("mv " + noMT_mapping_genome_bam_dups + " " + - mapping_genome_bam_dups) - cmd4 = tools.samtools + " index " + mapping_genome_bam_dups - pm.run([cmd1, cmd2, cmd3, cmd4], noMT_mapping_genome_bam_dups) - pm.clean_add(mapping_genome_index_dups) + str(pm.cores) + " " + mapping_genome_bam + " > " + + noMT_mapping_genome_bam) + cmd3 = ("mv " + noMT_mapping_genome_bam + " " + mapping_genome_bam) + cmd4 = tools.samtools + " index " + mapping_genome_bam + pm.run([cmd1, cmd2, cmd3, cmd4], noMT_mapping_genome_bam) + pm.clean_add(mapping_genome_index) + + # Determine maximum read length + cmd = (tools.samtools + " stats " + mapping_genome_bam + + " | grep '^SN' | cut -f 2- | grep 'maximum length:' | cut -f 2-") + max_len = int(pm.checkprint(cmd)) + + if args.max_len != -1: + max_len = args.max_len # Remove PE2 reads if args.paired_end: - dups_pe1_bam = os.path.join( - map_genome_folder, args.sample_name + "_dups_PE1.bam") - dups_pe2_bam = os.path.join( - map_genome_folder, args.sample_name + "_dups_PE2.bam") - cmd1 = (tools.samtools + " view -b -f 64 " + mapping_genome_bam_dups + - " | " + tools.samtools + " sort - -@ " + str(pm.cores) + - " > " + dups_pe1_bam) - cmd2 = (tools.samtools + " view -b -f 128 " + mapping_genome_bam_dups + - " | " + tools.samtools + " sort - -@ " + str(pm.cores) + - " > " + dups_pe2_bam) - pm.run([cmd1, cmd2], [dups_pe1_bam, dups_pe2_bam]) - mapping_genome_bam_dups = dups_pe1_bam - - pm.timestamp("### Calculate library complexity") - - preseq_output = os.path.join( - QC_folder, args.sample_name + "_preseq_out.txt") - preseq_yield = os.path.join( - QC_folder, args.sample_name + "_preseq_yield.txt") - # preseq_mr = os.path.join( - # QC_folder, args.sample_name + "_preseq.mr") - # preseq_cov = os.path.join( - # QC_folder, args.sample_name + "_preseq_coverage.txt") - preseq_counts = os.path.join( - QC_folder, args.sample_name + "_preseq_counts.txt") - preseq_plot = os.path.join( - QC_folder, args.sample_name + "_preseq_plot") - preseq_pdf = os.path.join( - QC_folder, args.sample_name + "_preseq_plot.pdf") - preseq_png = os.path.join( - QC_folder, args.sample_name + "_preseq_plot.png") - - cmd1 = (tools.preseq + " c_curve -v -o " + preseq_output + - " -B " + mapping_genome_bam_dups) - pm.run(cmd1, preseq_output) - - cmd2 = (tools.preseq + " lc_extrap -v -o " + preseq_yield + - " -B " + mapping_genome_bam_dups) - pm.run(cmd2, preseq_yield, nofail=True) - - if os.path.exists(preseq_yield): - # cmd3 = ("bam2mr " + mapping_genome_bam_dups + - # " > " + preseq_mr) - # cmd4 = (tools.preseq + " gc_extrap -v -o " + preseq_cov + - # " " + preseq_mr) - cmd5 = ("echo '" + preseq_yield + - " '$(" + tools.samtools + " view -c -F 4 " + - mapping_genome_bam_dups + ")" + "' '" + - "$(" + tools.samtools + " view -c -F 4 " + - mapping_genome_bam + ") > " + preseq_counts) - - # pm.run([cmd3, cmd4, cmd5], - # [preseq_mr, preseq_cov, preseq_counts]) - pm.run(cmd5, preseq_counts) - #pm.clean_add(preseq_mr) - pm.clean_add(mapping_genome_bam_dups) - pm.clean_add(mapping_genome_bam_temp_dups) - - cmd = ("awk '{sum+=$2} END {printf \"%.0f\", sum}' " + res.chrom_sizes) - genome_size = int(pm.checkprint(cmd)) - - cmd = (tools.Rscript + " " + tool_path("PEPPRO.R") + - " preseq " + "-i " + preseq_yield) - if args.coverage: - cmd += (" -c " + str(genome_size) + " -l " + max_len) - cmd += (" -r " + preseq_counts + " -o " + preseq_plot) - - pm.run(cmd, [preseq_pdf, preseq_png]) - - pm.report_object("Library complexity", preseq_pdf, - anchor_image=preseq_png) - else: - print("Unable to calculate library complexity.") + pm.timestamp("### Split BAM file") + mapping_pe1_bam = os.path.join( + map_genome_folder, args.sample_name + "_PE1.bam") + mapping_pe2_bam = os.path.join( + map_genome_folder, args.sample_name + "_PE2.bam") + cmd1 = (tools.samtools + " view -b -f 64 " + mapping_genome_bam + + " | " + tools.samtools + " sort - -@ " + str(pm.cores) + + " > " + mapping_pe1_bam) + cmd2 = (tools.samtools + " view -b -f 128 " + mapping_genome_bam + + " | " + tools.samtools + " sort - -@ " + str(pm.cores) + + " > " + mapping_pe2_bam) + pm.run([cmd1, cmd2], [mapping_pe1_bam, mapping_pe2_bam]) + mapping_genome_bam = mapping_pe1_bam + + ############################################################################ + # Calculate library complexity # + ############################################################################ + QC_folder = os.path.join(param.outfolder, "QC_" + args.genome_assembly) + ngstk.make_dir(QC_folder) + preseq_output = os.path.join( + QC_folder, args.sample_name + "_preseq_out.txt") + preseq_yield = os.path.join( + QC_folder, args.sample_name + "_preseq_yield.txt") + preseq_counts = os.path.join( + QC_folder, args.sample_name + "_preseq_counts.txt") + preseq_plot = os.path.join( + QC_folder, args.sample_name + "_preseq_plot") + preseq_pdf = os.path.join( + QC_folder, args.sample_name + "_preseq_plot.pdf") + preseq_png = os.path.join( + QC_folder, args.sample_name + "_preseq_plot.png") + + if not _itsa_file(preseq_plot) or args.new_start: + if args.complexity and args.umi_len > 0: + if os.path.exists(mapping_genome_bam_temp_dups): + if not os.path.exists(temp_mapping_index_dups): + cmd = tools.samtools + " index " + mapping_genome_bam_temp_dups + pm.run(cmd, temp_mapping_index_dups) + pm.clean_add(temp_mapping_index_dups) + + cmd_dups = (tools.samtools + " idxstats " + + mapping_genome_bam_temp_dups + " | grep") + for name in mito_name: + cmd_dups += " -we '" + name + "'" + cmd_dups += "| cut -f 3" + mr_dups = pm.checkprint(cmd_dups) + + if mr_dups and mr_dups.strip(): + # Index the sort'ed BAM file first + mapping_genome_index_dups = os.path.join( + mapping_genome_bam_dups + ".bai") + noMT_mapping_genome_bam_dups = os.path.join( + map_genome_folder, args.sample_name + "_noMT_dups.bam") + + cmd1 = tools.samtools + " index " + mapping_genome_bam_dups + cmd2 = (tools.samtools + " idxstats " + + mapping_genome_bam_dups + " | cut -f 1 | grep") + for name in mito_name: + cmd2 += " -vwe '" + name + "'" + cmd2 += ("| xargs " + tools.samtools + " view -b -@ " + + str(pm.cores) + " " + mapping_genome_bam_dups + + " > " + noMT_mapping_genome_bam_dups) + cmd3 = ("mv " + noMT_mapping_genome_bam_dups + " " + + mapping_genome_bam_dups) + cmd4 = tools.samtools + " index " + mapping_genome_bam_dups + pm.run([cmd1, cmd2, cmd3, cmd4], noMT_mapping_genome_bam_dups) + pm.clean_add(mapping_genome_index_dups) + + # Remove PE2 reads + if args.paired_end: + dups_pe1_bam = os.path.join( + map_genome_folder, args.sample_name + "_dups_PE1.bam") + dups_pe2_bam = os.path.join( + map_genome_folder, args.sample_name + "_dups_PE2.bam") + cmd1 = (tools.samtools + " view -b -f 64 " + + mapping_genome_bam_dups + " | " + tools.samtools + + " sort - -@ " + str(pm.cores) + " > " + dups_pe1_bam) + cmd2 = (tools.samtools + " view -b -f 128 " + + mapping_genome_bam_dups + " | " + tools.samtools + + " sort - -@ " + str(pm.cores) + " > " + dups_pe2_bam) + pm.run([cmd1, cmd2], [dups_pe1_bam, dups_pe2_bam]) + mapping_genome_bam_dups = dups_pe1_bam + + pm.timestamp("### Calculate library complexity") + + cmd1 = (tools.preseq + " c_curve -v -o " + preseq_output + + " -B " + mapping_genome_bam_dups) + pm.run(cmd1, preseq_output) + + cmd2 = (tools.preseq + " lc_extrap -v -o " + preseq_yield + + " -B " + mapping_genome_bam_dups) + pm.run(cmd2, preseq_yield, nofail=True) + + if os.path.exists(preseq_yield): + # cmd3 = ("bam2mr " + mapping_genome_bam_dups + + # " > " + preseq_mr) + # cmd4 = (tools.preseq + " gc_extrap -v -o " + preseq_cov + + # " " + preseq_mr) + cmd5 = ("echo '" + preseq_yield + + " '$(" + tools.samtools + " view -c -F 4 " + + mapping_genome_bam_dups + ")" + "' '" + + "$(" + tools.samtools + " view -c -F 4 " + + mapping_genome_bam + ") > " + preseq_counts) + + # pm.run([cmd3, cmd4, cmd5], + # [preseq_mr, preseq_cov, preseq_counts]) + pm.run(cmd5, preseq_counts) + #pm.clean_add(preseq_mr) + pm.clean_add(mapping_genome_bam_dups) + pm.clean_add(mapping_genome_bam_temp_dups) + + cmd = ("awk '{sum+=$2} END {printf \"%.0f\", sum}' " + res.chrom_sizes) + genome_size = int(pm.checkprint(cmd)) + + cmd = (tools.Rscript + " " + tool_path("PEPPRO.R") + + " preseq " + "-i " + preseq_yield) + if args.coverage: + cmd += (" -c " + str(genome_size) + " -l " + max_len) + cmd += (" -r " + preseq_counts + " -o " + preseq_plot) + + pm.run(cmd, [preseq_pdf, preseq_png]) + + pm.report_object("Library complexity", preseq_pdf, + anchor_image=preseq_png) + else: + print("Unable to calculate library complexity.") ############################################################################ # Calculate quality control metrics for the alignment file # @@ -2222,68 +2170,70 @@ def count_unmapped_reads(): else: pm.timestamp("### Calculate TSS enrichment") - # Split TSS file - plus_TSS = os.path.join(QC_folder, "plus_TSS.tsv") - minus_TSS = os.path.join(QC_folder, "minus_TSS.tsv") - cmd = ("sed -n -e '/[[:space:]]+/w " + - plus_TSS + "' -e '/[[:space:]]-/w " + - minus_TSS + "' " + res.refgene_tss) - pm.run(cmd, [plus_TSS, minus_TSS]) - - # pyTssEnrichment requires indexed bam - if not os.path.exists(mapping_genome_index): - cmd = build_command([ - tools.samtools, - "index", - mapping_genome_bam - ]) - pm.run(cmd, mapping_genome_index) - - # Plus TSS enrichment Tss_plus = os.path.join(QC_folder, args.sample_name + "_plus_TssEnrichment.txt") - cmd = tool_path("pyTssEnrichment.py") - cmd += " -a " + mapping_genome_bam + " -b " + plus_TSS + " -p ends" - cmd += " -c " + str(pm.cores) - cmd += " -z -v -s 6 -o " + Tss_plus - pm.run(cmd, Tss_plus, nofail=True) - pm.clean_add(plus_TSS) - pm.clean_add(Tss_plus) - - with open(Tss_plus) as f: - floats = list(map(float, f)) - try: - # If the TSS enrichment is 0, don't report - Tss_score = ( - (sum(floats[int(floats.index(max(floats))-49): - int(floats.index(max(floats))+51)]) / 100) / - (sum(floats[1:int(len(floats)*0.05)]) / int(len(floats)*0.05))) - pm.report_result("TSS_Plus_Score", round(Tss_score, 1)) - except ZeroDivisionError: - pass - - # Minus TSS enrichment Tss_minus = os.path.join(QC_folder, args.sample_name + "_minus_TssEnrichment.txt") - cmd = tool_path("pyTssEnrichment.py") - cmd += " -a " + mapping_genome_bam + " -b " + minus_TSS + " -p ends" - cmd += " -c " + str(pm.cores) - cmd += " -z -v -s 6 -o " + Tss_minus - pm.run(cmd, Tss_minus, nofail=True) - pm.clean_add(minus_TSS) - pm.clean_add(Tss_minus) - - with open(Tss_minus) as f: - floats = list(map(float, f)) - try: - # If the TSS enrichment is 0, don't report - Tss_score = ( - (sum(floats[int(floats.index(max(floats))-49): - int(floats.index(max(floats))+51)]) / 100) / - (sum(floats[1:int(len(floats)*0.05)]) / int(len(floats)*0.05))) - pm.report_result("TSS_Minus_Score", round(Tss_score, 1)) - except ZeroDivisionError: - pass + + if not pm.get_stat("TSS_Minus_Score") or args.new_start: + # Split TSS file + plus_TSS = os.path.join(QC_folder, "plus_TSS.tsv") + minus_TSS = os.path.join(QC_folder, "minus_TSS.tsv") + cmd = ("sed -n -e '/[[:space:]]+/w " + + plus_TSS + "' -e '/[[:space:]]-/w " + + minus_TSS + "' " + res.refgene_tss) + pm.run(cmd, [plus_TSS, minus_TSS]) + + # pyTssEnrichment requires indexed bam + if not os.path.exists(mapping_genome_index): + cmd = build_command([ + tools.samtools, + "index", + mapping_genome_bam + ]) + pm.run(cmd, mapping_genome_index) + + # Plus TSS enrichment + cmd = tool_path("pyTssEnrichment.py") + cmd += " -a " + mapping_genome_bam + " -b " + plus_TSS + " -p ends" + cmd += " -c " + str(pm.cores) + cmd += " -z -v -s 6 -o " + Tss_plus + pm.run(cmd, Tss_plus, nofail=True) + pm.clean_add(plus_TSS) + pm.clean_add(Tss_plus) + + with open(Tss_plus) as f: + floats = list(map(float, f)) + try: + # If the TSS enrichment is 0, don't report + Tss_score = ( + (sum(floats[int(floats.index(max(floats))-49): + int(floats.index(max(floats))+51)]) / 100) / + (sum(floats[1:int(len(floats)*0.05)]) / int(len(floats)*0.05))) + pm.report_result("TSS_Plus_Score", round(Tss_score, 1)) + except ZeroDivisionError: + pass + + # Minus TSS enrichment + cmd = tool_path("pyTssEnrichment.py") + cmd += " -a " + mapping_genome_bam + " -b " + minus_TSS + " -p ends" + cmd += " -c " + str(pm.cores) + cmd += " -z -v -s 6 -o " + Tss_minus + pm.run(cmd, Tss_minus, nofail=True) + pm.clean_add(minus_TSS) + pm.clean_add(Tss_minus) + + with open(Tss_minus) as f: + floats = list(map(float, f)) + try: + # If the TSS enrichment is 0, don't report + Tss_score = ( + (sum(floats[int(floats.index(max(floats))-49): + int(floats.index(max(floats))+51)]) / 100) / + (sum(floats[1:int(len(floats)*0.05)]) / int(len(floats)*0.05))) + pm.report_result("TSS_Minus_Score", round(Tss_score, 1)) + except ZeroDivisionError: + pass # Call Rscript to plot TSS Enrichment TSS_pdf = os.path.join(QC_folder, args.sample_name + @@ -2335,62 +2285,62 @@ def count_unmapped_reads(): .format(res.ensembl_gene_body)) else: pm.timestamp("### Calculate Pause Index (PI)") - - # Remove missing chr from PI annotations - tss_local = os.path.join(QC_folder, - args.genome_assembly + "_ensembl_tss.bed") - body_local = os.path.join(QC_folder, - args.genome_assembly + "_ensembl_gene_body.bed") - cmd1 = ("grep -wf " + chr_keep + " " + res.ensembl_tss + " | " + - tools.bedtools + " sort -i stdin -faidx " + chr_order + - " > " + tss_local) - cmd2 = ("grep -wf " + chr_keep + " " + res.ensembl_gene_body + " | " + - tools.bedtools + " sort -i stdin -faidx " + chr_order + - " > " + body_local) - pm.run([cmd1,cmd2], [tss_local, body_local], nofail=True) - pm.clean_add(tss_local) - pm.clean_add(body_local) - - # Determine coverage of highest scoring TSS - TSS_density = os.path.join(QC_folder, args.sample_name + - "_TSS_density.bed") - cmd = (tools.bedtools + " coverage -sorted -counts -s -a " + - tss_local + " -b " + mapping_genome_bam + - " -g " + chr_order + " | awk '$7>0' | " + - "sort -k4,4 -k7,7nr | " + - "sort -k4,4 -u > " + TSS_density) - pm.run(cmd, TSS_density, nofail=True) - pm.clean_add(TSS_density) - - # Determine coverage of gene body - body_density = os.path.join(QC_folder, args.sample_name + - "_gene_body_density.bed") - cmd = (tools.bedtools + " coverage -sorted -counts -s -a " + - body_local + " -b " + mapping_genome_bam + - " -g " + chr_order + " | awk '$7>0' | " + - "sort -k4 > " + body_density) - pm.run(cmd, body_density, nofail=True) - pm.clean_add(body_density) - - # Determine pause index pause_index = os.path.join(QC_folder, args.sample_name + "_pause_index.bed") - cmd = ("join --nocheck-order -j4 -o 1.1 1.2 1.3 1.4 1.6 1.7 2.2 2.3 2.7 " + - TSS_density + " " + body_density + - " | awk -v OFS='\t' '{print $1, $2, $3, $4, ($6/($3-$2))" + - "/($9/($8-$7)), $5}' | env LC_COLLATE=C sort -k1,1 -k2,2n > " + - pause_index) - pm.run(cmd, pause_index, nofail=True) - - # Median pause index - cmd = ("sort -k5,5n " + pause_index + - " | awk ' { a[i++]=$5; } END " + - "{ x=int((i+1)/2); if (x < (i+1)/2) " + - "print (a[x-1]+a[x])/2; else print a[x-1]; }'") - val = pm.checkprint(cmd) - if val and val.strip(): - pi = float(val) - pm.report_result("Pause index", round(pi, 2)) + if not pm.get_stat("Pause_index") or args.new_start: + # Remove missing chr from PI annotations + tss_local = os.path.join(QC_folder, + args.genome_assembly + "_ensembl_tss.bed") + body_local = os.path.join(QC_folder, + args.genome_assembly + "_ensembl_gene_body.bed") + cmd1 = ("grep -wf " + chr_keep + " " + res.ensembl_tss + " | " + + tools.bedtools + " sort -i stdin -faidx " + chr_order + + " > " + tss_local) + cmd2 = ("grep -wf " + chr_keep + " " + res.ensembl_gene_body + " | " + + tools.bedtools + " sort -i stdin -faidx " + chr_order + + " > " + body_local) + pm.run([cmd1,cmd2], [tss_local, body_local], nofail=True) + pm.clean_add(tss_local) + pm.clean_add(body_local) + + # Determine coverage of highest scoring TSS + TSS_density = os.path.join(QC_folder, args.sample_name + + "_TSS_density.bed") + cmd = (tools.bedtools + " coverage -sorted -counts -s -a " + + tss_local + " -b " + mapping_genome_bam + + " -g " + chr_order + " | awk '$7>0' | " + + "sort -k4,4 -k7,7nr | " + + "sort -k4,4 -u > " + TSS_density) + pm.run(cmd, TSS_density, nofail=True) + pm.clean_add(TSS_density) + + # Determine coverage of gene body + body_density = os.path.join(QC_folder, args.sample_name + + "_gene_body_density.bed") + cmd = (tools.bedtools + " coverage -sorted -counts -s -a " + + body_local + " -b " + mapping_genome_bam + + " -g " + chr_order + " | awk '$7>0' | " + + "sort -k4 > " + body_density) + pm.run(cmd, body_density, nofail=True) + pm.clean_add(body_density) + + # Determine pause index + cmd = ("join --nocheck-order -j4 -o 1.1 1.2 1.3 1.4 1.6 1.7 2.2 2.3 2.7 " + + TSS_density + " " + body_density + + " | awk -v OFS='\t' '{print $1, $2, $3, $4, ($6/($3-$2))" + + "/($9/($8-$7)), $5}' | env LC_COLLATE=C sort -k1,1 -k2,2n > " + + pause_index) + pm.run(cmd, pause_index, nofail=True) + + # Median pause index + cmd = ("sort -k5,5n " + pause_index + + " | awk ' { a[i++]=$5; } END " + + "{ x=int((i+1)/2); if (x < (i+1)/2) " + + "print (a[x-1]+a[x])/2; else print a[x-1]; }'") + val = pm.checkprint(cmd) + if val and val.strip(): + pi = float(val) + pm.report_result("Pause_index", round(pi, 2)) # Plot pause index distribution pi_pdf = os.path.join(QC_folder, args.sample_name + @@ -2612,108 +2562,108 @@ def count_unmapped_reads(): os.path.exists(res.refgene_intron)): pm.timestamp("### Calculate mRNA contamination") - - # Sort exons and introns - exons_sort = os.path.join(QC_folder, args.genome_assembly + - "_exons_sort.bed") - introns_sort = os.path.join(QC_folder, args.genome_assembly + - "_introns_sort.bed") - cmd1 = ("grep -wf " + chr_keep + " " + res.refgene_exon + - " | " + tools.bedtools + " sort -i stdin -faidx " + - chr_order + " > " + exons_sort) - # a single sort fails to sort a 1 bp different start position intron - cmd2 = ("grep -wf " + chr_keep + " " + res.refgene_intron + - " | " + tools.bedtools + " sort -i stdin -faidx " + - chr_order + " | " + tools.bedtools + " sort -i stdin -faidx " + - chr_order + " > " + introns_sort) - pm.run([cmd1, cmd2], [exons_sort, introns_sort], nofail=True) - pm.clean_add(exons_sort) - pm.clean_add(introns_sort) - - # Determine coverage of exons/introns - exons_cov = os.path.join(QC_folder, args.sample_name + - "_exons_coverage.bed") - introns_cov = os.path.join(QC_folder, args.sample_name + - "_introns_coverage.bed") - cmd1 = (tools.bedtools + " coverage -sorted -counts -s -a " + - exons_sort + " -b " + mapping_genome_bam + - " -g " + chr_order + " > " + exons_cov) - cmd2 = (tools.bedtools + " coverage -sorted -counts -s -a " + - introns_sort + " -b " + mapping_genome_bam + - " -g " + chr_order + " > " + introns_cov) - pm.run([cmd1, cmd2], [exons_cov, introns_cov], nofail=True) - pm.clean_add(exons_cov) - pm.clean_add(introns_cov) - - # need Total Reads divided by 1M - ar = float(pm.get_stat("Aligned_reads")) - scaling_factor = float(ar/1000000) - - exons_rpkm = os.path.join(QC_folder, args.sample_name + - "_exons_rpkm.bed") - introns_rpkm = os.path.join(QC_folder, args.sample_name + - "_introns_rpkm.bed") - - # determine exonic RPKM for individual genes - if os.path.exists(exons_cov): - cmd = ("awk -v OFS='\t' '{chrom[$4] = $1; " + - "if($4!=prev4) {chromStart[$4] = $2} " + - "strand[$4] = $6; " + - "readCount[$4] += $7; " + - "exonCount[$4] += 1; " + - "geneSizeKB[$4] += (sqrt(($3-$2+0.00000001)^2)/1000); " + - "gene[$4] = $4; " + - "chromEnd[$4]=$3; " + - "prev4=$4} END " + - "{ for (a in readCount) " + - "{ print chrom[a], chromStart[a], chromEnd[a], gene[a], " + - "(readCount[a]/" + str(scaling_factor) + - ")/geneSizeKB[a], strand[a]}}' " + - exons_cov + " | awk '$5>0' | sort -k4 > " + - exons_rpkm) - pm.run(cmd, exons_rpkm, nofail=True) - pm.clean_add(exons_rpkm) - - # determine intronic RPKM for individual genes - if os.path.exists(introns_cov): - cmd = ("awk -v OFS='\t' '{chrom[$4] = $1; " + - "if($4!=prev4) {chromStart[$4] = $2} " + - "strand[$4] = $6; " + - "readCount[$4] += $7; " + - "exonCount[$4] += 1; " + - "geneSizeKB[$4] += (sqrt(($3-$2+0.00000001)^2)/1000); " + - "gene[$4] = $4; " + - "chromEnd[$4]=$3; " + - "prev4=$4} END " + - "{ for (a in readCount) " + - "{ print chrom[a], chromStart[a], chromEnd[a], gene[a], " + - "(readCount[a]/" + str(scaling_factor) + - ")/geneSizeKB[a], strand[a]}}' " + - introns_cov + " | awk '$5>0' | sort -k4 > " + - introns_rpkm) - pm.run(cmd, introns_rpkm, nofail=True) - pm.clean_add(introns_rpkm) - - # join intron, exon RPKM on gene name and calculate ratio intron_exon = os.path.join(QC_folder, args.sample_name + "_exon_intron_ratios.bed") - if os.path.exists(exons_rpkm) and os.path.exists(introns_rpkm): - cmd = ("join --nocheck-order -a1 -a2 -j4 " + - introns_rpkm + " " + exons_rpkm + " | " + - "awk -v OFS='\t' " + - "'NF==11 {print $7, $8, $9, $1, ($10/$5), $11}'" + - " | sort -k1,1 -k2,2n > " + intron_exon) - pm.run(cmd, intron_exon, nofail=True) - - # report median ratio - if os.path.exists(intron_exon): - cmd = ("awk '{print $5}' " + intron_exon + - " | sort -n | awk ' { a[i++]=$1; }" + - " END { x=int((i+1)/2);" + - " if (x < (i+1)/2) print (a[x-1]+a[x])/2;" + - " else print a[x-1]; }'") - mrna_con = float(pm.checkprint(cmd)) - pm.report_result("mRNA contamination", round(mrna_con, 2)) + if not pm.get_stat("mRNA_contamination") or args.new_start: + # Sort exons and introns + exons_sort = os.path.join(QC_folder, args.genome_assembly + + "_exons_sort.bed") + introns_sort = os.path.join(QC_folder, args.genome_assembly + + "_introns_sort.bed") + cmd1 = ("grep -wf " + chr_keep + " " + res.refgene_exon + + " | " + tools.bedtools + " sort -i stdin -faidx " + + chr_order + " > " + exons_sort) + # a single sort fails to sort a 1 bp different start position intron + cmd2 = ("grep -wf " + chr_keep + " " + res.refgene_intron + + " | " + tools.bedtools + " sort -i stdin -faidx " + + chr_order + " | " + tools.bedtools + " sort -i stdin -faidx " + + chr_order + " > " + introns_sort) + pm.run([cmd1, cmd2], [exons_sort, introns_sort], nofail=True) + pm.clean_add(exons_sort) + pm.clean_add(introns_sort) + + # Determine coverage of exons/introns + exons_cov = os.path.join(QC_folder, args.sample_name + + "_exons_coverage.bed") + introns_cov = os.path.join(QC_folder, args.sample_name + + "_introns_coverage.bed") + cmd1 = (tools.bedtools + " coverage -sorted -counts -s -a " + + exons_sort + " -b " + mapping_genome_bam + + " -g " + chr_order + " > " + exons_cov) + cmd2 = (tools.bedtools + " coverage -sorted -counts -s -a " + + introns_sort + " -b " + mapping_genome_bam + + " -g " + chr_order + " > " + introns_cov) + pm.run([cmd1, cmd2], [exons_cov, introns_cov], nofail=True) + pm.clean_add(exons_cov) + pm.clean_add(introns_cov) + + # need Total Reads divided by 1M + ar = float(pm.get_stat("Aligned_reads")) + scaling_factor = float(ar/1000000) + + exons_rpkm = os.path.join(QC_folder, args.sample_name + + "_exons_rpkm.bed") + introns_rpkm = os.path.join(QC_folder, args.sample_name + + "_introns_rpkm.bed") + + # determine exonic RPKM for individual genes + if os.path.exists(exons_cov): + cmd = ("awk -v OFS='\t' '{chrom[$4] = $1; " + + "if($4!=prev4) {chromStart[$4] = $2} " + + "strand[$4] = $6; " + + "readCount[$4] += $7; " + + "exonCount[$4] += 1; " + + "geneSizeKB[$4] += (sqrt(($3-$2+0.00000001)^2)/1000); " + + "gene[$4] = $4; " + + "chromEnd[$4]=$3; " + + "prev4=$4} END " + + "{ for (a in readCount) " + + "{ print chrom[a], chromStart[a], chromEnd[a], gene[a], " + + "(readCount[a]/" + str(scaling_factor) + + ")/geneSizeKB[a], strand[a]}}' " + + exons_cov + " | awk '$5>0' | sort -k4 > " + + exons_rpkm) + pm.run(cmd, exons_rpkm, nofail=True) + pm.clean_add(exons_rpkm) + + # determine intronic RPKM for individual genes + if os.path.exists(introns_cov): + cmd = ("awk -v OFS='\t' '{chrom[$4] = $1; " + + "if($4!=prev4) {chromStart[$4] = $2} " + + "strand[$4] = $6; " + + "readCount[$4] += $7; " + + "exonCount[$4] += 1; " + + "geneSizeKB[$4] += (sqrt(($3-$2+0.00000001)^2)/1000); " + + "gene[$4] = $4; " + + "chromEnd[$4]=$3; " + + "prev4=$4} END " + + "{ for (a in readCount) " + + "{ print chrom[a], chromStart[a], chromEnd[a], gene[a], " + + "(readCount[a]/" + str(scaling_factor) + + ")/geneSizeKB[a], strand[a]}}' " + + introns_cov + " | awk '$5>0' | sort -k4 > " + + introns_rpkm) + pm.run(cmd, introns_rpkm, nofail=True) + pm.clean_add(introns_rpkm) + + # join intron, exon RPKM on gene name and calculate ratio + if os.path.exists(exons_rpkm) and os.path.exists(introns_rpkm): + cmd = ("join --nocheck-order -a1 -a2 -j4 " + + introns_rpkm + " " + exons_rpkm + " | " + + "awk -v OFS='\t' " + + "'NF==11 {print $7, $8, $9, $1, ($10/$5), $11}'" + + " | sort -k1,1 -k2,2n > " + intron_exon) + pm.run(cmd, intron_exon, nofail=True) + + # report median ratio + if os.path.exists(intron_exon): + cmd = ("awk '{print $5}' " + intron_exon + + " | sort -n | awk ' { a[i++]=$1; }" + + " END { x=int((i+1)/2);" + + " if (x < (i+1)/2) print (a[x-1]+a[x])/2;" + + " else print a[x-1]; }'") + mrna_con = float(pm.checkprint(cmd)) + pm.report_result("mRNA_contamination", round(mrna_con, 2)) # plot mRNA contamination distribution mRNApdf = os.path.join(QC_folder, @@ -2811,7 +2761,7 @@ def count_unmapped_reads(): already_mapped = False for file in map_files: - if os.path.isfile(file) and os.stat(file).st_size > 0: + if _itsa_file(file): already_mapped = True else: already_mapped = False From 50c70585602244b502f427006e66ef25ed787821 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Mon, 4 Nov 2019 15:59:02 -0500 Subject: [PATCH 092/207] fix spacing and notes --- pipelines/peppro.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 9f06f55..4f4dddd 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -1657,10 +1657,6 @@ def main(): print("Prealignment assemblies: " + str(args.prealignments)) # Loop through any prealignment references and map to them sequentially for reference in args.prealignments: - # fq1_gz = os.path.join(param.outfolder, "prealignments", - # args.sample_name + "_" + - # reference + "_unmap_R1.fq.gz") - #if not _itsa_file(fq1_gz) or args.new_start: if args.complexity and args.umi_len > 0: if args.no_fifo: unmap_fq1, unmap_fq2 = _align_with_bt2( @@ -2407,7 +2403,6 @@ def count_unmapped_reads(): pass # Used to plot adapter distribution here, but moved to cutadapt. - ############################################################################ # Extract genomic features # ############################################################################ From 9ace222f2ae527ba4df5bca56ac78bee8db86e02 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Wed, 20 Nov 2019 09:32:34 -0500 Subject: [PATCH 093/207] convert gt files into refgenie assets --- pipelines/peppro.py | 429 +++++++++++++++++++++++++++----------------- 1 file changed, 263 insertions(+), 166 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 4f4dddd..fff8c31 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -191,13 +191,6 @@ def _remove_adapters(args, tools, read2, fq_file, outfolder): fastp_report_html_R2 = fastp_pfx_R2 + ".html" fastp_report_json_R2 = fastp_pfx_R2 + ".json" - # If single-end, must use cutadapt for plotting purposes - if not args.paired_end: - if args.adapter != "cutadapt": - pm.warning("You set adapter arg to '{}' but you must select 'cutadapt'" - " for single end data. Overriding.".format(args.adapter)) - args.adapter = "cutadapt" - # Setup report output folders if args.adapter == "cutadapt": ngstk.make_dir(cutadapt_folder) @@ -881,12 +874,16 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): trimmed_dups_fastq_R2 = os.path.join(fastq_folder, sname + "_R2_trimmed_dups.fastq") processed_fastq = os.path.join(fastq_folder, sname + "_R1_processed.fastq") - adapter_report = os.path.join(fastqc_folder, sname + "_R1_rmAdapter.txt") + if args.adapter == "cutadapt": + cutadapt_folder = os.path.join(outfolder, "cutadapt") + cutadapt_report = os.path.join(cutadapt_folder, sname + "_cutadapt.txt") + adapter_report = cutadapt_report + else: + adapter_report = os.path.join(fastqc_folder, sname + "_R1_rmAdapter.txt") + fastp_pfx = os.path.join(fastp_folder, sname + "_R1_fastp_adapter") fastp_report_txt = fastp_pfx + ".txt" fastp_report_html = fastp_pfx + ".html" - cutadapt_folder = os.path.join(outfolder, "cutadapt") - cutadapt_report = os.path.join(cutadapt_folder, sname + "_cutadapt.txt") adapter_command = _remove_adapters(args, tools, read2, fq_file, outfolder) pm.debug("Adapter command: {}".format(adapter_command)) @@ -1336,76 +1333,121 @@ def _itsa_empty_file(anyfile): return(os.path.isfile(anyfile) and os.stat(anyfile).st_size == 0) -def _add_resources(args, res): +def _add_resources(args, res, asset_dict=None): """ Add additional resources needed for pipeline. :param argparse.Namespace args: binding between option name and argument, e.g. from parsing command-line options :param pm.config.resources res: pipeline manager resources list + :param asset_dict list: list of asset dicts to add """ - rgc = RGC(select_genome_config(res.get("genome_config"))) - # REQ - refgenie_assets = [ - ("fasta", "chrom_sizes", "default"), - (BT2_IDX_KEY, None, "default")] - - # Loop to find missing assets - for asset, seek_key, tag in refgenie_assets: - if not seek_key: - res[asset] = rgc.get_asset(args.genome_assembly, asset, tag_name=tag) - else: - res[seek_key] = rgc.get_asset(args.genome_assembly, asset, - tag_name=tag, - seek_key=seek_key) - - for reference in args.prealignments: - for asset in [BT2_IDX_KEY]: - res[asset] = rgc.get_asset(reference, asset) - # OPT + # Potential assets check_list = [ - {"asset":"refgene_anno", "seek_key":"refgene_tss", "arg":"TSS_name", "user_arg":"TSS-name"}, - {"asset":"ensembl_gtf", "seek_key":"ensembl_tss", "arg":"ensembl_tss", "user_arg":"pi-tss"}, - {"asset":"ensembl_gtf", "seek_key":"ensembl_gene_body", "arg":"ensembl_gene_body", "user_arg":"pi-body"}, - {"asset":"refgene_anno", "seek_key":"refgene_pre_mRNA", "arg":"pre_name", "user_arg":"pre-name"}, - {"asset":"feat_annotation", "seek_key":"feat_annotation", "arg":"anno_name", "user_arg":"anno-name"}, - {"asset":"refgene_anno", "seek_key":"refgene_exon", "arg":"exon_name", "user_arg":"exon-name"}, - {"asset":"refgene_anno", "seek_key":"refgene_intron", "arg":"intron_name", "user_arg":"intron-name"} + {"asset_name":"refgene_anno", "seek_key":"refgene_tss", "arg":"TSS_name", "user_arg":"TSS-name"}, + {"asset_name":"ensembl_gtf", "seek_key":"ensembl_tss", "arg":"ensembl_tss", "user_arg":"pi-tss"}, + {"asset_name":"ensembl_gtf", "seek_key":"ensembl_gene_body", "arg":"ensembl_gene_body", "user_arg":"pi-body"}, + {"asset_name":"refgene_anno", "seek_key":"refgene_pre_mRNA", "arg":"pre_name", "user_arg":"pre-name"}, + {"asset_name":"feat_annotation", "seek_key":"feat_annotation", "arg":"anno_name", "user_arg":"anno-name"}, + {"asset_name":"refgene_anno", "seek_key":"refgene_exon", "arg":"exon_name", "user_arg":"exon-name"}, + {"asset_name":"refgene_anno", "seek_key":"refgene_intron", "arg":"intron_name", "user_arg":"intron-name"} ] + rgc = RGC(select_genome_config(res.get("genome_config"))) - key_errors = [] - exist_errors = [] - for item in check_list: - asset = item["asset"] - seek_key = item["seek_key"] - arg = item["arg"] - user_arg = item["user_arg"] - - if hasattr(args, arg) and getattr(args, arg): - res[asset] = os.path.abspath(getattr(args, arg)) - else: - try: - pm.debug("asset key: {}".format(seek_key)) + if not asset_dict: + # REQ + refgenie_assets = [ + ("fasta", "chrom_sizes", "default"), + ("fasta", None, "default"), + (BT2_IDX_KEY, None, "default")] + + # Loop to find missing assets + for asset, seek_key, tag in refgenie_assets: + if not seek_key: + res[asset] = rgc.get_asset(args.genome_assembly, + asset, tag_name=tag) + else: res[seek_key] = rgc.get_asset(args.genome_assembly, asset, - seek_key=seek_key) - pm.debug("res[seek_key]: {}".format(res[seek_key])) - except KeyError: - key_errors.append(item) - except: - exist_errors.append(item) + tag_name=tag, + seek_key=seek_key) + + for reference in args.prealignments: + for asset in [BT2_IDX_KEY]: + res[asset] = rgc.get_asset(reference, asset) + + key_errors = [] + exist_errors = [] + for item in check_list: + asset = item["asset_name"] + seek_key = item["seek_key"] + arg = item["arg"] + user_arg = item["user_arg"] + + if hasattr(args, arg) and getattr(args, arg): + res[asset] = os.path.abspath(getattr(args, arg)) + else: + try: + pm.debug("asset key: {}".format(seek_key)) + res[seek_key] = rgc.get_asset(args.genome_assembly, asset, + seek_key=seek_key) + pm.debug("res[seek_key]: {}".format(res[seek_key])) + except KeyError: + key_errors.append(item) + except: + exist_errors.append(item) + + if len(key_errors) > 0 or len(exist_errors) > 0: + print("Some assets are not found. You can update your REFGENIE " + "config file or point directly to the file using the noted " + "command-line arguments:") + + if len(key_errors) > 0: + print("Assets missing from REFGENIE config file: {}".format(", ".join(key_errors))) + + if len(exist_errors) > 0: + print("Assets not existing: {}".format(", ".join(["{asset} (--{user_arg})".format(**x) for x in exist_errors]))) + + return res, rgc + else: + key_errors = [] + exist_errors = [] + for item in asset_dict: + pm.debug("item: {}".format(item)) # DEBUG + asset = item["asset_name"] + seek_key = item["seek_key"] + tag = item["tag_name"] + arg = item["arg"] + user_arg = item["user_arg"] + + if hasattr(args, arg) and getattr(args, arg): + res[seek_key] = os.path.abspath(getattr(args, arg)) + else: + try: + pm.debug("asset key: {}".format(seek_key)) # DEBUG + pm.debug("asset tag: {}".format(tag)) # DEBUG + res[seek_key] = rgc.get_asset(args.genome_assembly, + asset, + tag_name=tag, + seek_key=seek_key) + pm.debug("res[seek_key]: {}".format(res[seek_key])) # DEBUG + except KeyError: + key_errors.append(item) + except: + exist_errors.append(item) - if len(key_errors) > 0 or len(exist_errors) > 0: - print("Some assets are not found. You can update your REFGENIE config" - " file or point directly to the file using the noted command-line arguments:") + if len(key_errors) > 0 or len(exist_errors) > 0: + print("Some assets are not found. You can update your REFGENIE " + "config file or point directly to the file using the noted " + "command-line arguments:") - if len(key_errors) > 0: - print(" Assets missing from REFGENIE config file: {}".format(", ".join(key_errors))) + if len(key_errors) > 0: + print("Assets missing from REFGENIE config file: {}".format(", ".join(key_errors))) - if len(exist_errors) > 0: - print(" Assets not existing: {}".format(", ".join(["{asset} (--{user_arg})".format(**x) for x in exist_errors]))) + if len(exist_errors) > 0: + print("Assets not existing: {}".format(", ".join(["{asset} (--{user_arg})".format(**x) for x in exist_errors]))) - return res, rgc + return res, rgc ############################################################################### @@ -1542,6 +1584,13 @@ def main(): repair_target = os.path.join(fastq_folder, "repaired.flag") dups_repair_target = os.path.join(fastq_folder, "dups_repaired.flag") + # If single-end, must use cutadapt for plotting purposes + if not args.paired_end: + if args.adapter != "cutadapt": + pm.warning("You set adapter arg to '{}' but you must select 'cutadapt'" + " for single end data. Overriding.".format(args.adapter)) + args.adapter = "cutadapt" + # If we've already aligned to the primary genome, skip these steps unless # it's a --new-start if not pm.get_stat("Aligned_reads") or args.new_start: @@ -1728,6 +1777,8 @@ def main(): # Map to primary genome # ############################################################################ pm.timestamp("### Map to genome") + + # Set up named files and options map_genome_folder = os.path.join( param.outfolder, "aligned_" + args.genome_assembly) ngstk.make_dir(map_genome_folder) @@ -1750,6 +1801,11 @@ def main(): unmap_genome_bam_dups = os.path.join( map_genome_folder, args.sample_name + "_unmap_dups.bam") + temp_mapping_index = os.path.join(mapping_genome_bam_temp + ".bai") + temp_mapping_index_dups = os.path.join(mapping_genome_bam_temp_dups + ".bai") + + mito_name = ["chrM", "chrMT", "M", "MT", "rCRSd", "rCRSd_3k"] + bt2_options = " --very-sensitive" bt2_options += " -X 2000" @@ -1758,6 +1814,7 @@ def main(): os.chmod(tempdir, 0o771) pm.clean_add(tempdir) + # Skip if this is a recovery and the following has already occurred if not pm.get_stat("Aligned_reads") or args.new_start: # check input for zipped or not if pypiper.is_gzipped_fastq(unmap_fq1): @@ -1773,7 +1830,7 @@ def main(): cmd += " --rg-id " + args.sample_name cmd += " -x " + os.path.join( rgc.get_asset(args.genome_assembly, BT2_IDX_KEY), - args.genome_assembly) + args.genome_assembly) if args.paired_end: cmd += " --rf -1 " + unmap_fq1 + " -2 " + unmap_fq2 else: @@ -1798,7 +1855,7 @@ def main(): cmd_dups += " --rg-id " + args.sample_name cmd_dups += " -x " + os.path.join( rgc.get_asset(args.genome_assembly, BT2_IDX_KEY), - args.genome_assembly) + args.genome_assembly) if args.paired_end: cmd_dups += " --rf -1 " + unmap_fq1_dups + " -2 " + unmap_fq2_dups else: @@ -1869,9 +1926,6 @@ def check_alignment_genome(temp_bam, bam): unmapped_fq = unmapped_fq + ".gz" pm.run(cmd, unmapped_fq) - temp_mapping_index = os.path.join(mapping_genome_bam_temp + ".bai") - temp_mapping_index_dups = os.path.join(mapping_genome_bam_temp_dups + ".bai") - if not args.prealignments and os.path.exists(mapping_genome_bam_temp): # Index the temporary bam file cmd = tools.samtools + " index " + mapping_genome_bam_temp @@ -1885,7 +1939,6 @@ def check_alignment_genome(temp_bam, bam): pm.clean_add(mapping_genome_bam_temp_dups) # Determine mitochondrial read counts - mito_name = ["chrM", "chrMT", "M", "MT", "rCRSd", "rCRSd_3k"] if os.path.exists(mapping_genome_bam_temp): if not os.path.exists(temp_mapping_index): cmd = tools.samtools + " index " + mapping_genome_bam_temp @@ -1920,14 +1973,6 @@ def check_alignment_genome(temp_bam, bam): pm.run([cmd1, cmd2, cmd3, cmd4], noMT_mapping_genome_bam) pm.clean_add(mapping_genome_index) - # Determine maximum read length - cmd = (tools.samtools + " stats " + mapping_genome_bam + - " | grep '^SN' | cut -f 2- | grep 'maximum length:' | cut -f 2-") - max_len = int(pm.checkprint(cmd)) - - if args.max_len != -1: - max_len = args.max_len - # Remove PE2 reads if args.paired_end: pm.timestamp("### Split BAM file") @@ -1944,6 +1989,34 @@ def check_alignment_genome(temp_bam, bam): pm.run([cmd1, cmd2], [mapping_pe1_bam, mapping_pe2_bam]) mapping_genome_bam = mapping_pe1_bam + # Determine maximum read length + if int(args.max_len) != -1: + max_len = args.max_len + elif _itsa_file(mapping_genome_bam): + cmd = (tools.samtools + " stats " + mapping_genome_bam + + " | grep '^SN' | cut -f 2- | grep 'maximum length:' | cut -f 2-") + max_len = int(pm.checkprint(cmd)) + else: + max_len = DEFAULT_MAX_LEN + + # TODO: at this point I can check for seqOutBias required indicies + # Can't do it earlier because I haven't determined the read_length of + # of interest for mappability purposes. + if args.sob: + if max_len == DEFAULT_MAX_LEN: + search_asset = [{"asset_name":"tallymer_index", + "seek_key":"search_file", + "tag_name":"default", + "arg":"search_file", + "user_arg":"search-file"}] + else: + search_asset = [{"asset_name":"tallymer_index", + "seek_key":"search_file", + "tag_name":max_len, + "arg":"search_file", + "user_arg":"search-file"}] + res, rgc = _add_resources(args, res, search_asset) + ############################################################################ # Calculate library complexity # ############################################################################ @@ -2150,7 +2223,7 @@ def count_unmapped_reads(): tools.samtools, "view", "-bh", - ("-f", 0x10), + ("-f", 16), mapping_genome_bam, (">", minus_bam) ]) @@ -2674,9 +2747,9 @@ def count_unmapped_reads(): ############################################################################ # Shift and produce BigWigs # ############################################################################ - genome_fq = os.path.join(rgc.genome_folder, - args.genome_assembly, - (args.genome_assembly + ".fa")) + genome_fq = rgc.get_asset(args.genome_assembly, + asset_name="fasta", + seek_key="fasta") signal_folder = os.path.join( param.outfolder, "signal_" + args.genome_assembly) ngstk.make_dir(signal_folder) @@ -2723,103 +2796,127 @@ def count_unmapped_reads(): # Do that in the $GENOMES folder, in a subfolder called "mappability" # Only need to do that once for each read-size of interest # default would be read-size 30 (args.max_len) - mappability_folder = os.path.join(rgc.genome_folder, - args.genome_assembly, - "mappability") - ngstk.make_dir(mappability_folder) + pm.debug("The max read length is {}".format(str(max_len))) + # mappability_folder = os.path.join(rgc.genome_folder, + # args.genome_assembly, + # "mappability", + # str(max_len)) + # ngstk.make_dir(mappability_folder) + + # seqOutBias will use a temporary directory + tempdir = tempfile.mkdtemp(dir=signal_folder) + os.chmod(tempdir, 0o771) + pm.clean_add(tempdir) # Link fasta file - genome_fq_ln = os.path.join(mappability_folder, - (args.genome_assembly + ".fa")) - if not os.path.isfile(genome_fq_ln): - cmd = "ln -sf " + genome_fq + " " + genome_fq_ln - pm.run(cmd, genome_fq_ln) - - if args.max_len != -1: - max_len = args.max_len - - suffix_index = os.path.join(mappability_folder, - (args.genome_assembly + ".sft")) - suffix_check = os.path.join(mappability_folder, - (args.genome_assembly + ".sft.suf")) - tally_index = os.path.join(mappability_folder, - (args.genome_assembly + ".tal_" + - str(max_len))) - tally_check = os.path.join(mappability_folder, - (args.genome_assembly + ".tal_" + - str(max_len) + ".mer")) - search_file = os.path.join(mappability_folder, - (args.genome_assembly + ".tal_" + - str(max_len) + ".gtTxt")) - - map_files = [suffix_check, tally_check, search_file] - already_mapped = False + # TODO: switch to refgenie fasta asset + # genome_fq_ln = os.path.join(mappability_folder, + # (args.genome_assembly + ".fa")) + # if not os.path.isfile(genome_fq_ln): + # cmd = "ln -sf " + genome_fq + " " + genome_fq_ln + # pm.run(cmd, genome_fq_ln) + + # These next two files are universal to all indicies? + # suffix_index = os.path.join(mappability_folder, + # (args.genome_assembly + ".sft")) + # suffix_check = os.path.join(mappability_folder, + # (args.genome_assembly + ".sft.suf")) + # tally_index = os.path.join(mappability_folder, + # (args.genome_assembly + ".tal_" + + # str(max_len))) + # tally_check = os.path.join(mappability_folder, + # (args.genome_assembly + ".tal_" + + # str(max_len) + ".mer")) + # search_file = os.path.join(mappability_folder, + # (args.genome_assembly + ".tal_" + + # str(max_len) + ".gtTxt")) + + # map_files = [suffix_check, tally_check, search_file] + # already_mapped = False + # in_progress = False - for file in map_files: - if _itsa_file(file): - already_mapped = True - else: - already_mapped = False - - if not already_mapped: - pm.timestamp("### Compute mappability information") - - suffix_cmd_chunks = [ - ("gt", "suffixerator"), - "-dna", - "-pl", - "-tis", - "-suf", - "-lcp", - "-v", - ("-parts", args.parts), - ("-db", genome_fq_ln), - ("-indexname", suffix_index) - ] - suffix_cmd = build_command(suffix_cmd_chunks) - pm.run(suffix_cmd, suffix_index) - - tally_cmd_chunks = [ - ("gt", "tallymer"), - "mkindex", - ("-mersize", max_len), - ("-minocc", 2), - ("-indexname", tally_index), - "-counts", - "-pl", - ("-esa", suffix_index) - ] - tally_cmd = build_command(tally_cmd_chunks) - pm.run(tally_cmd, tally_index) - - search_cmd_chunks = [ - ("gt", "tallymer"), - "search", - "-output", - ("qseqnum", "qpos"), - ("-strand", "fp"), - ("-tyr", tally_index), - ("-q", genome_fq_ln), - (">", search_file) - ] - search_cmd = build_command(search_cmd_chunks) - pm.run(search_cmd, search_file) + # NOTE: potential clash if multiple samples are at this point + # concurrently and try to build these files + # for file in map_files: + # if _itsa_file(file): + # already_mapped = True + # elif _itsa_empty_file(file): + # already_mapped = False + # in_progress = True + # err_msg = ("{} appears to be underconstruction by another " \ + # "pipeline run. Confirm the file is complete and " \ + # "restart this sample to resume.") + # pm.fail_pipeline(IOError(err_msg.format(file))) + # else: + # already_mapped = False + + # if not already_mapped: + # pm.debug("Available memory is {}".format(args.mem)) + + # pm.timestamp("### Compute mappability information") + # # This file is universal to the genome... + # # 45 minutes with 24 GB mem + # suffix_cmd_chunks = [ + # ("gt", "suffixerator"), + # "-dna", + # "-pl", + # "-tis", + # "-suf", + # "-lcp", + # "-v", + # "-showprogress", + # #("-parts", args.parts), + # ("-memlimit", str(int(args.mem)*0.95) + "MB"), + # ("-db", genome_fq_ln), + # ("-indexname", suffix_index) + # ] + # suffix_cmd = build_command(suffix_cmd_chunks) + # pm.run(suffix_cmd, suffix_index) + + # # This is unique to the read_length + # # 30 minutes for 70kmer with 24GB available mem + # tally_cmd_chunks = [ + # ("gt", "tallymer"), + # "mkindex", + # ("-mersize", max_len), + # ("-minocc", 2), + # ("-indexname", tally_index), + # "-counts", + # "-v", + # "-pl", + # ("-esa", suffix_index) + # ] + # tally_cmd = build_command(tally_cmd_chunks) + # pm.run(tally_cmd, tally_index) + + # search_cmd_chunks = [ + # ("gt", "tallymer"), + # "search", + # "-output", + # ("qseqnum", "qpos"), + # ("-strand", "fp"), + # ("-tyr", tally_index), + # ("-q", genome_fq_ln), + # (">", search_file) + # ] + # search_cmd = build_command(search_cmd_chunks) + # pm.run(search_cmd, search_file) pm.timestamp("### Use seqOutBias to produce bigWig files") - seqtable = os.path.join(res.genomes, args.genome_assembly, - mappability_folder, (args.genome_assembly + ".tbl")) + seqtable = os.path.join(signal_folder, (args.genome_assembly + ".tbl")) seqtable_cmd = build_command([ (tools.seqoutbias, "seqtable"), - genome_fq_ln, - str("--tallymer=" + search_file), - str("--gt-workdir=" + mappability_folder), # TODO - str("--read-size=" + max_len), + res.fasta, + str("--tallymer=" + res.search_file), + str("--gt-workdir=" + tempdir), + str("--read-size=" + str(max_len)), str("--out=" + seqtable) ]) pm.run(seqtable_cmd, seqtable) + pm.clean_add(seqtable) plus_table = os.path.join( signal_folder, (args.genome_assembly + "_plus_tbl.txt")) From bc1d27683276803b3ffcbb272d92ab4d6790b8c5 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Thu, 21 Nov 2019 14:52:51 -0500 Subject: [PATCH 094/207] rework _add_resources and seqOutBias usage --- pipeline_interface.yaml | 2 +- pipelines/peppro.py | 292 ++++++++++++++-------------------------- 2 files changed, 99 insertions(+), 195 deletions(-) diff --git a/pipeline_interface.yaml b/pipeline_interface.yaml index fd81ad5..4809589 100644 --- a/pipeline_interface.yaml +++ b/pipeline_interface.yaml @@ -36,11 +36,11 @@ pipelines: "--max-len": max_len "--sob": sob "--scale": scale - "--parts": parts "--prealignments": prealignments "--TSS-name": TSS_name "--pre-name": pre_name "--anno-name": anno_name + "--search-file": search_file "--coverage": coverage "--keep": keep "--noFIFO": no_fifo diff --git a/pipelines/peppro.py b/pipelines/peppro.py index fff8c31..227fd74 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -92,11 +92,6 @@ def parse_arguments(): help="Scale output with seqOutBias when producing" " signal tracks.") - parser.add_argument("--parts", dest="parts", - default="4", - help="Split suffix tree generation into parts. " - "Increase this value to lower memory use.") - parser.add_argument("--prealignments", default=[], type=str, nargs="+", help="Space-delimited list of reference genomes to " "align to before primary alignment.") @@ -129,6 +124,11 @@ def parse_arguments(): dest="intron_name", type=str, help="file_name of intron annotation file.") + parser.add_argument("--search-file", default=None, + dest="search_file", type=str, + help="file_name of read length matched gt tallymer " + "index search file") + parser.add_argument("--coverage", action='store_true', default=False, dest="coverage", help="Report library complexity using coverage: " @@ -1340,112 +1340,81 @@ def _add_resources(args, res, asset_dict=None): :param argparse.Namespace args: binding between option name and argument, e.g. from parsing command-line options :param pm.config.resources res: pipeline manager resources list - :param asset_dict list: list of asset dicts to add + :param asset_dict list: list of dictionary of assets to add """ - # Potential assets - check_list = [ - {"asset_name":"refgene_anno", "seek_key":"refgene_tss", "arg":"TSS_name", "user_arg":"TSS-name"}, - {"asset_name":"ensembl_gtf", "seek_key":"ensembl_tss", "arg":"ensembl_tss", "user_arg":"pi-tss"}, - {"asset_name":"ensembl_gtf", "seek_key":"ensembl_gene_body", "arg":"ensembl_gene_body", "user_arg":"pi-body"}, - {"asset_name":"refgene_anno", "seek_key":"refgene_pre_mRNA", "arg":"pre_name", "user_arg":"pre-name"}, - {"asset_name":"feat_annotation", "seek_key":"feat_annotation", "arg":"anno_name", "user_arg":"anno-name"}, - {"asset_name":"refgene_anno", "seek_key":"refgene_exon", "arg":"exon_name", "user_arg":"exon-name"}, - {"asset_name":"refgene_anno", "seek_key":"refgene_intron", "arg":"intron_name", "user_arg":"intron-name"} - ] rgc = RGC(select_genome_config(res.get("genome_config"))) - if not asset_dict: - # REQ - refgenie_assets = [ - ("fasta", "chrom_sizes", "default"), - ("fasta", None, "default"), - (BT2_IDX_KEY, None, "default")] - - # Loop to find missing assets - for asset, seek_key, tag in refgenie_assets: - if not seek_key: - res[asset] = rgc.get_asset(args.genome_assembly, - asset, tag_name=tag) - else: - res[seek_key] = rgc.get_asset(args.genome_assembly, asset, - tag_name=tag, - seek_key=seek_key) - - for reference in args.prealignments: - for asset in [BT2_IDX_KEY]: - res[asset] = rgc.get_asset(reference, asset) - - key_errors = [] - exist_errors = [] - for item in check_list: - asset = item["asset_name"] - seek_key = item["seek_key"] - arg = item["arg"] - user_arg = item["user_arg"] - - if hasattr(args, arg) and getattr(args, arg): - res[asset] = os.path.abspath(getattr(args, arg)) - else: - try: - pm.debug("asset key: {}".format(seek_key)) - res[seek_key] = rgc.get_asset(args.genome_assembly, asset, - seek_key=seek_key) - pm.debug("res[seek_key]: {}".format(res[seek_key])) - except KeyError: - key_errors.append(item) - except: - exist_errors.append(item) - - if len(key_errors) > 0 or len(exist_errors) > 0: - print("Some assets are not found. You can update your REFGENIE " - "config file or point directly to the file using the noted " - "command-line arguments:") + key_errors = [] + exist_errors = [] + required_list = [] - if len(key_errors) > 0: - print("Assets missing from REFGENIE config file: {}".format(", ".join(key_errors))) - - if len(exist_errors) > 0: - print("Assets not existing: {}".format(", ".join(["{asset} (--{user_arg})".format(**x) for x in exist_errors]))) + # Check that bowtie2 indicies exist for specified prealignments + for reference in args.prealignments: + for asset in [BT2_IDX_KEY]: + try: + res[asset] = rgc.get_asset(reference, asset) + except KeyError: + err_msg = "{} for {} is missing from REFGENIE config file." + pm.fail_pipeline(KeyError(err_msg.format(asset, reference))) + except: + err_msg = "{} for {} does not exist." + pm.fail_pipeline(IOError(err_msg.format(asset, reference))) + # Check specified assets + if not asset_dict: return res, rgc else: - key_errors = [] - exist_errors = [] for item in asset_dict: pm.debug("item: {}".format(item)) # DEBUG asset = item["asset_name"] - seek_key = item["seek_key"] - tag = item["tag_name"] + seek_key = item["seek_key"] or item["asset_name"] + tag = item["tag_name"] or "default" arg = item["arg"] user_arg = item["user_arg"] + req = item["required"] - if hasattr(args, arg) and getattr(args, arg): + if arg and hasattr(args, arg) and getattr(args, arg): res[seek_key] = os.path.abspath(getattr(args, arg)) else: try: - pm.debug("asset key: {}".format(seek_key)) # DEBUG - pm.debug("asset tag: {}".format(tag)) # DEBUG + pm.debug("{} - {}.{}:{}".format(args.genome_assembly, + asset, + seek_key, + tag)) # DEBUG res[seek_key] = rgc.get_asset(args.genome_assembly, - asset, - tag_name=tag, - seek_key=seek_key) - pm.debug("res[seek_key]: {}".format(res[seek_key])) # DEBUG + asset_name=str(asset), + tag_name=str(tag), + seek_key=str(seek_key)) except KeyError: key_errors.append(item) + if req: + required_list.append(item) except: exist_errors.append(item) + if req: + required_list.append(item) if len(key_errors) > 0 or len(exist_errors) > 0: - print("Some assets are not found. You can update your REFGENIE " - "config file or point directly to the file using the noted " - "command-line arguments:") + pm.info("Some assets are not found. You can update your REFGENIE " + "config file or point directly to the file using the noted " + "command-line arguments:") if len(key_errors) > 0: - print("Assets missing from REFGENIE config file: {}".format(", ".join(key_errors))) + if required_list: + err_msg = "Required assets missing from REFGENIE config file: {}" + pm.fail_pipeline(IOError(err_msg.format(", ".join(["{asset_name}.{seek_key}:{tag_name}".format(**x) for x in required_list])))) + else: + warning_msg = "Optional assets missing from REFGENIE config file: {}" + pm.info(warning_msg.format(", ".join(["{asset_name}.{seek_key}:{tag_name}".format(**x) for x in key_errors]))) if len(exist_errors) > 0: - print("Assets not existing: {}".format(", ".join(["{asset} (--{user_arg})".format(**x) for x in exist_errors]))) + if required_list: + err_msg = "Required assets not existing: {}" + pm.fail_pipeline(IOError(err_msg.format(", ".join(["{asset_name}.{seek_key}:{tag_name} (--{user_arg})".format(**x) for x in required_list])))) + else: + warning_msg = "Optional assets not existing: {}" + pm.info(warning_msg.format(", ".join(["{asset_name}.{seek_key}:{tag_name} (--{user_arg})".format(**x) for x in exist_errors]))) return res, rgc @@ -1501,7 +1470,39 @@ def main(): pm.fail_pipeline(RuntimeError(err_msg)) # Set up reference resource according to genome prefix. - res, rgc = _add_resources(args, res) + check_list = [ + {"asset_name":"fasta", "seek_key":"chrom_sizes", + "tag_name":"default", "arg":None, "user_arg":None, + "required":True}, + {"asset_name":"fasta", "seek_key":None, + "tag_name":"default", "arg":None, "user_arg":None, + "required":True}, + {"asset_name":BT2_IDX_KEY, "seek_key":None, + "tag_name":"default", "arg":None, "user_arg":None, + "required":True}, + {"asset_name":"refgene_anno", "seek_key":"refgene_tss", + "tag_name":"default", "arg":"TSS_name", "user_arg":"TSS-name", + "required":False}, + {"asset_name":"ensembl_gtf", "seek_key":"ensembl_tss", + "tag_name":"default", "arg":"ensembl_tss", "user_arg":"pi-tss", + "required":False}, + {"asset_name":"ensembl_gtf", "seek_key":"ensembl_gene_body", + "tag_name":"default", "arg":"ensembl_gene_body", "user_arg":"pi-body", + "required":False}, + {"asset_name":"refgene_anno", "seek_key":"refgene_pre_mRNA", + "tag_name":"default", "arg":"pre_name", "user_arg":"pre-name", + "required":False}, + {"asset_name":"feat_annotation", "seek_key":"feat_annotation", + "tag_name":"default", "arg":"anno_name", "user_arg":"anno-name", + "required":False}, + {"asset_name":"refgene_anno", "seek_key":"refgene_exon", + "tag_name":"default", "arg":"exon_name", "user_arg":"exon-name", + "required":False}, + {"asset_name":"refgene_anno", "seek_key":"refgene_intron", + "tag_name":"default", "arg":"intron_name", "user_arg":"intron-name", + "required":False} + ] + res, rgc = _add_resources(args, res, check_list) # Adapter file can be set in the config; if left null, we use a default. # TODO: use this option or just specify directly the adapter sequence as I do now @@ -1989,7 +1990,10 @@ def check_alignment_genome(temp_bam, bam): pm.run([cmd1, cmd2], [mapping_pe1_bam, mapping_pe2_bam]) mapping_genome_bam = mapping_pe1_bam - # Determine maximum read length + ############################################################################ + # Determine maximum read length and add seqOutBias resource # + ############################################################################ + if int(args.max_len) != -1: max_len = args.max_len elif _itsa_file(mapping_genome_bam): @@ -1999,22 +2003,25 @@ def check_alignment_genome(temp_bam, bam): else: max_len = DEFAULT_MAX_LEN - # TODO: at this point I can check for seqOutBias required indicies - # Can't do it earlier because I haven't determined the read_length of - # of interest for mappability purposes. + # At this point we can check for seqOutBias required indicies. + # Can't do it earlier because we haven't determined the read_length of + # interest for mappability purposes. if args.sob: + pm.debug("max_len: {}".format(max_len)) # DEBUG if max_len == DEFAULT_MAX_LEN: search_asset = [{"asset_name":"tallymer_index", "seek_key":"search_file", "tag_name":"default", "arg":"search_file", - "user_arg":"search-file"}] + "user_arg":"search-file", + "required":True}] else: search_asset = [{"asset_name":"tallymer_index", "seek_key":"search_file", "tag_name":max_len, "arg":"search_file", - "user_arg":"search-file"}] + "user_arg":"search-file", + "required":True}] res, rgc = _add_resources(args, res, search_asset) ############################################################################ @@ -2792,116 +2799,13 @@ def count_unmapped_reads(): print("Skipping signal track production -- Could not call \'wigToBigWig\'.") print("Check that you have the required UCSC tools in your PATH.") else: - # Need to run seqOutBias tallymer separately - # Do that in the $GENOMES folder, in a subfolder called "mappability" - # Only need to do that once for each read-size of interest - # default would be read-size 30 (args.max_len) pm.debug("The max read length is {}".format(str(max_len))) - # mappability_folder = os.path.join(rgc.genome_folder, - # args.genome_assembly, - # "mappability", - # str(max_len)) - # ngstk.make_dir(mappability_folder) - # seqOutBias will use a temporary directory + # seqOutBias needs a working directory, we'll make that temporary tempdir = tempfile.mkdtemp(dir=signal_folder) os.chmod(tempdir, 0o771) pm.clean_add(tempdir) - # Link fasta file - # TODO: switch to refgenie fasta asset - # genome_fq_ln = os.path.join(mappability_folder, - # (args.genome_assembly + ".fa")) - # if not os.path.isfile(genome_fq_ln): - # cmd = "ln -sf " + genome_fq + " " + genome_fq_ln - # pm.run(cmd, genome_fq_ln) - - # These next two files are universal to all indicies? - # suffix_index = os.path.join(mappability_folder, - # (args.genome_assembly + ".sft")) - # suffix_check = os.path.join(mappability_folder, - # (args.genome_assembly + ".sft.suf")) - # tally_index = os.path.join(mappability_folder, - # (args.genome_assembly + ".tal_" + - # str(max_len))) - # tally_check = os.path.join(mappability_folder, - # (args.genome_assembly + ".tal_" + - # str(max_len) + ".mer")) - # search_file = os.path.join(mappability_folder, - # (args.genome_assembly + ".tal_" + - # str(max_len) + ".gtTxt")) - - # map_files = [suffix_check, tally_check, search_file] - # already_mapped = False - # in_progress = False - - # NOTE: potential clash if multiple samples are at this point - # concurrently and try to build these files - # for file in map_files: - # if _itsa_file(file): - # already_mapped = True - # elif _itsa_empty_file(file): - # already_mapped = False - # in_progress = True - # err_msg = ("{} appears to be underconstruction by another " \ - # "pipeline run. Confirm the file is complete and " \ - # "restart this sample to resume.") - # pm.fail_pipeline(IOError(err_msg.format(file))) - # else: - # already_mapped = False - - # if not already_mapped: - # pm.debug("Available memory is {}".format(args.mem)) - - # pm.timestamp("### Compute mappability information") - # # This file is universal to the genome... - # # 45 minutes with 24 GB mem - # suffix_cmd_chunks = [ - # ("gt", "suffixerator"), - # "-dna", - # "-pl", - # "-tis", - # "-suf", - # "-lcp", - # "-v", - # "-showprogress", - # #("-parts", args.parts), - # ("-memlimit", str(int(args.mem)*0.95) + "MB"), - # ("-db", genome_fq_ln), - # ("-indexname", suffix_index) - # ] - # suffix_cmd = build_command(suffix_cmd_chunks) - # pm.run(suffix_cmd, suffix_index) - - # # This is unique to the read_length - # # 30 minutes for 70kmer with 24GB available mem - # tally_cmd_chunks = [ - # ("gt", "tallymer"), - # "mkindex", - # ("-mersize", max_len), - # ("-minocc", 2), - # ("-indexname", tally_index), - # "-counts", - # "-v", - # "-pl", - # ("-esa", suffix_index) - # ] - # tally_cmd = build_command(tally_cmd_chunks) - # pm.run(tally_cmd, tally_index) - - # search_cmd_chunks = [ - # ("gt", "tallymer"), - # "search", - # "-output", - # ("qseqnum", "qpos"), - # ("-strand", "fp"), - # ("-tyr", tally_index), - # ("-q", genome_fq_ln), - # (">", search_file) - # ] - # search_cmd = build_command(search_cmd_chunks) - # pm.run(search_cmd, search_file) - pm.timestamp("### Use seqOutBias to produce bigWig files") seqtable = os.path.join(signal_folder, (args.genome_assembly + ".tbl")) From ebd11b3f4a4504d35d827598cf401e1b7616fbb5 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Mon, 25 Nov 2019 09:58:47 -0500 Subject: [PATCH 095/207] remove horizontal line and adjust auto-scale; close #44 --- PEPPROr/R/PEPPROr.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PEPPROr/R/PEPPROr.R b/PEPPROr/R/PEPPROr.R index bb3121b..b4371a4 100644 --- a/PEPPROr/R/PEPPROr.R +++ b/PEPPROr/R/PEPPROr.R @@ -809,12 +809,12 @@ plotTSS <- function(TSSfile) { pre <- ggplot(normTSS, aes(x=(as.numeric(rownames(normTSS))- (nrow(normTSS)/2)), y=score, group=1, colour="black")) + - geom_hline(yintercept = 6, linetype = 2, - color = "grey", size = 0.25) + + # geom_hline(yintercept = 6, linetype = 2, + # color = "grey", size = 0.25) + geom_smooth(method="loess", span=0.02, se=FALSE, colour=lineColor) + labs(x = "Distance from TSS (bp)", y = "TSS Enrichment Score") - y_max <- max(30, roundUpNice(TSSscore*1.1)) + y_max <- roundUpNice(TSSscore) p <- pre + t1 + scale_x_continuous(expand=c(0,0)) + scale_y_continuous(expand=c(0,0)) + From d011a1abb7c603c3667457574bb1321e8585c38e Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Mon, 25 Nov 2019 09:59:19 -0500 Subject: [PATCH 096/207] drop old parameter --- examples/meta/peppro_test.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/meta/peppro_test.yaml b/examples/meta/peppro_test.yaml index 9b71c33..5d92a0f 100644 --- a/examples/meta/peppro_test.yaml +++ b/examples/meta/peppro_test.yaml @@ -19,7 +19,7 @@ implied_columns: adapter: fastp # Default dedup: seqkit # Default trimmer: seqtk # Default - runon: pro # Default + protocol: pro # Default umi_len: 8 # Default max_len: 30 # Default @@ -27,7 +27,6 @@ pipeline_args: # peppro.py: # "--sob": null # Default is FALSE. Pass flag to use seqOutBias for signal track generation and to incorporate mappability # "--scale": null # Default is FALSE. Pass flag to scale seqOutBias signal tracks -# "--parts": 4 # Default. Split suffix tree generation into <4> parts. Higher number == less memory use. # "--coverage": null # Default is FALSE. Pass flag to use coverage when producing library complexity plots. # "--keep": null # Default is FALSE. Pass flag to keep prealignment BAM files. # "--noFIFO": null # Default is FALSE. Pass flag to NOT use named pipes during prealignments. From 2bcf7ade36484af76ce916b51488d0baa46c84be Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Mon, 25 Nov 2019 10:03:04 -0500 Subject: [PATCH 097/207] adjust messaging for fastp warning --- pipelines/peppro.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 227fd74..6f73ee6 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -441,9 +441,11 @@ def _trim_deduplicated_files(args, tools, fq_file, outfolder): ]) else: if args.umi_fastp and args.adapter != "fastp": - print("To remove UMI intelligently, you must process adapters using 'fastp'") - print("Defaulting to removing the first {} " - "bp instead via trimming".format(str(args.umi_len))) + pm.info("To remove UMI intelligently, you must process " + "adapters using 'fastp'") + if args.umi_len > 0: + pm.info("Defaulting to removing the first {} " + "bp instead via trimming".format(str(args.umi_len))) if args.trimmer == "seqtk": trim_cmd_chunks = [ tools.seqtk, @@ -592,9 +594,11 @@ def _trim_adapter_files(args, tools, fq_file, outfolder): ]) else: if args.umi_fastp and args.adapter != "fastp": - print("To remove UMI intelligently, you must process adapters using 'fastp'") - print("Defaulting to removing the first {} " - "bp instead via trimming".format(str(args.umi_len))) + pm.info("To remove UMI intelligently, you must process " + "adapters using 'fastp'") + if args.umi_len > 0: + pm.info("Defaulting to removing the first {} " + "bp instead via trimming".format(str(args.umi_len))) if args.trimmer == "seqtk": trim_cmd_chunks = [ tools.seqtk, @@ -757,9 +761,11 @@ def _trim_pipes(args, tools, read2, fq_file, outfolder): # If args.complexity and args.umi_len > 0 retain intermediate files else: if args.umi_fastp and args.adapter != "fastp": - print("To remove UMI intelligently, you must process adapters using 'fastp'") - print("Defaulting to removing the first {} " - "bp instead via trimming".format(str(args.umi_len))) + pm.info("To remove UMI intelligently, you must process " + "adapters using 'fastp'") + if args.umi_len > 0: + pm.info("Defaulting to removing the first {} " + "bp instead via trimming".format(str(args.umi_len))) if args.trimmer == "seqtk": trim_cmd_chunks = [ tools.seqtk, From 30e0ee7794d23f2f69b76138705d375e9c3af71b Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Mon, 25 Nov 2019 10:20:00 -0500 Subject: [PATCH 098/207] adjust fastp usage; close: #41 --- pipeline_interface.yaml | 1 - pipelines/peppro.py | 450 ++++++++++++++++++++-------------------- 2 files changed, 221 insertions(+), 230 deletions(-) diff --git a/pipeline_interface.yaml b/pipeline_interface.yaml index 4809589..e6a995b 100644 --- a/pipeline_interface.yaml +++ b/pipeline_interface.yaml @@ -31,7 +31,6 @@ pipelines: "--adapter": adapter "--dedup": dedup "--trimmer": trimmer - "--umi": umi "--umi-len": umi_len "--max-len": max_len "--sob": sob diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 6f73ee6..a1ada49 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -66,10 +66,6 @@ def parse_arguments(): help="Name of read trimming program. " "Default: {}".format(DEFAULT_TRIMMER)) - parser.add_argument("--umi-fastp", action='store_true', default=False, - help="Use fastp to remove UMIs. Default: Use " - "tool selected for 'trimmer' option.") - parser.add_argument("--umi-len", default=DEFAULT_UMI_LEN, type=int, help="Specify the length of the UMI." @@ -409,7 +405,8 @@ def _trim_deduplicated_files(args, tools, fq_file, outfolder): if args.trimmer == "fastx": encoding = _guess_encoding(fq_file) - if args.umi_fastp and args.adapter == "fastp": + if args.adapter == "fastp": + # Remove UMI by specifying location of UMI trim_cmd_chunks = [ tools.fastp, ("--thread", str(pm.cores)), @@ -424,6 +421,7 @@ def _trim_deduplicated_files(args, tools, fq_file, outfolder): (tools.seqtk, "trimfq") ] + # Trim to max length if specified if args.max_len != -1: trim_cmd_chunks.extend([("-L", args.max_len)]) @@ -439,89 +437,86 @@ def _trim_deduplicated_files(args, tools, fq_file, outfolder): ("-r", "-"), (">", processed_fastq) ]) - else: - if args.umi_fastp and args.adapter != "fastp": - pm.info("To remove UMI intelligently, you must process " - "adapters using 'fastp'") - if args.umi_len > 0: - pm.info("Defaulting to removing the first {} " - "bp instead via trimming".format(str(args.umi_len))) - if args.trimmer == "seqtk": - trim_cmd_chunks = [ + elif args.trimmer == "seqtk": + # Remove UMI by blind trimming + trim_cmd_chunks = [ + tools.seqtk, + "trimfq", + ("-b", str(args.umi_len)) + ] + + # Trim to max length if specified + if args.max_len != -1: + trim_cmd_chunks.extend([("-L", str(args.max_len))]) + + trim_cmd_chunks.extend([dedup_fastq]) + + # Do not reverse complement for GRO-seq + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([(">", processed_fastq)]) + else: + trim_cmd_chunks.extend([ + "|", tools.seqtk, - "trimfq", - ("-b", str(args.umi_len)) - ] + ("seq", "-r"), + ("-", ">"), + processed_fastq + ]) + elif args.trimmer == "fastx": + trim_tool = tools.fastx + "_trimmer" + rc_tool = tools.fastx + "_reverse_complement" + trim_cmd_chunks = [trim_tool] - if args.max_len != -1: - trim_cmd_chunks.extend([("-L", str(args.max_len))]) + if encoding == "Illumina-1.8": + trim_cmd_chunks.extend([ + ("-Q", str(33)) + ]) - trim_cmd_chunks.extend([dedup_fastq]) + # Remove UMI blindly + trim_cmd_chunks.extend([("-f", str(int(float(args.umi_len)) + 1))]) - # Do not reverse complement for GRO-seq - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([(">", processed_fastq)]) - else: - trim_cmd_chunks.extend([ - "|", - tools.seqtk, - ("seq", "-r"), - ("-", ">"), - processed_fastq - ]) - elif args.trimmer == "fastx": - trim_tool = tools.fastx + "_trimmer" - rc_tool = tools.fastx + "_reverse_complement" - trim_cmd_chunks = [trim_tool] + # Trim to max length if specified + if args.max_len != -1: + trim_cmd_chunks.extend([ + ("-l", (str(int(float(args.max_len)) + int(float(args.umi_len))))) + ]) + trim_cmd_chunks.extend([("-i", dedup_fastq)]) + + # Do not reverse complement if GRO-seq + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([("-o", processed_fastq)]) + else: + trim_cmd_chunks.extend([("|", rc_tool)]) if encoding == "Illumina-1.8": trim_cmd_chunks.extend([ ("-Q", str(33)) ]) + trim_cmd_chunks.extend([("-o", processed_fastq)]) + else: + # Default to seqtk + trim_cmd_chunks = [ + tools.seqtk, + "trimfq", + ("-b", str(args.umi_len)) + ] - trim_cmd_chunks.extend([("-f", str(int(float(args.umi_len)) + 1))]) - - if args.max_len != -1: - trim_cmd_chunks.extend([ - ("-l", (str(int(float(args.max_len)) + int(float(args.umi_len))))) - ]) + if args.max_len != -1: + trim_cmd_chunks.extend([("-L", str(args.max_len))]) - trim_cmd_chunks.extend([("-i", dedup_fastq)]) + trim_cmd_chunks.extend([dedup_fastq]) - # Do not reverse complement if GRO-seq - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([("-o", processed_fastq)]) - else: - trim_cmd_chunks.extend([("|", rc_tool)]) - if encoding == "Illumina-1.8": - trim_cmd_chunks.extend([ - ("-Q", str(33)) - ]) - trim_cmd_chunks.extend([("-o", processed_fastq)]) + # Do not reverse complement for GRO-seq + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([(">", processed_fastq)]) else: - # Default to seqtk - trim_cmd_chunks = [ + trim_cmd_chunks.extend([ + "|", tools.seqtk, - "trimfq", - ("-b", str(args.umi_len)) - ] - - if args.max_len != -1: - trim_cmd_chunks.extend([("-L", str(args.max_len))]) - - trim_cmd_chunks.extend([dedup_fastq]) - - # Do not reverse complement for GRO-seq - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([(">", processed_fastq)]) - else: - trim_cmd_chunks.extend([ - "|", - tools.seqtk, - ("seq", "-r"), - ("-", ">"), - processed_fastq - ]) + ("seq", "-r"), + ("-", ">"), + processed_fastq + ]) trim_cmd = build_command(trim_cmd_chunks) pm.debug("trim_deduplicated_cmd: {}".format(build_command(trim_cmd_chunks))) @@ -548,8 +543,6 @@ def _trim_adapter_files(args, tools, fq_file, outfolder): fastq_folder = os.path.join(outfolder, "fastq") noadap_fastq = os.path.join(fastq_folder, sname + "_R1_noadap.fastq") trimmed_fastq = os.path.join(fastq_folder, sname + "_R1_processed.fastq") - #trimmed_fastq = os.path.join(fastq_folder, sname + "_R1_trimmed.fastq") - #processed_fastq = os.path.join(fastq_folder, sname + "_R1_processed.fastq") fastp_folder = os.path.join(outfolder, "fastp") umi_report = os.path.join(fastp_folder, sname + "_R1_rmUmi.html") @@ -559,8 +552,8 @@ def _trim_adapter_files(args, tools, fq_file, outfolder): if args.trimmer == "fastx": encoding = _guess_encoding(fq_file) - if args.umi_fastp and args.adapter == "fastp": - # Use FastP + if args.adapter == "fastp": + # Remove UMI and specify location of UMI # Still requires seqtk for reverse complementation trim_cmd_chunks = [ tools.fastp, @@ -576,6 +569,7 @@ def _trim_adapter_files(args, tools, fq_file, outfolder): (tools.seqtk, "trimfq") ] + # Trim tp max length if specified if args.max_len != -1: trim_cmd_chunks.extend([("-L", args.max_len)]) @@ -592,92 +586,95 @@ def _trim_adapter_files(args, tools, fq_file, outfolder): ("-r", "-"), (">", trimmed_fastq) ]) - else: - if args.umi_fastp and args.adapter != "fastp": - pm.info("To remove UMI intelligently, you must process " - "adapters using 'fastp'") - if args.umi_len > 0: - pm.info("Defaulting to removing the first {} " - "bp instead via trimming".format(str(args.umi_len))) - if args.trimmer == "seqtk": - trim_cmd_chunks = [ - tools.seqtk, - "trimfq", - ("-b", str(args.umi_len)) - ] - if args.max_len != -1: - trim_cmd_chunks.extend([ - ("-L", str(args.max_len)) - ]) - - trim_cmd_chunks.extend([noadap_fastq]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([ - (">", trimmed_fastq) - ]) - else: - trim_cmd_chunks.extend([ - "|", - (tools.seqtk, "seq"), - ("-r", "-"), - (">", trimmed_fastq) - ]) - elif args.trimmer == "fastx": - trim_tool = tools.fastx + "_trimmer" - rc_tool = tools.fastx + "_reverse_complement" - trim_cmd_chunks = [trim_tool] + elif args.trimmer == "seqtk": + # Remove UMI blindly by position + trim_cmd_chunks = [ + tools.seqtk, + "trimfq", + ("-b", str(args.umi_len)) + ] + + # Trim tp max length if specified + if args.max_len != -1: + trim_cmd_chunks.extend([ + ("-L", str(args.max_len)) + ]) + + trim_cmd_chunks.extend([noadap_fastq]) + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([ + (">", trimmed_fastq) + ]) + else: + trim_cmd_chunks.extend([ + "|", + (tools.seqtk, "seq"), + ("-r", "-"), + (">", trimmed_fastq) + ]) + elif args.trimmer == "fastx": + trim_tool = tools.fastx + "_trimmer" + rc_tool = tools.fastx + "_reverse_complement" + trim_cmd_chunks = [trim_tool] + if encoding == "Illumina-1.8": + trim_cmd_chunks.extend([ + ("-Q", str(33)) + ]) + + # Remove UMI blindly by position only + trim_cmd_chunks.extend([ + ("-f", str(int(float(args.umi_len)) + 1)) + ]) + + # Trim tp max length if specified + if args.max_len != -1: + trim_cmd_chunks.extend([ + ("-l", (str(int(float(args.max_len)) + int(float(args.umi_len))))) + ]) + + # Need undeduplicated results for complexity calculation + trim_cmd_chunks.extend([ + ("-i", noadap_fastq) + ]) + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([ + ("-o", trimmed_fastq) + ]) + else: if encoding == "Illumina-1.8": trim_cmd_chunks.extend([ ("-Q", str(33)) ]) trim_cmd_chunks.extend([ - ("-f", str(int(float(args.umi_len)) + 1)) + ("-o", trimmed_fastq) ]) - if args.max_len != -1: - trim_cmd_chunks.extend([ - ("-l", (str(int(float(args.max_len)) + int(float(args.umi_len))))) - ]) - # Need undeduplicated results for complexity calculation - + else: + # Default to seqtk + # Remove UMI blindly by position only + trim_cmd_chunks = [ + tools.seqtk, + "trimfq", + ("-b", str(args.umi_len)) + ] + + # Trim to max length if specified + if args.max_len != -1: trim_cmd_chunks.extend([ - ("-i", noadap_fastq) + ("-L", str(args.max_len)) + ]) + + trim_cmd_chunks.extend([noadap_fastq]) + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([ + (">", trimmed_fastq) ]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([ - ("-o", trimmed_fastq) - ]) - else: - if encoding == "Illumina-1.8": - trim_cmd_chunks.extend([ - ("-Q", str(33)) - ]) - trim_cmd_chunks.extend([ - ("-o", trimmed_fastq) - ]) - # Default to seqtk else: - trim_cmd_chunks = [ - tools.seqtk, - "trimfq", - ("-b", str(args.umi_len)) - ] - if args.max_len != -1: - trim_cmd_chunks.extend([ - ("-L", str(args.max_len)) - ]) - - trim_cmd_chunks.extend([noadap_fastq]) - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([ - (">", trimmed_fastq) - ]) - else: - trim_cmd_chunks.extend([ - "|", - (tools.seqtk, "seq"), - ("-r", "-"), - (">", trimmed_fastq) - ]) + trim_cmd_chunks.extend([ + "|", + (tools.seqtk, "seq"), + ("-r", "-"), + (">", trimmed_fastq) + ]) trim_cmd = build_command(trim_cmd_chunks) pm.debug("trim_cmd_nodedup: {}".format(build_command(trim_cmd_chunks))) @@ -721,8 +718,9 @@ def _trim_pipes(args, tools, read2, fq_file, outfolder): if args.trimmer == "fastx": encoding = _guess_encoding(fq_file) - if args.umi_fastp and args.adapter == "fastp": + if args.adapter == "fastp": # There are no intermediate files, just pipes + # Remove UMI trim_cmd_chunks = [ tools.fastp, ("--thread", str(pm.cores)), @@ -743,6 +741,7 @@ def _trim_pipes(args, tools, read2, fq_file, outfolder): (tools.seqtk, "trimfq") ]) + # Trim to max length if specified if args.max_len != -1: trim_cmd_chunks.extend([("-L", args.max_len)]) @@ -759,91 +758,84 @@ def _trim_pipes(args, tools, read2, fq_file, outfolder): (">", processed_fastq) ]) # If args.complexity and args.umi_len > 0 retain intermediate files - else: - if args.umi_fastp and args.adapter != "fastp": - pm.info("To remove UMI intelligently, you must process " - "adapters using 'fastp'") - if args.umi_len > 0: - pm.info("Defaulting to removing the first {} " - "bp instead via trimming".format(str(args.umi_len))) - if args.trimmer == "seqtk": - trim_cmd_chunks = [ - tools.seqtk, - "trimfq" - ] + elif args.trimmer == "seqtk": + trim_cmd_chunks = [ + tools.seqtk, + "trimfq" + ] - if read2: - trim_cmd_chunks.extend([("-e", str(args.umi_len))]) - else: - trim_cmd_chunks.extend([("-b", str(args.umi_len))]) - if args.max_len != -1: - trim_cmd_chunks.extend([("-L", str(args.max_len))]) + if read2: + trim_cmd_chunks.extend([("-e", str(args.umi_len))]) + else: + trim_cmd_chunks.extend([("-b", str(args.umi_len))]) + if args.max_len != -1: + trim_cmd_chunks.extend([("-L", str(args.max_len))]) - trim_cmd_chunks.extend(["-"]) + trim_cmd_chunks.extend(["-"]) - # Do not reverse complement for GRO-seq - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([(">", processed_fastq)]) - else: + # Do not reverse complement for GRO-seq + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([(">", processed_fastq)]) + else: + trim_cmd_chunks.extend([ + "|", + tools.seqtk, + ("seq", "-r"), + ("-", ">"), + processed_fastq + ]) + elif args.trimmer == "fastx": + trim_tool = tools.fastx + "_trimmer" + rc_tool = tools.fastx + "_reverse_complement" + trim_cmd_chunks = [trim_tool] + + if encoding == "Illumina-1.8": + trim_cmd_chunks.extend([("-Q", str(33))]) + + if read2: + trim_cmd_chunks.extend([("-t", str(int(float(args.umi_len))))]) + else: + trim_cmd_chunks.extend([("-f", str(int(float(args.umi_len)) + 1))]) + if args.max_len != -1: trim_cmd_chunks.extend([ - "|", - tools.seqtk, - ("seq", "-r"), - ("-", ">"), - processed_fastq + ("-l", (str(int(float(args.max_len)) + int(float(args.umi_len))))) ]) - elif args.trimmer == "fastx": - trim_tool = tools.fastx + "_trimmer" - rc_tool = tools.fastx + "_reverse_complement" - trim_cmd_chunks = [trim_tool] + # Do not reverse complement for GRO-seq + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([("-o", processed_fastq)]) + else: + trim_cmd_chunks.extend([("|", rc_tool)]) if encoding == "Illumina-1.8": trim_cmd_chunks.extend([("-Q", str(33))]) + trim_cmd_chunks.extend([("-o", processed_fastq)]) + else: + # Default to seqtk + trim_cmd_chunks = [ + tools.seqtk, + "trimfq" + ] - if read2: - trim_cmd_chunks.extend([("-t", str(int(float(args.umi_len))))]) - else: - trim_cmd_chunks.extend([("-f", str(int(float(args.umi_len)) + 1))]) - if args.max_len != -1: - trim_cmd_chunks.extend([ - ("-l", (str(int(float(args.max_len)) + int(float(args.umi_len))))) - ]) - - # Do not reverse complement for GRO-seq - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([("-o", processed_fastq)]) - else: - trim_cmd_chunks.extend([("|", rc_tool)]) - if encoding == "Illumina-1.8": - trim_cmd_chunks.extend([("-Q", str(33))]) - trim_cmd_chunks.extend([("-o", processed_fastq)]) + if read2: + trim_cmd_chunks.extend([("-e", str(args.umi_len))]) else: - # Default to seqtk - trim_cmd_chunks = [ - tools.seqtk, - "trimfq" - ] - - if read2: - trim_cmd_chunks.extend([("-e", str(args.umi_len))]) - else: - trim_cmd_chunks.extend([("-b", str(args.umi_len))]) - if args.max_len != -1: - trim_cmd_chunks.extend([("-L", str(args.max_len))]) + trim_cmd_chunks.extend([("-b", str(args.umi_len))]) + if args.max_len != -1: + trim_cmd_chunks.extend([("-L", str(args.max_len))]) - trim_cmd_chunks.extend(["-"]) + trim_cmd_chunks.extend(["-"]) - # Do not reverse complement for GRO-seq - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([(">", processed_fastq)]) - else: - trim_cmd_chunks.extend([ - "|", - tools.seqtk, - ("seq", "-r"), - ("-", ">"), - processed_fastq - ]) + # Do not reverse complement for GRO-seq + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([(">", processed_fastq)]) + else: + trim_cmd_chunks.extend([ + "|", + tools.seqtk, + ("seq", "-r"), + ("-", ">"), + processed_fastq + ]) trim_cmd = build_command(trim_cmd_chunks) pm.debug("trim_pipes_cmd: {}".format(build_command(trim_cmd_chunks))) From 24832c4bb7e716ee50adb36955a0096fc868f341 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Mon, 25 Nov 2019 11:10:34 -0500 Subject: [PATCH 099/207] update adapter file usage and input; Closes: #43 --- pipelines/peppro.py | 55 ++++++++++++++++++++++++++-------------- tools/PRO-seq_adapter.fa | 2 -- tools/adapter.fa | 4 +++ 3 files changed, 40 insertions(+), 21 deletions(-) delete mode 100644 tools/PRO-seq_adapter.fa create mode 100644 tools/adapter.fa diff --git a/pipelines/peppro.py b/pipelines/peppro.py index a1ada49..22bd1f5 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -154,14 +154,16 @@ def parse_arguments(): return args -def _remove_adapters(args, tools, read2, fq_file, outfolder): +def _remove_adapters(args, res, tools, read2, fq_file, outfolder): """ A helper function to build a command for adapter removal. :param argparse.Namespace args: binding between option name and argument, e.g. from parsing command-line options + :param looper.models.AttributeDict res: binding between resources and + value, e.g. for resources used by the pipeline :param looper.models.AttributeDict tools: binding between tool name and - value, e.g. for tools/resources used by the pipeline + value, e.g. for tools used by the pipeline :param bool read2: if True, do not deduplicate and do not retain intermediate files :param str fq_file: path to FASTQ file @@ -187,6 +189,16 @@ def _remove_adapters(args, tools, read2, fq_file, outfolder): fastp_report_html_R2 = fastp_pfx_R2 + ".html" fastp_report_json_R2 = fastp_pfx_R2 + ".json" + if _itsa_file(res.adapters): + five_prime = pm.checkprint("awk '/5prime/{getline; print}' " + + res.adapters) or "TGGAATTCTCGGGTGCCAAGG" + three_prime = pm.checkprint("awk '/3prime/{getline; print}' " + + res.adapters) or "GATCGTCGGACTGTAGAACTCTGAAC" + else: + # Default to the hardcoded values as a fallback + five_prime = "TGGAATTCTCGGGTGCCAAGG" + three_prime = "GATCGTCGGACTGTAGAACTCTGAAC" + # Setup report output folders if args.adapter == "cutadapt": ngstk.make_dir(cutadapt_folder) @@ -209,7 +221,7 @@ def _remove_adapters(args, tools, read2, fq_file, outfolder): ] if read2: adapter_cmd_chunks.extend([ - ("--adapter_sequence", "GATCGTCGGACTGTAGAACTCTGAAC"), + ("--adapter_sequence", three_prime), ("--length_required", (18 + int(float(args.umi_len)))), ("--html", fastp_report_html_R2), ("--json", fastp_report_json_R2), @@ -217,7 +229,7 @@ def _remove_adapters(args, tools, read2, fq_file, outfolder): ]) else: adapter_cmd_chunks.extend([ - ("--adapter_sequence", "TGGAATTCTCGGGTGCCAAGG"), + ("--adapter_sequence", five_prime), ("--length_required", (18 + int(float(args.umi_len)))), ("--html", fastp_report_html), ("--json", fastp_report_json), @@ -245,7 +257,7 @@ def _remove_adapters(args, tools, read2, fq_file, outfolder): adapter_cmd_chunks.extend([("-j", str(pm.cores))]) adapter_cmd_chunks.extend([ ("-m", (18 + int(float(args.umi_len)))), - ("-a", "GATCGTCGGACTGTAGAACTCTGAAC"), + ("-a", three_prime), fq_file ]) else: @@ -256,7 +268,7 @@ def _remove_adapters(args, tools, read2, fq_file, outfolder): adapter_cmd_chunks.extend([("-j", str(pm.cores))]) adapter_cmd_chunks.extend([ ("-m", (18 + int(float(args.umi_len)))), - ("-a", "TGGAATTCTCGGGTGCCAAGG"), + ("-a", five_prime), fq_file, ("-o", noadap_fastq + ")"), (">", cutadapt_report) @@ -268,7 +280,7 @@ def _remove_adapters(args, tools, read2, fq_file, outfolder): adapter_cmd_chunks.extend([("-j", str(pm.cores))]) adapter_cmd_chunks.extend([ ("-m", (18 + int(float(args.umi_len)))), - ("-a", "TGGAATTCTCGGGTGCCAAGG"), + ("-a", five_prime), fq_file ]) @@ -284,7 +296,7 @@ def _remove_adapters(args, tools, read2, fq_file, outfolder): ] if read2: adapter_cmd_chunks.extend([ - ("--adapter_sequence", "GATCGTCGGACTGTAGAACTCTGAAC"), + ("--adapter_sequence", three_prime), ("--length_required", (18 + int(float(args.umi_len)))), ("--html", fastp_report_html_R2), ("--json", fastp_report_json_R2), @@ -292,7 +304,7 @@ def _remove_adapters(args, tools, read2, fq_file, outfolder): ]) else: adapter_cmd_chunks.extend([ - ("--adapter_sequence", "TGGAATTCTCGGGTGCCAAGG"), + ("--adapter_sequence", five_prime), ("--length_required", (18 + int(float(args.umi_len)))), ("--html", fastp_report_html), ("--json", fastp_report_json), @@ -844,14 +856,16 @@ def _trim_pipes(args, tools, read2, fq_file, outfolder): return trim_cmd -def _process_fastq(args, tools, read2, fq_file, outfolder): +def _process_fastq(args, tools, res, read2, fq_file, outfolder): """ A helper function to prepare read files for downstream processing. :param argparse.Namespace args: binding between option name and argument, e.g. from parsing command-line options + :param looper.models.AttributeDict res: binding between resources and + value, e.g. for resources used by the pipeline :param looper.models.AttributeDict tools: binding between tool name and - value, e.g. for tools/resources used by the pipeline + value, e.g. for tools used by the pipeline :param bool read2: if True, do not deduplicate and do not retain intermediate files :param str fq_file: path to FASTQ file @@ -883,7 +897,7 @@ def _process_fastq(args, tools, read2, fq_file, outfolder): fastp_report_txt = fastp_pfx + ".txt" fastp_report_html = fastp_pfx + ".html" - adapter_command = _remove_adapters(args, tools, read2, fq_file, outfolder) + adapter_command = _remove_adapters(args, tools, res, read2, fq_file, outfolder) pm.debug("Adapter command: {}".format(adapter_command)) pm.debug("Read2 status: {}".format(read2)) @@ -1503,8 +1517,8 @@ def main(): res, rgc = _add_resources(args, res, check_list) # Adapter file can be set in the config; if left null, we use a default. - # TODO: use this option or just specify directly the adapter sequence as I do now - res.adapters = res.adapters or tool_path("PRO-seq_adapter.fa") + # Expects headers to include >5prime and >3prime + res.adapters = res.adapters or tool_path("adapter.fa") param.outfolder = outfolder @@ -1584,6 +1598,7 @@ def main(): dups_repair_target = os.path.join(fastq_folder, "dups_repaired.flag") # If single-end, must use cutadapt for plotting purposes + # TODO: make this a warning, not a hard switch... if not args.paired_end: if args.adapter != "cutadapt": pm.warning("You set adapter arg to '{}' but you must select 'cutadapt'" @@ -1595,14 +1610,15 @@ def main(): if not pm.get_stat("Aligned_reads") or args.new_start: if args.paired_end: if args.complexity and args.umi_len > 0: - unmap_fq1, unmap_fq1_dups = _process_fastq(args, tools, False, + unmap_fq1, unmap_fq1_dups = _process_fastq(args, tools, res, + False, untrimmed_fastq1, outfolder=param.outfolder) else: - unmap_fq1 = _process_fastq(args, tools, False, + unmap_fq1 = _process_fastq(args, tools, res, False, untrimmed_fastq1, outfolder=param.outfolder) - unmap_fq2, unmap_fq2_dups = _process_fastq(args, tools, True, + unmap_fq2, unmap_fq2_dups = _process_fastq(args, tools, res, True, untrimmed_fastq2, outfolder=param.outfolder) @@ -1657,13 +1673,14 @@ def main(): pm.run([cmd1, cmd2, cmd3], dups_repair_target) else: if args.complexity and args.umi_len > 0: - unmap_fq1, unmap_fq1_dups = _process_fastq(args, tools, False, + unmap_fq1, unmap_fq1_dups = _process_fastq(args, tools, res, + False, untrimmed_fastq1, outfolder=param.outfolder) unmap_fq2 = "" unmap_fq2_dups = "" else: - unmap_fq1 = _process_fastq(args, tools, False, + unmap_fq1 = _process_fastq(args, tools, res, False, untrimmed_fastq1, outfolder=param.outfolder) unmap_fq2 = "" diff --git a/tools/PRO-seq_adapter.fa b/tools/PRO-seq_adapter.fa deleted file mode 100644 index a4868ec..0000000 --- a/tools/PRO-seq_adapter.fa +++ /dev/null @@ -1,2 +0,0 @@ ->5prime -TGGAATTCTCGGGTGCCAAGG \ No newline at end of file diff --git a/tools/adapter.fa b/tools/adapter.fa new file mode 100644 index 0000000..4e4308e --- /dev/null +++ b/tools/adapter.fa @@ -0,0 +1,4 @@ +>5prime +TGGAATTCTCGGGTGCCAAGG +>3prime +GATCGTCGGACTGTAGAACTCTGAAC \ No newline at end of file From f75bb541b35be3226988415ee65e6d5089484946 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Mon, 25 Nov 2019 11:28:45 -0500 Subject: [PATCH 100/207] Reduce not using cutadapt for SE to a warning, not an automatic override --- pipelines/peppro.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 22bd1f5..0f79806 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -1601,9 +1601,10 @@ def main(): # TODO: make this a warning, not a hard switch... if not args.paired_end: if args.adapter != "cutadapt": - pm.warning("You set adapter arg to '{}' but you must select 'cutadapt'" - " for single end data. Overriding.".format(args.adapter)) - args.adapter = "cutadapt" + pm.warning("You set adapter arg to '{}' but you must select " + "'cutadapt' to plot the adapter insertion distribution " + " for single end data. ".format(args.adapter)) + #args.adapter = "cutadapt" # If we've already aligned to the primary genome, skip these steps unless # it's a --new-start @@ -1688,7 +1689,7 @@ def main(): pm.timestamp("### Plot adapter insertion distribution") if not args.adapter == "cutadapt": pm.info("Skipping sample degradation plotting...") - pm.info("This requires using 'cutadapt' for adapter clipping.") + pm.info("This requires using 'cutadapt' for adapter removal.") elif not os.path.exists(cutadapt_report): pm.info("Skipping sample degradation plotting...") pm.info("Could not find {}.`".format(cutadapt_report)) From f383bf803859289249ec68eca13753ae2d2c808f Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Mon, 25 Nov 2019 11:37:03 -0500 Subject: [PATCH 101/207] put in checks for division by zero --- pipelines/peppro.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 0f79806..97b412a 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -1154,7 +1154,11 @@ def _align_with_bt2(args, tools, paired, useFIFO, unmap_fq1, unmap_fq2, print("Trimmed reads is not reported.") else: res_key = "Alignment_rate_" + assembly_identifier - pm.report_result(res_key, round(float(ar) * 100 / float(tr), 2)) + if float(ar) > 0: + pm.report_result(res_key, + round(float(ar) * 100 / float(tr), 2)) + else: + pm.report_result(res_key, 0) if paired: unmap_fq1 = out_fastq_r1 @@ -1598,12 +1602,11 @@ def main(): dups_repair_target = os.path.join(fastq_folder, "dups_repaired.flag") # If single-end, must use cutadapt for plotting purposes - # TODO: make this a warning, not a hard switch... if not args.paired_end: if args.adapter != "cutadapt": pm.warning("You set adapter arg to '{}' but you must select " "'cutadapt' to plot the adapter insertion distribution " - " for single end data. ".format(args.adapter)) + " for single end data.".format(args.adapter)) #args.adapter = "cutadapt" # If we've already aligned to the primary genome, skip these steps unless @@ -1899,6 +1902,9 @@ def main(): def check_alignment_genome(temp_bam, bam): mr = ngstk.count_mapped_reads(temp_bam, args.paired_end) ar = ngstk.count_mapped_reads(bam, args.paired_end) + if float(ar) < 1: + err_msg = "No aligned reads. Check alignment settings." + pm.fail_pipeline(RuntimeError(err_msg)) if args.paired_end: ar = float(ar)/2 rr = float(pm.get_stat("Raw_reads")) From 972d4a97bf4ef391781fefc579db48bd9746e124 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Mon, 25 Nov 2019 13:21:26 -0500 Subject: [PATCH 102/207] update fastp umi control based on umi_len specification --- pipelines/peppro.py | 162 ++++++++++++++++++++++++++++---------------- 1 file changed, 104 insertions(+), 58 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 97b412a..2dd4839 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -567,37 +567,55 @@ def _trim_adapter_files(args, tools, fq_file, outfolder): if args.adapter == "fastp": # Remove UMI and specify location of UMI # Still requires seqtk for reverse complementation - trim_cmd_chunks = [ - tools.fastp, - ("--thread", str(pm.cores)), - ("-i", noadap_fastq), - "--stdout", - "--umi", - ("--umi_loc", "read1"), - ("--umi_len", args.umi_len), - ("--html", umi_report), - ("--json", umi_json), - "|", - (tools.seqtk, "trimfq") - ] - - # Trim tp max length if specified - if args.max_len != -1: - trim_cmd_chunks.extend([("-L", args.max_len)]) + if args.umi_len > 0: + trim_cmd_chunks = [ + tools.fastp, + ("--thread", str(pm.cores)), + ("-i", noadap_fastq), + "--stdout", + "--umi", + ("--umi_loc", "read1"), + ("--umi_len", args.umi_len), + ("--html", umi_report), + ("--json", umi_json), + "|", + (tools.seqtk, "trimfq") + ] - trim_cmd_chunks.extend(["-"]) + if args.max_len != -1: + # Trim to max length if specified + trim_cmd_chunks.extend([("-L", args.max_len)]) + + trim_cmd_chunks.extend(["-"]) + elif args.max_len != -1: + trim_cmd_chunks = [ + (tools.seqtk, "trimfq"), + ("-L", args.max_len), + "-" + ] + else: + trim_cmd_chunks = [] - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([ - (">", trimmed_fastq) - ]) + if trim_cmd_chunks: + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([ + (">", trimmed_fastq) + ]) + else: + trim_cmd_chunks.extend([ + "|", + (tools.seqtk, "seq"), + ("-r", "-"), + (">", trimmed_fastq) + ]) else: - trim_cmd_chunks.extend([ - "|", - (tools.seqtk, "seq"), - ("-r", "-"), - (">", trimmed_fastq) - ]) + # If no UMI removal or read trimming, just reverse complement + if args.protocol.lower() in RUNON_SOURCE_PRO: + trim_cmd_chunks.extend([ + (tools.seqtk, "seq"), + ("-r", "-"), + (">", trimmed_fastq) + ]) elif args.trimmer == "seqtk": # Remove UMI blindly by position trim_cmd_chunks = [ @@ -733,42 +751,70 @@ def _trim_pipes(args, tools, read2, fq_file, outfolder): if args.adapter == "fastp": # There are no intermediate files, just pipes # Remove UMI - trim_cmd_chunks = [ - tools.fastp, - ("--thread", str(pm.cores)), - ("--stdin", "--stdout"), - "--umi" - ] + if args.umi_len > 0: + trim_cmd_chunks = [ + tools.fastp, + ("--thread", str(pm.cores)), + ("--stdin", "--stdout"), + "--umi" + ] - if read2: - trim_cmd_chunks.extend([("--umi_loc", "paired_end")]) - else: - trim_cmd_chunks.extend([("--umi_loc", "read1")]) + if read2: + trim_cmd_chunks.extend([("--umi_loc", "paired_end")]) + else: + trim_cmd_chunks.extend([("--umi_loc", "read1")]) - trim_cmd_chunks.extend([ - ("--umi_len", args.umi_len), - ("--html", umi_report), - ("--json", umi_json), - "|", - (tools.seqtk, "trimfq") - ]) + trim_cmd_chunks.extend([ + ("--umi_len", args.umi_len), + ("--html", umi_report), + ("--json", umi_json), + "|", + (tools.seqtk, "trimfq") + ]) - # Trim to max length if specified - if args.max_len != -1: - trim_cmd_chunks.extend([("-L", args.max_len)]) + # Trim to max length if specified + if args.max_len != -1: + trim_cmd_chunks.extend([("-L", args.max_len)]) - trim_cmd_chunks.extend(["-"]) + trim_cmd_chunks.extend(["-"]) - # Do not reverse complement for GRO-seq - if args.protocol.lower() in RUNON_SOURCE_GRO: - trim_cmd_chunks.extend([(">", processed_fastq)]) + # Do not reverse complement for GRO-seq + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([(">", processed_fastq)]) + else: + trim_cmd_chunks.extend([ + "|", + (tools.seqtk, "seq"), + ("-r", "-"), + (">", processed_fastq) + ]) + elif args.max_len != -1: + # No UMI, but still trim max length + trim_cmd_chunks = [ + (tools.seqtk, "trimfq"), + ("-L", args.max_len), + "-" + ] + # Do not reverse complement for GRO-seq + if args.protocol.lower() in RUNON_SOURCE_GRO: + trim_cmd_chunks.extend([(">", processed_fastq)]) + else: + trim_cmd_chunks.extend([ + "|", + (tools.seqtk, "seq"), + ("-r", "-"), + (">", processed_fastq) + ]) else: - trim_cmd_chunks.extend([ - "|", - (tools.seqtk, "seq"), - ("-r", "-"), - (">", processed_fastq) - ]) + # No UMI and no trimming + if args.protocol.lower() in RUNON_SOURCE_PRO: + trim_cmd_chunks = [ + (tools.seqtk, "seq"), + ("-r", "-"), + (">", processed_fastq) + ] + else: + trim_cmd_chunks = [] # If args.complexity and args.umi_len > 0 retain intermediate files elif args.trimmer == "seqtk": trim_cmd_chunks = [ From c98cefef1eca06fa99a7bfbf47b94d21ce2b642e Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Mon, 25 Nov 2019 14:15:23 -0500 Subject: [PATCH 103/207] fix spacing in message --- pipelines/peppro.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 2dd4839..b66e2f4 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -1652,7 +1652,7 @@ def main(): if args.adapter != "cutadapt": pm.warning("You set adapter arg to '{}' but you must select " "'cutadapt' to plot the adapter insertion distribution " - " for single end data.".format(args.adapter)) + "for single end data.".format(args.adapter)) #args.adapter = "cutadapt" # If we've already aligned to the primary genome, skip these steps unless From 4b1ffec45ac141ace663ca0a53206d030bed6dda Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Mon, 25 Nov 2019 15:20:49 -0500 Subject: [PATCH 104/207] switch mRNA contamination to default to histogram while keeping other styles as options; Closes: #40 --- PEPPROr/R/PEPPROr.R | 158 +++++++++++++++++++++++++++++++++----------- 1 file changed, 121 insertions(+), 37 deletions(-) diff --git a/PEPPROr/R/PEPPROr.R b/PEPPROr/R/PEPPROr.R index b4371a4..18510e4 100644 --- a/PEPPROr/R/PEPPROr.R +++ b/PEPPROr/R/PEPPROr.R @@ -1038,7 +1038,8 @@ fancyNumbers <- function(n){ #' @export mRNAcontamination <- function(rpkm, name='mRNA contamination ratios', - raw=FALSE) { + raw=FALSE, + type=c("histogram", "boxplot", "violin")) { if (exists(rpkm)) { RPKM <- data.table(get(rpkm)) } else if (file.exists(rpkm)) { @@ -1051,32 +1052,99 @@ mRNAcontamination <- function(rpkm, finite_rpkm <- RPKM[is.finite(RPKM$ratio),] + plot_theme <- theme_classic(base_size=14) + + theme(axis.line = element_line(size = 0.5), + panel.grid.major = element_blank(), + panel.grid.minor = element_blank(), + aspect.ratio = 1, + panel.border = element_rect(colour = "black", + fill=NA, size=0.5)) + if (raw) { - q <- ggplot(data = finite_rpkm, - aes(x="", y=(ratio))) + + if (type == "histogram") { + base_plot <- ggplot(data = finite_rpkm, aes(ratio)) + } else { + base_plot <- ggplot(data = finite_rpkm, aes(x="", y=(ratio))) + } + } else { + if (type == "histogram") { + base_plot <- ggplot(data = finite_rpkm, aes(log10(ratio))) + } else { + base_plot <- ggplot(data = finite_rpkm, aes(x="", y=log10(ratio))) + } + } + + if (type == "histogram") { + if (raw) { + plot = base_plot + + geom_histogram(col="black", fill=I("transparent")) + + geom_vline(aes(xintercept=median(ratio)), + color="gray", linetype="dashed", size=1) + + geom_vline(aes(xintercept=mean(ratio)), + color="light gray", linetype="dotted", size=1) + + labs(x=expression((over(exon[RPKM], intron[RPKM]))~X~Gene)) + + xlim(c(0, ceiling(summary(finite_rpkm$ratio)[5]))) + } else { + plot = base_plot + + geom_histogram(col="black", fill=I("transparent")) + + geom_vline(aes(xintercept=median(log10(ratio))), + color="gray", linetype="dashed", size=1) + + geom_vline(aes(xintercept=mean(log10(ratio))), + color="light gray", linetype="dotted", size=1) + + labs(x=expression(log[10](over(exon[RPKM], intron[RPKM]))~X~Gene)) + + scale_x_log10(limits = c(0.001, 50), + expand = expand_scale(mult = c(0, 0)), + labels=fancyNumbers, + breaks=prettyLogs) + + annotation_logticks(sides = c("rl")) + } + } else if (type == "boxplot") { + if (raw) { + plot = base_plot + + stat_boxplot(geom ='errorbar', width = 0.25) + + geom_boxplot(width = 0.25, + outlier.color='red', + outlier.shape=1) + + stat_summary(fun.y = "mean", geom = "point", + shape = 1, size = 2) + + labs(x=name, + y=expression((over(exon[RPKM], intron[RPKM]))~X~Gene)) + + ylim(c(0, ceiling(summary(finite_rpkm$ratio)[5]))) + } else { + plot <- base_plot + stat_boxplot(geom ='errorbar', width = 0.25) + geom_boxplot(width = 0.25, outlier.color='red', outlier.shape=1) + + stat_summary(fun.data = n_fun, geom = "text", hjust = 0.5) + + stat_summary(fun.y = "mean", geom = "point", + shape = 1, size = 2) + + scale_y_log10(limits = c(0.001, 50), + expand = expand_scale(mult = c(0, 0)), + labels=fancyNumbers, + breaks=prettyLogs) + + annotation_logticks(sides = c("rl")) + + labs(x=name, + y=expression(log[10](over(exon[RPKM], intron[RPKM]))~X~Gene)) + } + } else if (type == "violin") { + if (raw) { + plot = base_plot + + stat_boxplot(geom ='errorbar', width = 0.25) + + geom_violin(width = 0.25, draw_quantiles = c(0.25,0.75), + linetype="dashed") + + geom_violin(width=0.25, fill="transparent", draw_quantiles = 0.5) + stat_summary(fun.y = "mean", geom = "point", shape = 1, size = 2) + labs(x=name, y=expression((over(exon[RPKM], intron[RPKM]))~X~Gene)) + - ylim(c(0, ceiling(summary(finite_rpkm$ratio)[5]))) + - theme_classic(base_size=14) + - theme(axis.line = element_line(size = 0.5)) + - theme(panel.grid.major = element_blank(), - panel.grid.minor = element_blank(), - aspect.ratio = 1, - panel.border = element_rect(colour = "black", - fill=NA, size=0.5)) - } else { - q <- ggplot(data = finite_rpkm, - aes(x="", y=log10(ratio))) + + ylim(c(0, ceiling(summary(finite_rpkm$ratio)[5]))) + } else { + plot <- base_plot + stat_boxplot(geom ='errorbar', width = 0.25) + - geom_boxplot(width = 0.25, - outlier.color='red', - outlier.shape=1) + + geom_violin(width = 0.25, draw_quantiles = c(0.25,0.75), + linetype="dashed") + + geom_violin(width=0.25, fill="transparent", draw_quantiles = 0.5) + stat_summary(fun.data = n_fun, geom = "text", hjust = 0.5) + stat_summary(fun.y = "mean", geom = "point", shape = 1, size = 2) + @@ -1086,30 +1154,46 @@ mRNAcontamination <- function(rpkm, breaks=prettyLogs) + annotation_logticks(sides = c("rl")) + labs(x=name, - y=expression(log[10](over(exon[RPKM], intron[RPKM]))~X~Gene)) + - theme_classic(base_size=14) + - theme(axis.line = element_line(size = 0.5)) + - theme(panel.grid.major = element_blank(), - panel.grid.minor = element_blank(), - aspect.ratio = 1, - panel.border = element_rect(colour = "black", - fill=NA, size=0.5)) + y=expression(log[10](over(exon[RPKM], intron[RPKM]))~X~Gene)) + } + } else { + # Default to histogram + if (raw) { + plot = base_plot + + geom_histogram(col="black", fill=I("transparent")) + + geom_vline(aes(xintercept=median(ratio)), + color="gray", linetype="dashed", size=1) + + geom_vline(aes(xintercept=mean(ratio)), + color="light gray", linetype="dotted", size=1) + + labs(x=expression((over(exon[RPKM], intron[RPKM]))~X~Gene)) + + xlim(c(0, ceiling(summary(finite_rpkm$ratio)[5]))) + } else { + plot = base_plot + + geom_histogram(col="black", fill=I("transparent")) + + geom_vline(aes(xintercept=median(log10(ratio))), + color="gray", linetype="dashed", size=1) + + geom_vline(aes(xintercept=mean(log10(ratio))), + color="light gray", linetype="dotted", size=1) + + labs(x=expression(log[10](over(exon[RPKM], intron[RPKM]))~X~Gene)) + + scale_x_log10(limits = c(0.001, 50), + expand = expand_scale(mult = c(0, 0)), + labels=fancyNumbers, + breaks=prettyLogs) + + annotation_logticks(sides = c("rl")) + } } - label1 <- c(paste("'median'[log[10]]", ":~", - round(median(log10((finite_rpkm$ratio))), 2)), - paste("'median'[raw]", ":", - round(median(finite_rpkm$ratio), 2))) - max_y <- layer_scales(q)$y$range$range[2] + label1 <- paste("'median'[log[10]]", ":~", round(median(log10((finite_rpkm$ratio))), 2)) + label2 <- paste("'median'[raw]", ":", round(median(finite_rpkm$ratio), 2)) - if (raw) { - q <- q + annotate("text", x = 0.5, y = c(max_y, 0.95*max_y), - hjust=0, vjust=1, label = label1, parse=TRUE) - } else { - q <- q + annotate("text", x = 0.5, y = c(10^max_y, 10^max_y-10), - hjust=0, vjust=1, label = label1, parse=TRUE) - } + max_y <- layer_scales(plot)$y$range$range[2] + + q <- plot + annotate("text", x = -Inf, y = Inf, hjust=-0.01, vjust=1.05, + label = label1, parse=TRUE) + + annotate("text", x = -Inf, y = Inf, hjust=-0.01, vjust=2.05, + label = label2, parse=TRUE) + + plot_theme return(q) } From f24195c50b988bf96171db6fc6dcc63772882ce8 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Mon, 25 Nov 2019 15:50:45 -0500 Subject: [PATCH 105/207] adjust axes limits to 90th percentile --- PEPPROr/R/PEPPROr.R | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PEPPROr/R/PEPPROr.R b/PEPPROr/R/PEPPROr.R index 18510e4..0b7e4d8 100644 --- a/PEPPROr/R/PEPPROr.R +++ b/PEPPROr/R/PEPPROr.R @@ -1083,7 +1083,7 @@ mRNAcontamination <- function(rpkm, geom_vline(aes(xintercept=mean(ratio)), color="light gray", linetype="dotted", size=1) + labs(x=expression((over(exon[RPKM], intron[RPKM]))~X~Gene)) + - xlim(c(0, ceiling(summary(finite_rpkm$ratio)[5]))) + xlim(c(0, ceiling(quantile(finite_rpkm$ratio, 0.90)))) } else { plot = base_plot + geom_histogram(col="black", fill=I("transparent")) + @@ -1109,7 +1109,7 @@ mRNAcontamination <- function(rpkm, shape = 1, size = 2) + labs(x=name, y=expression((over(exon[RPKM], intron[RPKM]))~X~Gene)) + - ylim(c(0, ceiling(summary(finite_rpkm$ratio)[5]))) + ylim(c(0, ceiling(quantile(finite_rpkm$ratio, 0.90)))) } else { plot <- base_plot + stat_boxplot(geom ='errorbar', width = 0.25) + @@ -1138,7 +1138,7 @@ mRNAcontamination <- function(rpkm, shape = 1, size = 2) + labs(x=name, y=expression((over(exon[RPKM], intron[RPKM]))~X~Gene)) + - ylim(c(0, ceiling(summary(finite_rpkm$ratio)[5]))) + ylim(c(0, ceiling(quantile(finite_rpkm$ratio, 0.90)))) } else { plot <- base_plot + stat_boxplot(geom ='errorbar', width = 0.25) + @@ -1166,7 +1166,7 @@ mRNAcontamination <- function(rpkm, geom_vline(aes(xintercept=mean(ratio)), color="light gray", linetype="dotted", size=1) + labs(x=expression((over(exon[RPKM], intron[RPKM]))~X~Gene)) + - xlim(c(0, ceiling(summary(finite_rpkm$ratio)[5]))) + xlim(c(0, ceiling(quantile(finite_rpkm$ratio, 0.90)))) } else { plot = base_plot + geom_histogram(col="black", fill=I("transparent")) + From d75057ec0de87df99a7e026cc38cdd2abf148a83 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Mon, 25 Nov 2019 16:10:08 -0500 Subject: [PATCH 106/207] adjust calculation of max_len to minimize calling it on re-runs or recoveries; Closes: #37 --- pipelines/peppro.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index b66e2f4..464580f 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -2062,14 +2062,17 @@ def check_alignment_genome(temp_bam, bam): # Determine maximum read length and add seqOutBias resource # ############################################################################ - if int(args.max_len) != -1: - max_len = args.max_len - elif _itsa_file(mapping_genome_bam): - cmd = (tools.samtools + " stats " + mapping_genome_bam + - " | grep '^SN' | cut -f 2- | grep 'maximum length:' | cut -f 2-") - max_len = int(pm.checkprint(cmd)) - else: - max_len = DEFAULT_MAX_LEN + # TODO: report this as a stat, so we can pm.get_stat() on re-runs or recoveries + if not pm.get_stat("Maximum_read_length") or args.new_start: + if int(args.max_len) != -1: + max_len = int(args.max_len) + elif _itsa_file(mapping_genome_bam): + cmd = (tools.samtools + " stats " + mapping_genome_bam + + " | grep '^SN' | cut -f 2- | grep 'maximum length:' | cut -f 2-") + max_len = int(pm.checkprint(cmd)) + else: + max_len = int(DEFAULT_MAX_LEN) + pm.report_result("Maximum_read_length", max_len) # At this point we can check for seqOutBias required indicies. # Can't do it earlier because we haven't determined the read_length of From c4067e68d7d9a9f15a185030d0b7b75311d1d78e Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Mon, 25 Nov 2019 16:17:57 -0500 Subject: [PATCH 107/207] update get_stat for max_len --- pipelines/peppro.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 464580f..9a1c3fc 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -2062,7 +2062,6 @@ def check_alignment_genome(temp_bam, bam): # Determine maximum read length and add seqOutBias resource # ############################################################################ - # TODO: report this as a stat, so we can pm.get_stat() on re-runs or recoveries if not pm.get_stat("Maximum_read_length") or args.new_start: if int(args.max_len) != -1: max_len = int(args.max_len) @@ -2073,6 +2072,8 @@ def check_alignment_genome(temp_bam, bam): else: max_len = int(DEFAULT_MAX_LEN) pm.report_result("Maximum_read_length", max_len) + else: + max_len = int(pm.get_stat("Maximum_read_length")) # At this point we can check for seqOutBias required indicies. # Can't do it earlier because we haven't determined the read_length of From 53acb7553427470711be225d0c68fd43dd11f5b3 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Mon, 25 Nov 2019 16:28:39 -0500 Subject: [PATCH 108/207] make argument names clearer for user; Closes: #33 --- pipeline_interface.yaml | 6 +++--- pipelines/peppro.py | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pipeline_interface.yaml b/pipeline_interface.yaml index e6a995b..43a1c94 100644 --- a/pipeline_interface.yaml +++ b/pipeline_interface.yaml @@ -28,9 +28,9 @@ pipelines: optional_arguments: "--input2": read2 "--protocol": protocol - "--adapter": adapter - "--dedup": dedup - "--trimmer": trimmer + "--adapter-tool": adapter + "--dedup-tool": dedup + "--trimmer-tool": trimmer "--umi-len": umi_len "--max-len": max_len "--sob": sob diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 9a1c3fc..0d80fa1 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -51,20 +51,20 @@ def parse_arguments(): default="pro", choices=RUNON_SOURCE, help="Run on sequencing type.") - parser.add_argument("--adapter", dest="adapter", + parser.add_argument("--adapter-tool", dest="adapter", default=DEFAULT_REMOVER, choices=ADAPTER_REMOVERS, help="Name of adapter removal program." - "Default: {}".format(DEFAULT_REMOVER)) + "Default: {}".format(DEFAULT_REMOVER)) - parser.add_argument("--dedup", dest="dedup", + parser.add_argument("--dedup-tool", dest="dedup", default=DEFAULT_DEDUPLICATOR, choices=DEDUPLICATORS, help="Program to use to duplicate reads. " - "Default: {}".format(DEFAULT_DEDUPLICATOR)) + "Default: {}".format(DEFAULT_DEDUPLICATOR)) - parser.add_argument("--trimmer", dest="trimmer", + parser.add_argument("--trimmer-tool", dest="trimmer", default=DEFAULT_TRIMMER, choices=TRIMMERS, help="Name of read trimming program. " - "Default: {}".format(DEFAULT_TRIMMER)) + "Default: {}".format(DEFAULT_TRIMMER)) parser.add_argument("--umi-len", default=DEFAULT_UMI_LEN, type=int, From 6cf23ef063f9b8999698027713b3dde61f10a46e Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Mon, 25 Nov 2019 16:30:24 -0500 Subject: [PATCH 109/207] fix spacing, bump version --- pipelines/peppro.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 0d80fa1..3fb040e 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -5,7 +5,7 @@ __author__ = ["Jason Smith", "Nathan Sheffield", "Mike Guertin"] __email__ = "jasonsmith@virginia.edu" -__version__ = "0.8.1" +__version__ = "0.8.5" from argparse import ArgumentParser @@ -53,7 +53,7 @@ def parse_arguments(): parser.add_argument("--adapter-tool", dest="adapter", default=DEFAULT_REMOVER, choices=ADAPTER_REMOVERS, - help="Name of adapter removal program." + help="Name of adapter removal program. " "Default: {}".format(DEFAULT_REMOVER)) parser.add_argument("--dedup-tool", dest="dedup", From 83db2079c8375c6c1520d97bf7e8688ff958e14a Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Mon, 25 Nov 2019 16:37:10 -0500 Subject: [PATCH 110/207] rename complexity to improve clarity of function; closes: #32 --- pipelines/peppro.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 3fb040e..01ad2b4 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -138,7 +138,7 @@ def parse_arguments(): dest="no_fifo", help="Do NOT use named pipes during prealignments.") - parser.add_argument("--complexity", action='store_false', default=True, + parser.add_argument("--no-complexity", action='store_true', default=False, dest="complexity", help="Disable library complexity calculation (faster).") @@ -237,7 +237,7 @@ def _remove_adapters(args, res, tools, read2, fq_file, outfolder): ]) # If calculating library complexity and this is read 1 or single-end, # must produce an intermediate file. - if args.complexity and args.umi_len > 0 and not read2 : + if not args.complexity and args.umi_len > 0 and not read2 : adapter_cmd_chunks.extend([("-o", noadap_fastq)]) else: adapter_cmd_chunks.extend([("--stdout")]) @@ -261,7 +261,7 @@ def _remove_adapters(args, res, tools, read2, fq_file, outfolder): fq_file ]) else: - if args.complexity and args.umi_len > 0: + if not args.complexity and args.umi_len > 0: adapter_cmd_chunks = ["(" + tools.cutadapt] # old versions of cutadapt can not use multiple cores if cut_version >= 1.15: @@ -312,7 +312,7 @@ def _remove_adapters(args, res, tools, read2, fq_file, outfolder): ]) # If calculating library complexity and this is read 1 or single-end, # must produce a physical output file. - if args.complexity and not read2: + if not args.complexity and not read2: adapter_cmd_chunks.extend([("-o", noadap_fastq)]) else: adapter_cmd_chunks.extend([("--stdout")]) @@ -345,7 +345,7 @@ def _deduplicate(args, tools, fq_file, outfolder): dedup_fastq = os.path.join(fastq_folder, sname + "_R1_dedup.fastq") # Create deduplication command(s). - if args.complexity and args.umi_len > 0: + if not args.complexity and args.umi_len > 0: if args.dedup == "seqkit": dedup_cmd_chunks = [ (tools.seqkit, "rmdup"), @@ -354,7 +354,7 @@ def _deduplicate(args, tools, fq_file, outfolder): "--ignore-case", "-o" ] - if args.complexity: + if not args.complexity: dedup_cmd_chunks.extend([ (dedup_fastq, noadap_fastq) ]) @@ -815,7 +815,7 @@ def _trim_pipes(args, tools, read2, fq_file, outfolder): ] else: trim_cmd_chunks = [] - # If args.complexity and args.umi_len > 0 retain intermediate files + # if not args.complexity and args.umi_len > 0 retain intermediate files elif args.trimmer == "seqtk": trim_cmd_chunks = [ tools.seqtk, @@ -949,7 +949,7 @@ def _process_fastq(args, tools, res, read2, fq_file, outfolder): if read2: trim_command = _trim_pipes(args, tools, True, fq_file, outfolder) - elif args.complexity and args.umi_len > 0: + elif not args.complexity and args.umi_len > 0: deduplicate_command = _deduplicate(args, tools, fq_file, outfolder) pm.debug("Dedup command: {}".format(deduplicate_command)) trim_command = _trim_adapter_files(args, tools, fq_file, outfolder) @@ -1018,7 +1018,7 @@ def report_fastq(): pm.run(cp_cmd, trimmed_dups_fastq_R2) return trimmed_fastq_R2, trimmed_dups_fastq_R2 else: - if args.complexity and args.umi_len > 0: + if not args.complexity and args.umi_len > 0: # This trim command DOES need the adapter file... pm.debug("\ntrim_command1: {} + {}\n".format(adapter_command, trim_command)) pm.run([adapter_command, trim_command], processed_fastq, @@ -1659,7 +1659,7 @@ def main(): # it's a --new-start if not pm.get_stat("Aligned_reads") or args.new_start: if args.paired_end: - if args.complexity and args.umi_len > 0: + if not args.complexity and args.umi_len > 0: unmap_fq1, unmap_fq1_dups = _process_fastq(args, tools, res, False, untrimmed_fastq1, @@ -1722,7 +1722,7 @@ def main(): cmd3 = ("touch dups_repaired.flag") pm.run([cmd1, cmd2, cmd3], dups_repair_target) else: - if args.complexity and args.umi_len > 0: + if not args.complexity and args.umi_len > 0: unmap_fq1, unmap_fq1_dups = _process_fastq(args, tools, res, False, untrimmed_fastq1, @@ -1772,7 +1772,7 @@ def main(): print("Prealignment assemblies: " + str(args.prealignments)) # Loop through any prealignment references and map to them sequentially for reference in args.prealignments: - if args.complexity and args.umi_len > 0: + if not args.complexity and args.umi_len > 0: if args.no_fifo: unmap_fq1, unmap_fq2 = _align_with_bt2( args, tools, args.paired_end, False, unmap_fq1, @@ -1906,7 +1906,7 @@ def main(): cmd += " -T " + tempdir cmd += " -o " + mapping_genome_bam_temp - if args.complexity and args.umi_len > 0: + if not args.complexity and args.umi_len > 0: # check input for zipped or not if pypiper.is_gzipped_fastq(unmap_fq1_dups): cmd = (ngstk.ziptool + " -d " + (unmap_fq1_dups + ".gz")) @@ -1939,7 +1939,7 @@ def main(): " -U " + failQC_genome_bam + " ") cmd2 += mapping_genome_bam_temp + " > " + mapping_genome_bam - if args.complexity and args.umi_len > 0: + if not args.complexity and args.umi_len > 0: cmd2_dups = (tools.samtools + " view -q 10 -b -@ " + str(pm.cores) + " -U " + failQC_genome_bam_dups + " ") cmd2_dups += mapping_genome_bam_temp_dups + " > " + mapping_genome_bam_dups @@ -1980,7 +1980,7 @@ def check_alignment_genome(temp_bam, bam): mapping_genome_bam), container=pm.container) - if args.complexity and args.umi_len > 0: + if not args.complexity and args.umi_len > 0: pm.run([cmd_dups, cmd2_dups], mapping_genome_bam_dups, container=pm.container) @@ -2001,7 +2001,7 @@ def check_alignment_genome(temp_bam, bam): pm.run(cmd, temp_mapping_index) pm.clean_add(temp_mapping_index) - if args.complexity and args.umi_len > 0: + if not args.complexity and args.umi_len > 0: cmd_dups = tools.samtools + " index " + mapping_genome_bam_temp_dups pm.run(cmd_dups, temp_mapping_index_dups) pm.clean_add(temp_mapping_index_dups) @@ -2115,7 +2115,7 @@ def check_alignment_genome(temp_bam, bam): QC_folder, args.sample_name + "_preseq_plot.png") if not _itsa_file(preseq_plot) or args.new_start: - if args.complexity and args.umi_len > 0: + if not args.complexity and args.umi_len > 0: if os.path.exists(mapping_genome_bam_temp_dups): if not os.path.exists(temp_mapping_index_dups): cmd = tools.samtools + " index " + mapping_genome_bam_temp_dups From e1528b662e0820f17c693866af94a57965e6f475 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Wed, 27 Nov 2019 08:42:39 -0500 Subject: [PATCH 111/207] eliminate superfluous messaging; add arguments to mRNA contamination plot --- PEPPROr/R/PEPPROr.R | 27 +++++++++++++++------------ tools/PEPPRO.R | 13 ++++++++----- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/PEPPROr/R/PEPPROr.R b/PEPPROr/R/PEPPROr.R index 0b7e4d8..2cb0ea2 100644 --- a/PEPPROr/R/PEPPROr.R +++ b/PEPPROr/R/PEPPROr.R @@ -1038,7 +1038,7 @@ fancyNumbers <- function(n){ #' @export mRNAcontamination <- function(rpkm, name='mRNA contamination ratios', - raw=FALSE, + raw=TRUE, type=c("histogram", "boxplot", "violin")) { if (exists(rpkm)) { RPKM <- data.table(get(rpkm)) @@ -1053,12 +1053,12 @@ mRNAcontamination <- function(rpkm, finite_rpkm <- RPKM[is.finite(RPKM$ratio),] plot_theme <- theme_classic(base_size=14) + - theme(axis.line = element_line(size = 0.5), - panel.grid.major = element_blank(), - panel.grid.minor = element_blank(), - aspect.ratio = 1, - panel.border = element_rect(colour = "black", - fill=NA, size=0.5)) + theme(axis.line = element_line(size = 0.5), + panel.grid.major = element_blank(), + panel.grid.minor = element_blank(), + aspect.ratio = 1, + panel.border = element_rect(colour = "black", + fill=NA, size=0.5)) if (raw) { if (type == "histogram") { @@ -1133,7 +1133,8 @@ mRNAcontamination <- function(rpkm, stat_boxplot(geom ='errorbar', width = 0.25) + geom_violin(width = 0.25, draw_quantiles = c(0.25,0.75), linetype="dashed") + - geom_violin(width=0.25, fill="transparent", draw_quantiles = 0.5) + + geom_violin(width=0.25, fill="transparent", + draw_quantiles = 0.5) + stat_summary(fun.y = "mean", geom = "point", shape = 1, size = 2) + labs(x=name, @@ -1144,7 +1145,8 @@ mRNAcontamination <- function(rpkm, stat_boxplot(geom ='errorbar', width = 0.25) + geom_violin(width = 0.25, draw_quantiles = c(0.25,0.75), linetype="dashed") + - geom_violin(width=0.25, fill="transparent", draw_quantiles = 0.5) + + geom_violin(width=0.25, fill="transparent", + draw_quantiles = 0.5) + stat_summary(fun.data = n_fun, geom = "text", hjust = 0.5) + stat_summary(fun.y = "mean", geom = "point", shape = 1, size = 2) + @@ -1183,11 +1185,12 @@ mRNAcontamination <- function(rpkm, } } - - label1 <- paste("'median'[log[10]]", ":~", round(median(log10((finite_rpkm$ratio))), 2)) + label1 <- paste("'median'[log[10]]", ":~", + round(median(log10((finite_rpkm$ratio))), 2)) label2 <- paste("'median'[raw]", ":", round(median(finite_rpkm$ratio), 2)) - max_y <- layer_scales(plot)$y$range$range[2] + max_y <- suppressMessages( + suppressWarnings(layer_scales(plot)$y$range$range[2])) q <- plot + annotate("text", x = -Inf, y = Inf, hjust=-0.01, vjust=1.05, label = label1, parse=TRUE) + diff --git a/tools/PEPPRO.R b/tools/PEPPRO.R index 4f9875b..b2f272c 100755 --- a/tools/PEPPRO.R +++ b/tools/PEPPRO.R @@ -3,7 +3,7 @@ # PEPPRO R parser ############################################################################### -version <- 0.5 +version <- 0.6 ##### Load dependencies ##### required_libraries <- c("PEPPROr") @@ -357,7 +357,8 @@ if (is.na(subcmd) || grepl("/R", subcmd)) { "Version: ", version, "\n\n", "Command: mrna \t plot mRNA contamination distribution\n\n", " -i, --rpkm\t Three column TSV of intron and exon RPKM by gene.\n", - " -w, --raw\t Plot raw exon/intron ratios instead of log10.\n" + " -w, --raw\t Plot raw exon/intron ratios instead of log10.\n", + " -y, --type\t Choose plot type from: histogram, boxplot, or violin.\n" ) help <- opt_get(name = c("help", "?", "h"), required=FALSE, @@ -375,21 +376,23 @@ if (is.na(subcmd) || grepl("/R", subcmd)) { description="Three column TSV containing gene exon and intron RPKMs.") raw <- opt_get(name = c("raw", "w"), required=FALSE, default=FALSE, description="Plot raw ratios (Default = FALSE).") + type <- opt_get(name = c("type", "y"), required=FALSE, default="histogram", + description="Choose plot type from: histogram, boxplot, or violin (Default = histogram).") sample_name <- sampleName(rpkm, 3) name <- basename(sample_name) - suppressWarnings(p <- mRNAcontamination(rpkm=rpkm, name=name, raw=raw)) + suppressWarnings(p <- mRNAcontamination(rpkm=rpkm, name=name, raw=raw, type=type)) # Save plot to pdf file pdf(file=paste0(sample_name, "_mRNA_contamination.pdf"), width= 7, height = 7, useDingbats=F) - suppressWarnings(suppressWarnings(print(p))) + suppressMessages(suppressWarnings(print(p))) invisible(dev.off()) # Save plot to png file png(filename = paste0(sample_name, "_mRNA_contamination.png"), width = 480, height = 480) - suppressWarnings(suppressWarnings(print(p))) + suppressMessages(suppressWarnings(print(p))) invisible(dev.off()) if (exists("p")) { From 87067a4e41b713d6c85c07011df64585fd6d754f Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Wed, 27 Nov 2019 08:50:52 -0500 Subject: [PATCH 112/207] integrate fastqc; Closes: #30 --- pipelines/peppro.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 01ad2b4..85f0be0 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -400,7 +400,7 @@ def _trim_deduplicated_files(args, tools, fq_file, outfolder): :return str: command to trim adapter trimmed and deduplicated reads """ - # Only call this when args.complexity and args.umi_len > 0 + # Only call this when args.complexity32 and args.umi_len > 0 sname = args.sample_name # for concise code fastq_folder = os.path.join(outfolder, "fastq") @@ -1022,7 +1022,8 @@ def report_fastq(): # This trim command DOES need the adapter file... pm.debug("\ntrim_command1: {} + {}\n".format(adapter_command, trim_command)) pm.run([adapter_command, trim_command], processed_fastq, - follow=ngstk.check_trim(processed_fastq, False, None)) + follow=ngstk.check_trim(processed_fastq, False, None, + fastqc_folder=fastqc_folder)) # This needs to produce the trimmed_fastq file pm.debug("\ntrim_command2: {} + {} + {}\n".format(adapter_command, deduplicate_command, trim_command2)) pm.run([adapter_command, deduplicate_command, trim_command2], @@ -1036,7 +1037,8 @@ def report_fastq(): process_fastq_cmd = build_command([ "(", adapter_command, "|", trim_command, ") 2> ", adapter_report]) pm.run(process_fastq_cmd, processed_fastq, - follow=ngstk.check_trim(processed_fastq, False, None)) + follow=ngstk.check_trim(processed_fastq, False, None, + fastqc_folder=fastqc_folder)) return processed_fastq From 1bce5897a1e47486f13b18f1f56420b279847613 Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Wed, 27 Nov 2019 11:21:24 -0500 Subject: [PATCH 113/207] zip bed files and remove any empty dirs --- pipelines/peppro.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/pipelines/peppro.py b/pipelines/peppro.py index 85f0be0..bed0b79 100755 --- a/pipelines/peppro.py +++ b/pipelines/peppro.py @@ -1397,6 +1397,16 @@ def _itsa_empty_file(anyfile): return(os.path.isfile(anyfile) and os.stat(anyfile).st_size == 0) +def is_gzipped(file_name): + """ + Determine whether indicated file appears to be gzipped. + :param str file_name: Name/path of file to check as gzipped. + :return bool: Whether indicated file appears to be in gzipped format. + """ + _, ext = os.path.splitext(file_name) + return file_name.endswith(".gz") + + def _add_resources(args, res, asset_dict=None): """ Add additional resources needed for pipeline. @@ -2502,6 +2512,11 @@ def count_unmapped_reads(): pm.run(cmd, pi_pdf, nofail=True) pm.report_object("Pause index", pi_pdf, anchor_image=pi_png) + if not is_gzipped(pause_index): + cmd = (ngstk.ziptool + " -f " + pause_index) + pause_index = pause_index + ".gz" + pm.run(cmd, pause_index) + ############################################################################ # Calculate Fraction of Reads in Pre-mRNA (FRiP) # ############################################################################ @@ -2713,6 +2728,7 @@ def count_unmapped_reads(): pm.timestamp("### Calculate mRNA contamination") intron_exon = os.path.join(QC_folder, args.sample_name + "_exon_intron_ratios.bed") + if not pm.get_stat("mRNA_contamination") or args.new_start: # Sort exons and introns exons_sort = os.path.join(QC_folder, args.genome_assembly + @@ -2825,6 +2841,11 @@ def count_unmapped_reads(): pm.run(cmd, mRNApdf, nofail=False) pm.report_object("mRNA contamination", mRNApdf, anchor_image=mRNApng) + if not is_gzipped(intron_exon): + cmd = (ngstk.ziptool + " -f " + intron_exon) + intron_exon = intron_exon + ".gz" + pm.run(cmd, intron_exon) + ############################################################################ # Shift and produce BigWigs # ############################################################################ @@ -2969,6 +2990,17 @@ def count_unmapped_reads(): pm.run([scale_plus_cmd, scale_minus_cmd], minus_bw) + # Remove potentially empty folders + if os.path.exists(raw_folder) and os.path.isdir(raw_folder): + if not os.listdir(raw_folder): + pm_clean_add(raw_folder) + if os.path.exists(fastq_folder) and os.path.isdir(fastq_folder): + if not os.listdir(fastq_folder): + pm_clean_add(fastq_folder) + if os.path.exists(fastqc_folder) and os.path.isdir(fastqc_folder): + if not os.listdir(fastqc_folder): + pm_clean_add(fastqc_folder) + ############################################################################ # PIPELINE COMPLETE! # ############################################################################ From 4404aa4293ca47e8dfe0e835f51c0c5c02ea178b Mon Sep 17 00:00:00 2001 From: jpsmith5 Date: Wed, 27 Nov 2019 14:14:08 -0500 Subject: [PATCH 114/207] update tutorial example output --- .../tutorial/reports/fastqc_report_r1.html | 254 ++ .../reports/fragment_distribution.html | 7 +- .../examples/tutorial/reports/minus_frif.html | 7 +- .../tutorial/reports/mrna_contamination.html | 7 +- .../examples/tutorial/reports/objects.html | 12 +- .../tutorial/reports/pause_index.html | 7 +- .../examples/tutorial/reports/plus_frif.html | 7 +- .../examples/tutorial/reports/samples.html | 7 +- .../examples/tutorial/reports/status.html | 11 +- .../tutorial/reports/tss_enrichment.html | 7 +- .../examples/tutorial/reports/tutorial.html | 118 +- .../tutorial/PEPPRO_cleanup.sh | 3 + .../tutorial/PEPPRO_commands.sh | 242 +- .../tutorial/PEPPRO_completed.flag | 0 .../results_pipeline/tutorial/PEPPRO_log.md | 2147 +++------- .../tutorial/PEPPRO_profile.tsv | 312 +- .../QC_hg38/tutorial_TSSenrichment.pdf | Bin 5633 -> 5657 bytes .../QC_hg38/tutorial_TSSenrichment.png | Bin 26362 -> 34261 bytes .../QC_hg38/tutorial_fragLenDistribution.pdf | Bin 38797 -> 33289 bytes .../QC_hg38/tutorial_fragLenDistribution.png | Bin 12998 -> 13605 bytes .../QC_hg38/tutorial_mRNA_contamination.pdf | Bin 5048 -> 5193 bytes .../QC_hg38/tutorial_mRNA_contamination.png | Bin 5390 -> 6426 bytes .../tutorial/QC_hg38/tutorial_minus_frif.pdf | Bin 195496 -> 73716 bytes .../tutorial/QC_hg38/tutorial_minus_frif.png | Bin 25148 -> 24780 bytes .../tutorial/QC_hg38/tutorial_pause_index.pdf | Bin 10020 -> 6664 bytes .../tutorial/QC_hg38/tutorial_pause_index.png | Bin 12264 -> 15225 bytes .../tutorial/QC_hg38/tutorial_plus_frif.pdf | Bin 199001 -> 73440 bytes .../tutorial/QC_hg38/tutorial_plus_frif.png | Bin 25458 -> 25309 bytes .../fastp/tutorial_R1_fastp_adapter.html | 3513 +++++++++++++++++ .../fastp/tutorial_R1_fastp_adapter.json | 752 ++++ .../fastp/tutorial_R1_fastp_adapter.txt | 29 + .../fastp/tutorial_R2_fastp_adapter.html | 2725 +++++++++++++ .../fastp/tutorial_R2_fastp_adapter.json | 358 ++ .../fastqc/tutorial_R1_processed_fastqc.html | 187 + .../results_pipeline/tutorial/objects.tsv | 3 +- .../results_pipeline/tutorial/stats.tsv | 51 +- .../summary/tutorial_libComplexity.pdf | Bin 8290 -> 0 bytes .../summary/tutorial_libComplexity.png | Bin 24780 -> 0 bytes .../tutorial/tutorial_stats_summary.tsv | 4 +- .../examples/tutorial/tutorial_summary.html | 126 +- 40 files changed, 8767 insertions(+), 2129 deletions(-) create mode 100644 docs/files/examples/tutorial/reports/fastqc_report_r1.html create mode 100755 docs/files/examples/tutorial/results_pipeline/tutorial/PEPPRO_cleanup.sh create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/PEPPRO_completed.flag create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/fastp/tutorial_R1_fastp_adapter.html create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/fastp/tutorial_R1_fastp_adapter.json create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/fastp/tutorial_R1_fastp_adapter.txt create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/fastp/tutorial_R2_fastp_adapter.html create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/fastp/tutorial_R2_fastp_adapter.json create mode 100644 docs/files/examples/tutorial/results_pipeline/tutorial/fastqc/tutorial_R1_processed_fastqc.html delete mode 100644 docs/files/examples/tutorial/summary/tutorial_libComplexity.pdf delete mode 100644 docs/files/examples/tutorial/summary/tutorial_libComplexity.png diff --git a/docs/files/examples/tutorial/reports/fastqc_report_r1.html b/docs/files/examples/tutorial/reports/fastqc_report_r1.html new file mode 100644 index 0000000..697c707 --- /dev/null +++ b/docs/files/examples/tutorial/reports/fastqc_report_r1.html @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + Looper: FastQC report r1 objects + +
+ + + +
+
+
+ +

FastQC report r1

+ + + +
Links
+
+ + tutorial + +
+ + +
+
+ +
+ + \ No newline at end of file diff --git a/docs/files/examples/tutorial/reports/fragment_distribution.html b/docs/files/examples/tutorial/reports/fragment_distribution.html index e270881..ffff313 100644 --- a/docs/files/examples/tutorial/reports/fragment_distribution.html +++ b/docs/files/examples/tutorial/reports/fragment_distribution.html @@ -163,7 +163,7 @@
+

tutorial +
+ +
+
General
+
+ + + + + + +
fastp version:0.19.4 (https://github.com/OpenGene/fastp)
sequencing:single end (46 cycles)
mean length before filtering:45bp
mean length after filtering:43bp
duplication rate:25.115256% (may be overestimated since this is SE data)
+
+
Before filtering
+
+ + + + + + +
total reads:1000.000000 K
total bases:45.253865 M
Q20 bases:43.967646 M (97.157770%)
Q30 bases:43.636909 M (96.426922%)
GC content:54.417765%
+
+
After filtering
+
+ + + + + + +
total reads:464.390000 K
total bases:20.168949 M
Q20 bases:19.734976 M (97.848311%)
Q30 bases:19.583954 M (97.099527%)
GC content:53.295717%
+
+
Filtering result
+
+ + + + + +
reads passed filters:464.390000 K (46.439000%)
reads with low quality:13.053000 K (1.305300%)
reads with too many N:8 (0.000800%)
reads too short:522.549000 K (52.254900%)
+
+
+
+
+ +
+
Adapter or bad ligation of read1
+
+ + + + + + + + + + +
SequenceOccurrences
TGGAATTCTCGGGTGCC13226
TGGAATTCTCGGGTGCCA9608
TGGAATTCTCGGGTGCCAAGG10676
TGGAATTCTCGGGTGCCAAGGAACTCC7569
TGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC8351
TGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCA383032
TGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAAT18321
other adapter sequences148213
+
+
+
+
+ +
+
+
+
+ + +
+
+
+ +
+ +
+
Value of each position will be shown on mouse over.
+
+
+ + + +
+
Value of each position will be shown on mouse over.
+
+
+ + + +
+
Darker background means larger counts. The count will be shown on mouse over.
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AAATACAGTATTTCTGCACTCCCGGAGTGCGG
AAAAAAAAAAAATAAAACAAAAGAAATAAAATTAAATCAAATGAAACAAAACTAAACCAAACGAAAGAAAAGTAAAGCAAAGG
AATAATAAAATATAATACAATAGAATTAAATTTAATTCAATTGAATCAAATCTAATCCAATCGAATGAAATGTAATGCAATGG
AACAACAAAACATAACACAACAGAACTAAACTTAACTCAACTGAACCAAACCTAACCCAACCGAACGAAACGTAACGCAACGG
AAGAAGAAAAGATAAGACAAGAGAAGTAAAGTTAAGTCAAGTGAAGCAAAGCTAAGCCAAGCGAAGGAAAGGTAAGGCAAGGG
ATAATAAAATAATATAACATAAGATATAATATTATATCATATGATACAATACTATACCATACGATAGAATAGTATAGCATAGG
ATTATTAAATTATATTACATTAGATTTAATTTTATTTCATTTGATTCAATTCTATTCCATTCGATTGAATTGTATTGCATTGG
ATCATCAAATCATATCACATCAGATCTAATCTTATCTCATCTGATCCAATCCTATCCCATCCGATCGAATCGTATCGCATCGG
ATGATGAAATGATATGACATGAGATGTAATGTTATGTCATGTGATGCAATGCTATGCCATGCGATGGAATGGTATGGCATGGG
ACAACAAAACAATACAACACAAGACATAACATTACATCACATGACACAACACTACACCACACGACAGAACAGTACAGCACAGG
ACTACTAAACTATACTACACTAGACTTAACTTTACTTCACTTGACTCAACTCTACTCCACTCGACTGAACTGTACTGCACTGG
ACCACCAAACCATACCACACCAGACCTAACCTTACCTCACCTGACCCAACCCTACCCCACCCGACCGAACCGTACCGCACCGG
ACGACGAAACGATACGACACGAGACGTAACGTTACGTCACGTGACGCAACGCTACGCCACGCGACGGAACGGTACGGCACGGG
AGAAGAAAAGAATAGAACAGAAGAGATAAGATTAGATCAGATGAGACAAGACTAGACCAGACGAGAGAAGAGTAGAGCAGAGG
AGTAGTAAAGTATAGTACAGTAGAGTTAAGTTTAGTTCAGTTGAGTCAAGTCTAGTCCAGTCGAGTGAAGTGTAGTGCAGTGG
AGCAGCAAAGCATAGCACAGCAGAGCTAAGCTTAGCTCAGCTGAGCCAAGCCTAGCCCAGCCGAGCGAAGCGTAGCGCAGCGG
AGGAGGAAAGGATAGGACAGGAGAGGTAAGGTTAGGTCAGGTGAGGCAAGGCTAGGCCAGGCGAGGGAAGGGTAGGGCAGGGG
TAATAAAATAAATTAAACTAAAGTAATATAATTTAATCTAATGTAACATAACTTAACCTAACGTAAGATAAGTTAAGCTAAGG
TATTATAATATATTATACTATAGTATTATATTTTATTCTATTGTATCATATCTTATCCTATCGTATGATATGTTATGCTATGG
TACTACAATACATTACACTACAGTACTATACTTTACTCTACTGTACCATACCTTACCCTACCGTACGATACGTTACGCTACGG
TAGTAGAATAGATTAGACTAGAGTAGTATAGTTTAGTCTAGTGTAGCATAGCTTAGCCTAGCGTAGGATAGGTTAGGCTAGGG
TTATTAAATTAATTTAACTTAAGTTATATTATTTTATCTTATGTTACATTACTTTACCTTACGTTAGATTAGTTTAGCTTAGG
TTTTTTAATTTATTTTACTTTAGTTTTATTTTTTTTTCTTTTGTTTCATTTCTTTTCCTTTCGTTTGATTTGTTTTGCTTTGG
TTCTTCAATTCATTTCACTTCAGTTCTATTCTTTTCTCTTCTGTTCCATTCCTTTCCCTTCCGTTCGATTCGTTTCGCTTCGG
TTGTTGAATTGATTTGACTTGAGTTGTATTGTTTTGTCTTGTGTTGCATTGCTTTGCCTTGCGTTGGATTGGTTTGGCTTGGG
TCATCAAATCAATTCAACTCAAGTCATATCATTTCATCTCATGTCACATCACTTCACCTCACGTCAGATCAGTTCAGCTCAGG
TCTTCTAATCTATTCTACTCTAGTCTTATCTTTTCTTCTCTTGTCTCATCTCTTCTCCTCTCGTCTGATCTGTTCTGCTCTGG
TCCTCCAATCCATTCCACTCCAGTCCTATCCTTTCCTCTCCTGTCCCATCCCTTCCCCTCCCGTCCGATCCGTTCCGCTCCGG
TCGTCGAATCGATTCGACTCGAGTCGTATCGTTTCGTCTCGTGTCGCATCGCTTCGCCTCGCGTCGGATCGGTTCGGCTCGGG
TGATGAAATGAATTGAACTGAAGTGATATGATTTGATCTGATGTGACATGACTTGACCTGACGTGAGATGAGTTGAGCTGAGG
TGTTGTAATGTATTGTACTGTAGTGTTATGTTTTGTTCTGTTGTGTCATGTCTTGTCCTGTCGTGTGATGTGTTGTGCTGTGG
TGCTGCAATGCATTGCACTGCAGTGCTATGCTTTGCTCTGCTGTGCCATGCCTTGCCCTGCCGTGCGATGCGTTGCGCTGCGG
TGGTGGAATGGATTGGACTGGAGTGGTATGGTTTGGTCTGGTGTGGCATGGCTTGGCCTGGCGTGGGATGGGTTGGGCTGGGG
CAACAAAACAAATCAAACCAAAGCAATACAATTCAATCCAATGCAACACAACTCAACCCAACGCAAGACAAGTCAAGCCAAGG
CATCATAACATATCATACCATAGCATTACATTTCATTCCATTGCATCACATCTCATCCCATCGCATGACATGTCATGCCATGG
CACCACAACACATCACACCACAGCACTACACTTCACTCCACTGCACCACACCTCACCCCACCGCACGACACGTCACGCCACGG
CAGCAGAACAGATCAGACCAGAGCAGTACAGTTCAGTCCAGTGCAGCACAGCTCAGCCCAGCGCAGGACAGGTCAGGCCAGGG
CTACTAAACTAATCTAACCTAAGCTATACTATTCTATCCTATGCTACACTACTCTACCCTACGCTAGACTAGTCTAGCCTAGG
CTTCTTAACTTATCTTACCTTAGCTTTACTTTTCTTTCCTTTGCTTCACTTCTCTTCCCTTCGCTTGACTTGTCTTGCCTTGG
CTCCTCAACTCATCTCACCTCAGCTCTACTCTTCTCTCCTCTGCTCCACTCCTCTCCCCTCCGCTCGACTCGTCTCGCCTCGG
CTGCTGAACTGATCTGACCTGAGCTGTACTGTTCTGTCCTGTGCTGCACTGCTCTGCCCTGCGCTGGACTGGTCTGGCCTGGG
CCACCAAACCAATCCAACCCAAGCCATACCATTCCATCCCATGCCACACCACTCCACCCCACGCCAGACCAGTCCAGCCCAGG
CCTCCTAACCTATCCTACCCTAGCCTTACCTTTCCTTCCCTTGCCTCACCTCTCCTCCCCTCGCCTGACCTGTCCTGCCCTGG
CCCCCCAACCCATCCCACCCCAGCCCTACCCTTCCCTCCCCTGCCCCACCCCTCCCCCCCCCGCCCGACCCGTCCCGCCCCGG
CCGCCGAACCGATCCGACCCGAGCCGTACCGTTCCGTCCCGTGCCGCACCGCTCCGCCCCGCGCCGGACCGGTCCGGCCCGGG
CGACGAAACGAATCGAACCGAAGCGATACGATTCGATCCGATGCGACACGACTCGACCCGACGCGAGACGAGTCGAGCCGAGG
CGTCGTAACGTATCGTACCGTAGCGTTACGTTTCGTTCCGTTGCGTCACGTCTCGTCCCGTCGCGTGACGTGTCGTGCCGTGG
CGCCGCAACGCATCGCACCGCAGCGCTACGCTTCGCTCCGCTGCGCCACGCCTCGCCCCGCCGCGCGACGCGTCGCGCCGCGG
CGGCGGAACGGATCGGACCGGAGCGGTACGGTTCGGTCCGGTGCGGCACGGCTCGGCCCGGCGCGGGACGGGTCGGGCCGGGG
GAAGAAAAGAAATGAAACGAAAGGAATAGAATTGAATCGAATGGAACAGAACTGAACCGAACGGAAGAGAAGTGAAGCGAAGG
GATGATAAGATATGATACGATAGGATTAGATTTGATTCGATTGGATCAGATCTGATCCGATCGGATGAGATGTGATGCGATGG
GACGACAAGACATGACACGACAGGACTAGACTTGACTCGACTGGACCAGACCTGACCCGACCGGACGAGACGTGACGCGACGG
GAGGAGAAGAGATGAGACGAGAGGAGTAGAGTTGAGTCGAGTGGAGCAGAGCTGAGCCGAGCGGAGGAGAGGTGAGGCGAGGG
GTAGTAAAGTAATGTAACGTAAGGTATAGTATTGTATCGTATGGTACAGTACTGTACCGTACGGTAGAGTAGTGTAGCGTAGG
GTTGTTAAGTTATGTTACGTTAGGTTTAGTTTTGTTTCGTTTGGTTCAGTTCTGTTCCGTTCGGTTGAGTTGTGTTGCGTTGG
GTCGTCAAGTCATGTCACGTCAGGTCTAGTCTTGTCTCGTCTGGTCCAGTCCTGTCCCGTCCGGTCGAGTCGTGTCGCGTCGG
GTGGTGAAGTGATGTGACGTGAGGTGTAGTGTTGTGTCGTGTGGTGCAGTGCTGTGCCGTGCGGTGGAGTGGTGTGGCGTGGG
GCAGCAAAGCAATGCAACGCAAGGCATAGCATTGCATCGCATGGCACAGCACTGCACCGCACGGCAGAGCAGTGCAGCGCAGG
GCTGCTAAGCTATGCTACGCTAGGCTTAGCTTTGCTTCGCTTGGCTCAGCTCTGCTCCGCTCGGCTGAGCTGTGCTGCGCTGG
GCCGCCAAGCCATGCCACGCCAGGCCTAGCCTTGCCTCGCCTGGCCCAGCCCTGCCCCGCCCGGCCGAGCCGTGCCGCGCCGG
GCGGCGAAGCGATGCGACGCGAGGCGTAGCGTTGCGTCGCGTGGCGCAGCGCTGCGCCGCGCGGCGGAGCGGTGCGGCGCGGG
GGAGGAAAGGAATGGAACGGAAGGGATAGGATTGGATCGGATGGGACAGGACTGGACCGGACGGGAGAGGAGTGGAGCGGAGG
GGTGGTAAGGTATGGTACGGTAGGGTTAGGTTTGGTTCGGTTGGGTCAGGTCTGGTCCGGTCGGGTGAGGTGTGGTGCGGTGG
GGCGGCAAGGCATGGCACGGCAGGGCTAGGCTTGGCTCGGCTGGGCCAGGCCTGGCCCGGCCGGGCGAGGCGTGGCGCGGCGG
GGGGGGAAGGGATGGGACGGGAGGGGTAGGGTTGGGTCGGGTGGGGCAGGGCTGGGCCGGGCGGGGGAGGGGTGGGGCGGGGG
+
+ +
+
Sampling rate: 1 / 20
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
overrepresented sequencecount (% of bases)distribution: cycle 1 ~ cycle 46
AAAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC62 (0.109604%)
AAATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC44 (0.077783%)
AACATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC34 (0.060105%)
AACCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC49 (0.086622%)
AACGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC44 (0.077783%)
AACTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC36 (0.063641%)
AAGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC53 (0.093694%)
AAGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC32 (0.056570%)
AAGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC55 (0.097229%)
AAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC61 (0.107836%)
AAGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC40 (0.070712%)
AAGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC35 (0.061873%)
AAGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC43 (0.076016%)
AAGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC59 (0.104300%)
AAGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC64 (0.113140%)
AATATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC52 (0.091926%)
AATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA25 (0.044195%)
AATGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC51 (0.090158%)
AATTCTCGGGTGCCAAGGAA46 (0.040660%)
AATTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC64 (0.113140%)
ACAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC42 (0.074248%)
ACACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC29 (0.051266%)
ACAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC49 (0.086622%)
ACATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC65 (0.114907%)
ACCACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC36 (0.063641%)
ACCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC19 (0.033588%)
ACCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC24 (0.042427%)
ACCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC44 (0.077783%)
ACCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC52 (0.091926%)
ACGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC42 (0.074248%)
ACGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC45 (0.079551%)
ACGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC42 (0.074248%)
ACGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC41 (0.072480%)
ACTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC29 (0.051266%)
ACTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC20 (0.035356%)
ACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA24 (0.042427%)
ACTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC20 (0.035356%)
ACTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC44 (0.077783%)
AGAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC33 (0.058338%)
AGACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC34 (0.060105%)
AGAGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC30 (0.053034%)
AGAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC55 (0.097229%)
AGATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC47 (0.083087%)
AGCAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC30 (0.053034%)
AGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC24 (0.042427%)
AGCATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC34 (0.060105%)
AGCCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC51 (0.090158%)
AGCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC57 (0.100765%)
AGCCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC26 (0.045963%)
AGCCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC52 (0.091926%)
AGCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC51 (0.090158%)
AGCGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC34 (0.060105%)
AGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC52 (0.091926%)
AGCTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC29 (0.051266%)
AGCTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC15 (0.026517%)
AGCTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC37 (0.065409%)
AGGAATTCTCGGGTGCCAAG118 (0.104300%)
AGGAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC29 (0.051266%)
AGGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC86 (0.152031%)
AGGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC38 (0.067177%)
AGGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC42 (0.074248%)
AGGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC28 (0.049499%)
AGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC22 (0.038892%)
AGGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC38 (0.067177%)
AGGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC68 (0.120211%)
AGGGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG31 (0.054802%)
AGGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC37 (0.065409%)
AGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC26 (0.045963%)
AGGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC40 (0.070712%)
AGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC29 (0.051266%)
AGGTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC38 (0.067177%)
AGTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC59 (0.104300%)
AGTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC48 (0.084855%)
AGTGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC51 (0.090158%)
AGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA32 (0.056570%)
AGTGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC43 (0.076016%)
AGTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC45 (0.079551%)
AGTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC57 (0.100765%)
ATAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC45 (0.079551%)
ATACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC49 (0.086622%)
ATAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC43 (0.076016%)
ATATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC57 (0.100765%)
ATCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC35 (0.061873%)
ATCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC56 (0.098997%)
ATCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC35 (0.061873%)
ATGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC56 (0.098997%)
ATGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC69 (0.121979%)
ATGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC135 (0.238654%)
ATGGAATTCTCGGGTGCCAA5179 (4.577731%)
ATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAATATCT58 (0.112786%)
ATGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC33 (0.058338%)
ATGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC37 (0.065409%)
ATGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC79 (0.139657%)
ATGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC59 (0.104300%)
ATTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC52 (0.091926%)
ATTCTCGGGTGCCAAGGAAC43 (0.038008%)
ATTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC42 (0.074248%)
ATTGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC32 (0.056570%)
ATTGGAATTCTCGGGTGCCA1375 (1.215366%)
ATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA30 (0.053034%)
ATTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC61 (0.107836%)
ATTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC85 (0.150263%)
CAAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC75 (0.132585%)
CAAATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC10 (0.017678%)
CAACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC62 (0.109604%)
CAAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC31 (0.054802%)
CAAGGAACTCCAGTCACGCC86 (0.076016%)
CAAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC78 (0.137889%)
CAATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC18 (0.031820%)
CACACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC23 (0.040660%)
CACATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC52 (0.091926%)
CACCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC48 (0.084855%)
CACCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC31 (0.054802%)
CACCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC48 (0.084855%)
CACCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC38 (0.067177%)
CACGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC34 (0.060105%)
CACGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC85 (0.150263%)
CACTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC22 (0.038892%)
CACTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC40 (0.070712%)
CAGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC46 (0.081319%)
CAGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC49 (0.086622%)
CAGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC40 (0.070712%)
CAGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC49 (0.086622%)
CAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC39 (0.068944%)
CAGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC60 (0.106068%)
CAGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC50 (0.088390%)
CAGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC49 (0.086622%)
CAGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC30 (0.053034%)
CAGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC42 (0.074248%)
CAGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC20 (0.035356%)
CATATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC74 (0.130818%)
CATCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC28 (0.049499%)
CATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA18 (0.031820%)
CATGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC40 (0.070712%)
CATTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC20 (0.035356%)
CCAAGGAACTCCAGTCACGC38 (0.033588%)
CCAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC31 (0.054802%)
CCAATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC28 (0.049499%)
CCACATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC51 (0.090158%)
CCACCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG23 (0.040660%)
CCACCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC53 (0.093694%)
CCACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC19 (0.033588%)
CCACTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC53 (0.093694%)
CCAGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG39 (0.068944%)
CCAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC35 (0.061873%)
CCAGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC35 (0.061873%)
CCAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC31 (0.054802%)
CCAGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC42 (0.074248%)
CCATCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC31 (0.054802%)
CCATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC37 (0.065409%)
CCATTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC64 (0.113140%)
CCCAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC49 (0.086622%)
CCCACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC69 (0.121979%)
CCCAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG32 (0.056570%)
CCCAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC46 (0.081319%)
CCCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC35 (0.061873%)
CCCATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC35 (0.061873%)
CCCCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC54 (0.095461%)
CCCCATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG27 (0.047731%)
CCCCCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG38 (0.067177%)
CCCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC44 (0.077783%)
CCCCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC64 (0.113140%)
CCCCTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG14 (0.024749%)
CCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC19 (0.033588%)
CCCCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC57 (0.100765%)
CCCGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG34 (0.060105%)
CCCGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG27 (0.047731%)
CCCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC39 (0.068944%)
CCCGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC47 (0.083087%)
CCCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC17 (0.030053%)
CCCGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC44 (0.077783%)
CCCTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC23 (0.040660%)
CCCTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC39 (0.068944%)
CCCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC47 (0.083087%)
CCCTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC58 (0.102533%)
CCGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC50 (0.088390%)
CCGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC41 (0.072480%)
CCGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC36 (0.063641%)
CCGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC23 (0.040660%)
CCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC35 (0.061873%)
CCGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC53 (0.093694%)
CCGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC25 (0.044195%)
CCGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC43 (0.076016%)
CCTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC33 (0.058338%)
CCTATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC27 (0.047731%)
CCTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC68 (0.120211%)
CCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA7 (0.012375%)
CCTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC70 (0.123746%)
CCTTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC34 (0.060105%)
CCTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC31 (0.054802%)
CCTTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC45 (0.079551%)
CGAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC47 (0.083087%)
CGACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC31 (0.054802%)
CGAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC19 (0.033588%)
CGAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC18 (0.031820%)
CGATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC53 (0.093694%)
CGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC35 (0.061873%)
CGCCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC51 (0.090158%)
CGCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC49 (0.086622%)
CGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC38 (0.067177%)
CGCCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC48 (0.084855%)
CGCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC51 (0.090158%)
CGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC18 (0.031820%)
CGCGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC36 (0.063641%)
CGCTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC42 (0.074248%)
CGCTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC26 (0.045963%)
CGCTGCGATCTATTGAAAGTCAGCCCTCGACACAAGGGTT24 (0.042427%)
CGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC39 (0.068944%)
CGCTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC39 (0.068944%)
CGGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC29 (0.051266%)
CGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC61 (0.107836%)
CGGGTGCCAAGGAACTCCAG57 (0.050382%)
CGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC29 (0.051266%)
CGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC31 (0.054802%)
CGTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC49 (0.086622%)
CGTGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC47 (0.083087%)
CGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA16 (0.028285%)
CGTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC36 (0.063641%)
CGTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC41 (0.072480%)
CTAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC60 (0.106068%)
CTACCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC57 (0.100765%)
CTACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC51 (0.090158%)
CTAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC62 (0.109604%)
CTATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC19 (0.033588%)
CTCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC43 (0.076016%)
CTCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC33 (0.058338%)
CTCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC47 (0.083087%)
CTCGGGTGCCAAGGAACTCC39 (0.034472%)
CTCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC30 (0.053034%)
CTCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC26 (0.045963%)
CTGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC35 (0.061873%)
CTGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC54 (0.095461%)
CTGGAATTCTCGGGTGCCAA6923 (6.119256%)
CTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAATATCT35 (0.068060%)
CTGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC36 (0.063641%)
CTGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC32 (0.056570%)
CTTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC42 (0.074248%)
CTTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC47 (0.083087%)
CTTCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC22 (0.038892%)
CTTGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC34 (0.060105%)
CTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA15 (0.026517%)
CTTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC16 (0.028285%)
CTTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC17 (0.030053%)
GAAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC42 (0.074248%)
GAATTCTCGGGTGCCAAGGA39 (0.034472%)
GAATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC44 (0.077783%)
GACATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC25 (0.044195%)
GAGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC66 (0.116675%)
GAGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC30 (0.053034%)
GAGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC50 (0.088390%)
GAGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC27 (0.047731%)
GAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC33 (0.058338%)
GAGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC27 (0.047731%)
GAGGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG30 (0.053034%)
GAGGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG42 (0.074248%)
GAGGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG42 (0.074248%)
GAGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC52 (0.091926%)
GAGGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG34 (0.060105%)
GAGGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG35 (0.061873%)
GAGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC32 (0.056570%)
GAGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC16 (0.028285%)
GAGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC29 (0.051266%)
GAGTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC23 (0.040660%)
GAGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC99 (0.175013%)
GATATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC39 (0.068944%)
GATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA13 (0.022981%)
GATGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC53 (0.093694%)
GATTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC62 (0.109604%)
GCAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC117 (0.206833%)
GCAATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC32 (0.056570%)
GCACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC75 (0.132585%)
GCAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC73 (0.129050%)
GCAGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC44 (0.077783%)
GCAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC61 (0.107836%)
GCAGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC31 (0.054802%)
GCATGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC23 (0.040660%)
GCATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC24 (0.042427%)
GCATTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC32 (0.056570%)
GCCAAGGAACTCCAGTCACG39 (0.034472%)
GCCAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC44 (0.077783%)
GCCACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC88 (0.155567%)
GCCAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC41 (0.072480%)
GCCATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC50 (0.088390%)
GCCCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC86 (0.152031%)
GCCCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG29 (0.051266%)
GCCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC57 (0.100765%)
GCCCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG29 (0.051266%)
GCCCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC64 (0.113140%)
GCCCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC51 (0.090158%)
GCCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC38 (0.067177%)
GCCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC16 (0.028285%)
GCCTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC33 (0.058338%)
GCCTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC62 (0.109604%)
GCGAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC25 (0.044195%)
GCGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC52 (0.091926%)
GCGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC69 (0.121979%)
GCGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC63 (0.111372%)
GCGCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG37 (0.065409%)
GCGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC60 (0.106068%)
GCGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC56 (0.098997%)
GCGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC31 (0.054802%)
GCGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC44 (0.077783%)
GCGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC29 (0.051266%)
GCGTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC34 (0.060105%)
GCGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC65 (0.114907%)
GCGTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC42 (0.074248%)
GCTACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC45 (0.079551%)
GCTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC18 (0.031820%)
GCTATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC27 (0.047731%)
GCTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC64 (0.113140%)
GCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAATATC20 (0.038892%)
GCTGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC29 (0.051266%)
GCTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC62 (0.109604%)
GCTTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC31 (0.054802%)
GCTTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC33 (0.058338%)
GCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCA6 (0.010607%)
GCTTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC33 (0.058338%)
GCTTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC34 (0.060105%)
GGAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC52 (0.091926%)
GGAATTCTCGGGTGCCAAGG162 (0.143192%)
GGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAATATCTCG5 (0.009723%)
GGAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC37 (0.065409%)
GGAGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG29 (0.051266%)
GGAGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG39 (0.068944%)
GGAGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC28 (0.049499%)
GGAGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG24 (0.042427%)
GGAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC21 (0.037124%)
GGATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC58 (0.102533%)
GGCACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC30 (0.053034%)
GGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC17 (0.030053%)
GGCATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC43 (0.076016%)
GGCCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC48 (0.084855%)
GGCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC55 (0.097229%)
GGCCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC24 (0.042427%)
GGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC27 (0.047731%)
GGCCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC45 (0.079551%)
GGCGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC50 (0.088390%)
GGCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC39 (0.068944%)
GGCGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG19 (0.033588%)
GGCGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC55 (0.097229%)
GGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC18 (0.031820%)
GGCGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC47 (0.083087%)
GGCTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC37 (0.065409%)
GGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC24 (0.042427%)
GGCTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC60 (0.106068%)
GGGAGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCAC27 (0.047731%)
GGGAGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG39 (0.068944%)
GGGAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC43 (0.076016%)
GGGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC65 (0.114907%)
GGGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC33 (0.058338%)
GGGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC36 (0.063641%)
GGGCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG28 (0.049499%)
GGGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC52 (0.091926%)
GGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC23 (0.040660%)
GGGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC28 (0.049499%)
GGGGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC47 (0.083087%)
GGGGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG21 (0.037124%)
GGGGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG35 (0.061873%)
GGGGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG40 (0.070712%)
GGGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC36 (0.063641%)
GGGGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG24 (0.042427%)
GGGGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG42 (0.074248%)
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG20 (0.035356%)
GGGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC85 (0.150263%)
GGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC17 (0.030053%)
GGGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC61 (0.107836%)
GGGTGCCAAGGAACTCCAGT120 (0.106068%)
GGGTGCCTGGAATTCTCGGG14 (0.012375%)
GGGTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC46 (0.081319%)
GGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC13 (0.022981%)
GGGTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC42 (0.074248%)
GGTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC69 (0.121979%)
GGTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC43 (0.076016%)
GGTGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC29 (0.051266%)
GGTGCCAAGGAACTCCAGTC76 (0.067177%)
GGTGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG34 (0.060105%)
GGTGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC63 (0.111372%)
GGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA6 (0.010607%)
GGTGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG28 (0.049499%)
GGTGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG38 (0.067177%)
GGTGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC52 (0.091926%)
GGTGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG30 (0.053034%)
GGTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC76 (0.134353%)
GGTGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC38 (0.067177%)
GGTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC16 (0.028285%)
GTAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC49 (0.086622%)
GTACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC48 (0.084855%)
GTATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC63 (0.111372%)
GTCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC31 (0.054802%)
GTCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC44 (0.077783%)
GTGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC35 (0.061873%)
GTGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC39 (0.068944%)
GTGCCAAGGAACTCCAGTCA22 (0.019446%)
GTGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC67 (0.118443%)
GTGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC46 (0.081319%)
GTGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC70 (0.123746%)
GTGGAATTCTCGGGTGCCAA4479 (3.958999%)
GTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAATATCT47 (0.091396%)
GTGGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG28 (0.049499%)
GTGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC33 (0.058338%)
GTGGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG24 (0.042427%)
GTGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC29 (0.051266%)
GTGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC35 (0.061873%)
GTGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC28 (0.049499%)
GTGTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC34 (0.060105%)
GTGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC57 (0.100765%)
GTTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC67 (0.118443%)
GTTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC45 (0.079551%)
GTTGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC43 (0.076016%)
GTTGGAATTCTCGGGTGCCA1640 (1.449600%)
GTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA15 (0.026517%)
GTTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC64 (0.113140%)
GTTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC102 (0.180316%)
NNNNNNNNNNNNNNNNNNNN317 (0.280197%)
TAAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC45 (0.079551%)
TAACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC38 (0.067177%)
TAAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC40 (0.070712%)
TAATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC63 (0.111372%)
TACATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC53 (0.093694%)
TACCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC28 (0.049499%)
TACCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC43 (0.076016%)
TACCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC53 (0.093694%)
TACGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC40 (0.070712%)
TACTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC53 (0.093694%)
TAGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC29 (0.051266%)
TAGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC54 (0.095461%)
TAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC94 (0.166174%)
TAGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC39 (0.068944%)
TAGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC55 (0.097229%)
TAGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC56 (0.098997%)
TATATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC53 (0.093694%)
TATCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC39 (0.068944%)
TATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA20 (0.035356%)
TATGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC65 (0.114907%)
TATTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC78 (0.137889%)
TCACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC35 (0.061873%)
TCAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC25 (0.044195%)
TCCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC49 (0.086622%)
TCCCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC39 (0.068944%)
TCCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC40 (0.070712%)
TCCCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC23 (0.040660%)
TCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC42 (0.074248%)
TCCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC55 (0.097229%)
TCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC33 (0.058338%)
TCGGGTGCCAAGGAACTCCA111 (0.098113%)
TCTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC39 (0.068944%)
TCTCGGGTGCCAAGGAACTC75 (0.066293%)
TCTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC16 (0.028285%)
TCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA22 (0.038892%)
TGAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC39 (0.068944%)
TGAATTCTCGGGTGCCAAGG200 (0.176780%)
TGACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC36 (0.063641%)
TGAGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC30 (0.053034%)
TGAGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC35 (0.061873%)
TGAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC71 (0.125514%)
TGATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC52 (0.091926%)
TGCAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC23 (0.040660%)
TGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC76 (0.134353%)
TGCATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC16 (0.028285%)
TGCCAAGGAACTCCAGTCAC31 (0.027401%)
TGCCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC51 (0.090158%)
TGCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC67 (0.118443%)
TGCCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC30 (0.053034%)
TGCCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC60 (0.106068%)
TGCGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC67 (0.118443%)
TGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC63 (0.111372%)
TGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC52 (0.091926%)
TGCTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC33 (0.058338%)
TGGAATTCTCGGGTGCCAAG145 (0.128166%)
TGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAATATCTC131 (0.254741%)
TGGAATTCTCGGGTGCCTGG135 (0.119327%)
TGGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC72 (0.127282%)
TGGCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC34 (0.060105%)
TGGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC77 (0.136121%)
TGGCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC38 (0.067177%)
TGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC29 (0.051266%)
TGGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC51 (0.090158%)
TGGGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC47 (0.083087%)
TGGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC42 (0.074248%)
TGGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC55 (0.097229%)
TGGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC48 (0.084855%)
TGGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC70 (0.123746%)
TGGTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC32 (0.056570%)
TGTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC45 (0.079551%)
TGTCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC11 (0.019446%)
TGTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC49 (0.086622%)
TGTGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC62 (0.109604%)
TGTGGAATTCTCGGGTGCCA1254 (1.108414%)
TGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA13 (0.022981%)
TGTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC42 (0.074248%)
TGTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC89 (0.157335%)
TTAATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC52 (0.091926%)
TTACTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC48 (0.084855%)
TTAGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC37 (0.065409%)
TTATTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC63 (0.111372%)
TTCATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC49 (0.086622%)
TTCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC42 (0.074248%)
TTCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC61 (0.107836%)
TTCGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC43 (0.076016%)
TTCTCGGGTGCCAAGGAACT27 (0.023865%)
TTCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC36 (0.063641%)
TTGATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC45 (0.079551%)
TTGCCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACG32 (0.056570%)
TTGCCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC58 (0.102533%)
TTGCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC36 (0.063641%)
TTGCTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC49 (0.086622%)
TTGGAATTCTCGGGTGCCAA1870 (1.652897%)
TTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAATATCT79 (0.153622%)
TTGGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC79 (0.139657%)
TTGTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC77 (0.136121%)
TTTATGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC58 (0.102533%)
TTTCTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC61 (0.107836%)
TTTGGAATTCTCGGGTGCCA1831 (1.618425%)
TTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCCAA15 (0.026517%)
TTTGTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC72 (0.127282%)
TTTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGCC58 (0.102533%)
TTTTTTGGAATTCTCGGGTGCCAAGGAACTCCAGTCACGC21 (0.037124%)
TTTTTTTTTTTTTTTTTTTT247 (0.218324%)
+
+ +
+
+
+ +
+ +
+
Value of each position will be shown on mouse over.
+
+
+ + + +
+
Value of each position will be shown on mouse over.
+
+
+ + + +
+
Darker background means larger counts. The count will be shown on mouse over.
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AAATACAGTATTTCTGCACTCCCGGAGTGCGG
AAAAAAAAAAAATAAAACAAAAGAAATAAAATTAAATCAAATGAAACAAAACTAAACCAAACGAAAGAAAAGTAAAGCAAAGG
AATAATAAAATATAATACAATAGAATTAAATTTAATTCAATTGAATCAAATCTAATCCAATCGAATGAAATGTAATGCAATGG
AACAACAAAACATAACACAACAGAACTAAACTTAACTCAACTGAACCAAACCTAACCCAACCGAACGAAACGTAACGCAACGG
AAGAAGAAAAGATAAGACAAGAGAAGTAAAGTTAAGTCAAGTGAAGCAAAGCTAAGCCAAGCGAAGGAAAGGTAAGGCAAGGG
ATAATAAAATAATATAACATAAGATATAATATTATATCATATGATACAATACTATACCATACGATAGAATAGTATAGCATAGG
ATTATTAAATTATATTACATTAGATTTAATTTTATTTCATTTGATTCAATTCTATTCCATTCGATTGAATTGTATTGCATTGG
ATCATCAAATCATATCACATCAGATCTAATCTTATCTCATCTGATCCAATCCTATCCCATCCGATCGAATCGTATCGCATCGG
ATGATGAAATGATATGACATGAGATGTAATGTTATGTCATGTGATGCAATGCTATGCCATGCGATGGAATGGTATGGCATGGG
ACAACAAAACAATACAACACAAGACATAACATTACATCACATGACACAACACTACACCACACGACAGAACAGTACAGCACAGG
ACTACTAAACTATACTACACTAGACTTAACTTTACTTCACTTGACTCAACTCTACTCCACTCGACTGAACTGTACTGCACTGG
ACCACCAAACCATACCACACCAGACCTAACCTTACCTCACCTGACCCAACCCTACCCCACCCGACCGAACCGTACCGCACCGG
ACGACGAAACGATACGACACGAGACGTAACGTTACGTCACGTGACGCAACGCTACGCCACGCGACGGAACGGTACGGCACGGG
AGAAGAAAAGAATAGAACAGAAGAGATAAGATTAGATCAGATGAGACAAGACTAGACCAGACGAGAGAAGAGTAGAGCAGAGG
AGTAGTAAAGTATAGTACAGTAGAGTTAAGTTTAGTTCAGTTGAGTCAAGTCTAGTCCAGTCGAGTGAAGTGTAGTGCAGTGG
AGCAGCAAAGCATAGCACAGCAGAGCTAAGCTTAGCTCAGCTGAGCCAAGCCTAGCCCAGCCGAGCGAAGCGTAGCGCAGCGG
AGGAGGAAAGGATAGGACAGGAGAGGTAAGGTTAGGTCAGGTGAGGCAAGGCTAGGCCAGGCGAGGGAAGGGTAGGGCAGGGG
TAATAAAATAAATTAAACTAAAGTAATATAATTTAATCTAATGTAACATAACTTAACCTAACGTAAGATAAGTTAAGCTAAGG
TATTATAATATATTATACTATAGTATTATATTTTATTCTATTGTATCATATCTTATCCTATCGTATGATATGTTATGCTATGG
TACTACAATACATTACACTACAGTACTATACTTTACTCTACTGTACCATACCTTACCCTACCGTACGATACGTTACGCTACGG
TAGTAGAATAGATTAGACTAGAGTAGTATAGTTTAGTCTAGTGTAGCATAGCTTAGCCTAGCGTAGGATAGGTTAGGCTAGGG
TTATTAAATTAATTTAACTTAAGTTATATTATTTTATCTTATGTTACATTACTTTACCTTACGTTAGATTAGTTTAGCTTAGG
TTTTTTAATTTATTTTACTTTAGTTTTATTTTTTTTTCTTTTGTTTCATTTCTTTTCCTTTCGTTTGATTTGTTTTGCTTTGG
TTCTTCAATTCATTTCACTTCAGTTCTATTCTTTTCTCTTCTGTTCCATTCCTTTCCCTTCCGTTCGATTCGTTTCGCTTCGG
TTGTTGAATTGATTTGACTTGAGTTGTATTGTTTTGTCTTGTGTTGCATTGCTTTGCCTTGCGTTGGATTGGTTTGGCTTGGG
TCATCAAATCAATTCAACTCAAGTCATATCATTTCATCTCATGTCACATCACTTCACCTCACGTCAGATCAGTTCAGCTCAGG
TCTTCTAATCTATTCTACTCTAGTCTTATCTTTTCTTCTCTTGTCTCATCTCTTCTCCTCTCGTCTGATCTGTTCTGCTCTGG
TCCTCCAATCCATTCCACTCCAGTCCTATCCTTTCCTCTCCTGTCCCATCCCTTCCCCTCCCGTCCGATCCGTTCCGCTCCGG
TCGTCGAATCGATTCGACTCGAGTCGTATCGTTTCGTCTCGTGTCGCATCGCTTCGCCTCGCGTCGGATCGGTTCGGCTCGGG
TGATGAAATGAATTGAACTGAAGTGATATGATTTGATCTGATGTGACATGACTTGACCTGACGTGAGATGAGTTGAGCTGAGG
TGTTGTAATGTATTGTACTGTAGTGTTATGTTTTGTTCTGTTGTGTCATGTCTTGTCCTGTCGTGTGATGTGTTGTGCTGTGG
TGCTGCAATGCATTGCACTGCAGTGCTATGCTTTGCTCTGCTGTGCCATGCCTTGCCCTGCCGTGCGATGCGTTGCGCTGCGG
TGGTGGAATGGATTGGACTGGAGTGGTATGGTTTGGTCTGGTGTGGCATGGCTTGGCCTGGCGTGGGATGGGTTGGGCTGGGG
CAACAAAACAAATCAAACCAAAGCAATACAATTCAATCCAATGCAACACAACTCAACCCAACGCAAGACAAGTCAAGCCAAGG
CATCATAACATATCATACCATAGCATTACATTTCATTCCATTGCATCACATCTCATCCCATCGCATGACATGTCATGCCATGG
CACCACAACACATCACACCACAGCACTACACTTCACTCCACTGCACCACACCTCACCCCACCGCACGACACGTCACGCCACGG
CAGCAGAACAGATCAGACCAGAGCAGTACAGTTCAGTCCAGTGCAGCACAGCTCAGCCCAGCGCAGGACAGGTCAGGCCAGGG
CTACTAAACTAATCTAACCTAAGCTATACTATTCTATCCTATGCTACACTACTCTACCCTACGCTAGACTAGTCTAGCCTAGG
CTTCTTAACTTATCTTACCTTAGCTTTACTTTTCTTTCCTTTGCTTCACTTCTCTTCCCTTCGCTTGACTTGTCTTGCCTTGG
CTCCTCAACTCATCTCACCTCAGCTCTACTCTTCTCTCCTCTGCTCCACTCCTCTCCCCTCCGCTCGACTCGTCTCGCCTCGG
CTGCTGAACTGATCTGACCTGAGCTGTACTGTTCTGTCCTGTGCTGCACTGCTCTGCCCTGCGCTGGACTGGTCTGGCCTGGG
CCACCAAACCAATCCAACCCAAGCCATACCATTCCATCCCATGCCACACCACTCCACCCCACGCCAGACCAGTCCAGCCCAGG
CCTCCTAACCTATCCTACCCTAGCCTTACCTTTCCTTCCCTTGCCTCACCTCTCCTCCCCTCGCCTGACCTGTCCTGCCCTGG
CCCCCCAACCCATCCCACCCCAGCCCTACCCTTCCCTCCCCTGCCCCACCCCTCCCCCCCCCGCCCGACCCGTCCCGCCCCGG
CCGCCGAACCGATCCGACCCGAGCCGTACCGTTCCGTCCCGTGCCGCACCGCTCCGCCCCGCGCCGGACCGGTCCGGCCCGGG
CGACGAAACGAATCGAACCGAAGCGATACGATTCGATCCGATGCGACACGACTCGACCCGACGCGAGACGAGTCGAGCCGAGG
CGTCGTAACGTATCGTACCGTAGCGTTACGTTTCGTTCCGTTGCGTCACGTCTCGTCCCGTCGCGTGACGTGTCGTGCCGTGG
CGCCGCAACGCATCGCACCGCAGCGCTACGCTTCGCTCCGCTGCGCCACGCCTCGCCCCGCCGCGCGACGCGTCGCGCCGCGG
CGGCGGAACGGATCGGACCGGAGCGGTACGGTTCGGTCCGGTGCGGCACGGCTCGGCCCGGCGCGGGACGGGTCGGGCCGGGG
GAAGAAAAGAAATGAAACGAAAGGAATAGAATTGAATCGAATGGAACAGAACTGAACCGAACGGAAGAGAAGTGAAGCGAAGG
GATGATAAGATATGATACGATAGGATTAGATTTGATTCGATTGGATCAGATCTGATCCGATCGGATGAGATGTGATGCGATGG
GACGACAAGACATGACACGACAGGACTAGACTTGACTCGACTGGACCAGACCTGACCCGACCGGACGAGACGTGACGCGACGG
GAGGAGAAGAGATGAGACGAGAGGAGTAGAGTTGAGTCGAGTGGAGCAGAGCTGAGCCGAGCGGAGGAGAGGTGAGGCGAGGG
GTAGTAAAGTAATGTAACGTAAGGTATAGTATTGTATCGTATGGTACAGTACTGTACCGTACGGTAGAGTAGTGTAGCGTAGG
GTTGTTAAGTTATGTTACGTTAGGTTTAGTTTTGTTTCGTTTGGTTCAGTTCTGTTCCGTTCGGTTGAGTTGTGTTGCGTTGG
GTCGTCAAGTCATGTCACGTCAGGTCTAGTCTTGTCTCGTCTGGTCCAGTCCTGTCCCGTCCGGTCGAGTCGTGTCGCGTCGG
GTGGTGAAGTGATGTGACGTGAGGTGTAGTGTTGTGTCGTGTGGTGCAGTGCTGTGCCGTGCGGTGGAGTGGTGTGGCGTGGG
GCAGCAAAGCAATGCAACGCAAGGCATAGCATTGCATCGCATGGCACAGCACTGCACCGCACGGCAGAGCAGTGCAGCGCAGG
GCTGCTAAGCTATGCTACGCTAGGCTTAGCTTTGCTTCGCTTGGCTCAGCTCTGCTCCGCTCGGCTGAGCTGTGCTGCGCTGG
GCCGCCAAGCCATGCCACGCCAGGCCTAGCCTTGCCTCGCCTGGCCCAGCCCTGCCCCGCCCGGCCGAGCCGTGCCGCGCCGG
GCGGCGAAGCGATGCGACGCGAGGCGTAGCGTTGCGTCGCGTGGCGCAGCGCTGCGCCGCGCGGCGGAGCGGTGCGGCGCGGG
GGAGGAAAGGAATGGAACGGAAGGGATAGGATTGGATCGGATGGGACAGGACTGGACCGGACGGGAGAGGAGTGGAGCGGAGG
GGTGGTAAGGTATGGTACGGTAGGGTTAGGTTTGGTTCGGTTGGGTCAGGTCTGGTCCGGTCGGGTGAGGTGTGGTGCGGTGG
GGCGGCAAGGCATGGCACGGCAGGGCTAGGCTTGGCTCGGCTGGGCCAGGCCTGGCCCGGCCGGGCGAGGCGTGGCGCGGCGG
GGGGGGAAGGGATGGGACGGGAGGGGTAGGGTTGGGTCGGGTGGGGCAGGGCTGGGCCGGGCGGGGGAGGGGTGGGGCGGGGG
+
+ +
+
Sampling rate: 1 / 20
+ + + + + + + + + + + + + + +
overrepresented sequencecount (% of bases)distribution: cycle 1 ~ cycle 46
ATTCTCGGGTGCCAAGGAAC20 (0.039665%)
CAAGGAACTCCAGTCACGCC45 (0.089246%)
CGCTGCGATCTATTGAAAGTCAGCCCTCGACACAAGGGTT28 (0.111062%)
CGGGTGCCAAGGAACTCCAG16 (0.031732%)
CTCGGGTGCCAAGGAACTCC18 (0.035698%)
GCCAAGGAACTCCAGTCACG12 (0.023799%)
GGGTGCCAAGGAACTCCAGT33 (0.065447%)
GGTGCCAAGGAACTCCAGTC43 (0.085280%)
TCGGGTGCCAAGGAACTCCA19 (0.037682%)
TCTCGGGTGCCAAGGAACTC51 (0.101146%)
TTCTCGGGTGCCAAGGAACT18 (0.035698%)
TTTTTTTTTTTTTTTTTTTT248 (0.491845%)
+
+ +
+
+ +