pax_global_header00006660000000000000000000000064147471510550014523gustar00rootroot0000000000000052 comment=737a236399977351f769adb559830f1fb0c0e48a pairtools-1.1.3/000077500000000000000000000000001474715105500135415ustar00rootroot00000000000000pairtools-1.1.3/.flake8000066400000000000000000000006711474715105500147200ustar00rootroot00000000000000[flake8] exclude = __init__.py __main__.py max-line-length = 120 ignore = # whitespace before ':' E203 # too many leading '#' for block comment E266 # line too long E501 # line break before binary operator W503 select = # mccabe complexity C # pycodestyle E # pyflakes error F # pyflakes warning W # bugbear B # line exceeds max-line-length + 10% B950 pairtools-1.1.3/.github/000077500000000000000000000000001474715105500151015ustar00rootroot00000000000000pairtools-1.1.3/.github/workflows/000077500000000000000000000000001474715105500171365ustar00rootroot00000000000000pairtools-1.1.3/.github/workflows/python-build-wheels.yml000066400000000000000000000057611474715105500235750ustar00rootroot00000000000000name: Build wheels on: [workflow_dispatch] jobs: make_sdist: name: Make SDist runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 # Optional, use if you use setuptools_scm submodules: true # Optional, use if you have submodules - name: Install dependencies run: python -m pip install cython numpy pysam - name: Build SDist run: pipx run build --sdist - uses: actions/upload-artifact@v4 with: name: cibw-sdist path: dist/*.tar.gz build_wheels: name: Build wheels on ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: matrix: # macos-13 is an intel runner, macos-14 is apple silicon os: [ubuntu-latest] #, windows-latest, macos-13, macos-14] python-version: [ "3.11" ] # "3.7", "3.8", "3.9", "3.10", steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} # - name: Build wheels # uses: pypa/cibuildwheel@v2.21.0 # # uses: pypa/cibuildwheel@v2.17.0 # # env: # # CIBW_SOME_OPTION: value # # ... # # with: # # package-dir: . # # output-dir: wheelhouse # # config-file: "{package}/pyproject.toml" - name: Install cibuildwheel run: python -m pip install cibuildwheel==2.22.0 - name: Build wheels run: python -m cibuildwheel --output-dir dist # to supply options, put them in 'env', like: env: #CIBW_BUILD_FRONTEND: "pip; args: --no-build-isolation" CIBW_BUILD_FRONTEND: "build; args: --no-isolation" CIBW_BEFORE_ALL: "yum install bzip2-devel xz-devel -y;" # we have to recompile pysam so that repairwheel can later find various libraries (libssl, libnghttp2, etc) #CIBW_BEFORE_ALL: "yum install bzip2-devel xz-devel openssl-devel openldap-devel krb5-devel libssh-devel libnghttp2-devel -y;" CIBW_BEFORE_BUILD: "python -m pip install setuptools cython numpy pysam --no-binary pysam" # skip building 32-bit wheels (i686) CIBW_ARCHS_LINUX: "auto64" # we could use 2_28 to download pysam's wheel instead of compiling it ; # HOWEVER THAT DIDN'T WORK BECAUSE PYSAM DEPENDS ON LIBSSL, LIBNGHTTP2, ETC, WHICH CANNOT BE FOUND # SO WE ARE BACK TO COMPILING PYSAM'S WHEEL (no-binary pysam) # CIBW_MANYLINUX_X86_64_IMAGE: "manylinux_2_28" ## skip building pypy and musllinux CIBW_SKIP: pp* *musllinux* #CIBW_REPAIR_WHEEL_COMMAND: 'auditwheel -v repair -w {dest_dir} {wheel}' #PIP_NO_CACHE_DIR: "false" #PIP_NO_BUILD_ISOLATION: "false" #PIP_NO_BINARY: "pysam" - uses: actions/upload-artifact@v4 with: name: cibw-wheels-${{ matrix.os }}-${{ strategy.job-index }} path: ./dist/*.whlpairtools-1.1.3/.github/workflows/python-publish-test.yml000066400000000000000000000033221474715105500236230ustar00rootroot00000000000000name: Publish Python Package to Test PyPI on: # release: # types: [published] workflow_dispatch: jobs: publish_all: name: Publish wheels and sdist to Test PyPI # if: github.event_name == 'release' && github.event.action == 'published' environment: testpypi permissions: id-token: write runs-on: ubuntu-latest steps: - uses: dawidd6/action-download-artifact@v7 with: # Required, if the repo is private a Personal Access Token with `repo` scope is needed or GitHub token in a job where the permissions `action` scope set to `read` #github_token: ${{secrets.GITHUB_TOKEN}} # Optional, workflow file name or ID # If not specified, will be inferred from run_id (if run_id is specified), or will be the current workflow workflow: python-build-wheels.yml # Optional, the status or conclusion of a completed workflow to search for # Can be one of a workflow conclusion: # "failure", "success", "neutral", "cancelled", "skipped", "timed_out", "action_required" # Or a workflow status: # "completed", "in_progress", "queued" # Use the empty string ("") to ignore status or conclusion in the search workflow_conclusion: success - name: Publish sdist 📦 to PyPI uses: pypa/gh-action-pypi-publish@release/v1 with: packages-dir: cibw-sdist repository-url: https://test.pypi.org/legacy/ - name: Publish wheels 📦 to PyPI uses: pypa/gh-action-pypi-publish@release/v1 with: packages-dir: cibw-wheels-ubuntu-latest-0 repository-url: https://test.pypi.org/legacy/ pairtools-1.1.3/.github/workflows/python-publish.yml000066400000000000000000000031201474715105500226420ustar00rootroot00000000000000name: Publish Python Package to PyPI on: # release: # types: [published] workflow_dispatch: jobs: publish_all: name: Publish wheels and sdist to PyPI # if: github.event_name == 'release' && github.event.action == 'published' environment: pypi permissions: id-token: write runs-on: ubuntu-latest steps: - uses: dawidd6/action-download-artifact@v7 with: # Required, if the repo is private a Personal Access Token with `repo` scope is needed or GitHub token in a job where the permissions `action` scope set to `read` #github_token: ${{secrets.GITHUB_TOKEN}} # Optional, workflow file name or ID # If not specified, will be inferred from run_id (if run_id is specified), or will be the current workflow workflow: python-build-wheels.yml # Optional, the status or conclusion of a completed workflow to search for # Can be one of a workflow conclusion: # "failure", "success", "neutral", "cancelled", "skipped", "timed_out", "action_required" # Or a workflow status: # "completed", "in_progress", "queued" # Use the empty string ("") to ignore status or conclusion in the search workflow_conclusion: success - name: Publish sdist 📦 to PyPI uses: pypa/gh-action-pypi-publish@release/v1 with: packages-dir: cibw-sdist - name: Publish wheels 📦 to PyPI uses: pypa/gh-action-pypi-publish@release/v1 with: packages-dir: cibw-wheels-ubuntu-latest-0 pairtools-1.1.3/.github/workflows/python-test.yml000066400000000000000000000026071474715105500221640ustar00rootroot00000000000000# This workflow will install Python dependencies, run tests and lint with a variety of Python versions # For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions name: Test build, lint and test on: push: branches: [ master ] tags: - "v*" # Tag events matching v*, i.e. v1.0, v20.15.10 pull_request: branches: [ master ] jobs: build: runs-on: ubuntu-latest strategy: matrix: python-version: ["3.9", "3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip wheel setuptools build pip install cython pysam numpy pip install -e .[test] --no-build-isolation -v -v - name: Lint with flake8 run: | # stop the build if there are Python syntax errors or undefined names flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Test with pytest run: | pip install pytest pytest pairtools-1.1.3/.gitignore000066400000000000000000000022501474715105500155300ustar00rootroot00000000000000# vim undos *.un~ # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so *.c *.cpp # Distribution / packaging .Python env/ build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib64/ parts/ sdist/ var/ *.egg-info/ .installed.cfg *.egg # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *,cover .hypothesis/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # IPython Notebook .ipynb_checkpoints # pyenv .python-version # celery beat schedule file celerybeat-schedule # dotenv .env # virtualenv venv/ ENV/ # Spyder project settings .spyderproject # Rope project settings .ropeproject # cython compiled C extension _*.c *.DS_Store # VS code settings .vscode/* # Files generated as the examples examples/* pairtools-1.1.3/CHANGES.md000066400000000000000000000162421474715105500151400ustar00rootroot00000000000000### 1.1.3 (2025-01-31) ### Bugfixes of parse2: - Standartiation of complex pair types: names R1&2 and R1-2 are now uniform in the code. This was inconistent before leading to the bugs at the positions assignment for R1&2. - Walk policies are applied not only to complex walks but also to non-chimeric reads in parse2. Bugfizes of pairtools select: - Empty columns at the end of the .pairs file are not truncated anymore. New tests: - parse2 tests for R1&2 and R2 reads (read25/27). - parse2 tests for correct flipping (read25/26). ### 1.1.2 (2024-12-11) ### Bugfixes: - Drop Cython-generated .c/.cpp files from the sdist ### 1.1.1 (2024-12-10) ### Bugfixes: - Migrating to pyproject.toml + cibuildwheel. pairtools will now release binary wheels for Linux. --no-build-isolation is a mandatory flag now. - Require Cython during build to avoid the "circular import" bug. - fix API incomplete functionality for read-side detection by @agalitsyna **Full Changelog**: https://github.com/open2c/pairtools/compare/v1.1.0...v1.1.1 ### 1.1.0 (2024-04-23) ### Major bugfixes: - Fix a major bug in sort that previously broke the sorting order. This bug was introduced in recent versions of pairtools #230 - Fix a major bug in dedup that caused pair duplication and broken sorting order in non-Cython backends New features: - stats: calculate the distance of P(s) divergence between pairs of different directionalities #222 - dedup: allow column names in all backends, and allow sorting by arbitrary columns #162 New behavior and default settings: - dedup: turn mark-dups on by default #211 - parse: change the default --walks-policy to 5unique - parse: pair types are now always in upper case. Previously, letters in pair types were converted to lowercase if the corresponding side contained chimeric alignments. Minor bugfixes: - dedup: allow inputs with quotes #194 - dedup: allow empty input pairs file #201 - stats: minor bugfixes #200 Documentation: - a new notebook with the statistics of distances between PCR duplicates #233 - clean up phase walkthrough #218 - a new chapter on building workflows with pairtools #219 #226 #231 - a major cleanup Code updates: - make pairsio.py to read (and, in the future, write) .pairs files #195 - minor refactoring of parse #223 New Contributors: - @hkariti made their first contribution in #194 ### 1.0.3 (2023-11-20) ### - [x] `pairtools dedup`: update default chunksize to 10,000 to prevent memory overflow on datasets with high duplication rate ### 1.0.2 (2022-11-XX) ### - [x] `pairtools select` regex update (string substitutions failed when the column name was a substring of another) - [x] Warnings capture in dedup: pairs lines are always split after rstrip newline - [x] Important fixes of splitting schema - [x] Dedup comment removed (failed when the read qualities contained "#") - [x] Remove dbist build out of wheel - [x] pairtools scaling: fixed an issue with scaling maximum range value https://github.com/open2c/pairtools/issues/150#issue-1439106031 ### 1.0.1 (2022-09-XX) ### - [x] Fixed issue with pysam dependencies on pip and conda - [x] pytest test engine instead of nose - [x] Small fixes in teh docs and scaling ### 1.0.0 (2022-08-XX) ### This is a major release of pairtools since last release (April 2019!) #### Post merge: - [x] sphinx docs update with incorporated walkthroughs #### New tools: - [x] parse2 module with CLI for parsing complex walks - [x] scaling and header modules with CLI #### Fixes by modules: pairtools dedup - [x] finalize detection of optical duplicates https://github.com/open2c/pairtools/issues/106 and https://github.com/open2c/pairtools/issues/59, also related to https://github.com/open2c/pairtools/issues/54 - [x] chunked dedup by @Phlya - [x] improvement of dedup to include reporting of the parent readID by @Phlya and @agalitsyna pairtools stats/scaling - [x] split dedup stats and regular stats - [x] output chromosome size to the stats output https://github.com/open2c/pairtools/issues/83 - [x] pairtools stats: YAML output? https://github.com/open2c/pairtools/issues/111 and https://github.com/open2c/pairtools/issues/79 - [x] pairtools scaling tool which takes into account chromosome sizes: https://github.com/open2c/pairtools/issues/81, https://github.com/open2c/pairtools/issues/56? pairtools parse - [x] parse complex walks engine and tools: https://github.com/open2c/pairtools/pull/109 - [x] stdin and stdout reporting defaults: https://github.com/open2c/pairtools/issues/48 - [x] flipping issue: https://github.com/open2c/pairtools/issues/91 pairtools phase - [x] make work with both pip and github versions of bwa: https://github.com/open2c/pairtools/pull/114 pairtools restrict - [x] Handle empty pairs with "!" chromosomes: https://github.com/open2c/pairtools/issues/76 - [x] Problem with restriction sites header/first rfrag: https://github.com/open2c/pairtools/issues/73 - [x] Suggestions by @golobor: https://github.com/open2c/pairtools/issues/16 pairtools merge - [x] do not require sorting? https://github.com/open2c/pairtools/issues/23 - [x] headers handling: https://github.com/open2c/pairtools/issues/18 #### General improvements: Headers maintenance - [x] allow adding a header to a headerless file https://github.com/open2c/pairtools/issues/119 or broader addition of the headed module, draft: https://github.com/open2c/pairtools/pull/121 Code maintenance - [x] transfer pairlib into sandbox of pairtools lib - [x] separate cli and lib - [x] Remove OrderedDict: https://github.com/open2c/pairtools/issues/113 - [x] Clean up deprecation warnings, e.g. https://github.com/open2c/pairtools/issues/71 - [x] Fix input errors without explanations, e.g. https://github.com/open2c/pairtools/issues/61 #### Specific changes: Docs improvements - [x] pairtools walkthrough - [x] phasing walkthrough - [x] parse docs update Tests proposals - [x] add tests for dedup @Phlya : https://github.com/open2c/pairtools/issues/5 - [x] add tests for stats, and merge: https://github.com/open2c/pairtools/issues/5 Enhancements - [x] add summaries: https://github.com/open2c/pairtools/pull/105 - [x] support of [bwa mem2]( https://github.com/bwa-mem2/bwa-mem2), which is 2-3 times faster than usual bwa mem: https://github.com/open2c/pairtools/discussions/118 - [x] I/O single utility instead of repetitive code in each module ### 0.3.1 (2021-02-XX) ### * sample: a new tool to select a random subset of pairs * parse: add --readid-transform to edit readID * parse: add experimental --walk-policy all (note: it will be moved to a separate tool in future!) * all tools: use bgzip if pbgzip not available Internal changes: * parse: move most code to a separate _parse module * _headerops: add extract_chromosomes(header) * all tools: drop py3.5 support * switch from travis CI to github actions ### 0.3.0 (2019-04-23) ### * parse: tag pairs with missing FASTQ/SAM on one side as corrupt, pair type "XX" ### 0.2.2 (2019-01-07) ### * sort: enable lz4c compression of sorted chunks by default ### 0.2.1 (2018-12-21) ### * automatically convert mapq1 and mapq2 to int in `select` ### 0.2.0 (2018-09-03) ### * add the `flip` tool ### 0.1.1 (2018-07-19) ### * Bugfix: include _dedup.pyx in the Python package ### 0.1.0 (2018-07-19) ### * First release. pairtools-1.1.3/LICENSE000066400000000000000000000020541474715105500145470ustar00rootroot00000000000000MIT License Copyright (c) 2017-2021 Open2C Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. pairtools-1.1.3/MANIFEST.in000066400000000000000000000006201474715105500152750ustar00rootroot00000000000000include README.md include CHANGES.md include LICENSE include pyproject.toml include pytest.ini graft tests graft doc prune doc/_build prune doc/_templates global-include *.pyx global-include *.pxd global-exclude *.c global-exclude *.cpp global-exclude __pycache__/* global-exclude *.so global-exclude *.pyd global-exclude *.pyc global-exclude .git* global-exclude .deps/* global-exclude .DS_Store pairtools-1.1.3/Makefile000066400000000000000000000012661474715105500152060ustar00rootroot00000000000000.PHONY: init install clean-pyc clean-build build test publish docs-init docs init: conda install --file requirements.txt install: pip install -e . test: nosetests clean-pyc: find . -name '*.pyc' -exec rm --force {} + find . -name '*.pyo' -exec rm --force {} + find . -name '*~' -exec rm --force {} + clean-build: rm -rf build/ rm -rf dist/ clean: clean-pyc clean-build build: clean-build python setup.py sdist # python setup.py bdist_wheel publish: build twine upload dist/* publish-test: twine upload --repository-url https://test.pypi.org/legacy/ dist/* #docs-init: # conda install --file docs/requirements.txt # #docs: # cd docs && python make_cli_rst.py && make html pairtools-1.1.3/README.md000066400000000000000000000225611474715105500150260ustar00rootroot00000000000000# pairtools [![Documentation Status](https://readthedocs.org/projects/pairtools/badge/?version=latest)](http://pairtools.readthedocs.org/en/latest/) [![Build Status](https://travis-ci.org/mirnylab/pairtools.svg?branch=master)](https://travis-ci.org/mirnylab/pairtools) [![Join the chat on Slack](https://img.shields.io/badge/chat-slack-%233F0F3F?logo=slack)](https://bit.ly/2UaOpAe) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.1490831.svg)](https://doi.org/10.5281/zenodo.1490831) ## Process Hi-C pairs with pairtools `pairtools` is a simple and fast command-line framework to process sequencing data from a Hi-C experiment. `pairtools` process pair-end sequence alignments and perform the following operations: - detect ligation junctions (a.k.a. Hi-C pairs) in aligned paired-end sequences of Hi-C DNA molecules - sort .pairs files for downstream analyses - detect, tag and remove PCR/optical duplicates - generate extensive statistics of Hi-C datasets - select Hi-C pairs given flexibly defined criteria - restore .sam alignments from Hi-C pairs - annotate restriction digestion sites - get the mutated positions in Hi-C pairs To get started: - Visit [pairtools tutorials](https://pairtools.readthedocs.io/en/latest/examples/pairtools_walkthrough.html), - Take a look at a [quick example](https://github.com/open2c/pairtools#quick-example), - Check out the detailed [documentation](http://pairtools.readthedocs.io). ## Data formats `pairtools` produce and operate on tab-separated files compliant with the [.pairs](https://github.com/4dn-dcic/pairix/blob/master/pairs_format_specification.md) format defined by the [4D Nucleome Consortium](https://www.4dnucleome.org/). All pairtools properly manage file headers and keep track of the data processing history. Additionally, `pairtools` define the [.pairsam format](https://pairtools.readthedocs.io/en/latest/formats.html#pairsam), an extension of .pairs that includes the SAM alignments of a sequenced Hi-C molecule. .pairsam complies with the .pairs format, and can be processed by any tool that operates on .pairs files. `pairtools` produces a set of additional extra columns, which describe properties of alignments, phase, mutations, restriction and complex walks. The full list of possible extra columns is provided in the [`pairtools` format specification](https://pairtools.readthedocs.io/en/latest/formats.html#extra-columns). ## Installation Requirements: - Python 3.x - Python packages `cython`, `pysam`, `bioframe`, `pyyaml`, `numpy`, `scipy`, `pandas` and `click`. - Command-line utilities `sort` (the Unix version), `samtools` and `bgzip` (shipped with `samtools`). If available, `pairtools` can compress outputs with `pbgzip` and `lz4`. For the full list of recommended versions, see [the requirements section in the pyproject.toml](https://github.com/open2c/pairtools/blob/main/pyproject.toml). There are three options for installing pairtools: 1. We highly recommend using the `conda` package manager to install `pairtools` together with all its dependencies. To get it, you can either install the full [Anaconda](https://www.continuum.io/downloads) Python distribution or just the standalone [conda](http://conda.pydata.org/miniconda.html) package manager. With `conda`, you can install `pairtools` and all of its dependencies from the [bioconda](https://bioconda.github.io/index.html) channel: ```sh $ conda install -c conda-forge -c bioconda pairtools ``` 2. Alternatively, install non-Python dependencies (`sort`, `samtools`, `bgzip`, `pbgzip` and `lz4`) separately and download `pairtools` with Python dependencies from PyPI using pip: ```sh $ pip install pairtools ``` 3. Finally, when the two options above don't work or when you want to modify `pairtools`, build `pairtools` from source via pip's "editable" mode: ```sh $ pip install numpy cython pysam $ git clone https://github.com/open2c/pairtools $ cd pairtools $ pip install -e ./ --no-build-isolation ``` ## Quick example Setup a new test folder and download a small Hi-C dataset mapped to sacCer3 genome: ```bash $ mkdir /tmp/test-pairtools $ cd /tmp/test-pairtools $ wget https://github.com/open2c/distiller-test-data/raw/master/bam/MATalpha_R1.bam ``` Additionally, we will need a .chromsizes file, a TAB-separated plain text table describing the names, sizes and the order of chromosomes in the genome assembly used during mapping: ```bash $ wget https://raw.githubusercontent.com/open2c/distiller-test-data/master/genome/sacCer3.reduced.chrom.sizes ``` With `pairtools parse`, we can convert paired-end sequence alignments stored in .sam/.bam format into .pairs, a TAB-separated table of Hi-C ligation junctions: ```bash $ pairtools parse -c sacCer3.reduced.chrom.sizes -o MATalpha_R1.pairs.gz --drop-sam MATalpha_R1.bam ``` Inspect the resulting table: ```bash $ less MATalpha_R1.pairs.gz ``` ## Pipelines - We provide a simple working example of a mapping bash pipeline in /examples/. - [distiller](https://github.com/open2c/distiller-nf) is a powerful Hi-C data analysis workflow, based on `pairtools` and [nextflow](https://www.nextflow.io/). ## Tools - `parse`: read .sam/.bam files produced by bwa and form Hi-C pairs - form Hi-C pairs by reporting the outer-most mapped positions and the strand on the either side of each molecule; - report unmapped/multimapped (ambiguous alignments)/chimeric alignments as chromosome "!", position 0, strand "-"; - perform upper-triangular flipping of the sides of Hi-C molecules such that the first side has a lower sorting index than the second side; - form hybrid pairsam output, where each line contains all available data for one Hi-C molecule (outer-most mapped positions on the either side, read ID, pair type, and .sam entries for each alignment); - report .sam tags or mutations of the alignments; - print the .sam header as #-comment lines at the start of the file. - `parse2`: read .sam/.bam files with long paired-and or single-end reads and form Hi-C pairs from complex walks - identify and rescue chrimeric alignments produced by singly-ligated Hi-C molecules with a sequenced ligation junction on one of the sides; - annotate chimeric alignments by restriction fragments and report true junctions and hops (One-Read-Based Interactions Annotation, ORBITA); - perform intra-molecule deduplication of paired-end data when one side reads through the DNA on the other side of the read; - report index of the pair in the complex walk; - make combinatorial expansion of pairs produced from the same walk; - `sort`: sort pairs files (the lexicographic order for chromosomes, the numeric order for the positions, the lexicographic order for pair types). - `merge`: merge sorted .pairs files - merge sort .pairs; - combine the .pairs headers from all input files; - check that each .pairs file was mapped to the same reference genome index (by checking the identity of the @SQ sam header lines). - `select`: select pairs according to specified criteria - select pairs entries according to the provided condition. A programmable interface allows for arbitrarily complex queries on specific pair types, chromosomes, positions, strands, read IDs (including matches to a wildcard/regexp/list). - optionally print the non-matching entries into a separate file. - `dedup`: remove PCR duplicates from a sorted triu-flipped .pairs file - remove PCR duplicates by finding pairs of entries with both sides mapped to similar genomic locations (+/- N bp); - optionally output the PCR duplicate entries into a separate file; - detect optical duplicates from the original Illumina read ids; - apply filtering by various properties of pairs (MAPQ; orientation; distance) together with deduplication; - output yaml or convenient tsv deduplication stats into text file. - NOTE: in order to remove all PCR duplicates, the input must contain \*all\* mapped read pairs from a single experimental replicate; - `maskasdup`: mark all pairs in a pairsam as Hi-C duplicates - change the field pair_type to DD; - change the pair_type tag (Yt:Z:) for all sam alignments; - set the PCR duplicate binary flag for all sam alignments (0x400). - `split`: split a .pairsam file into .pairs and .sam. - `flip`: flip pairs to get an upper-triangular matrix - `header`: manipulate the .pairs/.pairsam header - generate new header for headerless .pairs file - transfer header from one .pairs file to another - set column names for the .pairs file - validate that the header corresponds to the information stored in .pairs file - `stats`: calculate various statistics of .pairs files - `restrict`: identify the span of the restriction fragment forming a Hi-C junction - `phase`: phase pairs mapped to a diploid genome ## Contributing [Pull requests](https://akrabat.com/the-beginners-guide-to-contributing-to-a-github-project/) are welcome. For development, clone and install in "editable" (i.e. development) mode with the `-e` option. This way you can also pull changes on the fly. ```sh $ git clone https://github.com/open2c/pairtools.git $ cd pairtools $ pip install -e . ``` ## Citing `pairtools` Open2C*, Nezar Abdennur, Geoffrey Fudenberg, Ilya M. Flyamer, Aleksandra A. Galitsyna*, Anton Goloborodko*, Maxim Imakaev, Sergey V. Venev. "Pairtools: from sequencing data to chromosome contacts" bioRxiv, February 13, 2023. ; doi: https://doi.org/10.1101/2023.02.13.528389 ## License MIT pairtools-1.1.3/doc/000077500000000000000000000000001474715105500143065ustar00rootroot00000000000000pairtools-1.1.3/doc/Makefile000066400000000000000000000012571474715105500157530ustar00rootroot00000000000000# Minimal makefile for Sphinx documentation # # You can set these variables from the command line, and also # from the environment for the first two. SPHINXOPTS ?= SPHINXBUILD ?= sphinx-build SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @cd ..; python setup.py build_ext --inplace; cd docs @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)pairtools-1.1.3/doc/_static/000077500000000000000000000000001474715105500157345ustar00rootroot00000000000000pairtools-1.1.3/doc/_static/hic-processing-pipeline.png000066400000000000000000001514661474715105500231770ustar00rootroot00000000000000PNG  IHDR~3sBIT|d pHYsgRtEXtSoftwarewww.inkscape.org< IDATxwE׽IH#$!B)Jޫt/ "_"_JP;kBzr~|v~3g={MxGNi O+ "l hmuDDzǀG[\l l 涰^",6KG])D`1Bb@`w`LwVJDd LmTf_fX|2[aJuoQDz3m:X0v;ZJ\ Z\NJ,[x8[b7KDdIq8vӮ؁7F~zuAw_ %`zc" <+iFliVmLޛZ\/I,߈Mj""K[X`=X|pHEqx|86dF~YWł<""v\݁wUm6}u- KEDDDz''&f:k'g;u`=c%ʻ1G˾l&QD$;fM\ $H{ץ;^⺈t'Bcs 2;t-"Yݓ̐Jneezs-"RO|A]L/❋kq]DDDDsI+H/Փ'NngUuR""u܉GU콝z, FY"K4@DD6`M`p66)3ؚQZr7l^,ՁLEXP{q:Xv[ xȊȒ?0({< XP``5`%l䍃eym3 XXkzc>3l?YeGewg >,}iƭ[$"Kdn/&,2Q_f(u1vBG+Ў^`,vlX;_#ۿ2ul _r =3{`;`&AP=;&ŽAb ?;^C ۧHp6x$ax<́lMRξ_Ifཛྷ&WD'%pAcTW=yKF$X:Wbñ bj78䍃s~&{ĶΫ׳ǯǽ&eDN0pubX_מ |-OEς/a=S܄|XЭٲe|߃e 駲$eh;+ 7'EV̼D]ATHD&|{t#5낉koVFѲeĆ*jÍ'4X`.>}F+#Û{pXNpS#{2bC@,bw0u]QM4XzHOuvG[..?o\n^@x8x]bƚ2="Y|~> ꇲICu us'#cEˆaજ߂VrA9 Oc#ͩHoˎ6/DͽÂɻaAX<v[NѲ}_~7^)R+9W=;n]PN"f`9e6Ʒ5H,+[5zm;OpmnjSY&a޸"-n,ڀ(;.8G}|-Zvh,o菝2߉f0BD' Dn ~8q=^+׮ %YTOHeSr\Ph'eqrLؙ>R\j,˷H, ?*(75+L0F T| _r'eMKrM~}}Lb=Ûe `YniTbo ǹG/X66g'g|*i2+x3v""""=Կ0un( ;̔=ZV쬜IM%"jc8-;έ~8E2J,,`MP8d8q؃g,$?+`+5u(yhǃeGNnhqcm^|CaOe;ˎ2g:E>y2W?愓`n X'/=eo`'Q}cr6+Xz޶Ԭf8-sC?_ "k{ zqqֵgs=,N]yaRCչsu궘Iw)afU>H? v2s yu {ryLuwC=u 5Ed 6k!Y86#4 qbv JDqD %6xh"<=~`.33d Aq`+u׽)"vDuy=|@Wug-]Ò.BEh#~:BNd&aj8nOR=[wzκòky|y늭$qV-cλiZ4dƚ[GT t #SYDzٿIg'Cu7diq} ύ( XwԾ=LFѸj""=kRX^!x<`}wco&3?Vfm<'?|bq& SMmFlEc-{<  N:F~6έ):oH?q j8E^OXxwk n.:8Trߣ-;qF"iLm\9o\N'[3eePEZ&iE'js9 QD/X:_8o>v:΂mgcP. q22P$x\/+l{1q%~b('AlmƮwA_Svؘ`3;zyX\NOEl¨:Xw띕SXV_!< L|߳epcJنrFOP8ۋp蝑Ī'cݰ=jX ~3}@wsvXnx?\7Ac? &uvz]W]MTaǰSI3PT1b2k}:8 ̻C{MHYnM,}cě""""-7NNffa'SfdNz !5>.ƭrjMT쵂w}Vfv2*"Ӹ ޴L 5DխK믁ex{?x.BnbNƏv5+7K(hk`]͝=뇙3u-8s"ngbNjishm2'l9?9uEf=UⱮ6<c%6u+ޘV ;,geNN,?4{G`ߜ튈Pq`Bua3w|^^,m/80,`uVg%%gԄ""ֆ8/VCGS&`cͶ>sa|Tv޺.gak͂OvP(";do.6T.%(Ol`Yv`7+Uo"p.qCSfk|fqvMPt]QdY>RNnfV7^-y ; x)e~:}neƪ+6Bp v|X.{hea=#oځ+1f5 ]WԳ! ߗ1g,<~ +a1gaåT{,ߍkQ>H:n=61Tߊ4(̪u-x^}.}3O~,_ܧf ISf~"' p7Hj5"""""""9&΍QDDZlx`cp $~Jlґ%yW-&""Ӟ!1~SƍG^&i9M("=a1o c>Mf&""=N'X9ֆM6;DNwR=Q,}@`VWBDDDDDDDDI.muEzk@%׺jH/p#pF""""""""K)XVW:h[W5ƷApz`_7֫+gb7XOjq]:$gb$⺈ȒkV1`ץ.Ǝ/_nq]DDDd)zݴd]`>|.?5Rz5b9`嶤&]Y.*߶i~qLMp\WVJDjķ%.]ay%R""ҷ.MpsݾoNNma]DDx7xRl؎#ED: 8,VhuZh߹o[Y.ձazF)WtI4[[ e;*"g`m /Z\fkxU`'Hus} i&bVWDD$SoHAKZXqTED]w<ꊈH""""""""DCjHOxh`S` l¢$6c&a?V˖\:J;uSe/`ԭ &wa38{cCS籬_bcc6bx#XW/W|;QY>}sVvޛyL?Kguүn]: o+%~/̉zÁ}m5X[92d#l\屮|n~h~ k~ ˌ? <}ҹǾ+bk~< < 7_/a`6XJln#9Xs)w#c=9~WS]wۼg_>w6ֵ/Xzl:{>Wq^xÁӲw lJsc;_Z=\dva ޾ `{9`cazf?ґlx3fl`-5c$pvCX uX[^\I͊?p0,{EYbD->@83n};%~Kyv2}7 1,w>KDe"KX pv.=;H;g;?[;=vzD}Wcזع?=y,㿱9kx-#3u.M:^mrFwN*vwud`}( ~J,_[s:o` ֫`OwH.> leO]eYSamcթX r?v,w/9܎'r[`^ NB.IJ>RoeCY;X< O{{9:ytkVTTaDg4v18?agyYݝM Dzb#b2G`'o/?.xm`[vGak2bK6`,,Y N,k2D F_,K9uaٌnkm N>v,ӱ}X,l-{r!6V#N=^Y.@a7t8'|%sTVϏc=*3X`m2>xֆ|ם3|6oeb߉;/c&m 콺 .}~[ÂK'' l ׼ Ѹ -m3/cm }_~ñTM{>}ڱE9^+R\83W[Pp7|7Xcv,y.]=kW~m;/s,s=v,8k{g8Xnw"3L²Ďñ,-عY8w֓ ?zVk+u#0 k/ηǮIq_C/Ŏ ^a ֖;ރms{ ""D37Sv8v`)Eۨ|`, H:/| ?idw'Se:>Fcw Fg~ ;t;& |OljE:vF CXvZ{%|?^[p Ӱح>N#č?߭O`An#۞  }߁B+3.o9awKufwev^ǛX(ԆݰpH0{!n2ĶgNt*X;UbgQb41~V,`Ne891XNjV>%2*mIA}{f8G_\Hwf8N,_Xc۸t}kt ~ؐ<2VLyԶ3a^|cc >3AoJHtg9 (sebH|{4KRHF' ,pg] Lb {L-VFDDd H9 &q=EF/ ,0Y4rѰh$|Yry'a)MܛX^6܆eȜrhY#}`2XP|=^,ghY7\f1%XvQ[` ȖŲS ],%=(c^ re 2.ZvD,/<2Ҙ3gvX3͛ qsP.. 8%ʤziu3te !^xP3azA6K\ƋUHk_e>H%if~|[7Z_,Ǖ$\x^˶+x"" Ȓ?b]S'ېƲ`&/WmϦt7z^GmhWꇿZ' E'wWoHLJ,K˚k܈0H^NaOq p6v2YOlQ*&+> g_Qv'o#+X[< ƿgȟ1wwt8oLGesC|.Jl]qg;M ǹfƂ.. ›kqKaƺCܟFѱq?q,{[OYV"Α瓟ҕVurhì5TKx]z"!$"h gY꺛'-enuaÏk79R=`l\"vAWt>OYgr.?LXP޾,)1Io,C/eX0 q}h-3؉jXfgC㇂eƠ7:9N2 (~z=(yLヌsL,n|aaO7N)ӎ [}_\3os\6:~̙ݔK-ߑ\`dcn[ L ǵ@݁ݸ^榪9k)IU\WKǎ#VkSbcx\@βXI[rTtLWkpE[ ,v`u{6&ϩ>h0^v]7S`y,;p^!x7]}uT;㸛 >.&?;{CqN-U,&ѽg{бQx5.gkƤuImʖPݩ,lt]u<x#)y]\&SfaXEǵf,90{p<,0-"זopu]WM{5{q&s1v0n_lϾpG8ˈ@z<03-87fkaV| eʝ=*,6iWvFº24;Y6" ]Nz"fu%] 6hpӂaE5K+Y/Y&Q=Ӱq1iw.`.*S .i䷲6T^ wxE,Ua,cCF*z]yhl# Xkܰ7 hMզpZNXkzkʼɁUmblx+v켱pDtQ"w-ո =w?nzV>uؚa`:eϮN`Dahڱ.py_ǞnջA;t1.U z];*ޯaT ,=CXҀ;M$lSѹsȧ==>XފJ0ۑsfH[wv\k z@x)כ3n ;~ݨ骹'D\:g5?TVOkz{ڹcN:iTDzeifom.ÏALdPnX PP[㿗G.ڇ~Ȋcoҍh ?ߦz"oo:mlڕ3ˮqrm7wH=f6:l5ߐ>+؆c]`1/3|lws:n-l/S~0nN!L)(EejpdNY"}\: s ՕW`דf"}|#{\>u)~Xfβ49{,6_w|D ~Xg(.kpj/př>)a'X)AiCǿgQ,vlwa ϒhԹ ώ~Z:{;a˰퇿`ewÂFyu'ҁ69>Hu6eJ72  ;Ul2)Xwj~O;ep 5)ew{  uXf`J8!#B(w#j4;''QHL)"]+uE]l Ǔ=O玏`筱F ;95UfAY6UDri gYL2|.N ~eF݆͞>[;ZbǰA C:`؝>|EAb8$vB4c>9/Xb'`(> 8j?ރ3۰}b'Ckvr>N,|.m2$IVbXݏ²_QX0x(pb]2^a㛱.`߉! pw:˚v~l,R,sPV{XXPfK,~|/^,vnb<ƺxe޵+,,=vq#Zw`C(SX>,?@+}ڄ@m7n2gfy.ڄXI~;zS>ca{C,~/kxʇnw݄ v̜}>uC=ƆZ ^֖cU؍%q7և_0b7DtvǴ`ǎ3c-)v6PnAع;vSFb=aM"3]v"v&vYþamo߆]}\\;W ǎ.x}v8,v>oQ>c,uHS]&*(c_)[HmVi,U{0g%_ȝQb[)eֹ`{өkd[%:6dOm$Y-`uw^b݃凖@_j\ff$9[8)zX&qOi&aSgGXfȭg,~wX_P~'X;u1(҆M9`ϒ?|^A90(2 =˚Kw`IxFcG=s s nO{:۹ ~w7.(j} LmJ9(W44MY{Yކ˼7$c<76"(sqN6h˸+u|^5X6uYc> =:o g`܂u}h46 hKC@ȇ)odɷ*6"lț矣ܤ""""""+&X5Ui_Q7Eu\MCKk$" mL,"""""d}XLMw ,Ƃ`_?MXajdM4v̺LODDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD9/ܝY Di#7&қҰ_3}V Jt~ס"""lnV̞[xX\Ңz4o`ץ'ikuzU[9F-HO2 F/ݙX[6;~ 6iDD:|ik[Xq-XI`d 8;GavB87  k {35 ۵c좴e]o+-Q͡=iFyel{a$""]m7`14l5:~V'k~xLεzCy0ݯD}>x#ڗ NŒ+zu &iq]RޡiFv,{O`&l;uE`'4i""yڜ^Kp8߮uXJV)\7_sYXD3vޢ6]N:aT)XvHo5k3*T3;;lnͣ:U6,8Rb7>EDخ-Ks;pOVH# צ2k)\kx`.Y][{cCy.B._nq]lπ| ۜFuVgcvmvEDBm-KW)g4N1?n IDATpsZ x 1gw}ThÏNz~+yzfvbhsDzƺq TzR xK@VGD=AD́oXo@^OV5 ƃXc(ez21 = lR][[mvVMڔ tC764vMH66^f6g=kdO\\l ?u%8vE]cuaѮ}\ZDَ} {uڰwd Mݕ]ðcmG!V.{:s/"""K؉B,p0?"૤/T/nnY]Vlp+ 1Ď%a;? f Jc﹈,' | Lpww/oe)L|jz=NBCuo1ڊ2nNZs OQ|섴(qu<pSq0dF|jXIdyyaF ğXف[9:4Xc7=S/c?=-Ur_hm~Yb3=mq))p~Q4qݯ'2 :2伿8; `ԟPܩ?S&^}(g݋wbWe/IDDDO N)bcq-hf> ʜSO`iXX7ma힝ݎΏbe/C2s}⃸R3k?$==Ӱ7|Q)Q epˮͩgc=yzkq]Dw9e 8 L. kV[: 86$ >lXX%V)#"ۗU ]]6їvs:Ι;߽XOm.g೯c-;`rk}_,?K{?NƮb Y9^"""8?,Lp'lm O6 L}wY"+3ޣy㞅lw'Elj Msؚ@" g|qb̓ݳ-kt\CnGK&|Ip45⺈t) 8&+",ۀ co~O%cԑر}XƯʯEM }u,x/Hٯ&"&6N~ j 8(1'Qc?1R;Iq {x}۸ 7]VxlkA|G4U "3mm}`]6+.b,H-vq{]Xm 6˔~X)(mҋXwオȟ4lGmE,Cl5؉j_,!哰n#~Xv`/!LcITrtm.e AG+BonPj!cNlg.p#ĉZv0_]߉t!Ԏ1X[eYu7xn1v 0 MƸ8#,o@VX(x|gVz}o](|O^jY-D_}'Ǟulq;;1l+rwx.\aTo'Uzn0 4 ò۱@ba]4Xw o 獜ۻktߒ>>k`y[t"=[ Ռq+'FۀO=]`tZ쩬,PqˁR}nUyYDe̯U ,ղ+ IJvC2{#^b>$ <&wb[Ǻ8%7 'o"ݯǞբ_P}.:kC‰V/n\u8[=-+CvN09ƬEm lؑP^F7. l¿``7C?"p'T("&wq/Nk L:< a2ՂuW:aCuxv]D:MleO CXw*> n{idMwibIml㉩\cYX)+R;ՃG`nOcjPțhu!l0Q(;'=lXkYP}AR4SҦYǞ!Nx_EuU:eo0j?pv=[vBӱ WǎաT0QDTmQNw;Y2fL[ack<s \wT`4 0O,o٪e,\X>W@QPE}52`ew sLq* 6 mPuFDJqOC^D6r,!;F\BD֧xnʯ=kbm||3fWE۰Oʼ ?:Wߵm͛Q>nְseL,騇y_*]wn;sb8>"x|<_w{*yˏ&ww;ܓXp]7e+?;\~7HE (|(bGEE"(("]D H=@H#g~ݝSu͙lyg|U\Ъy= MWz܏>7A.!{O+C=*fl_6߃"/?O~s<{{j%Q`3FpΟQۻ  u((][ KTiNdEE`s%EaC:Ffo]ǩJ?<&c؜03k(4u\S6zTOXٙa\>O|e`]ڛ/B#ޓs3^>?_6BT]=n icmqscwϺifffCІ$OPϲpU9{?6"8l\€sca֨.p{yqgOQ;Qj ΠE# ~#;qjcҏqyB< [^`R66z_mGfCJgmLyjgY$8yAZ6H&Yth<^hsA啟6 2yBԎ$l4?Y+ mX߇P[(?K/>=7;>O[ "YV}5$^D?seKff8ue2U9}Ehf!,B +Q"nGoE=O|M(A\d4 5NC'ynv/F5)~td,V~ }3[|BF8I9ˑ,u%ًm[z}|=4T%(ʥ~D~.ږgI^oWhgzd,Mq(dMgR?|o(Y4 6]HTa0fYM." 7vB:h('{Ѣ;|g%_ʊ'P~v7wtjB]FkHujf5zl:Pʺ%k BZ}CwHؒdOWw]7-HnzWqZl ܃?Uf[Q+GW333X_vEC'%g>t l n* kh[6ͬ6Gk،:!CF7N5`c```"0XoYSMuت.'fS[N<ʉyMufX-wqTVLFx')3wt3fff6، l X矇7ס P9&TV,nBeu(`ffQ.OZ^󛙙Yz&uq75L_N|+ܡl x/{Gi13\!6j?p V_=z<*k(0?:ǒ1+!իqy磊^~؁iOGy4T>XQ/PyQTN<8x+23NvF{дy^D7/D@S2FSMV] K,Ϩ]qlfff1;+`!p+p2;L`T|5'аRx03z p0v(N#́O礣8Meffݵj34ppx4@knB $t` jAvl6[㬛F i^Es`03֍F7n%;nV,崍v~Y{/̆-_Y[Qn[ 8ƒcpiffff-*{ϑݓ!hU w <6umf6\C=!8 M1:=lh33k]YAGњ,TzS|ZJ z|+VӁSQl [84} lffY*]`RW=݇pp7&F+zQҜx޶ԙ p#EP|BekM/Zez54ՆW63+0Z/>ЋU^+-+[gkV єD,s4/Q gYնM}CB9꩖!03+c {,]]fE4&x T]̪p>b<|zjvB W^ ffi+gS_N<ojnXt d#єvө_8{ uTVDϧC +p͟FU럋S]4Eki4P/^tLff7wQ_.B[V0]ݲGoT^:̬ik7PhǙ _D=/s\a̪4 F'g#v0]ff{ l_a3QkfffPܫ9h 5I&_1433+#՜ry8[ k045fGK~9-_YcЈtAx333¦R߫y6=zjg?fZ IDAT}v2Qff]*exC^U&̬FҽSd-ԏ*̆}_h1$pWb̬S^~zU&j|r"T U7R|D pE`*efff֪qϨ½ڞE37=ͬ?DSWs~Qљ!15m_\v-\H"'v4nifffj+5UAh< P϶v-Zp6̬;_r*5CeBj8 t>3f><8D RS?f4F|0333k3 55~(ܿu~tp.32̠6O; 65S?(_g,hfMS9ygYgО 5p>3333z 4, \Bm5W9<,u-F3"=hnwp`BΣ~mz@|3ffemG}_ᛓЃʆt'+/:433n 2j+,W!P+g|2s^ifVc"jh0^{}/^G9e '(Nz#mf/P_^ikJlxچg+M1)YhFN'R|5akGj(Z|  Q%.:X3n6LFS_H^./ffffA*MU9]iՁ[bc~PtzѕTPj|X o6K<,ˉOu%f6lAm38 o#oR[Ej?;d333F?/`*e*'R[9 _I}! Z̬Y=SVrb.I9 \Er1T'03]]u`JSdQ$c>Fغ 733e6zl0Zڛ\.')6}lD٠w?e*M5F3Sd333&(,4E֌4wj3d3dn'74E֬h85h:&4j̆{H* +M53^)CIy/3㛒_3>e=9̊?6O4L^e]O (S q`g)fmA*}p3 `!-8 7Aepmp>oy崛Dsv㡎fVos`:'f{TkHW;ʉ̲%3NA&=JrlxضXΣ}>4Gf?/'=ͬˋg9Y_fl͋0333Y A+}N]33v,xG:Δgw:̬wЙJa]u(f:WN\ٽK13+/+tR̬U?s>4wZ]33korba׮:e`>-3ڵ1333 >ӝrݺ 33%|y0KdffffMZxW Q%It23t5Su̬IJSkО`gѰl33\S}+p33XT6dS|{P̆̆%UJd`192  ^/\2̬"S[N68sjKUm4*e v%"̆&W@33Xj dsyU%^t._`ߪhfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffv7K*NK@rKU33kl7[@oi=еꄘ B ꄘY \ Я'0,j,~_qZ:+WN;Z8-ff6>p<0ⴔuI=C׹ꄘ BW[v-E]sҊI)׀J#cӀ+NY7=(y̦1;nO2^=x}R^k0V: L m$;ⴔsc7@o/BgS (pQ`&^kMgfC$y'*NKY8YEQ(X%w1]p9ɵ|ⴴ$?TpŬ&_[|>m0+ؾg?ӷ;`Qpμ,`~`p0xx}f8-O7T бpI^~z`߽/Fϧ'8x_Pp7GKgfC(3FKh6htcÅ yy*KEEhܛ>p0~fU8M>lJ𷻁ŀ5mQ5x7XF̮:!9Baa{`R{87OpJץ9 |F(/wi\{Ͻ+Ma4Wm9p(p>p7N({spo>cPi6F/Σ`p+W}ػQ2,rd_kAھڿ-"2;gQõԮ>Fv;^g^tmx_s\DE Y'r~pLVN3CsSjA>H: ̺Iuwyjp+LmEN/8: Wrn9uߟ)5>B~0 Uвr_"QzZ_{J 5R$9G79c^V>vp 9'-Pc7/yS"MSܦs`plI9~^0jcʵ-n 7\h[?}'? Gi8^:lT畏_.w α m{`VSj\lBV-_F/uDGp:u\ϽʱSIzBqC}^(o=Iuf)5Eӏo_ D-}k$_CDՕ x"'kVy]π3.?:Wk2{gy + 㴓}Gߑkx\QPfl[yHuk5 d7Jߋ[~ܫy&A3g/ՙ7@nF^蚮EՀ,D-~2?q&kWeA>4DOZ#;V1glOGk5_3c}ۖ3k0}M7*ḑm5<?dxa`tyjgȒu!63U]OX[k׌G\OvՀ ԾWjC2 +PϴP~}_ xJZvS[Q3kN[ظ wY.݀z4:{vp}&7 8/Ame_a~_εWW:k#OΛōd-E=Bm9.E碀A, 8Axhi~ڃR[s|ޘʭksq_s2oAFOǴ;F&q9 Y#.Ү9{P|(~e`ChMHj{{s0Tj[/py>#P^7'2gl_gS$2 -*6I%c֟eyo 8_m$n }Hp=.8 QG#Jy ȋ/|f^esє"0\1Or#֑( w:< 3hf6T6܃zM18%#8ߒmIH*FR?;cEjհ|u*M=yqmI*U𺰢=H {%pޒܟF} $tTW٬g kLۑscM8倳YpHM{h&{4߻HovElD;C {2AsyƯqs4p>zSp_MUmf lp~wXR>g#lol}sz4 έ<p^%8&-k Io\zPG8Z=Qj?E'`sej[I3McWFΠr!.˯9NJ$u}\aԶFgxE߇R -HE$M7G 8_uzHe.eibԶwt|;3Z0U%=H~9N^p'$_ "UAڃYp!dCN7OPopi7ۖ.ƺpYS}6 o{.NXG fY$n?V&lޟ_Ґg!q6U >xA KZBEGSbɄ㏐_KgYOҕy_CЁ"\бl%zhf=Qߋ=f}$Y=-2 95=ɨ3,DP{St<ܡOPɳeT\6/A2ٍ48'xJuɂU2j1iG7̬ "k̟?@f;M4DHN%頴qgJ'm@YrGFTɿZ/{r=}hW[<3|HxܽjmM2ZQ/ٰlI],A{o*n(6'ͼh{z*Vާ*dh$,ط' 0AtO3ݮipkQt`2Ci.?L#ٍK`2;Fx;뇫dN!|'ɪ8^ӱcP>Ita,٫y Dtp;+nw[xuv}ReWR7R$#P6ni3ΚG^x۠FQU|->dv ˨ÞVa޿Ifh֥/^+k+\,'e-De]rZV3ѨG,him8窨.*I/0/TtC0vE~o@=y:x)9M\dM4Wos̚17KT>g<m;Dt"i]KM0 yӚҟc^B^?cQohh$ӂ^Ӭ#?:-wjFFVȜE™H0.nM?#(oY#jZyP#O>hx"4+13nMƋC7EtƢi8F#|fX訁7+A/ao/ HpZ4ͤ;(;w,3)It%^^ `Xd~ IDAT(c,Cǜw/v8 $a-gǠKaѼjBKv`ߴV'wj}v ?eHFX6"QpԴ!/PY4T1&v 5w[eѼyGR܊}vVs3=, %~.g/ūuC2'd-th~x\=WA?Nxx z5f7FϧP;J.$$ rihEҫz:ZѪi4Y$"θ; U6x~%ioA% ^ܗ^ :%g?oPMezOھ©L^ݫSyٙDZ(^DvyHVm] uq9…~Bk=6ʈ3^|3uZx?w/Ds Gm"$C~G)<"@CIͬ9K]!ql2jZ)*7FypK|ߋH;P06>_$E?ݑ)(z-Vv-cFӑ~{ *.|˛sFӭ~Mw{)J'$qєۋ:PnL=)$km:6# L$pgtcXwH*>ߏ?<Pt:ur;7'R}>_^ot#laCwz_l_CIOzB#m{goQײ" Xe.;/ǧ5@Y|etieA(C<'s({l/qhآ5 ˺+xv}6nj?> e^_燨0z)اS4`ߝ 19u~l۾b? bǙY^&=Qpeo^s?*oA= oTlKWUZ֥6O I(Pp={0PE](~;p8r{x{FU.M=8hߣ}KUs%е>m/oc=Wa I~ ;u/ _ͪCN8|d2?-gpfַ9087]oPK8>N.Ho +oP,=vn>I3t(#}K`A?PownDž퍢!W5$9 /o$eޣ w:p+ysMmйѣBA?NIcНjut|AwGc€ҨgA t73f5y5' 8=&C\ 8nȾX"y.kzZi ffێ3LS4ဳY+Wo)a( A\Ʊ=λY_mpe5j"Zecى34~I=7\ Qts|1K6x>>&jH.8f ::t>lL=A9nhs(_|{S}~W+WԱpBjw@tԑnnby L8*|2cQ>(}fY yFD7پ6 ߈:¼ާuL}o0EPMdKPhFtWg72gXϠJ(\4'Ok{Ep;+';fh[^"b +^/cGi_Q< ̢YhĵWpא=Z$YVI~^P"zUm濹@2Yh;R~);(K6! TXǯfV^p z|)˷h({ ʇsYvo=^:&i)4tTZPyq{뙏ˀ/ѿbPs3ql/mHޗ>,اZ=Ĭ5ϣg~hh*Qox;5gdzC=dAuMsy,?ScD:zFCmR<-B}fC=]j? 5/Cut{ ]#׃=Q} j_կO ] Q#졹rE='Fi}<ϡ@|a{c?"`! 6B2 _a(nf@w@hơ\#НNfSU=k53Zp]SeK[ D#&DiJq<(Tfz|YcPC**'xߺuf6o, tQnaq4+lFSmo(Ԏ[jIʎ2C#b}\ vj$I5ff8Yg33 +lff_8G!O8ME < GC>܎;ffffffɅhܔϣtif?"ز4ޮASՙ0瀳 %K9`h: 4vh! bfffOaff03xVG Х=/ܪ3}?!lfff XN"YxHz12GIC+皙 B*NՊ^-:M0t vBw'i̺mD 0~ 2333맛Izs[qZ '<I򯬀xm|8ꄘ _fp^=)y̑1Jm[=ڐ5:wXa>233KqgkM*K uBe xOi1|#IcBcnjIm{_5?LߧQ,#K#33fY.fT33nG ⴘ G7wп] f,}MױV}RpfWW33ffVJֲrcaZ5e\zcXF/lW^yQ=cI`C}eSwyZdYocf 鏥u{֢#CCʍ'6؇gB@yJV>w^ M=\zR݀{ ο3Ivd~oF pJL`׎ڛqG3|,ڞ.;1[: Q(!;d:{e7D=ċ lu[=nCyhZQyUǟu{4y=8_m{ɴĮ ߩEGL9G<2^0lߞ:$wx74x/̆hn zi|:")pGwǡ _&u +n׃ 8l*1Ps9؅2w@PðsҸű=mz0uLـ=MtR{tmt}G=_S軶NwPơ" ?CvO^kxM+$7\0؁dAoO:`]hDVE90f7_*'IB_".ދPOHn'{:ߨ7[Po]Aթ$+(?\ : ϠU߾}Snm"<[_-g:SDž?Q~0 8'jmM6c{pΛkq^_ _xc"^Eـe9oE͚bOU9od, ^Nv;>oO dj[/cjO:43fEƒv#LcqtS1m?ۯ@ld=$yfUIYA0Z#Q]>Wۏ.$md4 TEE. ΛZd/KQ՜/E2%<5 baO9<'G[zL =Iw/ 8qHjG)Co T䝷fl 8O$3Dzќ67y>iwyTz:%8o&Ͽ Ie΍ϟ`_33-oJN > ǐl C}@toaTFO24TkMA>NA nNK_ǂǢUoP@8koJ!dD/I~j'4h΋rQha3,#H]ltPϓػ8t*E=.No!}}.ف't@j7 ta=ԛ4gi':^yY_\,z$nMgQ/ePpyelCplmH{P<%KF߽f3uý><›:R$#AӶ5zM ϳP햙hd_4?iR8I:=/]vq 4*^* TkFt=coR?gViѿ)n-Qya; 4z9Mjy xSO8;"4#iڴy;˳PXw?M bff6(A٬h3Q0ۨ7ND46~~[x4wynX3x~9VE.B< {K¹#LWy5?@ӕHz/L-b XY& lܧoߑ{e IG=u@om6|} FzJ IDAT(B45FU˒L}1S?eS, 7Ni%Cގ%{Xx,Ѩ1]74>9V^)t8ܯ]€h˰ϤWyApfh,58{-+2d4g{T[u`yڛDEu&H|OF=WF[;/ȧpf(2_784z>PVy;܎^zB(ދbÊ*UkZEk/zQQE@ EtI%̝v>'~g?gΞf֞Ϛ߬1x F[C1'9|d$c 8Ct1؊H;kb|廒 :;"ߌ5^~ a?E^b51vJԧcW7Zξok7 P/ӈ.U3rKқ{kS41Tbl}<szNZ{:PA<ͭ,_Lwv.7:b,iפA'{c"w;ѩ|#MznJgu4Vc׭:c&16p0'ƥĽHyxusҹR%iu}5;ꂸcU?Z\5ǰX6D~$,% 1d"}q?9b~CI:π3XXsCH9xńy阓_pMyޢst·A2U+)&hIi'YE] 6aқ/R݊/!.$&R [ :$ $g{zqˉbRܲk qt?-3nJӖC?\6D:ӪgDnN徙Y;ƇOHlxYhՍH/:9G54|z s]C%WusnGDyZb櫉F A#@<lJ[׾^uDzNݞ豕?x5p*pؔgg8X!D{SQ4; ѥk駈]Ҡz8?NiNS3Bdb F7\g91D7׹rM!oC:|O=C2~?Ѫ8bcn{%ZAKjeSL6qÞׯLWdK?YF-. #\ow!ךDsgeCw͌L9}(,ڪ*]J&m zm"͹({}hl;-<*wP+d۩Yy1n725y_D^G~S&d?p,u("s-!/@!^U%I35i`+֖8[RYenV:=Ímt C~AmwVs2#8M1~x6hIyV҉^eV7@Rf{0n_[1"ɑf\4OzשJX2!ZzOJ֮3C\Z T୕)zfqW5cנha۸ x3E5mRr:sD|u눇eiKFvӱ[~r@SӿɏG([J×&y.IZ"ұNLD7'Q>H)Dn<)kp:wuiG)u4NOp߷I̛vӛþg˯foʯWoCIsug\o ~<12 toIq߀ 1sH}V>GLZEj'ԯ??6Ǣ(ZIN?=74lN[~0q>TF-i / +(ߣNǁ_a=$ƺN '[D}cs|w*5ZC!`z׺S{-|W77O+u U4 ߉'Od]_YĤi;J7(nˎ/{0-r XiD'dZ{1W--#Yn  5x?/)moBH4G}$)o7 :k5h*?֊|siˎ-mIsUɺ_~9{ %9ĘyAimvtq㼔;7#l̫&__BSb^_Pz=JQo/,;"$bgY@Eo'뷬)6cx虖ቬ RWvfZD%7Sҝy+q^98ߖDEˈ`xn&rU3U]^{b]nd/''~K4'֤4IShlu߽UV!$I tS(΍w!y2%ݏ- <gK֗J~"Y{}RGܛypCW9*sx (ΙC-(M?r8=[I;q}i U&K2߅i]ʟ= $ZA w}q+f;$^A,n7uͶ&foOZn@\U[IPΓ+U6* MG"P_J/F+ >q]G{/\ۀ3*{$ U[gʿ{ym,ETewZ 7Dk*7R+Z7qiD]TWK[?}ϱbDhZ6gףp3}"ߖ Z_ .88=f ΛXFt>^g,_cvg]!ZR_bj ,Bdc O,[RthݭNL1ǟiCfG[ǨQoi "zx0|l+2̣8:+ry%ZZG3w#6ԪmL5[ݓMmb:w>cfINÔap!!x8Ue,YDຉ$-|+r;gU +l]ImJ|?='ͱ\K$]:Ed]z޻b$ ~@ѕ҂6!fي87=D.8N#ken'zG܀4v O'O#;(ZGu:r~iFlbED0)ƆIv!u2a9ڙAԝuts/"/7mĹ@⼲A9!Z=\AL9q]B7YT~[v#O#SD|9iw}"Iư|ȏ-?; 5$uVS|/sY$I##oP$ik@cbu~ybIa}"\5bHwgN|$I$4&$Mt)\t`D8ICG..s!6ҭއݐ%I$iTpX 1&D`4ˈ?2Z$93=W=dNV$I$iugC3;WMs1IDk (&';xIr)KYSf狵VηChMwJƟN˓I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$k}0i]I$I$IZUxa1ZVz``>Q/$I$I$[}.hű8d$I$I$IZי}- 8 ܕ >Œ$I$I-zsYFS]%Q,$I$I$[S}.hkpQ*$I$I$[h>e 8ؼu$I$I$IֵD@`R2'wgi6Je0H$I$I!lkkSP:1y"$&0 +("} 8#[ rۓ$I$IU{)xs,nԼs( 6݃_n DK*Z8C)Ơխپ$I$I/J/qGe+S Z0 T2"[YgAD8X+da[z|qAۑ$I$IU߉o ,ɶ Oyf<ˀC*< XY<"͟)Z(M4U餅3Iy/mN$I$IV[:$ϱҺg$.`p9$; 8_M:I$I$IZ-Mƞ6h<l68KبӀYL>R$I$IZ3Y~V\N܉28z2[U n(9@L2؋L gI$I$i䥭u!L"&XA{ v۩F7c+qƀ$I$I4+Yh$:̳2I0Mfvэ,cY$I$Iy O0$ߜo,/Ynt ;g1Ȁ$I$I4:n~nBO܍=v]"ݺؿ~.묈M&QL6xk 8K$I$I `a$hH N.;bhA*/vΖ>E$I$IƥCc.HM $I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$IVIkcw> KƷ9--ʐ ؿ߅4j>lBa_"ӁIm^< /ixm ױi}،~D$)E Èr`s\41ٻe1D,Fۉ=\h]`)q~a<,W?C}.UODraxR`Qt:X?$Iji?"8~ED: 2/nWo1ǭ 8e46"߯8c;({ plK[IwSԛsY:5(tx=i$I838Y"(.l6OM"Z=sne' -c>e~@YsY$RR٧eVwY@~U8H#4=lUD w<؂8OD$١Eo2eAm\CuEw>eĀ* XFe6V'Y#>J`>Eq:Y}.K7&%}+Q oI5\I\ L2ޚa.p - r |,DV-ߡ߮e>HqCYOKfMbpQҋIӉ1&Q w"WI/>˼Sr p~>1H16h$Ҫe##B:ﲼ:!Z|7Ė}-=k\E}.$I,ǮjMݘX"xفZn\>&cE/$( uʶxE9D ޵m?FLw[}^l0Oj-n׷($`kbi{w3W?RJ>ؐ{ 1~(.>e8͈%zΚĹa 19D=+{M#&mJ!&Eԉw\`lW npE $)q&S;ȿqgax=TJ9},e >ee|=#Id!lg bȿ{(:1k7&8ԙIԁ ެ%QoAViw!S{;H#B3[A$iM"nMn<)FI٪t+S *kOLU6[WPM]zxvMxil %ZލJy$5y<^v>K[&i:^La 8弊>U'$lj*(Z|I2mcgS\Wn!Ljz?kԟ'=Vn{ߢ|'#˝k.8 %I*bOۀu0FZɥt.Ҁ;n^4728y뷇dEˑv$eM{$hn<9&o$nȃDwDk4|Hă˃)&Nj7眵%43jip>$Ή{gSݲ{q،uU 8ϮXo}<7IsF 弙[3]c$ӀDAI@k4wXvI8CNnFt7&yzup~ST.K6&c؜d@&" [m3B'EK- ~en[&l@1ɘkdsB^wM &݇av|g DWoqu>o( pOű;^PL@[wf5i$J~..K]۩N浩$IR 8KJGy*V7#),pLdy"ݍ?S|OgtkRxVM;$dTbȆn8M$ꢼpݹSe?7jQ;?ڟ"nG ߤMI jcSb+)u+T Iu:cM~G@a3L!CG8?&z<`=,I҈0\/9]A< ZILq?1Dghu t88[vkBlwDݸ?"լL_cx[Q #j~{2Ug^C~*a ^ ܘ.1 D7J#"h$-dO 9aEn?&{:1ޟiI?x[њkg.ږhu#Chm0򭛡!p =D;sQDPyݫNW;g8JZ}Ylahn쒶,D 36%E 2 Γ[nU%IR{zWmҞ[b_ҴL)+1ks^SKOKٮ?,Y> pqJIb;{$~Ou 4jK_^L0m3H  Q?64 +}?n]Ϗ%iZ̝Rl݊igd?k6W-rP?EY;*4)CC4uEqzVvMM[tO\/޿ac]Y +֝dTbHe牝*K=G$a z7';ִp7T乥d "p;hez=Eknޟ~@ۙ,K}50ևƆmi aҺ:?7C?^-O1)HxF|v^cMg,Sؓޟl]jR2=2b HσĤe齝$ kՅ DCjZ 6Smy,t loqmek0QbE}츴[]ML(OOZ{HãW4]y}453lHE*7ne*j;?|>?^[0'ʯ)gA$;Iݹh:bhVnԍC?V'$K)oʶ3ܙ] 9a dݷ*>_iDA\ۃ*=SN[n)k]Շ1.ɶ8:Y`}I_ҡ2F x *n@L Lhm: As.Rl BŃ'|8~ 14sjKRusPC9TSyHyfӒ472=3YUP#9]lGܫy~E|{AsI &JUk;1 8ܝo]n^%K=F| m¾o".dyˍR'K1۵N6 b܇;+i4-D eɺ_u U9uGC^d bxtLDFE[8Ϣ|^7uoP{7Qݕ|ˊQ 8c&$1kMz# 8(ܭb{CW ('u#pBq8B %~s cԮ$I҈ؓ?3D˵7Ui@"1gp97"8Z~If?9N~OAR\.y"S@z@Зupx7yU-K'`hNH+AequuDQ"mΛC:ѽĹj DV!E=z;yWI#[>8<  ĹbIE9i#\q8T婲9rND~"Oz,:`ŘHmBs8 ԽDùDx;$]g_ z=.msަ5BRu^ؔD=A1znqKg[C ]$iHx }.XJH[8އrm@sYIZ5G14\~ڌ\x-Ź$um֯"_#P.E$ ΥIܡMYUy"\ab%(i|KǤc/X/sYƃR/ 4TS(XH0@esya/sY$I("%-ӱL?ߢHakW,n;$ͤdxǠN=b:̳s(`ٵő$iWWnޟ-ϧR~ѷRxX.RSXk8n`ldxZ XҒ4T%Fi c7[U},$I' ?c]GLtq(>klK4:'zt2 dw_YK.B4o͖/!&]K$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$IrNIENDB`pairtools-1.1.3/doc/_static/hic-processing-pipeline.svg000066400000000000000000000563741474715105500232140ustar00rootroot00000000000000 image/svg+xml paired-end DNA sequencing reads(.fastq/.sra) ligation junctionsaka Hi-C pairs(.pairs) paired-endsequence alignments(.sam/.bam) Hi-C contact maps(.cool) align reads to reference genome(bwa, bowtie2, ...) identifyligation junctions(pairtools) bin and count junctions(cooler) pairtools-1.1.3/doc/_static/read-vs-alignment-vs-pairs.svg000066400000000000000000011223441474715105500235430ustar00rootroot00000000000000 image/svg+xml side 1 side 2 5' 3' 5' 3' reads (.fastq) alignments (.sam/.bam) ligations (.pairs) --report-alignment-end 3 In cis pairs, we reporte the side with a lower coordinate first In trans pairs, we report the side with a "lower" chromosome first Pair reporting order Reporting chimeric reads Other options Unmapped reads Reads can have no alignments on either side ! Reads can have multiplealignments on either side When reads have multiple alignments at either side, we need a rule to select the one to report By default, we report the 5'-most unique alignment at each side Chimeric rescue --max-inter-align-gap ! ! Some reads with three alignments mayin fact represent Hi-C molecules formedthrough a single ligation event UU ! NU ? MU ! MM ! ! NM ! ! ! WW ! ! WW ! NN ? ? ! ? ? ! ! WW UU UR ? UR UR pairtools-1.1.3/doc/_static/read_pair_MU.png000066400000000000000000000410371474715105500207760ustar00rootroot00000000000000PNG  IHDR%sBIT|d pHYs.$.$* tEXtSoftwarewww.inkscape.org< IDATxux?(A!$+BԨS[گWzNFP$!.+?Xlv"z<]֟[e|N5^c'bK%~2CqcKR yQ%i3}ڦwo mL=ۼAqq\l<v2h 8G gܟsY[O[ y8fhBS̢l汃Ŗ$U.p3?;lIL9lh xs#_Ht`z>1-߰}{p,/pVnZW۲d]8*\ŚWoډهu8TmYn% ?)lxk_S%nhr>#dC:i7(gGNb7_k).⍵& OGj_M Gi%yqJ[lIc;Jxnr[lIaeYNS_U]ǥoQ}17TdųWiP^> ˣtĮ2VL^y"{2'l\ջY9m F[u哶⮭bŴ)k+HJ HG 9e` L/Yoۊ{S8=}~u*~.j-Ǧ`Zuki[lҏs3hwÖB[l9o glXW lEx.V=ue^CiFU/\O] @ &gsFmj/@ư-3,#[^D=eaI6ekhŖBPnq%/zw| *iƍi.w/Wbu9#K% h-Ss׻~pB.Ŗ+g3O_?[I{p02j'6x5k DɖM銟KGZ-fiGRœXny"6}?[l81HTW =wjݮ`rqϣt[B3h@w*o/:PF^mǨQ{ExlczKk<Go--?N.sao(Ezܕ v.M3iG_FCβǖ?v#.gb?>32ƌ8yܷhvHj""n˦ ɖp{ªJ[Q\x8x2/Tȱaa<8 "skQDww*7dݛwkH;:[l*\7m:l-yJƓqRS5U%.sμ[[Q EŖ=aK񈤞\=Bk\a 9Iܐ)ֺ5bR\dvl~v^^[2,ܱW~vrT]$;GD$՟6 \x 0YWs\Hj* {}38ltU٫qU^dMy[öe215Mk?r9 vlŖqRZ~qJmf-S8-=Ckv5$t;.ugedj7֮fN=Bc0Y6BWV66)Fk_7ב{O|Sovf@I|E$5Q$uEj ' O?-k_GH(YW?MDB1ؚ޽nE%%Kp'e~=)\^2y%+mr}7kOC&GLw/kqͷ-?FY-6YoSLpxM ǎE_k'6cf(CJ|rk--a[g\PYcKhɽ|x-l?KkI=&[ *ypB5\EH#ym9<(MLj\.3 $EDGi`Rv3uZXSbD/O8Q暹Y].p^p$)px|Zo5=|6fCj`>;Hg{÷<8FNq6V?=ocCȉdOy֖$i Gzp,9S-גG&ksIE/ؖkgisه{ëeZC[qb˶?f+m#pggKG\PCN7^ۖ,:bkU%ZGppm]D}W{a^Bqu+|4V빃8e"sݬ@IxUvz[$z(Oډݖi9 3(]#_<?{CLjC/~/-1GY5RW6~۔{"LYe$ݺd% x^[YE0"ɞL,o[Ï[lWƤ$潼u4d.g?-)I!/7\cIJ"tOy1}I.Iʄ{9Zۚ"9t~ֶ&&SHY뱦|,9߽l-F2=%߱mGZC._el{l ڻVΥ'mHwo]mʔtˈMkM"rIg. xMF$pc_nWg&4#\>,TIa-a^Z akl[lw&qƏkJTL? z\gOPG[l}i;b髧ٱp-hSqth(! b\^/5."SiTjE[BN-JXMBˬ@tWwmrt8aK-dKHdbKomÆin0/x<Mc7b\ǖܸOCzmBw6IAhyd\\ de|~vXAhqaJϜn=>'4>~:;Fri5V.]$SPbd/LB7m4;b(4=wrQ_fXvM6vgPwX"v\|b^+QAKչzGN_V`9M.Bw$uIso%ʳ㋍m씠[*m|eC^Ah4T7\{FZ,İ]QV%拦Uhka@V&ND oR B{UnCz[/汌 (,:З:0֣n=3u{(7~D=8 B A#fu,}Pt {7no'c'ty2Q+o\[~ºBp~j.!UI`~Wf>eme-'{ם,g9C' x kJ"!`JCMqM>^}*hn(WFDr V5n?ڞxEu^`AT Poi}X4V=~zB0pŽC+^YwVơ)AojN`pӁ肉Wh: ^ FM9>ϭWGj(b3Qڊ =`|c, e:$OGƗ^՗2u2}ٸ{ `tF {E[SOw"h:\ N" g(o܄fc{s9%UFL**'1Pf] @%xAT jT'o< 8Mv'&r[Ò&h}`-}ӨnL4 %gwB'%U2o6>^T,{v#,I#5hC%507gZ3da>AmQKÒ5X^5HJ7p)j`7~5*znCڀ8esF4R=GӋпDoB\]'wލ aM{Q1sQ)$~ctlߍ؁Uo"LP?FW]aI2n)B2e759.zs1f[š4=6E==|Bu~4kdV#ݓpW A0ZCi.Gl]XlKpNQn֎yEF)7_618o-=4Yc;NT{(/XGu/P't1](U;):Ul}1z?F`?ǾD4v8x566s9וKf\2[hznJTG{O#',芺Gm%8Q;o:C,pԅVJ KDl`?I(ϐU+0u/[|d ~B!:l%$*HG=Mduw@˝-tOVaxΟZvŨd$1OyͶEO?QtQ l|!QnnhcqͶ09atn{Pi߀CM]T׽6ґ\;(XO JH$竰'{|/8QaEjl,YK=nC: w.MDspc<|]#,)PRnCdtRwtj>%c}(MЍ n-lԨ_A{?b5%mޛEg§nCOOT֤\IIP٩|'ȝ6ґ CeU8|SQO֋3(;Q] :5>oC7݉J{+P'< $$ iPE֚$۝󀂰7 C Q㽽(Z_#]5Z w Qњ/,G;vf,{:1cԵx:cwU-B GG]0_{| 7mЩlպLQ( *B?6^2p+ @y23 X_QDx)hj^PixzA@a r-t3{zՠ7 BPٝ![(!_k75w(1IT;+žY؍5 . s=݆t@bQ#&HA=a B؂ YH*T4ROEHmC:@؊n D ]|xEZAA[6Ġt7GmHnon:hAԨA2i t^Qޯuv tM G *='^*$d$, Ay6߷ې=rb!D j=Ĩhj U(ynneAWZTeeBCITlx?SPYAMɈ8S&z%$Wx\YIIM ^ot4105VVz %;u'Vir vю|V.AEO8W;ha26:(FiFTzbg7ƌc&xtm q }W*+xp8%I#$~'x\l9 OCQ{٦o=ɀG3_Υ?hL&O)A6;GD&4EuzDHƨq[, ,/>JjPn1_~ȶكΰfN+vrt"C3A|x إUU OHd@uu:MY{[XMs5wq 7Uʖ8_ÛOO\ yE/.QHNK4=kw=LzXGtG54f IDATבDm`#^jg%$ÖBG+vr Cϟ|W_ԍ|ou+iTs"L1$ Gwz9 aŏ?d,sعGwsCMm nݟKM>8ꕦ|zl,7_mmt˱~ec=Hk[u z^_M|>e^}X~& \igبБH;Z"R੯qGkht* ƐO;ӚMlU>2'ߍ3T^>Op1vOP:TrPsQIMS]W s1u1g!7`#rFTnDcK5|>i`:+kVQZǫ̌Lpvim z^^coO-_U ߱hX՛oLJP{;ùt~#˯(&#&o3+!(Q;J(Μpy^L&6]hӚk W.[;Sg]k,3#s P z 0_E@qzPN@{juSgӚԅ[KKwskRjEwS+ɽ84I&ˇf|oetr/{;>-HÍc}c~{;22dpghqgq=ys 7͜F].HJ!+vy"JBBN2ɝYܜvfwi/aI5Qk~ʂZύtᖏQZZP9d`t3q~\Frj vqjz6ƊrM9|7%9R=9Ą65"hh &4Iz謄$>-؈ lχ%e+w2i`~?"j*2'TYi>M{;9)-P53nmn*ۃ7+^CA},޳ ʌˡ 2Gmp#5^n $;Ǹ̑lc5Sq1)5"R.@VXYÉHT34Иv݄DDٱe^೴NyBe ; :g}a *-~vmg/=4LAQTΓ/; BPnj#dm0ДukV?$!Z{YN~Z}7x;EKgz4/ޣǑNń((ZX?|֔i`Mƙw޽zx *g>GN} -"/iN?7,b/8jnήf?wv.8̛~IP&t 2 rb/#.:ZV;Ӌ O^M˨u7I=9wVѡ\eZ]}Xe:Աֽ[xc?,;k{B%<.Oڕk18dp>OC-Ǵ_MdOݙÇp͸A=vۇTlSkDDq_v]V e߿ЙANT)9+k;>.5Mk[zYdHWe]oBym-qe __wv?lюfeB9a@Xa9)1kjԂxaYfoaM{Z{G]H˥3{| $۵vݮb }Ѵ4ɝ3s]lYL4ΉyxSpQ\KL HהM\ns/<w+Svi$ICfn.`.A:r8p\]zPdYԴYwR@ -=lEP&toGM4) Z;<.ڕVP1_ѿMx=)IqlۼOL2Shxˉl:oR mϯZAKL'0p3 숐dYoOn^I|TkM.VLզԱ6w{o_KI.bixﺜ&w wCϬ\frg ݛsQu5ჇMsywFK#-K3,3x]Y1~δ3nΖs` +$&; wF2;jk5h>znF?h}t^:ͷwTi~zR(N 5.XԼBCIջal` SqXd-bjR\ljg'&m+6MoĄ129Ykob!нNbsɷ]k+w>7Pigz_ț^O4%)%Ju՝]Y|JDsp'9abx|9_k ~M|^ojO[Xj 415M75f#֔$DCK u:9a@Bm[sqF zEN&tf\` 0ˆذ:=ѕóM >.'8~ >pETsxtLSn,9!$ M$1lUyEKix_M|^ϺݺҡM-UUQަtV"k FhZ\4-bpf opy<,VN=J"ºb6ϜICz0ͭ 4A #AgiulS{B& 2,dcr5UZ;5(l%J?~AJ?~q\2܁ネyl֮CXQnrҏ{Eó+I\4D>xn * F?l)dN}JCLSBP }M`\9w*ĩD$ImJlyE1';zƐO㏅.O}lX0&vd;n 0gYhhUCgiͮV蕂œN1Z@ֱ %3b8y`i'/J 9L5}^: ϫr.cf-g/O倞psμWd1 ݝ߼` E8vܯ5A2sYC&6|YRh׽yBB'~0&"VU򑡂Ϙ^֔i6ZXV9+#45:^\m2byVf1Kx~?ap?+3gZv`jb yAk Iq+XtXK0B$@,[K0kT-o-(t /p^V1(<~~ֶֶ=oмmbDlZǺݻb>b=_F&3 ϭEYIMFϭ\NUcH/]ip?[KjkxҖcye9nF pk0Fcەߚ20Ԭ-uÈ5=6S,'/3<"ֳRwy^5B$Q>oQޘR":i+-f3+goa-rlͨцdZϨU\jq?tam& ƓD @: ]D-%1\mu9#REC9aH5/u6iM_=cLYecovaGm~=~G^dG6~:MSo&GЦQkgm<Fk|C6df `X_/6k#R3.nh)n >ԁgZ~77*6]4d},gcZI=9^W~ *Kf5kŦrF AyxGN^kOŴ/B?3k/.Ik;"b-Wn6}֎NLʄ񛵉\J`q0 p#u<Ѧ'z Pwsgp1pDc`!V 1ƈ9JKZ-)nSܚX-u BX  4UbqL7\f-T*C-K\xtr/&C|xm6L#<91F7yLi7#h̳#xG/k{`!PNߨAjG13 h9g5v:4-,6T9&--.Ϧ ڮmfMY^^TSw:20^S:Blo\N9|bR Wn 辙;b66LݟשڢG z a1μhE?{p,9񛵉GЫ[Y7||^4˨v xhX j\߀Tn}:8KZ£z@n &4d:P\u !iQR߸PID-.Z׋ HڇKڰEt@1tƂ tibRӍ.FdXv4={ }w9PpAv pCk9Bxo(!%0joX.ODB_R̸hJ|T4@/Hg,B`S K6.z(T3C8pNuhWXnAHd i']o\Eۄ?Bu~ӀE{tƂ tR?E16#9{XƿvHg,B ![┅΋x}pub~66!qKCY3;\&B du8=hX>n &3<춴](% m$nHr0.UI輼s<%xzߔθ`팭mAZICE)ml2G e/5,7.jθ3Qfib tfOC.JC * 1\g7.[ n]B:΃u$, ek~gOfdX^38Hhlމ^={ZQtM-uo^ZlIB`5 >=4SBFƝ >RSl/0.b9B '7K q-3LX-k)Ey 6#o24 jK[Qԝρc v"uoߍ׭UsWi)~@ϸUƾ'O ͭ,q硸%B:]/4.7Mn%;}6;FKS_^BWIDAT1.JU==k<#x5b#22K{pUWU6#tN7J{>jx!PD #bm-@:cA,gcL7QZAh+/PDTkO\JH,wriZs)j.B ֿcP &s#9 WKZoQ8Ԉzg`j,t1P1tƗ}U x#z'; z\jBDӴcn522QU?ī?Ӂ/JUݒZBXĬC}I 0N%dd,Bgת_` 3+xn#%dd,Bgg-05^J9QSȿ:'IENDB`pairtools-1.1.3/doc/_static/read_pair_MU_MM_NM.png000066400000000000000000001250171474715105500217620ustar00rootroot00000000000000PNG  IHDRsBIT|d pHYs.$.$* tEXtSoftwarewww.inkscape.org< IDATxexWր_;8 NN1-oq˘eN)M))lymگRJI@ӆf;fq,lHw$y$#y=3xIEWLK$Ci E12FQEQE?]T hKx)`\X 7-(Q`pmcvV뭁9ÀMK$SFEI&F%G* hNqKS`ik4x)P,#RKqE]yFAgCj~@]“L.yQ޿(JD5((({MK(Jh`R?N&18FKx%ہ}((ԉ ((((Vgҁ+UۅӘYfU. \&@4Af9{-Ⱦ˶9YosiI22{DY@mel%4ex2Ǽ5(0f^kQI9eJ>e;w4={KO(zs/./m 5ŭ%~q¥&( wDc[wmeҧcE䭻ZIKҧ_]=l3Y\R?GvqD' !ZSP:WdWy99iisW2SSX+^/_YŎ2uťIZG''VT[1G?Gk,^vCi!.@C. lh9 u|y\V>ͫTKDnD≷BB:1o .Gņ]Gty3u90Nv=i=FgҙlVC'w.ː#wAmrN>܉ݺsRTQAQEw}GjwnݹewEvtq:[.?Fp\s_vC0y4zߍui9\ie<{v^ <طº\.~~O l3$ \VgW AѸyڄ˙juQ\OM{J|2II^vnbKQc.'\̟p%ފj~FŔK8bRl݄{EJhv=+2.mp S7;v,ޱG (gۼX3:v#O7:v#Py?rSˁgvgs9iEi]srQ36os%)w t0o.A.37obQpQKy66{F:ˋ1o~=ae(e./{H'|E qDKiEIݶK |rA;mr"!Eq OHkҜWHjV'O;U.Y@jV1\r(5^]\R1]o݆KTof[2k\.rps|^L(x p5>o%z wPe ^6T=̻Tl\vL3S9}ٻz%zc.gv8˶⭥msy{b>_ʐK{.y+?JJw%5 F?OZfF\xm&.Jb %sbZiٶFrym.c\00m)uQƒfǒIOݦ!{رjIf\޾Ѥ}/#.KÎ, .5)'ݗtX޲9 ՜ӻ/tTO.gZqs~wo\QYy㯠bh֊W.qQŲb©iҡw˶y?t5'XX`oUow;ZZ3.S?dݬWow=2&xԏ7-cP3.~ȟbХ6b:(n^D?Cfvf\^E]°՛(\5ri2̸,~ WIOJQR<:UJ*+mT věs@VVrSa{1Ǽ6Nگ^|~;\ܘ_U.\#52 LzzsQD!pj=obH!pͥ\3r7}^p\iEt]m-+]̸Ǣ7-Ws.uii<8brZZN덵 ii ge;Ws.{3yqKkdE1Oњ,~]Ң~t;3.k{:ae,|F˾t?F#.JXv7l5re_1C. '9yzLaVݽ>'/˂),j_:<3. \:r%:nޜ ޞi,Z.5ACݴw˿ l֜]⢘b捿dwߥOIZX]d@ch'sʒB8H?4&B]A:M0x}5!n~U |˕Ѥ}>"ynrp2qZ q"c47\knᵆp;C;Nf%~f086dڀ¹]Ϲ9\etك>tǥtv yfQuA%٩ sm咐E ׼koe޶m|iK-iNm+]Zq!۷e3rxs"H0$7t[jx6(E M2/ ^Ml:%#ϓk QlKz&sy:77@'޴ \20ʐ$B\Yۣʄ*9y A\"m3G ĥM#j}l `Z'U[:qX-۾:.*6-.CKt3cSKw5t^vl F\"ؠ@zJB!aB]-%wKk" +?'۪{z)N3e@n%%=K]&][-SosD{+z|hAz+\8{W7pn|-.vZl}>VmIZFNjo^ETovOn~j%!.voeڐɠBl]yԟCHqt-]yfϋ[]LHsc2[vEO0p{κ.c O2eU9%/{9O][I᪹rYzpc˵O֝v3҂yw\oȋ.u9sjfkrB7w)6w2e;7r{d4jU`]gۜ\5L'\?&SsSrl;}\xՃii6d+\RӸ}pc.̚Q="35[SsyU.]Ğ]sC,u\:{H]sXt,Ɋ=Ac7?Ug9/.X',xGbߑ>μGǮsQc֠0G.qy2B`^o*O%UH` aˢZ^X~嵱8;$|W}4~]5Z!.]<%.߽).#O?yʉerլp9niuڍ<#.`dP 8ۀ\ *!.y-nO3.ws]1xMiނS1v3NTQۏ8;nU /CeMf^; FM`g(h|~ ."e _˟iexf?VR$ЄKF./@wQ˄se@:x(=&m. F浥TˍsyahL~5<x"6WlGk<֌\'h};ƟHU=GnZ kZkye<9 h=h3.gWXr 0rVfW/ϋcbjt:bLzɸhEߐ1]m߇mpC]m;u^i>w6^%">z':p-Ks9Ҵt=v߿&S?3.^Clych6ܼKytGfwk#Tvɀ]LwHS.tms_L/$Zh>zĂuiyhf=[Y,8m"M a9yzҷe_櫗tc(=O%ocsĐ,ynqk&D#._'o-&7ݫt-?|\ՇC;qaҳk\H)qYǿ/˧HNcK`GH4yŬ>Fǩ=O5 $4WoI^4;.=N5]z9{q96g©]N,n&C#.O?m]3x޶ /]x$ $d .&ϋbO /ǬObxK7a4Co89f<)d:Tb x{c^4cқpye \l祢yϏ6R1},ڱ ߛ6ٱUz>rJg[ɂdj#.V\vݳeK&]ƸEqT*b6 AP]R nfQ_\ᢸf(9R$Q,|9ȱ.Loπ+_$%=rf\r(5rٸyIib("IOHW lW"8`@b优ryRoEqMVݾ` ?xĘK\Naev=w.;LgfK%3XfDfnyVh#:u=cuZ]ԙS u C]غ%ֱ3eEq')\1<ʋ1oh%p?J]3)5zcEvq)+Njx}>1dfFJ*؛N%?.syp ViEqMToo>{Π˃.g%z YN5+?}ƌKSEG#.+aHuQ Y\ f.0䢸VC E'F\A#.\&Ħ_'s9r˿0L:eW/s GL6siTVͺլ97JZgJ;Bkecq1:ڥ K$Vi<)cp\q;\VS e_Tˢ7M< qh?oX_}kA\g:+ %.tyu|[.;i)?{|gdx?q92Μ>'sWN|:ɢ 6ElۏtXyԠI ǀw %.'7Eq1=N^MU @|c23ry% y%QRed^Ll+5RrSRR ;[iz:py\b[Zۏn'Zu S?dOuƩworٗ'mrm*NuhA{rLp9{O͈=L۴!n=8֠+.qQMмpyY(޸E{\7r{b(d'xx {5 HrRKC d ؀ˏ}^oW1 ~R}lg!t<4[2n.$UrLfZ xaRJQ;2'͇T*!pQ#yHz0PX+x_ٶ5%|?zNj ֞VbK Sh"rʪ5/Izxn+s95%O7/242[.5;!b$퀛H  [e $=5A*%d&ۄ-w!1T LaEq_~ `&ݜZB x5Կ(N+Vx@:/7LBOU۵uĮAꂭB(ьTz3xl;&8 O)?ߊc 68Vq? (ܬHOg*(Bm:ʪZ:"bp!i[V &A?TҝUFkx4ٿL % #緶lYHPC3dPj3'4zcj_y?{3nX,*d~ۊVgSm#z @y-?6=NCWǵ'IQS!: Xwxȗjj瞉@L 9T{d IC:Y*gLaEm9YWK$v|q%co>p!'+wQ~CG'k)XB‡ go]iWl.6$}O@' 2?x 7 !/%i\Ykw"9q:)VlƩ)I?> d-3>>9jJ=ؗ끣)FRFL$p&Xz|305C*P`|HH%U]5%yw a R( Ϊ'6r}ggc;75\MCǑՠb>*rQ#CTϵǣ%absr:=?s?JM |_֗HXNj!%RZ 3|?C*!hVMzajrQ6y7;يwO9!D? \M; 3%HI>,'۬XܯH~<JL+8œېk9΁}Cc߃-Jv2s_sq~:-0-p:#>$GcѤBbF7 wfk H!h 6_@^FTB+fLف'ؗ}?dT}¿(I p,>q{U M$ȊdA&]Q )"2_!a4H]џ? jr3RNR uJ)C3i>q#nژO>RR'J䴍Aݐ.sѤMJd|LX9i+\kk6:PINRB+Éؗ9v7R$x y+nD'MyHJgj_W?6"a1LL+.kډEu.Q:[ґ$Bːf x(ߘ|ⓋTʂlBZ:|V'd m=ߡ2=+>2$u`Œl#B*5)iE+~&_ hMҁb 2YJ| LQ*>dIEt yO2$V{8p'9n Z(!);Zg͌Q 3>Fsx]Cfu&sI8Cbt|UڥV41q1 iXKU5`DXO0 b$Lfu)3~D?+J,W8T̑tnAʇE36|624Gq?atθ|6HGpS%pySXH LcZcWǎ wNM%>IC&' ƙ KB5~UrXz#a҃s 4 vt'|?f%x6#'V`Ӱ2(Ѡ VLXuB6uW #&VxݾKi5U ?Һy2l1?ԏJ9L`n }a!m~Hy\D wk'G ̩% h[pMHɍrNDM(>,EJ+;R& LCJM nljؑ!`Hv͐DY\0dؗY`o(5 j.j ͐R/{poCB,nfU{ aO`%x-!E8Q|ACuR{$ EmX27vV< `6IW/Y CA(\dZD*ÐY-ng:#/?:ч ރ4v. I|3]"%x5fuvHY` RƸ}XN*6܅uqN3B'+b(HZI_#c (2YRqڙթBODxrB;gykN7> 蒕=F8!*6"D+" W ϿC[DX_:XFMgٴHL)EffV''YcV'UnE- ׽45U$1 s}< SbK}ƴH"dŭ[o6<$4y,;BB#63]dVK"N;$⠠n샶Xy5b.p$Xg"Ed"1&m'e-L$j#þ]n#+ώ&{Ek,Ss"DBw~' (l q#HsWFvX_譐NBa2Hw6j -r,6b rB%CDADp=0!eRH$g~`7vIa.ϴA/?eZ4trE'+)MB:CIn@M9yӬN %qWT7k `-"aX,ƇyݍK" Ҝd ԤJ0 \B[|W2LJ9+xmNƙy{WT3-#C mýzC:X,A&d3gvI"E\@s׿mVVڸca]a Q|iP㑉Y]c IHA:)bGB*\\=MT6 l_sI; h#^H:y8$o ?&2$w#`% N |s-658-&^1 )G81"73-$@f5\E nQ,X.cЉU& %6x1J'~š$v62hop&%ƿƼ}fr'+ݰ΅&T) 0 NQIEB >{2HYJ*:_ANX!F<jZ$Eʊc p_5/RNF^ĽU4.8M+BdUV?.D?B'K>Q}5EC?^di$ :dٸvZ &~4ɤH(0R] M D_pOlo?mO|2Ei,o# n/+ZF~UE\L$:=fUavo@wǾ2F?Ā1 !,yʜ⾯a%97(Q#Ei*wS #͐y?"u{"A,C;Npu!r h[p_ckT |HԌY}3.KΡ %W ?'6%V G4E(͑v}D$OcB #eYcdOI2= W?j_~lpR(8\S+%~AEQC R?xkUY uz'"kq:4ni "KR|yF?C欲(6. 8n?%p 2WԶq>_\Khd3:($B̹U N,! GWZu%d#sV%+^ː%y (A/Yu|2%s+q6(xﰾwEQ:ETbh) FGw}g!H}󺊢a+NAOEViJ.EQEINr6c=(IP2fHp#IQbCQf_ <p g=pt4}(J l*uH:s*Yz$+ÑDė e׾)'n@c+(p>F6,;Va5ϩgJ +] xץ4MWQXO/T.8WW$ȯ~|c(q;i+??"t#1VI"7C:Jh(Ӆ`dAyE?=" 7(X[{vW#~(&Pƿ?P?z$d+\L$U^BW l J9ߛQӐXzñVH~Ua"}Y,i,nBˢ2m`?sjqXR%u7nZE ӐKppW<+us]tK =ҨDӰqo_?F"Kk>34}gN:^"XG.\F*7%k *B+ꋿii~ IDAT%a52$7P3wgj1rRQUd}v}ejr9K s+ꇿa<8~j(X_\?uP q EZ7Hل_Y|!/;dɵuñ$O6v2/||gґ/L 1) li%e1dA/EWzc}n0#HC.$νȸLrֹj%H!4DSقhPXx.n0rxg%_MarYWL\92R>ك~QJ)e\2-%yH`z ?nXHE Z9j_]8:g $:eӭ H=ٟSd!+ˇ$&mƍX+8'DP{cG`yzV/d}0(3މ:?j". [TzQ"ն}jy9O[L(qC3\d nD B͐їc%( ʳHy]V6XX \Gc|g aUb]ε{%hj(]}]܂u2 (Ɂ (=%2N=)$h/6Ch3m(+J5ާ,oGhrȹrbf~ z4 M DBp&!(}hx8m-E:I>`)Rrν7_"s25h%5]g C:Δ p0@;hCOjQ͑B;SG$;+%>}H${>d&n }D5b^HIXI:nNˤĜ,d .BTv w^G:A(u dr)#zvH"`NA 1㍣Ers<]E\@>2cl >n\zX}@(s<MdP[Qљ@ 0WugE 0rS ϐi :vQ̓5ЁmX]msm_Fo"AM?"咉J6HXFv ` Ϳ]& yi%tFG{'L#[+(" 1' Y%8~cͩ՛ 4ds2Y!Le௴|1?Q LϤx{c<+=)`UJp6!8|18n2;>pWDGaXs4eS%7d"2'295# :vIt L"a%2!/"m-\xGr"( uiFdB>̜48,!t}\NºHGv5M8 ÿ(8:'&Tu/F##,?u(J(+Wv5J7uNm5gɶ6,.yôHĥ[N`",Ʊ@'sj1!NEQ9)_26fZPsh2:֡cE\bݔOvHӴN;1DI$lswa^ +NCbf{qӉ(t߉H:p*k#15݊5O$jNX%]ϑ<մHL($n̢CGb$oD(2kZ"r6R{Nb׽A:OBB2n_Luh, DX"nj5,$|5~D c-eD S (au*YWD 1CFE^ErrBlŲA~g "1)H!w$1x xH[-;.8԰K48 z~yY՘d#m"M2k(8RBD:효?Eq72?"$(Hh2:> /  p2H S9lH\}KJu@Wy8~4AC Li1!!#3ˑq<tBL|gȽۗІYb!^0 [ | l,YHRxxiBYRH(Ne? `>RY u>9D,D 9.D$HrDYI^dkXk!/t? Y]4-*YK|@$dN*( g;XvE&d+c7Qd~5(IdpC((ed۹PGf~^Ƚx.+ZQ%l@LDF~lFbFVv6YHGP2%VEW$Xi8oxj\R ӀO_QE c=&$ ["  $PҐk.4D(VQUO$E׹fuFtdպ( :_DVb2"s[x!uj NA_"3Ϭa!us;?e+CC耄"sbM2PEQC ZiZ7H Ɛx,̀I^JΫ5&EKt,Sܳ5:g2)ٴ~ ZU^{|׋ǓBv.v(/TSM"a>'vnZdRҭyśVyߦejQd@l}W &R #$_=rD液+HnJf~ǐ|[w1oy}%n=SgSXST-Hx8C'Y ezvWT0$5ss_|Lݸ%teh;h6|@vZtD˿7RlߑuAπxSGl9`@͸o|ss`}:W cpeή~}xacte6_/gQR)xyݫOثtMO=ZwkV|*vd&v|<ZCNI9Ľ]$97!ԟ w.JSRhT8{DFՌ4SRR|z{x<rBfKyUIZZ`mۗ|㟣 T6JTkv.*Ys'%xd^/wdGYssi$k ٰ{7>yFx}[i)+ wQž-#JK"U犳-/l\H!-'RO|^/)除\?II%-EH@e.G<Ҳ=f+?|nGjfr[II[5G0+{elD'!>x6to[ԗ uO,);lޚ^?`3j{[ط߼V= sxۻ-aͤN3U3ޣSHnֹV h"eҷs,2i- SA lmf4`չRRzu~dƘ'RRxHϱ,TbRzq7y߾dsWT͈~5'|}#3=CnO虖Se%{\Y< MeW^N6uH 7o $L7dd\mx.@:+^ndS*z9ۯ]!]+ w2v}IFe5WڢBnEٌwϟ?OvbsVTj3‰B?hjké#FZmAZ/?*YӤ>_~֧jnUɣqЧ~~;aСX: x.$Yl1TAC0vѿ`d}NX-ZbA18~xWdry效n5cvp8]/maףmcnBbVuP'h]>mAez[Tm|S7X-meY+O_1M3  C1#.AoQR L&>ޘQԄ3Jq焉n XoIazCjv=Gyg"q jTٽv`6J1/8y\·'5--x>i7A::c7Z-FYQ هPPەTԟoY+O7^>7ڂ8}U&䬒 75B[S=zH5*詝;ou*Àh? 10]` m-CpE|خOka oe iz)} cbG}kRcl`<.B7S\w)ǶbmvMK ^/OyҧHSGFJ}UYȩJ6[CsQ,|Ҁ@աq'c'Ҁ@[c4hVVm0+],/B]q>07 73JA|a}GUNg@ดl[+KPM=lҀ҆F¡98q3Y$ZJ'G~/9悛82a=K  }Hhl 8 @D=<_,wc!k_9h(gkYGL*uMgAKQo;g^Wf6&3w 6Ǟ:ֺJozVoEo$/=^+z$4SvĔ:ژ giiDΚ'h$b.;/ghܡ&A& 췍 U-Kߍ6Q8IZW@?mćF{'G4}:Lץ?wQC3޴V|@=0tn'Fl} MBUfnM m`q$ۧX,xvo_"'w1 E%z$%_+mAڂE}-gݐTD9_o܌m_Ao7UʺoC[/~= w1B-Sm/\aТphlJUuNnU>ŹQј1Bo>dק^Sl)0}ܓ6ISs{䘮2IRE1 )H}SGlO>/G[y5X+}6u59z#(=$ ?٘E;o FHa_5]`vԴT >Ru}Ö9Z̩7EW+E|;< yḱ#5:ij䋤ʠLJU1l13ڂێv {vኈGEz\^i$%_']TcVAn Gerl'; wd ̦yp=-;\}u"NENƣFz/ǡ /WGģ!ӝBcc ✚jl˕O[,O9!:y4bߛVc8&NoZX_YҌwH@iqB)?+? gCs,I<[V,KEz|nB /߫@-T~]ZˎgMVꏢtu_=A?'8VG|~8kţҌ)30tiz㗤7{k|>vh/TCz5"ljG}}F :ːApҧؠ /I3ֻiXlܧX)eES\+) ҧc,ol;~6jbX8΋6&l)k͸USaҧX)vKNHgק`)=\ا蓲W=KK1!eR{ɶ3g#U7I"#qՠQ9B7{-û{aDڀև1y,ׂK:{@Ez;<ʘQZW'w"[7> $}<ɶ}Y0o±_ ovX58UL@i hS IDATdlq?-LD;բQ/l҄ĥbT`6Hz:_xz']-j+;Sf<(g?iS *=@` \. ydݩF^gus3/m,fhZ()xbH5f\3"0 TbXQ$3tSG,!`uJ( \"|QWۨ+2.%P33fBb'HjPW hy=eE'gC._̂Wh|5na}fqPSKUbH}sqj%RYQf!fp33C])X>+KbۍJ3{,b!qc^m (1C{i'^߀`_qMX*ȏ{mJo+crg̩wЃٻ.: |8X 5 7Pj]']@OؾjpQ58hp^*k vV5Mec.w1W=$Qwaሻ\YwF[XMu²]kh\hqB=VX_@"UgBَvԹxk]h :Aټ=;b[*; 3^gz&Cˇϩy-L^6 mV3ؔǯNy`{qnT4`Ø$&N?j?rÂ|}3{0ud^gZ!lz-f_":-ZI0Z,=fhTs>'! rWEb A4p%-|n[.kQ{`A"bL}mʸ-Jnm [V?Ym3$^Hsܬw V<X𤋮@^h u;MJ;ݪyZuh=D 3?#F`Hl?\ X [̐-J&=fhNBK&/>s{S_<> 20-j^ cS~.ೢBIH‰Stu)c9?OSX&)f'b]1X}An)ݶuƌRG@%_"lq*d![\X?rg_O@z8*l 6 Zj*ICT6 ?yYLV W }CW\wărmVw!cW;ÅeXH^r{7_ X/ۡ]r;c(%m d kţWAH}__h3Dl'3CW5fv3H/K#Ԙ; k|}qx˳Le5fh!5`Tp0T" zC C7qc][LmSʁ}*z@B{aGQfȅ:ݖY>f(a\!OMYd] 1>n#]hwu0Q$ ӗ1C:0fȘR fzjn }ՠ1-&T * z.xO dLPs ?h7f}jp1O ޭ(MB6R!,[BDOw[j@ W@g`?caYrQwXmHLUGDžX XkPcLn :p;XGЪzQLZa̐ pT $@Z fHcuc01,\oy@ZQE /R" - Ubh`Dz^~aBǝ.%_c3'T ֗Bܙp9f i:ڰJem8BQLp X^{׫n[FSy0b5bЧxA*}S>3TM>>g z 1CrqH'o29BoGOnaYjp4uR58I߻caYr (kcxcsVӨP5fbG4ǧ 'o ,YD@;6*haق_CNˆS+#WcߕX7g̓bښꑻΈè nW#O7AǛǎt1##q|uNrj hC m[$hI$hrш MG]kK7_޴:]c12#yv4'q^F *  9Euux?BzrfFo7ץm<_@Ph%W8oSh~Gi!mڡ-fq@ N=х%o;NZfY()+)KHOt4 ҆QFbKA> } [̐hqD 2ɳwj(sLb`p(f.#wݓJrOIU1, 7WAr9} ˒v@ѣ,h TKh(3s{zm~:Vo2CGOvU3hQ6wa/4Z ܩ²FY1tiz҈5N]O/\XK@*%t AsUN0y4xA4ϓre1irR5f(HC0SAНHG1C䚱hT+mG1CNieJ$J̐ H9 1C4Ey%36=-F!Ezr8˧z[xHok1COIH}-QZ@{P)@vڧua4F'f?j|a]-VUݣ -#)&&kKJt klk?|VT_ۮ B̐m-@:)嘡/KjYXۋz|LHZxop $,,jPXzQ e?lj9y;X Xը53.B|}wO܏q&^9˙!FIoLJ1C?[%@(f6'1CDɑjTy"e*O">t.f*'1CK O+բ4|v[crW$Jߔt.]m-fH^=iFP[+V1Cԯ@h>HSt͈KP#Pd\ DO}̐%_R̐8Qz_"9[˜X ,(f%fB9fhI3rqNcZ^Xc6=F#ꜫpOՠ;; R z[:Ko[Z֨4d8WCTaҎ gt9C=ízvi[;w| L.}UI9yXȩsX:{Ro;^8,-uo/bG /s^bnjR"nR#!rMI1NVU#aW̐Qi=1,fkvϥ!ʄn"ye yZ[~cK1CKŘ y>>ųJ&)4l)P!vK1C,-yRPٌ3J"}jiCG98q3Qcԅeժ oKEb퉅ebb w)3sV jЃ*ԧnw8K'_nl0Kn!| t²%Ugby?YZph:H}JiI$UG~HoG}cơ #L?h1,a175fkr:z6C>{Q#_crP]2Z:~_t(f(㘱0 Ҥg3Ԩ}~kj$#L~oV Lc3#$ΘY4W㦁q>F][cEҕm1C3 Ԙ!AtLpk'1-mEfѧ6ᖱFPQ]]ݩ!O1'! >+KK u S_ؗV>f{B__1_(f(M.x:c3qBtᛙBg@uEP ZZqhaܵOt;[ΪUYGv} oc*KQ'zAAk lyMFqZ5XuGIo vs[x>@JڣgۚXC2k&_3Cǫk~CvwdqeRbVc0P^|}hߓ#;7}vN1x10pWB' 12|-V+[[-#bRDdBLQR҂# s']-\SҊZaa 6bdafd`>؄a~DxM C "aE/|Ld•F|Us36A$A]7FpNatƭ#D"^DЇ0`rV =ʚ;*w80í$~ 6&V@X8Moo}S*< Kv]k)W?F6#{1, \Kq3HEs7Q#Η|ԇ_J}R'뤙{鯍Uy&^{3Ae;SЀrڰ0ϢTX927‚z ʏ\ 0ĩ? ^2QB`ycf*@̃(`,`LT_ݟI#(ʸgmmAѧmI:u|f41G]x9hٳe߯ۃOD,uB,Q_pۯíz\#"<@-8;! bCiC=.>ܮxaCl6cz|P<>k³"0QXb" I(⾽RZT*?ūSF#t-.ollc6Ʉaa8'*} ~#M^7i`ɗ`ZD ;vMnR?" 9k6٫!Ug]zTŗ/ 3HU|@Pd2 +lE];'ikEoIN>BqZ7z, k`[9hn(˳{?O^p1EJDaPhx.9쇤ƺEjD!yVpxDPo!Zo4Oz[m(|ш ZqfaҵlCC wKxo=ONxu!Y53^#XXndqDq0މ'̪*l7%ϋS-mxNV|~oڣ5|)ດ1 QIٳB~70w ~cT ZZEA} R&~WuU#{māJy-1qHfT5*k٨ {$KN%pʸ|qҌ:o/+O5Ϥ/LkDهPXgTX6>!,U,cMmmAD@ mu|ܛ6 |#vm^V*E--M3` *,$> #ONga~J7_J5qTBo|$, ZWHH;)0k\~t)P]<+q}0 NY++(6,]KgАሻz6?5֢Т& J+KدeRӃ&Q=GyQsil< xIXx8:(خiaaubX#M5W.έ\c亥~>;jeesD 5*+IQ]==&ƶ6}S3vKLKxN?c_Q$-(RsT `7 $3ZmX*C{0HȆZW)6҃7cn:܊ȍ|LH^nI^|36<]MP͸[oחd %/|P/X,瘃C)D+m<$|(%JY#@ĥI)O0(Xh:VB%fCċy&aKӍ )/-8mTH9)@C횖r8y93vB@o2,džbzep1G]p.@Ŝ˔A&ج-^Vx1A0l c/M0lЇ$^!|Dbپ6>El[yDž-$~X3Ը§%j\I藤N%?) $$!y.9b ?=V}r\%"_<QACycN&@lmWHާMn9Jۨ3VUa\& ~!cwm^:1CĖ{/\oٻP&|/7#g爽N 5²W=. M, l[<=7 WܫPUMízq1dh#"" {~^mߣPs$/3RaR9W#?1CY߈hcxΘ=v1PF̐s&RPh1C yd=~%|S~w x dLu WZ6 f}R|/OJ[Ԙk 1 ӭ lԼ9m_#&_.]$4JYI( $ՓPNCGAbhf-Tbԙd(36J7o/Ycd˟2<g @mV+V okLQ&׭ʔbnw E`},U,D IDATJ,uJ,sJ, {Gň@F_F'\svg78qBUXm^~v1CBU\jyZ!`_q51CBF+iP{>cĘuB)f(R̐'}Ď6$"r7ظI;Z̐0fhR0뷝 ||61Pj ]r '/ k9K1Cn`gqԷNb;ێc##XV 47W60ݕ&eJƳX 5yi2D[KQ!c8X 2MTr?,1WF}yz ~Ug90q diK4hmn/e_Bp!h tx9CQ*>zB ~ @K@ xQX{bd` .I Oڂ.=>ERP';ڹ.f(i8`9 >|AGcs8ǦR~o>b̐X9)f?, 1ެh3a%f)$AцP /ցccb>yWuőKM8 aivo(B6"r#U8bԘ oq3ȩ v3M4S{WMڍ@f wr_k >.Cxe x;Sh $Vw,^̹;Xx@1ӕXcb,bAͰM^ T@qps:QhS;>X r,@J,PMK ^;` *$ Hr Qji!蚔1R,PYCUb. m3Mmf3n/yGJ_BOPT νVo*2c6/h2՘\бO^FcpiА1C߭+#WELO(@FJ?쟤5Ř!j/;fzo4 I9EZ! U j;ڐ\;b}f?д+ a \# g8$3t%h94M4Hk1d3ݎ^ M#-9!r|yJ;@H1Ci3t,}1&כ"avSE `3th#Ҍ7O?AZh 6$"r7al܂ƹ3/z3ȹ)Pb"}qޯQvQcԘ!%jIJ̐i=hp^k]?|k3Uq(kw].7` .X5bBc9 kTݓqXV<MuGƳ ,HmbF2?Kx@'v m؇nX>(cC>e]k ^*Gc ,:+\_qj노³"p/!fJ@:A,gEj,QWcqU<=h(f_dF^}!K1CuOȳGvnA36/Ĕ@wXx:]~ X7X!C1#.A_*4? wLO5McJ\~شXoq T].9<ECǞ!u  ME/ 0>wtڊbHWw ^̱r|3OIX:QA@^Hxɶ+4*W>a!+2 L4ƛv ?Cr4Ъkmf8g %:..hC^DZ@- %qhB\XKXV_Z$neFjqg ċvɗ6 EP -=3֊UjЍrz9f((z4"Z~ 8gxsLƛ3p6톺5;5ꂛ8ҘՕT <ӘW&T^o(Ti1Cy50J̐8fchdh(F7E@:Xƾ*B; ZqAQ/87 Hae:hу^mfqN}eqZ뫑A[PdxDh1Cߐba[U_ޓ e׭`yP SMAtۙPMK ^SbfM7b t^(Lb-m{?mL 9]q_t ^Xes{Rq'a\@mۡ03eCѦ+1P4f˜ 3@b5CD @dA^zGgQTm9Jzӯ[:n=?!ݿl[)S`;47`op-x轇Qu* ozF `ԑ5DW#A[:ض'U6 +~BX9n~/lTHF7!s\+sA o? =6M*X]o돛2Sh,GsXWh `thU8m?\AR'M?7j k dVUJOj}fAC[+^N"lV!X Ʉ#ǷިBʌ ~9,T d5x◟`ZPeQn_:RLhj_~/. -N}, E0}td Pg b.cfʱ@yI, BKzjNp!@ۉ|h5.ЪlW  #:'Wc&G-Ubq 4Q*kj[FCqy\|7_aق/b|0;! _`_^zil<66 Xm  -V?5QlYüddWigĎ|fv)rY/''^kȩǃc7 m5̷@҂?C FQVq[-8?бKy0B)hv'Т-ShGV+Z뫜n6td}Eɗ!0B{5#_Հ{QM3qL I: .ű?Uf[umBƵ߷“Xw""|A9PeW^aj>w:ٷՂ\Бk?E[EPRh @8@>?<0g [:&v꬝q.$V7 nuCG{QЦis`\MӭЦ CX_pӭ79~]k֦[- N܈ XZk(i֊ XN"#^зZRWZVCIf6-VA4Ե͛jV-UxO m``pFȕ}Q8ߗ Z@ O!ee@+Z^kmV+B`Y hlmEk,@˰onf6+'Z,hlkZ)O8Yڏ6 lk!j[Z`LHƭ^v 9 EJuS?㼭 hkx[B 턵wtl9 ?t4ТSS2W6BnUȁ`p&B;w?s]m2^$WpKߕ>CuD \GAHP\" yýI Ϝ8gah~_ua?4 bQGµ^&:YD[mu0IN~BNM n="6|p_ Hp1V;m!FQ6(n^p`+}m}K} Њ;z`hqBwC^{:h1څxVoVr툈Cqn2fh=ۡE-8۰ڬ˓} DD4hqm?:֡xXɕ jWQFO)>7) 4 `1%蟃?DDt zhz@c q T'@uGp h } }~B_S@ :"""Ȁh6h9Ͻbӛ|?<'"rOz \ТuUL6x@wR/ Qo2kPכ `r =(DL±ycV±FHS[ 2VK$ ߆WZ zDD۰#""հ?ثGDԻ^=""}DDv5}DDDDDDDDD370{ep$o߮A:e6{Ȉz Qxm$ 嶇 c^:<"""""""""KAxkEz{t90Uil;5 ^ p<|)}spr^_w+ <X徭2DDDv{`\(A] ^o t徟Ѕ> +yz7:nϴEf{`%ٰ}?1q]I&ǚ#O `qWwy#zDt,X9d{G?Y.7;^=" rt{d .fx&~9RwVNǢ.l;@PWa]8,2 "" _;'D];k'NSĻ~퍔'نۉw+n?"""" `# w}NdzO"""rs>Gc} Q4πa/u;mWFG/Z7_Ukv"L؉>{jg]'^ضPpP' KŻnáZ.U;~ox蘈)0U:~,So^QW}@a,60CDD-@7ZN=^|~{p'۟`|{ !qa25}݋C8)0ń+-CDDDdcS\dۛ|_Wxvlfh'DDD!/<[b€ΈR8A""\ {pk`itk.&O9kM*0 |֍}'cR~{HDDM/H-p` ;vA"0g.9 PIDAT8Tp>/F^%:#DDDԯ4X~{ x .Z\ `n/e?ȻZ3anG5Ovs}-Q8(@D9h(b/]k 3l'f8`~ h\ |_q!a Bćq|{ %u_bށ[pPﰸxub>Jq8_oQt`zQ_>Q7ҿ} `_k LvݰϷU".`["o!QUlo-n' oR4 ?6 JW"?gV+Ɇ#j60NQ_o+8rNO} 7*Fn_-σ-rplD:#l -Fȝ,0f%FHyF_w9(wT9iF6 #s :`ZQ 7ҿ crni@`vqDCod`xP}$7?0f;@ߡM8Ccyx8eQw#3.GO^:ǿt}@[T8v* M0 @Pmc!Q720| c ȑB -fXTx*q߅V6;8(@V X-045ܴz;yڶ0_}D9G'/Hd`oVlhݥ{~{ 7~H9 ۻ8_n$/ =)CwF$VtC0ꥲ CYZVeJtZ/6˼zu{8qִ;a9Μs+1r~`„(^0 I)?E(6 /3*:-J)]Y"5(g$}`@0mo88/ɿ lCR-Y"5( x+IF')@R@Ѿm'QuQ|H 'jGQlY*SH_#=YCqfpIiZSFȭԈ8 F9٦GB8Ap.!I9A^`BmӖ\VYߖ(=Y}qJA} 2'$?{+qIza۔Pk^\[7 r;yAR 6-ϋ^>Uj(=яϞ)} 25m$ _Vkem .C23jK+R`}.>~OգRśBBCRtɯ3'E(vFI~?Z?~'KoCg5 Qއ/^#]Y1x4ʷչ\.3,~,hjJh~g$~Eem)݋[OgMa?⢻ %yG_K}<|n:k<|6IKM3=!q(_ɇ HjjkٰdjUaPH—{ަt5$Iʇ t&/I?[)(ź73@$5ݬq?= E{ 3åXy _+ " $$I$I .'fHԴ:Mkݲh"sF!pBR6I2 NtEsfej}U}ۣQ]{kK}Ӏc3S=> mIQYgwUII:"ӈ51 zFM]3jꪞ#.n,TCm(R*fӻOqYIek3HWfX.ӈ>r7s>?. |Q8ʿK$I$)4/gc,=G`0!$I$I⠀6kA$I$I!Y IuVAH$I$I•n~#$I$Ip5]AIENDB`pairtools-1.1.3/doc/_static/read_pair_NU.png000066400000000000000000000241271474715105500210000ustar00rootroot00000000000000PNG  IHDR!6msBIT|d pHYs.$.$* tEXtSoftwarewww.inkscape.org< IDATxw|׽BXa :qօTgk BUqW[jZZ:ZPS3@$?νq$=x܇s'$sg|NurH5$Zy IX)Z׃Mԁcyz&ǫ| ׄs)Kz8.x=p=B.mùt ¹Z% 7sHH%SxIMޛ}Ns I7ɹjYsn.LNKY3Nqt:h\-Bd{>N.~$?\:s ]=A{6Ɵy_tFox |FrhtN*,-a -2e/ؚ69R٬jg{<~w\پb. ec4!ľ#(> ug >A&E3|xOKq~~z'ׄ$ԷIY kc1sG \GX`'>\~4z/H¨\4se%Tji]24;63o*w\:f[iˋ0w*ˊHʼI(5)1hCVr()bTl( qC/qvN <Lķ }/z3-2_m)70W4Wr?~)[ HHm^&.TV0K(٘orIi^61υP% +&2x£$g婫(^=OOOˆXNrh+lVw?t=|\6<ݎ]+Kcp' Kq'~wB14sc3G߳mMu_=9^3*O|:bi60nئ=ncmDc;,"m1$7 81iޤ I$ ə|#bKMOR39#?B019fя1c`f(/O|'p\Lv e~?{13mx x_YOck-=.{{jΓiPe󟼒 +$K$IO^E3I*'Y$5+܉I\lMzv";, Ƞ&}Z^4uٗKJ0lWzs?o. +A[0kmΥɘ5uU'Q[J JksUwh4̪b\A3&Ҷϰi'n.%=$՟Ȧ?rܑWЮ>VrYd6|λq9گ~;NߓP+fc<sE9A_b{7162 \m'zIui: = wޚ/;kWcA#HkOF1?tIdW{_tZ݉~5[Hek,jb~Jѻ6USe)h%p fSs 0gV[ȥ-|^wɯM' +h#p,XJ7}\2,/`3jyTg>4SGջ%cf7;; rG6;TawpwRpl~\HdzׄǬU3#^GW4LIHyǵR D;v ѕb)EFW$X~dҶp.i6w\/`v*N%gtb"; X[ +tdG"K̸\f1x$If(x2?qS˦ڦc2#LYH9|<rL ʟ,nA LYry {3Ij fOaŝWPe#-SoM.!Ch?F}Ԏ= &eك(IlҡmU?֎>ڴwƯ YYՕvu%MDJv76~+wYy_gz+z̆ k`JoF؜$u9p'wXxބX nۀ" t'cݏ.|9X_\S,y.9܏ݜb!v8z7'껴ij0We3&9N%!K)r*Ҧp6R &Td!BT]VVKBj:+@EfKKJ:'PMq'֜rIHؤ\T,qR4PZ]BT(]5\Jb6HWەq!و4h%nìh- Q$ljt6t?v)fH4V ^$^Yfa&wWDĚp?V˱"`9 L|DDZn$S.yFx+p?f{Yv ۟j9VĆޘ՘Z!"--@\u Pu͍`? H uUǵs)SGR^mbH0!1ivӑV$BhggfW-"-@̆8;OZ L""-RI8%k9Fx6fRDDXJl:]@c""V A9˗`ʯHv s[ atH|xYs l?8b^""R'~l9037‹1m&""ܫt˹Hq[T>L̘ġ1WZEv.^H s1+dG&# 3ᮻżDD \a;˹ߛKp( wۼh-jSU 2 | =3}ț|; [}F_jnDVx⻰*&x6p$rXK:=;Q+p/ˀ MHX5͞=pe|'KIy}(/ξטly8a,isp+{̉{ !Up)bŒָ'= Ǭnc8?(Aɛ|sHLxR'3Z9sY;)Ӂƒ+wU1OD/c锻(n@~MpErꘉ\ D`kmƹ0XYOj0c6iQ6|7;q~GZN\VNr^{p,_sR*}F_{>'(٘}\~޾|kgĝ>6]3q+ `8-!gmy e#TSq䌎~^_w~^m.r>N\=}{x򟜉a4~M S9 \m53+ ܕY9&"Ҵ?xu˜W+RT'tH2ĕ;KX:NҾ+=cԿRQjswڙS['uR:tkVdR`0"ĿкO""p+|Cry^&Vj7غxBٖNw RxYl='v6rn'[sdDQie,}ݽbMCϨ% pX ~uʥ+X~n?P:{P,95SlONA`J{+{?aj SewˡgЮ>N\Q79cO{KMf Ho=Wؾܝ;23:5g ѻ8ĥ}qu8] G^Vd:qy6w9g/TIS29DCZ " ;!N)+t˴.}ss?cs@052ʋͿ+IJrW TQ9CvU=Kq`Rdzo bXGtq2""M#jrEvG5#u/yv*˜xͧ/Pj'$w;cbV}ϺɹU;<1#z "Bd? w5'pR&T_} D3&TYa&dyum ;;ڏnGě~Ms>i&-`UA`灁1NFDI;fwV2Q[(zuEc[|?p@0\7;r_wWugKݪkVbviR:tq:qo}~w.bQ)왌;%{xg/Qd{xGA?~?ī'fy4""-FOJ'Ub_mrԶ4%Wߙ7_|ΰsh|\Cܶ?ĩў fKobH &4rV5 J^wgw=|owugvEw_a4'6ٷ8qBEug@梫95ڜs:P0鱈HQd?W;Wlix}+ Rew(@/ug/y.( ]/S??\ρMvvӾE0I'()։2z<9K^;t:Э]]-s$8qU}ԮUV[}WM|`X_N$;7x#`W{Cr;D0)շqVz6S2+;3|:xaF{.n"m;$!xZaHO0iCC "s= &9T:wz*U'+}̷b~[,lw,;SJ3;v)ȮG[]A~?t3<{U\8i'x -qfBDD~5xX&P%[|zѩz3\! L UsFnL}e)/ߓst.uuϧÐI @01,grE6id19ǺoPb~6nt^sL÷K`p*06緥HiW#>A;7%c6GqX::)PQ݉{ !x7ou7NLJN/2o+E.DugQJ75ɖwb!_۞ÌcG0=WY˨i$O_*xIDAT`A^5>@X4ΕqBJ*Jؾ|N &=t; 7PV9&!-4(ȃJPy)k(߱$}\/Ce*)^kmYGey%WX1Ĵv}եWQ^yt:ݽ2>3.}!7s(L{Ж_X̫DczyCnUBDĞ1j50o7^(++Ft'6F9^`QTLܡ1+yO='v"Mdfطʅա5$"ҭve'c*?މ*uS, 7йCEDy x֣sm'HaQoH N@NccrF8~} ,""0>M*"+y@(jF"0v1v$m' "g%v""q,Hבfw`!15""u  %+{MD09 5'czEG""uw)/5iEBHݴnm{ ZLGZ5""us y#*CI""G5p{H \""Hsiҁ$O^צe@Q$G~(JB]l_<<6N6乭:7z^l5zkk/ >ŸTrG3VV{I45"" z09ӑ*\ tDC1Zpw$HjMc-#Hó,^1"AS$!5b:e*nx#5}'"u ҺgF5v~'4 cHp fp@V6C7Y̥AǏQqi&"+pu$c(ٿ8b:R9Av4%*UHm2j8T[p/LNSc?4g">di,wXʣAǏ8:s .,~Vʋ!ğqB+j㇮Ebgq㲭X,#X<"ڷJSc,[>?~%YLGjq/1|o긡8~Z$'Tɢo"TQn7#V௞ R.8~LTܮpi0'Pj!>|^6R{}X⹭Hq/C$Xփ_a1A1f2WxAYTV{W5""5+.&\驲E/nFRE9o_Qqz;c~o޲ԠS$b"F&DqZ5""utx$yo|Q6S1GcߧVjQT.UpKŢp' sZrk0k};S2i>nG*4C2nZ2x]?;k2EW@:%qJH|Kj4C03Q9e~ B$Qr8$T˱KU3 S!.hc_ H` 7 c?&2t!-'{d3!^2]K?şA9kIENDB`pairtools-1.1.3/doc/_static/read_pair_NU_NN.png000066400000000000000000000413041474715105500213670ustar00rootroot00000000000000PNG  IHDR,sBIT|d pHYs.$.$* tEXtSoftwarewww.inkscape.org< IDATxu[ULgJ"nqY-^vq)H.n)@)5&&HnMzy$&77=ET;036"jWu!U@c!DrM`g!$t?\ eX!{c\ A֎ """"""""٤ Zn C-hk.Vq!JY\,:%6NѴE(=(FUD]yzr,Pkv:c~QLz$= <]4.+1,,gʒ,zf鱤cm67gkkoBK}Ynre]lUT\Jo_ux)YU?fm} c*Xe8p,Mz!Qr@,O!eiy Sidqʾ~3q^֟'?o8I^u@N fItxxawQH)O~oc_'[^>F @XQʲ%A(,cRw>$Y/V_'{˳喤,; |,^eYk'BՔ|9ztYF;q,8rpn'|&{TZVp7og7e)pDunv/+fOMCI$f./Ea' B\ twX˿DOSISziY4QaR,9K]:+B˝ۭ_޸p[,{8r;p},Nr,wpE"|2&6KhҾ;OFROVY1DwY}TRdI%vܳ/6eU"el _rQD \(D-H$ p`p 6rDLqV`ۈdR{c c06ͅc;rJ<8"E:mZ\ڄOVfxYf,Lot0˨"4Y:dH<k_d]<k_0|o_R^,8"78_eGYNNr,}1K"YNjNx.vZX k&s22BYw Que,1FGnkcM̲,3QgID)˝Uo. A7[;Imteobבʲβ,Nrw0Hka-e90BY@+Yfڭ2Qq Vqp4n {Yړgy")QD,5@ϛC cr_ ocg8\eW;;,9"; ?Fbt~f9͔s;NXM Z,fy2..%UdqQԘˊ\FE?r ,^Hv{ְ079ҲsVۃDQRYDjk'VteeI, V|xۮo/v?CGvٛzu=M1c+?e)j,Wj,Gc9ΩN! l\CEEp/~2u{|Yܳe]+^1ɅG3oeיeޤl5?άw`e h|g"ZmgCej8K|a#M[\yY< ~Dqhй$Bp\;')&1]Gu5r,Y&1]k Ǩc?pwkKa$j |A5?6E|VUIt ey{ila2{2DGԈ)!cSO(M\}L6,ws.P dɋVͭQYwŊ՝x 1!f,g* 0 fd9 2>wYD2Ύz$8eNY%?˭Ul,Wnb۰ygGYnb[)l.'FʵW"傈ey׾+t…IY u%\wX \kwcJgk߁%v.pd)jTQҸm._ĤGQj,'˲n923Y:,_IೈT76Λp,:ˣ+)DDY]fʱz.bmL6B,*.S}Y:D K3l,â/} -t!9'ؐKWYNʒpᗜK`,A[wbn/ݹld&{b[wbQ,gOa}se/6Kǔ,?H$bX{>VOk,GزP(]E~cvň} lĘ,c &gK{,^M3g뵙DHOY=Hs).x(LeMe.VŁDXC?x/^qP0)K6.ˀ$| fe(U7Zʀ.˾z$Hۀ<3vkIJrK,S(d+ ,921MK6Y'g DB:,%Ջ?Gg,+KZE$D\JmeN=y & c\,K&LǂԄ,O].GuD icw٨O'Rg瑘sk4Y^b۰ 8NK''exQ ;aKᎲ$a*$I\.:,&óLlYO:IYFJ!򜃻,'v-X ʊr~ V1YV}6HYKYznD, ?u&+esubbrTR;Yڿ [%ercRqHFbEb @GY+aKv +9_uw+p{wkJ7g)n Z@7eybl~gW꿬d h PڪI*ײzl*+*(.il'2BR %4I=Y2_Ml)l?b kqF@O`\YKW,=HpT'k,>wV+YY|lc%Y:cvT B܈wX4 h"D)$Y;rQUDDDDDDD Si$틱"G}X@"Yw'̗$rl[ؙ1 Ga']"`C3~ >8p$V{ |} Hu[b2wg x`26u`{ՂK&aT^ٷJ` 7 VN~Vc_E\UWA5Z |-Ӽ{KJH|8Hma}Ap24sM"{}FR[^6qDR_?bNU[r%Ӿd2O C59,]}(K4t>6rN]Jg ۊD./|uJMeOX|f$6Î|=ŽvA_j3K~%(\X댘GuXHa(Pw.ƪ)8;[uD6*[2I$v5/eX!UMXlQ9`E2ޑ|dFS%/g-E7}7" N֨^Lza&)|x- l4cr,"> y$UGV`4V$yNH⵶xw¿^ջ)'8>OHއnH K-VhX\>فhQD*a%ؙvNI!~m)m\ +%$l_W]S6~A9M#XgEUHNvmC$jSp|MWҽF$ðdG ^m%X}n#Fi]:+BJ5;!3ĉ=&XJW(,A9VX],ɲ)z "P}o%Yga{$rZcsʿ$8$:SI.~%%(`s^'u?EؼugV\[8X Me b Pg$ #ؼZ\x CqoV,3y I_`l:õm?Ӏ?('Q_gl˰"zҏ*4Ev#x |+ GO?jSh Rpc-v븋bl$U3>Sݰׂ7W<ݛG m$0YUk\"oHbVPm#0ض$͍fk3RP>I5^?ߑ~_hi\JpI2Z!NOnDZB{F C9y%hY߫V'4[&7]M)\(僩ߓ?CrI4iX^S/v?լ0-ȊR6^+~vz#1yHs/Kg5vb#Xxvָ\R6:OK {1U Da(~"{y)6vxo$0e(ҿ)waBc^"DͰؗ]zG:"UwTxh3eh<խ8;{UO]tqFSHzaS|2T=반 ƦtVh5cs~w!VDY.5$] e؋ ia+a5&0fQW;W%t-`!"RM٣r1lH!hx{FﰨFDC[&1a͒ؗIf# Hؼ}dGĨ{2 B~dJx1x;ƹ66Zb7OsۦG;yS#RDQ^M %y!${5F4uj;D}1M?fRa)qXgk%x菆.o8ڍHJj1Jp.'0Ӻཉ'Ct?nU! 0 Ϥ[WD$Wv:wQ! ؔ Y1\ lרh-!Yg8K& $^Q_Dݗk}fO' X*Y:V_R{ľ5q+Ha8ޚEV"شbR \Da-H9M.6)tFTj`)m`5! GNqt3󨥳tRc1sBPN^gIaoh+a_$D#ӼCicwoI56WRO*<@atyc'K`l옵PV| /A5ۗ.ZVF~$4\n4bDFLʃEs0x;LyIv-ѝ%n!QK潋44ؗIw;Rh t|)X|5ߑ#8rc,MQ`O(sI}0ϫ0Et]ghhkqۧv.yJ|R׏ԗMH!H>9/ɗx0$Nkz}3V6)1b V6y:9x?x~CEІ\ [-ie5~>룮)V,H>Mۜt&nOG )VO($3p闏jJݗɶ.K%v1۶jP$eYɵIpErvT| D"aju>RQ)l[JBe3zv0|!]--%74=)%R$ؙ\iD˰e0+nNW?H!9e:WMsGV~t'NwH_s޶Qqќe4_hjL⻎Hv5vuDK/lZD`® VDQͱbɣ)ʰ%PH>XD6S݂U$NnYx"{WfEbchO΄YzV$VY st5K"~qblם&h=^Fg }gY||"j6{/aسYKp4E,>H !?ޤ`ddHzclmHy0g;%"uS 샍 {^.&t0ܐ,?T8NGFv;REjG!Nj!?H[ 9\C3D$;.Ap?8RZޝtsW= 89w},S;%""R KXӏQgdSHvՅf """ z !o(*BDDDDDDDb}i~u+rпx0H$#zY Q_b s980],i\h%]0A| r p8708D] Ib`\"p u4YD$?%]7 H^:%sH$^+"^R+I*Mِc&|ӚNI "R mE%=Ӏ&>WBxa!"ElX0)hZ[}L:*vpHDDDDO"O*`nj:%] 4סDDDDD2Q䛻 ``$VyYiYD"""""Py $>qD$< F"J~m33c=#"RkI=FnC*,jsqDDDHT|8KTFT1VHSDDDDDDDr3 4b́ӱ_¤"""""""9untobsd<3yiy:bg+T}@\$MǦ xʁ#G$lhw2XrH\k&Jza{8uXxnNO8â-wݽɞΏn>x^K@Qq1Vݻ~x۰i6**+*h=`(=v96~{eE9SY邒x5Jg {94z7}A>qw',`sG&N(:"lZϮ>8I$""u[~@; }Ί~^F-w(O|ץt{4ND$-{o@R6 0Y}#Cͻ d!:_EJXq4XWwV;<:oot$M88tzqr=+Y[߸Z?g{mw)kQ .~ASlL|9Ί݀n∈H=NcEǺ ӇΊW0 C[$fw|BQaEf37fقxAce`w=vkb͒2~}xEtsLy *+l5; AW}p gX aC"ݰg:'gObK{j)4x`gȊB|Mꇴ:-#,./DHC,99L|zxF;~Ȱxr*.m՞{xOK^HQq`/OힻO}Uip9V}4"B_.N lk} ϯ%v,rGDD,D~sK`IW'd? )T/a#݀a;NcY'"k/nwHaTdR0p7cŜivΦybq3&1'펛I;_M56xqcT=n0s]ȁ5KoPwY"tx5GYDD$>#0T958WPJl}/ڊS=^NO~n^eFO-e87VUhO閞HDtojCKbDZ/ lqv`#,#hMHJH7cSz 8ZMXp63^wݲtjrl]#50u^;1$z][Ն""fzCr+p1c#sK;6|s>owlOڮU]'\GJTEE 8(*&nIZSo"J|Gp=wa+ys/N Uz,[|徴y=3CO 9" !XL+DDD?F[ lr"]TDԩ0zIQYϏ]6pjـ(dZ+WADDDw[V&6Hfqop٘qR9Rz1瓧YvᅵLI*d4w'` """ r_OŀyFn󈈄g͒2~}1QEt6aOXOo7iו_Lb`"_oUn%"""zי0""8BKjvRܸY9w|;Vc$ ##9#"~1tԩO^o7nۅ^{x1gS=z9*0ceL~{x^ݤ ]TVZSe#/pT 4]&aDDB1S=(*߈C}:FMfNf'O7ݍەL{j\]ڪ=v?1<TYoq>iA`r;g)$1/pTL4aDDBfh *+Y]O noֹMuLHvQq#ڬfB1 ~" ^seRH&:Fɭˊ qj)=w>f&\gѲtfD=XSӢ)}2V-͌x~#Kʨ`ʣAee.[@~}VV/4x"g)$1R*li㻼ﻢKÈ#k1;\JuD2#  """@lY1 OnC^e@SGS#HJ=NO{m|+/\áJ Hp gHYH9+K6ٕvCou7#ԑ:䵁#Ҡ<XRՆܷ o*Hpjbu>q0ДhK}Neʣ|OzpD|><>ud2Y1g`SG:#>e!tfy>O(.mJ#}=#?@:@[|`tvuDjd5gp8""@[j!9w`a P0` EDZd{lLtb oo?$xE;#fS;,)cƋoy7x )]1ċvv|/~x AmGF^60*WFϻc`AqEjY[a?#""YV q2`9#nAgCD$7Ak-o lS#oܓ#!tV/|ujkFp DZ6^F;"""w<;vkH.]0wX|*MnrF~z >SG<#]o#!ق((i}iq)A.sDje>} ""Z \ȑvujHy{4z$H 8KPYQǯ}#icx{3dͲvn6xFx[92:bgx뺖b" }d.GH]].:DD$]@pU#p{7ԗg4$ Q7߾lVw÷Y8H}SBDD|)@vUW,mіxcnQTTLmT]C ~q*|GaQUѼO~`/_y)miM5iNQq#|>ͣI8)_z_u,p!V<NpB1xDeؙ2gc'wUB`O|AWkTqy.v$k+hKY9v/FqFbND$otoOyr*֮ۮ 7)N:ҼMͦ4ϿʵkdpH Nyԑ,i$:C o>s%{c% @d7q>Ės5^BQQ;w߀PX[a/I - 0DX/e$.EDb Et$|.ťM>4n1~e TVT@QoK޾ŕ ,"ͺ㦻CMz~ @-HKo_1w:|2EJ8t! +yXFW 1](z8k!(tV>_ KL.V8$""6>|p8im^w}Xtw#;wb'v<_&1z.>xRg.ƆDI_ 9YI;Nش(v:}{+/ ! Ǒ,uZtO~%661 jORl>]*muZt]7U V3cN;([DDę/YQu6$ӆyj:özc7wqDDDbJ!zL7Wi;2Um;3 ""Q#ydѷX]+¦4T]WDDl.џҷ>žk llT3:ˣ4NDDrN`5;6$ߕcK~:ĦXE7sED$^:XGy! xX:HV:]@V9""""-A^I D:,\Su-4tls(Sn∈4hI ϷsEum[Ie#_ 'vy"p[۝ sp_  8ktZN.b-""""st|8H"W=-csciҾ8"""""84+'PHjJ['9Ӡ~-}kZ6}۴elr)""".]( 9A _MFOY+wi|Gsl~Vam2[lEDDD^`Fr6'XCBx@""iM;aZ:H"zE@,?"`}%6R5a!"R^^ (* cTÕh=݀BxMDžB'liZۄ0$;8e)7J8M+ r1<ϡ *\ Ƒ$|H{"v-qYt709vU 3uX^'"p8t aIN1';""nIp=_tgc-p}>Yɡ$*#"w %sǑ48[NTDc$9O!"٠sv  0x2v-0:(7H8|(:uF0Ur;LYDĝc$qHJ~?WCj|f+H8s- )1$:~6 9,NdAa?4B$7*+*+1TVS|2Uq"i-E7} ǷTZ>+BxbK 3uXyErG`X7HaEc뀋Hác$¡sx.&h^#96"hxHn]|5?}vG28YD$t$R8~t._lmɭUJ˘h5$K]nD8CE$t$R8~$V]Kq:vyl:SE h9m~ǗPիH`sݲUyzm/"czxq \f_'0 ;9| XY6H1۹/a -Q?.azjcrZ7yUi0:,DDW5V//8$:twv}.7T[Gr9a!"^cxH5~nA͇!^ϻr9 """U7aLa_QH X @e?=4C\DѮ-jxvmo-*"""ѵ;},htL'IY)IDAT&~oO]sJ)n ֕o-6fXxqA5N*"ٰ #w9HNEt" )#Fr708ULfj hnz +yf.D" Oc,|%PYܸYWS;Vn~kύ,TI}wʰmKˊjVYڑ S <<2GDkH9M$"u-.[""RsQ؇'W×M$UYJpci }7688wX`F-5;{H#,W`覑nWܯ󹺊@'D\ ¡"yJ"["ݗVuXGQlLϕ5%D$a!R8a!*)"R{  '1!`fu?~uÀ@{<x@:uX_%IU""< 6x)VW"9Ԥ떻""(W/{}@2y{-) E7 z.2Kx<$6BG+9/QRT@Bv47\ >J KkIK;ӓ}M;Wܣ^*;'uND|aFQ>Qc#"x{j8xrYA` +zIzHƫJh{kKQކ4ȚkBj~܂C41Nhґc?La~67hMq\<ԥfcWxuh?}iDqӈJ\ 8:9SFtJI=n'uC7Hf=%msNfU+Xq\2T0 p0a5"F5oǓF"R|d-SFD&ZcoI1kIA>"&NO-a{wW`btd-1^/?77N1 bb^4IP/’b^ÅA<ؽ9,_TReK؟\`*pDS. K\kEM&OtbSecdm\Z7H|6Zr2̥ϑи\~2ь\$Iͻje7oqo\~Zm{iŗ )*{%6B;ʣ˖PVrOdR$FEp K) PCw?r,p{Y@\DGy::Ғ_?gif|-[%;ߌ?ӆhd3nt40-dYĶ݌^N3ђKYBAhS~;)kViɥib"zI2Zr &H[BS.iX_65"BVl9Ɍz>MλEK.Gf?2:ΥEc䒛xS:eh%op/v[0u5'6LۑOkɥ&Nuephk&FqQb6㭯UɷSSF+2*蹔xY3N7FgNs䒹'ĩi8q);M1/6q*gJ&N>g^%ܝItި%2kǷv褥16c;swX㤣wލ1藶.0HS.y[["tG|CkɁ(ڧ%ZmN#i'3>{ԒKRSHjqZ}z$6 ^9tl ېt3ڴ#;hɥ*B;6*6dq4nhAK.AGDAFSq-|ꡃu+=VE`KEsTb+ 8"/bCi?œ~+Uu-m}D^ zs9MYdo^Ί6g;|:9ⅿ2v@;j}ߟ,ҡ]#>߿%m?/VŊ/-С1.zyfcɤ}ku0}Եb 2CfƻO,%u~îCK.ɭ{ f|oɘ\ZvH ZrIhҁv=cƇ9/iɥ"! FN=IIZrys͟,ٿ=h]B^P1m50TS.pV k US."d5.DŽM%g>6xKx(DŽϓz\Nе8-} 2Ne+GDmvlM7Q;rVFZr~>ۼɌiӎs5ђKK5V0((hirv>KJ<r;rq.y26(8;}ɓvž[wrt |ZݹAK.e ĩY}\kSX4M<#EV911EP)䈭4gJt z/Z*'t7}Q P#Q׎u b|@ T.E,˞\OTrNft2EtJZ'<MB*\D9HqU6V}z6yr G%#"&[nZt\ Ռ4a6B0Y N@! &ێ*i5ǍL^@q5k>jqz?+e: Vs*hMkMOrMX 739j r+58ύP<Ȃ(rB%犓XTXfwԑ` ?u$Q|$^pn%E}ճnz Hՙ>jJzgչ8؉`֛Ne+Wo}Q]3:uYxK/  dAu0Z ,BUZPC^TM%=5.Pwyya~F>CiUnD4F-yHJFM0 כN؋z`M""PKGm${/Fs޻X?ks~ĺy`&!r}#L\:Xs.j]f=f$j {`yVRKK~؛`_8ǩt*x]ʞ 9h]-D 9.ƭx3ju5ԐcSNu^z [Ea7KY0pjUH4HЛNX7> /MPmGxVr/X#Xof6wgu?jֳqRQ^E,koڲ w~I{4n5&Pk4p {+S,Q/ߍPTa+;gߵ_z5 n0֋J=Y.ԧ΍8_KQk*X9[o*!+'b<$c(= n@ȮC+uo_n/HԛD$BTcR@xK4м|*O>W E9PՔQ9[iGXJPi(KT)\ԥ9_)J&Z)kC[`2Ή_yH)N\>4^SC 56Ucwك& o8hs/2D.(QۃFvm &m&8Z񗂬 \@ԇ ע*muZi B5Xf˺eFFoBX ^?jtBP'ԆԤb$aښg/G˞B4ʞx?|;jXša g!k]ZftMp34bMd úoy 5A j-ew oS%pa\Ե'/=n\U8'k[`]^=d'*5SYԇ.N6M[v"O^@͜FU1yqkm}m1Qu~1̭Xe'8 xuX Sy}d*5X?}s9YMPTvrQ5Ձ܋^Vapvc:Rv\lRCᬧ|l+X;. ;&tzmhQ6QpzjE7ewNYuU5`%(BOsj?qs Q\yj:5\Fk!{V#QOk}@h].| VĢ:֡~ݨՑy DIYsej;'!ol*V%ߛ4^<͹X?X͹y.&z ?ghD܈IUܓwPk+Ʊ U9KF9 e\;@-T:.m:/՜KUQ)R}Gkm*oEm*kIKo2}#4*D-J^j&{'?<5i^]v e}X-vAod![M&ƺn|݂>'4ƹOT|}~*AD.} I-\T%A5R(^Kxq-ؘ$ոޏ=-ciN $QثÐL]'?QUr@bmjH[a8AƁ6~E x%j%TO8yVs.T>\CWT?qX/V 0UX)z)Da}Jo:"QK|E..D1/1j~/c5q|\G['j^Z±Wa՘We'|Gϐa kw/㼧OQ,-;!lVt«W,p-2L}ycMj =P-2u#ڲB^> ]4Rt@Cw"Uڜ`# 렮S'5"꒙qv5K}x%܇UjIQ=m]oAD5PkYE| 5qWE֖ U>W`!CݶƠߥAjpc9\94qwsC-3ze-O1r?@8 Z <ߠl$.] !4J,W"PBlB?]!,"0qu8k[87ڲB8fC)4@Bf>܃VGA5Ud7j۶I-B16Ew"*Rd&ΪZȞBQ],NG5Ρh"$E2 '5Or8묳2dRF˗3uT bEJ;%Xv Сw}Y =sNF_쇮iJ"O&c=Fڵ5trJJJꫯ},j1|Rܨ|ڶmOem*Dx5kÆ L9 ݄ cqxGw|>sLZrUo+[w&:qڟCfh<3fش#nxu#{r\Qt3INgǷևWMnlo1ܹFU3Gǎٶmqh;j<}YY?9P*7qfΜ7LVVm 5bkw΂ S%BT#I3P)KPWV\jSpU<讍_~z^h"5㨤4n"U;M1cW<@lj33>|4xIqav/:^:p#(WWY\\&Mk55Cm󴾬L.R7s(>>/φ FӦM4h999ᗁJPkNcQs$Vv1Z@e|-B g<P=V&8}qu4Gva2z=/v'kD[!}sf\f[Toy7Z_5[ >}ݏ811sVЧOf͚m6Z/{ JgSn}iErUT^Xk 64^1[#Aw`dYdMD\f9ȎX{bNf6f5hZ^ɱwgyrx"beZm{&r/ӿ^/yBQui\`̝;/S A1n8^|\ 1qhSQ=ztQ&7K\+7/b m uENCgk ow>e_a79777Ōu!$l вl όC޴KIIa޼yj驧b̙lݺ88j)T1XC7R:vs=9M!BDGnc5t-.kh;H2K޾fΡ1Ejgx HeoSizhsz#*ph}D5}K"kR3nzhbNg%66j:թS׈ &&G}~p=QƁ;֭eQ]jIt IDATQZ+]?;Kcch;)>oYЉ:ӠP9?{žkwo0Ì[޶1.V^f\gϛqLJwId"PZhO?7߄FURs=G+?9r$O<漎D ޷73jԨc@>p6j y%Э46_)_ I|z8{K$k3nzk=gHlޅ>ZOPPt˝ v̛Jfr"bjaܸq7Nw5ZDD(تqEDD0h ) b.ƹ hfbUs3R[>9 }dmZfM/غ͸ s߽cɭzP},_Q#FXtQ+,رcXWFobq^+X}J͕ ͟\5{[bD2j9͌K Hc݀>C[f>ckݥזCmwT!BS۶mi۶PP rGH׮UN - ȶũxW[ogs5U9cwt-.sNd Y3Z {wtgoYeV!U׷o_GA6[h܌e.T/&p AmbO>響`1D>_gn}jh6bXe, &c{fܺ*xKJ{AMe&YTlBhjlq,p->,L*suE/gfΞkqQ? EiH7:c˿̱M>h<+͸;U8!jpƶqbbm.JUw0жc{w\[^- 5VW>ڸ5FRs2VqyɌcSاABTMjj16sNA=56m g|%S~W)qˡ;z%gU QkaPtRnx{WD1ז3Ga~3nqݸ#OW1ܨڿQPR.SHrxx/8uQ-D'!Q;3>{"G.~9sBT]qq"7}1BiL!B7a[< k`3jFC? e$Zy1uԶ8{oɸܴں{=: q=նWYB=t &K|f\ !.++a7B'Q<_Pu/|g].#k}I"!>k^oHA7d!Dlܸnlo'6lvNBr[PdB!§j[Fӷj[~g/'ph5Ash۷j@;.;v !dR߁7M`$Dh-u%V)"ѷ%|g?x -g?3}*i}.3cߺXZVBTlɒ%p t}f͚ %DZدn6[ۺ[ou;?ͺvΝ|b ڶ{_BoÆ mbP "8*{e QCvvvA⎌V72@ˡ{FHu6c߽cRX#})!DMfQpGO!k wukdY*GRS3Θ.yqtr= Ìl_͞_f9Uq#(>Yw qe=qs-&LN:!s:ujIW3>~kJV… d-7A+A-s2>n5"鳟s|Œg?OQI#Yg]aKֆf쎊̸0;Mq<DZ=qж6mW^!333dn~;o_MP}lݺ~ L\H.Q3}FC?l%ҠUf|`dYdƮ(Z^q{rc[hy}D%Ϟ[bUBR[Y뼢XgO&藺r]w+N%(rssyꩧVa@f O/;6Xy ZԟZ.jf!pf@KDZWUӽ7x5{N=ڝ sOd,x4|'[f#;ְ,%fOmVd_ϟ^ k…̞4UNTQ 2n8<Ǐ~amܸql߾~QlW^%%%7~( V@Uhz?ެO?߶Z|n?}Dik}Q./^8/Ŷ1)c8b뜗ZurW?擹a\Q{rkuc6Рz⎡'n=$3'|oً4c/YL8GyD_F_s* [gIT7,8 z!^Z'.F>)|Tl%\NOy9uD%Ǽ\x|TQ )xr.{}FnuBCy{S..%zXhk7#ѣz?)B~g41kZp8i08B./XRىCN0scT~qJ\ B$ TaPWpƠ^ܛpn- '6!A]ּ/qLo1TrnYNA t!B J*ը sqB!%FyZ% !"@"yXOB!D6"|!\>اf1 !P f6Yp~ jNB!Suv@=' g~=xA_*BN@wU:x*=5."z`0BIC_ -[w"~1|\5ȭBm򀎔PjSw"p] &I !( ;r Pe8*Ԫ2'C|mxYf|ߟЯ=dݫ5O?6mhAQLf/6 Z/2ߣMw޼DDoI묬,Nʌ3|u/CY rԎcƌg!!!|D6k֌;v0UoҬj+rD4~veM68U{\&.^+Wk׮'!ĉڽ{7ڵȑ#ơ_6 Q=Ɓ~1w\jժ/+?1cFѣ!/p1jISܨ)xҤI<L5>UI3c+ZF8[͸ERtDm OrBaÆ?Gy8Ϡ[TlܹsIJJҗ >:up3j=ynA}r`ܸqaWE˫Vqrt478u*,419c!UsM86{Ք9NYsa޼yժ16 8)ScMo߾=O?t@ 7cmm|KNԊ69|5݌7hHiAQ!NT||<&M3~Fե3ws!.;wp9wp6WZl|Mbcu B>ڰΌ[$%sIs^_'^u%Nr]X^F믿ҥKC=tc7x`f͚U#ڜ^{\PCOj}8=;uĀ.o Eե+.kO{vx5[Vmh B8.W_}D 4ΐ!CjLc Ƙ1c쇆m!B]; Zr:d嶭f|FFN=%%O3um3E!O?I&^Aʣ>JTTT{W^dz gk v~Zjs(sglkvLb {! &Nƫ[.?77͙սz"%Bwb}f|U4I3 fܮV C5jB!#F6@kA>8ڧO`椅kVqFuVv5G<wu;Į!O \:Ǎ8ҹs`tnHF5=c" YfU}@&t.;N !ujբCC}@]d@PM?kVRRzm9&"::- !'wo]@} ˞efEE3 8xiӎ#Binl;:aZ{8o3M96]P\츶\?.k۴E!zBS؆m%#73nh\S͎3w`x6F!Bu:nc?RT:[sی ;w8p!_Jw~2C7g?bۯ9aczZ}g[׍uTZ9Z!𗬬,{x ٿP t3kUGc GB!!33vszǎVZ&%sQf[+N2'ߊ]B!?^fbl׭[{jgt$&kZйɄoMk!dٶXfZaY|yP!9:ZRs6'm}w}B!NƎ;عsRA^fYhp􊖭hd[ER24oiƾ" !'j̙Xl<Ï?ȠA^pE݌ܕ@va!mX]]ҡ?0WIzD: !D8x^mbcciԨ46m=hCMjWƯ=Y雹y Z&%jhvxuJdm[ڲDҷo_6mڤ;"##㏹uTK.eٲeC^q`ƌddd/;tfx^5 mٚV 4;V;"\!*D5rH>cݩ#h<1-e3p9_d-> [yKZ''BJqB-KJJ[x"^/wq1c,<]woU.k`oM4\Ҽmkr*8!+Z6=BϾܧ1Ok)z;v,/r 3#GW_Tlrsɀ9n3f iii%4k$$!'SJ;ֵI2_硃vhHjt~Q2ʕ+ڵ~$!8n ,`C)\dj>3L0A_F~vZn,Yb?EuM5.&(:uDjj Enmt}%11"@֬Yî]жPs 01ߟX}\/^LIIpp&Qv(A5 0FE +<0_^B!h#B sN #[nAy'UA64.*7c' !]J4RO5B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B`rN@i@ ?X\8/T "'R[m Q97iN sN@HYIqzNBP;qBn:MI5%DOALFt?t%6 D#hrQXR, cF K,j$?FpGDdn+FԢ јAzFнn=5t!Bң@#h9~)+>Fɶ8 ()D )ryO˓@jUo6BmFPt8]c:"Dގwf'}a4#|oـ * r\g4CJmqBb\Z^~tP$Ni(PO&˔Eܡt8naFߨt0؞xm=v@-`j_I.0+[Q|> (/QZ0"&ߥ9!L|TOB`(0IȐusc+-ň6U"$]7&Jtrt۱s9z :1![$DתOA7kLG  ēHb'a|C[Ҙ'VԤDZ\z71ℬ}] 6G5:v&-e"$ a t!BV<^|R=t9u]s7ј'QYհq#*8]u@<4ȡ1lՌFw"Wp,Ҿ/u/!N\g"[}AMU3ߠ!=ɌTvrܴl8~nbŶşdrhj SeO. W݈u!0X25\v,l DCM3]gt8!j-)f?[R9%!s]JB54\A^Qt8nJ kLG 2A]{`oQ>ذӅI }ޣ111nQ@3osz* iC;|y#kLGaGٓau\gͷLAgU (7><ǫiC[ p3/bVN7&Bw4#87\tD`-.ob_PCʆy~6e^4G&,ܽ*l!B69/kEy^}}>pW%'1qsz ?A/wŕpјmfeiLGbQA5гPE;lǛ7zgێrzS[0~%K^A~>_1!N$`y;4#BT1p5vl(e6p:q.>ٷ b /uJzQ{\{1íbKJ&w9ՃЪ9|z\5)Qs!=!ԈBTo&~p7-nA-.јyotJuLP!"XYTYr 9|b[,DUIO; !N1'"[w"BƸT!IENDB`pairtools-1.1.3/doc/_static/read_pair_UR_MorN.png000066400000000000000000001005671474715105500217420ustar00rootroot00000000000000PNG  IHDRsBIT|d pHYs.$.$* tEXtSoftwarewww.inkscape.org< IDATxwx?ZTEXbWk?;zQ!`EQ JB893M#{vy3;̙s(`[B8 T3-"B82-B̟@W"2y8?ۏ(L ?* ж+J0L Ҿ"[O>KB&AuEL  5 zQ^BITAM k G AAAA" P\צ-j/JzL^ڊ8Q }SmaŁ|Vk959~Mhx}r22F}``v8!)ˀ_l@'?c )T3Nۓ dϢκ:mzd_ejY8=~{Ş?g{в+v/i2:mO1e6|q9uڝZm{|[Yi!I-]Ԏm [9ƵZ]S>-߱glhuhٿ'33{ 1Wy _fnȠCҤF"5omTKvAsskO<(˯)7`OZvtShYusD^x墰+EZ}| :$6.)g\e䉡C~l$:1z^*aCkԈj=XԨcV˓: ?]R6'>jԒwkWjׁ #KdFlׁ6-O-]bLKxU 7=\);yӠ!l8s޺ ʛVzg1eFVmӒ֙!Ӳⵛpi9Kђw +_š%iyCkDZ_-Bէu$m"jNݻxk #ZF[b[wGZfŚI\QѴuhi;9#JpZ>zR$ß528/8Q.tF5)([rh (UD#}h‡_9Y,0*)Vڏ|H([AN^I~!KKQ/Ӳ|(2Q1qAR ;_kiR ej-GbD9MmiVU+LasS2e~wJnjDK苳dT 2ՠ!,:-vN|ѭ߿Î_&Fl=v2N:aFT;L#ZϛĎh-NݎgAZqq<ҽ' *n{VW %-A.0}6l>-Bv;ڦzlڍz:e|0@Z޽˩eKidLˑkVs'˴_$>Ɍ5%36[dPYN,JOu/dFxGÇh .jqQx 0JZкEqݰ4 hQ]s_RMiYu'%pCZ~Nw4=zcZM)NCӾ#hEH :@hU !߁y\bkK&ۖQUR>86Ϟ ePu73Zy͡%ݺ-[y ZGzmNz1-BŸ=hP |,#+hiXͮe>yU(.zP",wp]#jUi9oZͿ~0vXZ7JͿ4e+^\KK?eNDZ4ߨ$BfB+OjSi-^۪xw̅ABٿ6}N>y`@̛ÁqZKKH9 CZ~cvÞh|֕f >g_mDˡ1[tMιֈ!rz^yxџC]Z/^hDKh2ףMiGsp|(#_%:z He9UCC 洼v9FH :@h+%Z"{VV~eج4S!{VYcbU}XMK燊 ǦeHmqsmgلQ 򵖫 BQ׃i6 -:l5h 'sq&qjgPR~S5\QΜڏڅ6-P~k'kXZ KPX7eQEkzJ+3Z>mZzJk#ZJLRPaٓMV~>-N?A'r1k=ikt-A#e,(ppm A|Ȳi?q&m<JOgG^4 ,qB?oy,ue[n|ZrZj$)SBSZ&&>@jj?zQqhyթ)-,xy"hɊ+q\:tk0Z..eW.uUŪMtiYjӒ*V9[#y0뢏?؋Ք9)aTT??bOvǟ]}?Z.ǟmF>on~=#Zv>ms\ n~fm?gwgDKYsIr$ôd@K<풒ؽh#l<|I4Qn3_ Lښe@iINy(5*i))׆6L*pUnGj3V(oL˦ϟeWήe9Gn\E:,ڳWCos`b6Rk-b ihRoZʹR}atQ)G:-%eq/^qL^>pٿg6x+8iX+?IڠzִM]76L{!)ִ3,0JiY;?yF(]WFK3(%gwn=GˮZ#zT~*zy`HE@Gm} Wy(i2/JYW)^F@/lMQ/xl ^IcfSݯY~K,ҒŲWiiw,zdٻ3Fp}[#J x|='x/ siܣݵDǛ\7'S{[X-tk^7ii?U<>,l-]KYLzEna.9Ԋ=I+,侅?Ǽ/` 2Z( aMAwԡfw oKx'u;w1--/ϲk>̌J@ KXcZZ\_ךIc~ fo`V_mqfolfچuV68+-A*zғʐf09k -B] k4%3Z*a_xWڿg6}9-JX̦ϟ3-iY ?{ƈAgŊ*=h\F |rA-AcynqLې!$qEEnsYbAN'"?@I[Wm?в)-+'Z{2K,fi|)-Gе\g<"f<;%ֈ_:{deHK(^G'K&c(dSJchT :䞗rV{/oF49g]|{64>j1%,ڌk^aϟ_r!MzjoUv9ˈA[#u0FLT/ۮ(]4fRBkF?r#n#TҒKxʖQn8A}t 3[m- ,/)?-|rm_WhA9(j!XAȠCx` :BC5 F$KTLv   DeFޝ_@H.`:!r À+yuO<\ t(jO 56@[5+^uBeyX܄J^@QO{j֠Nc+Ы,`iɫ ~kU@,x{ .. i* QlBq<́4r㼥|{{1:vnչlfRT|>,!T yW0 * B} 8GH{&E)+c8Ө|c~Y9P&5Pu|&[)q{PWIawLLU9xwQÞ? Tr "SP TE?!)-B x/|=lLH^F3rC Bw1eG sU*<꣸Q^ar8} ߴCŹQO.ͤ Gtغ끢 @|>sQa*v p j0Bģ @=QS%:G-{3Šz7*@ 9.GEy& z!@b@_?C='nEna-UY޻}UޅQoI-tg&}Pnñ?ϯyP7P>m4 4!h.I'' Zv<*3c;Št`56mTQ1=Ix9_Р10㉎_caPυ3kY9U(lǢV)B`~P'y}|z-{L >_5ʒ*7 gz%Ȃ7CqFe-%},?5cF H@qz}@t1=pu P^PQz%yPMFme]~nhLq7(rHt,+G2* %!!t@<_(CQO >g2*$y.Gn"&v.Fͪ{W}="7 go |epfX^uQDqvnb&:Gk Ӆ HSនA!xLawp)U,Ti0=\rž7^eP݅L~*2+'"{QU!X G{BT)QaUXаpqVZ { OFy%Bb!3J~}}&ߥS/gzoP9S6\1@B㦅U|ĩju [$N]l2C&e(o,16Tm_B$YQA؇PvJX_zn V1Q717eD_}o_9jTz%Rzϸʔ8 BIDfra=/jGOP R {J IDAT݃J?!ymQ'Pչ |"P9% ByvaƏۋWAÿ y~.Ŀnq=m #evi!BL(1#~!*@=C(CU BIڋ: #4L`*|I BhZ@=tt}_C Dzxx5xsz*jA&vY9Bf3Z\mP8@.E#Us("UI?lO>pQ5BqaP8T1(f D󘇊ǹJۀǰ ϠrԽ<soAf#F& ]BE/PQM ޅ(syucN s6Q(?uYHi2ÝA'Vg3Pj P>Yv\@7j?P9c /TboY#;pc""tJ?*)&BUfܿͰPb!!p.ԀAp.(~ݫh:D=痢2Bp I&AE?C]ɔ(Ϗ32_]|:GpJn4OcSBԍd:o6c"T-R|u q"D`%:rB~kØ+mk(Uk`EjgP8xL M#|GU\<ˆ4OhbNy?l/]~9U| oxKSQNFD;}\ H p=0DzΨB\A &ycqhj<4ad/.k8~&^BFkwdTZwrBE9SQ!hmމpmqjo?R ű9Xf.tc?:IB¼  77 юTX_3}(n6G'&i4GDŽD8ˀѩn|WixP5MQ}f!=B[uL=B`4UÞZ` f05 B]UU=7`k'*AlX)@{;׹: ۷Gz^[P30ڄq{t@Mͣd?xp I۶(=۶S5{ap.WVGpI꣏6G' -exo$T*BX.Ӭ=@?hc#.ůǰH"T1׎//P)2Ryʰ`ɟ'R gؾ7p6 ¾Y* BF}:25  i$Ľ n{:" S#u`ҝ(c`!e|.h[} %GfxNB=xޯը4Ƞ_D~X-o3_#L$pF(yLV"m w<i&*pހנQ &onC>6%XDG@N2,W24_OiAމC NogTD pFT @]lU)P]QpQN?OhAዚ VFgq!x\Koqa`Bߧ@_r'l5 t@y]-,{!;5M B]rTS_o&.8 'pB7^ޗ:F˛qw)m~Yd8Š|S1,!4HDNDpx^ ATŴ `O°1Ay|K#E LBc[ M!55a'oOaTC !0Q lbUEF_ÍxTNY9B9H. AbM QkRx_cy!;@x"jyf8|z,is*d%_ٺ51;{4u|$JɅ;GfABZ k)~}ը""\E+J!45૟y!A%zTe8z_N";g>+ h.*~N 5Paj !i,O TE`ف yp5Y)TP7'TAUoE* -LL0#ǙP п+\LsAcѿ kJ?q_# hBpy؄ﴉ`WR9m$H1+RDBeʐ{&Zom=AW^o.0śdT=cL丩FL A& } Ƭ4+G(;@r"(ՙJ!ޯUJz O!}@x;֢&BGvj1×.6湨xȩǠj/Y( ͓*MQ:VU BuPK?2"HA<Mb3f.WT"'JBƒT=PnвQ i Ϭcb.J!CI>jSy仺5Hcv k5i"y jSx aGr"Ih؅g BXQm8X@x'!>nX  k)8<ńvK!' %4#\•(}s0 P6 k(#'jwnTu/P̃|,_G̕>t@<{Sn>G56SMAeg4| C}Ь@99?bZD.̞Gn MzrY9B^'D&i1pa-e:;½B34Pa[^cCLg`&\%2^Y8:nP"eGAГK {(jۍ*bJxX_yhP~N AjVNDs۠;6RvX)8/g聧ヰPa_USfA(a-1 ]ea-1*lOQ k G\(S}lEM @NBs"p'R = ;5ѥĶPBQ_0Zߥ ڏbVuW- w| LA%MEIi%`  ;Fxu kp t5Bw VLu|ݨ6Gj@oy|@nN BT7-Rfhd<_.yh%{PoN cѰpi)5Z4Q~бj?nw(:}#@0{c_+PcCU!y}-jXKAA{,B\5ĠJ?,dWA1?[G߰w`Xr-gʑ)~E ukO0Yi GąYHy^=llZAjzިȡ!*:sȭU-rg!h*MgL@.1\h0N+wofofOj7Ѩh Py}Ҡ^I֡|;H_xP^TdQ$ BXʅ +v 9.$wdVN@h ܈M+1u GָQQ#~ z LՋXA <-yڔ8A67AA5 t].B x֠4C9Pe2 80YDf6ZRTD\X ; 2-: Q!9.T|adPЂDy4o7jCOF}G_>74uU*"ʉ"IUdˠ~QP@ B$*]'9RU"ײO!B֨aHږ B8=8qAgeXڠCc TUr(/P4T]L;uh࿨Hj ~!"J!U"BĻ(ϒ̒V(i T/TB A10Դ8 UW(jU";EB<*\(bk7 39?ٻAQ);;hժk֬)w*ȑ#y |`wO,Y^zo*PzhѢ3g$%%|3}t>vm_+cS29<#rʸP ,-eWT "?e0TZhQsU+xsECYgf ֠CE(~^zYYp9E-7Itghkڦ s05J2y#> ]G?Ԍ>fƏoNhڴ)?ǀ%߰OVI9e,=ђش=ɧ 7O>IVTK4Sɰ؀C֭;wnpиqcfϞM.]o_ \꽮} 6qy/D I@[{=BNȴ`zp]^ E& } j;u;iyV@lz4;8H2q3,)ZV;n6=j'6HrK*q뭷Ҽys[`8o*ъ?~<<9Ew<#)!9J<*.F|w޿ ABS.P@h҆u,V$'@zL7kd̈́SsIjVǬvlz4;`çO8I闎JL7ll=zB*ڶmܹsIMM5*@Ԯ]3fPn]/e yrhذ!/BE !N?TaOOQՇ= i@7`|/N~F7| @G@4D}?OJ :8&!c˷~6Gwn-ܦܼ|lwOR;]0/ q\47ʱ Q%{z]vyޚ.#PС}%T&NȐ!C@6*0NYiAdoi\[,0c'6mOS8Q,m;˷| 堻ia|mڰEn!Ig2p\"zөS'n&ZA(waHM_iHسx#m"uTkj&XfH>ec<Bbh9ș^*VZ5QS^րCN􀃇ӫW/[aK% :Xz)))\y˞tZڳёuR< #8{#@a+./y6a^8+mb#m"6Fw$7ky3?<#.gy*r/r뭷4Zjŵ^k25EW3DEI4 2&LضeMxA饧M^NmӾדPWNǎޥҹsg;4hPUvd#qr_ F\ \ GE0,FؖEU() #;?#f"hl-GDKn/TwHj7v[kS¼l6|K7iDj+ń;Ü9s^9\.FqLzg?ZW/t膚P( <@TD=" FUX,<Ƭ'Q4 Eّ6OK79&;&_.{DiG8CM!OF hӦ ݻw?ٳ+A@c"ߟjL P?E]XĢ_6a'5@bi㜑饛H^]堻tŻ`>ĸ& 5G )%~SP}B\IH]|5 v~#;VVZgvי4A.C !>ѭ9 'MAS a3*Ž' #\i]P4hKrQ.vMiTDYiOwMwMΖ9oYZi9AȲ`7_=i+PY+`JR,mEXw:&{ (6wuN ?LanEeX*@ǎILLճuJcqh۶mi `=vM^Tv6^GġgVѩC9A щm]ҺB8 4!D(-6Ѭ Jhb}Mt]'EWW?Ih DEa% 5DJ {`]GJ'|`؞|\U#0mGߧsx]fD.4l˩q,'ԠHQFf >0`7opt6j9NwDnPu7&I&bO*6O9/# A(;IQ(%qt`T @>0k9@C[; #ys iQ QqըR_]?"gZp`oawGT ;i[جcv/\bԩS4#Wz b™:htPGD֎Zj'?xSf1LqRṈ|ߓ{pNy Q%BRRRPu P2PVuQ&v:ZTY l{l8U~.e˷o8;11%͵ gL4CvtB"MzjٺKq [Cc"33<\zB> 8ɧ!f=7q[?] ߑmހԕ0Mr#Gy'8?ôrۼI #GxXCYYY+Bqƙ>0[ ū8zGqӳ`:]0m>'vQebW:5i ahuVDAGA{ĺ0/j';z'k4#[V"B9p,'}AMbդgqvXbTt,O9 j4ic7}yvƭI9Jo[6jbbIr;/_HoxZ;v^A8gApQpo]%2 w[+wHL4{&4?n0LjwA_qxINf;߽G1) Bg{S^vYz $KIl#27}#ݡZf4>}`o]]QѪEYs}Vbuq[zzQÙV{ptzA^}(tim޼{Ap2]\sVg`}>P;8!TTfɶK,jP"@$6HrOPQ ] mm.dq4F fvƬ7JVƞų+!믿Mck.rrrJ[WShuΈϞu"2SӦ=zz[>UV;zm_xھm>p#m轸cp~rY,]jϳg7Eݲe˂I'֡ %g6N8NJޙ]c™RfyRy0Vw0i#m}_#* cCfʙ 41!{ee$N;4^ڛ;) O|=kw61gJr&Є$&>t3 Ps?ڟ?eΛ4:mUc:V}͆ 4:upn闎e.0G~#''ĆiRS/+VZgv]|ߦ+B萑ѣG^9\.^~eFmZJP0a |XUkҤI9`jpR97hvM:iǰw-ljw~lE@4:u}hyBd|䞗X4-_Ntȧ1eW\6D>rH$(gA;f{ Ôav0j*t wHĎѣG̀~wy'SLyϤIAY?P"fōy|wJ$:Rd 0-g>/x{r{Z12WB0$v,\ӧ׼c͛7STTv*Q3qDk58vXg-FMe #iE>Y8%Ipvxo|;0,VS˳s5Ӥ[;>jŎ /b7Z|Mt{B'1cưwsTGʥugɒ%L6\D&II%4ٛAZv[;^?k|pcleW) L5ecwa96 ?}ɟ}>nqW烾g]O?1lذg'm#-(¬Xai B^O&BfL.MxUzyhko7ʳc baeA9!a[j.z0..ޮ"#Gd„ cƼyBguӢW@9[Vq\Zw_XǓҐNoǥvenb+G0{A1c5-:*Ð1k,,:s> 8+˹3j+ txGCYf?!IJrl]˯)0p-e4D>4hJk>?3QaT Ȇa^kcOJà&w5YfJ3ǭ?1KvsѣGc Vk H⟫E]:DDbL+ \Bě?x1xFfhEq,cЬ aa"+--eԨQM[ {8ǥۯAo߾0g.\йy !8z1beeeH=)e\6B^P༽Jl"?e?̄ աW饢8[S/%uyyoMd&Ԧ-iuZ` =ĞEڏ{ˊpQ`ࢬ`p$7 |־1}͎HV~? E[VPQ8?Uf1kØ1cx(-[ƹˮ]Abއ蚋~%yyye$RyKj<4H99i)>`//hFY^Yג֬9;t$2+UV1+d&6g};7=Bξff .sΉU2|p^z)#y阵 |-77}f̘sirk$cɇyfps wر? #FԘC=zu5 mL81ojw˹;ϑ#Gy_zzzohY34n7~x؈$M6~G}ؽ{iӦwzAmB>}v/^0`@1`u&Mxb)UVVz7Ք^RRz ҨQj9x %%%<㍢B**N| S<ktgC!Q |@˖-v\o***شiiDT6mj<ד(** ]l܋M1߫O6dggӴiӪ^/7n ݼ3=A^1'""$(* t;&$+x=weLDDjmrOn'!ˁ/AA0mo4_DD$W8ׅ /0 ״ `p\DDʀ\`ۉԠ1fVn'F0+UT;A@%rԩ29Bmј?08DD"`If{Zc,i13;[ajpq@#̕)7afR4YvG(N$֜M uxk--"""$̚J>`jiìԱs1"E_5`pB].aߚ\=VDDD>0^&LDDD⏵ h>Sz]uyq9\EDDD$\ 0a˹K1kE}Ҩ]cNzss3R񙈈HD9{^znFEDDDB%P>l# |F=DDDֱ@)`G=J1KnD G9@F8bH=Sr9{I'.&0*wt| ^Sњ";*)ƺ$w@s 2]Nz`VlWK#>&LO1x$P.fšD ̠tA`, |Zv5H~v"aw+]ENJ0ED$NomX+^N :xKDD\ D v"RxxD 8DDDή/.동D"d:fj! x ɹжm[RScP^^бcG]ADJ&M<4FkCzz:[GرC*~h޼9ii=s޽߿5kFfz,"`ΝY& eTӀ&ֆۓ^FuTPP={B7\a T5e&M4aĉ 8+R0ԟ.u5)c' U8W:^XkWP1ω l0ݞ j>`Fkψ>'}̺%/"RCeԩ?6Y@  dX^&O\uU 8?ŋ[  Uq/z439 ɓ]L'z].$%1<7x`f0{OA駟UW]̙3M7bf;r/+fX IDATw/jٲ%f͢)}u%:'3o {8II |0a  oq"7ZnͨQ`m:XbJAڷoLnN%ƌÇ~ȢEMahV, ?ٸqc׿&զ|g7wlK:vKˌr\ngryN("R&Lwq~唂8&RS)xie$׃+#"X5jĄ N#HΝܹ\U=s8쳝~V.̵Wjذ!wY?zLвB`ǧjͩ-[E5Gp=z4-[t; &McqHIIGun @yũ@o=jɹiul*r0.ݍr"zv9ӈaÆ駟Za71?U?C`ugsWX^VM\R6%TKx< ;wTs ,>Smv*dffr)F :￟;wZ>εfggsgF;;\ĐeS:wM5E$q%%%qI'F7x`5kƾ}MCѠC$Z!C5q-tfHW;w]I!WvBƙī^zѫVqS :t(SL6] a}Nye_W. :ߝ\6m|;p0sWhED$񤥥q饗:7V.IK+$BXuDye%-юqq3 JDDׯkgk :5p  xoclӖ>?|gnD߀AW]J>g9hтvڹKTT61k:6,rK^4NIj""Gzziͩ T)S. *}ಉְ3Wc :K9֝={V[brj&vjs$rS<@k ۷p.;Kfפ)ED$ٓTGb[r\~S^Ys˫/xi2{Ѫ\""F}u<@3͛G5h*C& K)}t0x<nRd[wZH_ | 0S֞ekצv|vv"תUЊ-<@C疆 „20e Mv|nc{Lˆ{45MF#W6qQ},]L4Փ|HyH8x*4h@Z'~7dd 8Hdf-O">IչT6ѿEˠeeo/JƍiED~r=@sKIIIT{`grQt]FU+)(GDD$~kZ!]I[yu7IM嚮ҵ|uKTs!';p&.YY\ұz"""8">Is$>'WJ^^X4hGFe̞_#% DDDp;[mՄh3hݖ4xsڠL"""uzٳgsӾ:.l߾<"&M9[lfOYZr2<ގw;0a7xYGҿJOã_ݝۇwQ^Yc%L9}: /4V.vf@ċrLu;\vQ;^xݭ\R3`0y]M(lӖ-Zp.f[E:3 M”V2 V""u`/_vpuבv*Qz1cst|sq]wxHdf4N]tnn.ܱn0zឯ VpOᆴ,"r^|EFvdM 7v*Qx駝V/:AK_0p@Sspg2Wwƿ6mdK'e٦IĿseԌYf1{l6lv*Qk99gڵknރa%;z7< #/ CD$߿?OnrM71m4Sz :7=V.,KgN2TSfw̱/o݁)wa+-׬BD$ތ7.}.ժVyy9cǎunZi46 Nqq/ {z7l-*bֆuA KG CD$< zo^0oV^x1߹i#PF\Uw=gΜzsqǓ( G ۴g-ZײDDyg\٣ |C ߫z)֭ =C0 ֮]ѣ.CMVcD]FWtbłۣZn=tAC3D>;3SFǏwu65$2, n6]L':RS[;+,ݐw&ٿ)HE$q5R+?]uos墋.ip[ƌܴx B6&Ld~1=}IL[܄w{a<R!"xЃq,4v(30|pƍnV2n887R:`lڴ . gBs:efK+_bHNv<vk'""믿fM/av&``O9(H2M6qWR^n/\ _C*[p,-5zhFxKayy,$6m䇟؏{}>~8EEL_:5+*DD4|̙ c?8?#<ef^1c#87܀`,Qw#+9sYf)E^rRwゲ2^Y2h[z Zee""ƺ` [U(o( ֭[رc?ss1p!YuM13MN6s3tP:t@j/=n8&Oj)4gnf禇Xr s̱ߟ9s搑^VuT\\+¸qB''_Bkj[@zس7<Lt;*\Y9ו*.q]\9 DD>{b`l鈙*QxJDDb*`ILga%$DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\vR'큖<(R."G# $WN`Kv@vkى3<ɽDDDDD_2rb_g.ئ-}9#&J0Yw@"p ~׽'SĕA:1}Uk`'_)-ogOIONJǻH] ڟYZ~]8͕,D[Дv\1ǽlDc@tR%.m”Z. k!}IN'r23]LGRVִ5Ǟ{Jx+Y$8_Wo5ʖx Zt!Y]Or1:YTcm_6F pq=\NGYAΥIUc0W;kJD$AFZͲ9MjvI1YHJn@eװH丟ԠCǔGvZCL`dۃ^V"1FW8BD&hJ{Qě3KYQ :{j$7oؐtfw :]1$OIѤסcVF#)z;pݶ([K4hFْ';xQ :Ħ{]0Y_$̎>L9D#/5fÁ"HbOIop[O5ʖspR7s1xp~ Nj"6}[6\LGY)ڲtDijNìe986q5ĜTq+HkښvtD$k#stMkpW?׫fl)<[Dsʺ]Yc}&P"zHP$A%a}Ohj-\veK u 1_:snt]V0mrH&YAaH SjT#*鸽9;u?7ht$J C1-tY>p9p~X_U܆bL%?T 3Xiz};][mZ;Ar0gw5E(g_i)/,_b:"Ge4 ־19b+y"V5:M5Ӭ?v鶭.#Rkϼ%X71w3X 9xny%M/8?M"ohN ,ڳtDjm/0 w.# ͏f) $9E@.DŽGo$ q1˫]$|iLEaI# 8/wsO$xiabC  +CDbk8m5 /r1SŎ|sgq{pux t}f--/+Q/c1oz!;_ɑ/|V´4sE2kw1vp׮v/s+`Nh|߇y+Hk\,Ͻae=X~cYغРC|xq?ՒW~ҽ{ӑ5qj8⿆5#="0h")e+xtDj-NJsE[WeF^|UN])ߘՠC$Si_^ԇW(XH ZǬy}0ݕ?۶Ʃ~ p7 .^Ll/@ye%O-4Ob_l|o*%7ęyَ0t0Dc#f%0sZ5f]U浇URJ`$aL}+ ocfZXi`A$|1XO{hI\ UTdt7#'b,#1\Ĝ˗xL]_Pe2`_~y .^`mYɶO^u1Aَm/1ŒS]hH8=lg-aYq[W" ՘խLq.f Mq8./AbzJ^&/ Wvyl6==]LGbP>Is@=PLMŜ3k6qscbt? X7w2oI\)Ü\LC\f$jfVALbfhr(fHktbnokc㹷| ?Ӄ?ؼor1Z+Q~WV sfwӧjcI a;,~ #Ӏ41̏/+s1Zl{~ƞ>p1/3'~G˛]W} El{ 0V԰ǹI٠930tsL6ΙY>6dI6fJ5hk1ח Or3Aqp\߂! wJV%X3H|Zw x~o_3lRwaj߇)C'4oi5ͨׄ$w dРěk3AŃYR<kgA78ɹ> :.IDATH I=MDD$LXm{)nMhAEL_"YiA%Ma6F=#iߤ)⪼ \DFk Nj#"""""" `UτLS3"""""".ѽ :H|Vb נ[DB IENDB`pairtools-1.1.3/doc/_static/read_pair_UR_criteria.png000066400000000000000000001276171474715105500226760ustar00rootroot00000000000000PNG  IHDRuuXWsBIT|d pHYs.$.$* tEXtSoftwarewww.inkscape.org< IDATxyxTdOB6 " "Ƣ"(j[mnhEڪU[Z*(.("" !=3qrΜ̙Lu23'3PHy~CK.@#>0A_ \0p1$"""qw q0A^ EDD`nE ""D==~ .""" ~o߾\yt҅$%rlЁ$k;!$7x`C|s=wӷl7xOrM<;a +VOЯ1hs7pY$&&2eڵkވӧ :2G0VB{Yiӆ)SpAZӣ Kz7FXW_/ۘbSXXx׬Y '`$ume Ne;O[u3(*v|ǚ'=lz\~xՏ=HHaM/[笟W6 ~?{Nj?uS'[usߧl7h_p!#Fh=I~ իC{^` 99_c[Z3fp5װg. IDDDZ8 """Q/pYddd2tP$Y)@F}kOAVbV{rڲb/Uu>c~볎}­V`OǤߓz|'ۄ[InɱtU|Xum󞷍]_b yҌ|>=G6n9E|MƌsoiY."ϟϨQGLDDDݑ,; uZZ 70ueVcҝ~׊fUw:'f.~ƪ N Y7>;g坿QUͪO_bJߜ4٨Q ~1M1ZƬYb*7 8ӧY."""ri/"""W'ŭ]HN׋3up16:s#7ĆoůZu=̪lnu"1slx!UǤw.}߭.@bV]]RȖ^{҅MslLœ9sHyfάYbmYg-ƒ>h L^roT"""ڋ6ݻ7;&`4|v*. CɌ(-N&0v'mmǷ}Vқ3o%y.&IVd[ubt::kj*w*}?)O>iQD؛;LfϞͰa?{6m֭-CDDDĢ%y"""2vILLtq8".ζڃ17̤9NZv7דɪK moһ"%'n꽡7 t&kl~iG7!٪[ɮ3݈:oN=CfKwm۶̛7U s=C-KL{"##I&9w ,6ײz p&6:bkjOlGFcҝEξ>.5h{g[UBC/ {!J׋,O_NN?0/C?Og$d[u-|n^71Mo?A;]VKh'zA޽ZGS9* EDDZ>iiitͱDz𭭎.ե3h\U@n_]7Bmor:fsζ7M_Xu_kՕ6} VTiiEl{[^DDuh~ѥK}طx lI}\mtS0p`ۛKnty_)-7>ѪK^l{s`lU'an}jx}"rTD/"""[;ۻ98Vo78rBWԵ pM ~l{k3Ug7=*?oվ4 .56xǤmoJZĞ[u&qM|g"OAALEHb~8Dh V Tmt>i!ho{ۅqco{s R+>Mz/xѪA#::>5ql;irss88DDD$z)iݬi;Ouζ 9A=fQwU\ GۛMi~Iڮ`ϦYuBz.j%79߹ *vw=M9BhTfhM` :&gX?ݪ;7ZuBzϻo^CWcҝ1>jڟw{=Iٝzk_]Ѵ7& )(iݬ[n=y",QD V էJ\j&ª+v|ˎ^vc6:ZֿNc%9Uox} ueV֥FL]f7KD Zuui![fLYvTiڋn/oNYrvlufqRQ?$C/#ԖXuJ^)^5FO YumYmt9FX7ucFI{Uo4nr%"""""""`UV9*`.oBlT0c]V]W^8%7e dx6Yΰmʢ V&̪o1gj`F޲eC'"""B{[`Y,XDtf< i۾L\ؠujO\<'nյely҂mtDr""""QLe~b VXXD!ζ7iX`'XvytyU|=[lSMo=xP 诳chL6,\omb|W.w&tmxw}$WUUŋ/h?Fp/"""^DDD^iO>aNana8+9`#`ܯHHϵuS#PWcՙ}N%{hޱߔoڪR2(+?57h?88G$n^&3 7㏻= oc7on?MT/K/Ě5k\K^ |aG"0%QpѯrfqNIw:講zg^Ijzӌǩooӓg^i{>l㋣ewXu]y)ёp뭷RUU0CqM7 JؕCMs]Dv( kE>ذVƏ}*p~uOĎ^b&N¦ Kɹ]0lkP<Bmt>6:{Z_k +_?ao$mO8=_,`h$R: ŋ+Le <xG8(**"""rLڋ;.]7̣>D"&=o#wKIwj *gӛա66KߤfNO~gX33 'ij)^.;>/Of_KF߱}t}/3M?9`0o[L2 0֬d/~:&~SIFEDD0GDDDL/ΟgnfCϰh{oˀYpZu{!wyVc46j_R*]/UW̶xl3mg~ 6Nt.r!{V/hfK/tRp?Xm?gy뮻.~ \pDDDi """,O@{:`恫-=[ee%wq=}C0DDD%Ph/""" Q_~ٳ' J3k֬O $ƍwsǜ9s"4"w9*ر ] ץ] <0|p:uވ({na?p5;D nDDDl)0x= 2' -{͡K!<7$w#""(L=؅9x 4+"""rD4^DDD\ GDD—=n=&a큈} B㐃2W@in@H*8 F nG>8#@i:4 M EDDDDDDDDB{j M uޤ^DDDDDDDD(X`oRp{{#^ґ&uIȑQh/Qh{8ޤ^DDDDDDDDq %k`oRp^؛܋x 1F~ 96iz`8kMCDDDDDDho5ʹf74^DDZ53DZka퉰񈈈N|k ?5E=H w5@b%"A3Ss""r-^ȉV[53c9{`=h Y_iƽHL{qU8{;͸opvq/""-[aƽl"͸h0oXϸ?H`o"QN&܁I w`oRp/""-[ZCpޤ^DD{917؛܋D1H&G'RID#npID# m\pIHRh/ޤD:7)ht4-I`oRp/""n;=1e`oRp/KD؛[IDcnh{{q˱m1&"QFDہI؛܋H4huK,؛܋H5%=G ؛܋D؛;EK`oRp/""nj떖7%7)Hi\-.oޤ^$J(ޤmI9[ZbpI[sl1}3&"Q@UGk`oRp/""떖7g`oRp/""Q܇)7)qB{ hM5ޤ^DD"!--!G`oRp/""-56s`oRp/"-%7ྥ&""Nn>I4H׊>BIKn@bOK <#?Ln--@YDDZH]x#c8_GDDbߗ0!+טi[ G(3Y\$KAj WQ-)7y 1 Ė:5.E{S}p?lGDD$6UA7Gqybb}`G5qRE"O4>Pt{,G+!Τ~PCw """>Fpɷ|8 H XtF5ED$0?}oW1_3KHZhQ8>zܯo/gPXDD$68w{ܻ0~|"""V@J<-RF{"B{ +S`/""Ҹ+X{K{(9r+X{MDS`/""rb5W`/"",ւ{"^"F}(9v+ V{" %܇{^&-=W`/"&q GHi{iZjp^Dڋ+7?"""ͯ ED5ki{iHF}Q`/"">--W`/""r{"r0G{Ӂˀ  JtJߙ&nh@C(+h qCZ| 3n% nK IDATk]4+ ^Jch)w"T*0 Ht{ ǠXP ޥoJ`i%aVH9큈HD{p^DD@+98]Kcn$'m\xmrzboŎo)rU?伮V, Ltǝj{ ;Πv/. N#dؿy1aI֯(k۶MM=?9ZgC~pym۶̝;!C7fRTTC̙c?L<9Z~؋:q2"`%v,Y$ kh1s{ h#G Awr< Xvp^H@#x 큄zKuB;a tO3<mڐ:jT Ք~{/)!;UmhUg<[u%ӭ:>=ܡo}V`xv ImCJZdm! ٻ ^`Κ4j(ƍe64_"&x 8нQ5|f͚5\ÿ/pY`{#ka|i0dpŸg 쥉?v{ 1cVzif]1RIcȱH"ܛ?^Fl7vKWqn$L 1`'Clf{ァ^"NY߶h0%!hL'{\*B+]˷Kϭ:ϩ_]ɮOfYuBzYǟx% IZS7Am<}-mʔ)̞=Z0;*1]fg޼yp * ^/?<%%%'?i;4YBNNqqZ/-KEEu3'$$5Cuu5{ zc\J`ߵk%ٵk}=qvn6~ر#MlG馃`F+h0sF͸qh.BL<իWEMSc:$cMx 8/ofztTWxJx}70|< 0;vҲc>-4h{/w^xf8䝋90i(NJ8kaH82_ӛ3'a#W^?K~OgcsuI!7A/xZo7{]f+W$++9s&^xYaսlKq϶;`wyn͛k1nF0 [`߳gOyN?tFu}Ph?`p']C2q&&Ob1_M@F^y1b_| _ PQadcp{aÈ푸I>{ByK_>h3klxa.ZP]UՏN| qmxT|k3JWϵ}0%_-'L@B‘I_s5ިJ&0 zLRwF%\ IAA|AK.SN9~f[&Z= X?@z!To}XhQv'N䡇_1"X̰{ѣGӷoN!}ŔmoBMMmw2S.c[nI -WW9VՎ>F2a5G^xU:t`̙4~r 8k5J;`,F˙hv&c7nnK0ǭo`ck/ekSu\>Nc0,f\:6]Z-lr:sժfd)Xwp'VK :9 znn0?`ɜx+u c{9e3ָ7*No-馛2eʡKOOW^OXT7܃ó>Kn`\ID|O{v!f]i?[4 9qYeoª ϽʝVTeuS'[u\J `ǨʤwM,=L~Drs4%%xZccE~7o^3Xeټu:߂%c5|׵>R[yhk 8Y~fyζ7%E|e-%K?:-6&1BAcsێvy\U`XjhƌCAA6m2]M7b|%33~ሸxVV u2$L%@FS(Ъlg5i\^_yC/b{F˜Uk7"6~N AFKo^'SCq?֘e3:lsbV;:kؾ+ٹ-NIbxMi=dԸ0ªk׮<?4uA;k*9z!I!]_$XZ+olW@v~Gj<^=&x|)Uw7ħfqTǪmP`]-_ oM ~wv/,_nŒMJ yb&q=s=G>}#8gQapD\ZZdCClRo<4ڶju%VcՉ{9v~zG~}_4Ӟ5RSj;Bf(%]Mu:NH#<W^y8 {2nqM$FBc6@:`Ű7B#r\/1t}Vݦ@R;dmtBKېsV]{ KJwQ^/Ǥ;~@m_w|O`ë9nKi׮v8;{W_͐!C~Ѳ(|xިl$4mtfDZ*G}8ö)j{VfqtR;R6Ҿ5M?4 3.9l{^]/tGim3Mݺu뮳D6q۷G$ZJ#?s-i0~FۮOf9 w)۴[ !3Ϫ*)4퍩x|>^^]r% "shr=n$$$p׺<գ\3΂eiꎣ!9Uזy֓VxڍN?tN֮]8iii<#dedygMi})qcH޿g96vmɗ morom FۛүYuZHڣ"Ӷ/9퀶7>yul{c*[[CK"Y8p IIITUUc!1fٛR?Fpoϸm3(]Z)k۴~uՎ>RZlߺN}&|)Mgf;O[:vC]eNfoZ3scXyI7/,99sF͞7iii 7mo=\z7|cCbj.w1~c90XQ_/Fk(b{jf Tl֪^r#7߲×:ijwUjY?=h|lsklx}ucҝx>k$ N:1f̱޺޽65 X {P`^篮`'ȴ͠(jmo7'9WocڏME޴6 ^($$$0d-n 9. 1 &T>Pd/M&FKz6Z| =^/Ƴe3qP\Oo7֯\:o(:'/?`I @Bzϻ qo^C`=&.`@mGK{n9޽{ӻwOꪫ.+ :c{kW˾bu .Dsc4fKKfUB|;!)BK<34>}/ڟ~9M?}w6&kE#UE[uI{XޘW_}=tV?:DR7`75Z1xgۛ)w `u)^5ת;y@{ۛ8s<Ԗ[uv("GhKw5j[qOζ70zM؄Ɠr3i]wl,_ŇTZuÍK6:~tǤ[3B3: 6'nj.h7bUZ1,m($`sF}tm0iMyFufKL U_w/cqt 7q]/t%zAۛ-.?5t F3'm­M{cҢ{x"W-qv: B dmMg Ӿg=^j'.C3~6f1P9^zo?v km{<? ݹi:PID]pm뭺[ö7ۿ𣗭:gX?ݪulG6W&5аͮoY:^[lza?4 $URR$|-z}z}/?trпmf6i#;BtqƮo5@+@MR*"rrs9}ΡsYW>}4Xd}muNo ^S$d8>HojKpݕXV]]/iYu8z6\ݰG-_RȾ1L~'5z27Oxi`.c&W`jyf_J^kfdGۛn:go}Th]r@ۛB{ۛZ ƤE6̱n`oi Zr#&4}#S[loQ[؀{`ue{#.-_[hcC%ػw1ϱPޱcG7!⎆mo7x|.V_m*̡`Y&m!JKN% BIҏOb`|,|Z3qx|΃;Ʊ,|PW9ޞH8pv"Ě߾}vww=: ;*1^}Xl|y}r +gSehNg_hXo7yڪӺݩ^0It[f?CU666|h*5Ilazrp;ĹalW`̜Omq)jS{ ߄^v'B}`]@f) >dmd'"GgϞ=ҭq4šf۠H[|cfF(cj8ucf{o|"9CBkv|{}dJo~M&chsҍo6:;HYumY1gޝHsr6nkj3V{pѱĒMI!{EJb~ Y֯(\8ͪR IDAT7͋ՎI yt9gڟWoT{ֆh{ܪ7 Q{veγV}{ JѰc-JKܜ^b5KN%{PJ8.K {?PK}U't"Ӷ3u+(\gյxu_."ruDup֜*rX |&B=š#T| g8mC WΦPYءOȫK.f;B˦;^_i^yѻ>{hGmh#"N eC 2D%Fa1ix`&ͶEU+W ?| uK՜6xq:/\*UXu㳵ܹɱwP~gs5|ڗBsx| ,7a6 [F|@"-V !34f򷩳IjGFSlߺ֪=>y.2Wxܡ%f/1zW'$uSI>{m˜g* a#^SV|Db[gp5`,60fax`85'Kr^hBo"t}W:ue?u<ENծ8'``]-e8w$ڴic/hTF,Ÿk:E8{sZi*.vvW^>XSC(oF9qԻW:Ƶ=LuOV$v&shã߭uPm򥿺/?r<=h.AiMj{^x1wnݺA%?,P_]Aq_yC/s6:])46:idxUWJѺOϩT1NkWʱK+VUnՇ;O$η[qnH p9(0f93]՞B~U6tz)?d=C_xڄes/4kgƽ{7??/  M u+JT3t^7!`MF4_7w7`@V׋HjԪ,1:ctaι(Ÿ P~Ny3>ڎx$}gfH&Ol/SO#Qy"6,qpl4b<ƈۄ*3ԯ:ypUZ 'V1"on;ЦoCvwB2mG=pi#ڎ|"ijéߡg0HϷj;/LAuzn0Vwcb7(vDX`oRp{=ߡVz7Nt`{+ #ى] + nUtq5F߁[ q9m,?XuAwª ?:94XPߝX/`ْ%K6OO%qfa7]E"47)W?N\rQ|c=h[IʡmΡKٳضPO>Fgct61` 5.x>[{&:fp_&lݞCgoRcu{O)Yr9/0;]2v~YcoӊfADMfprgk㓕ш^\)M2Nph,}a8~B_-(۷0BZW!fN^W/ț7Hz۳sޣ@W(+ټybs[T˖-c޼yXK;!=.'{Z̊C{9;oӤHwd>/'zu|V (X7zxϒ)$uˆMgSv7s{[1Ap'߱M}lmR'?w_|13gΤ}N6cƌT#TVVZZի֭=M16Y]pnUWctl+1WwtNn؂Ws@^csތz,`͡K%FlW:ASZ\=Hn:ve?#p`&$7)$xJwWo ϹZֺ+MA|c>E7P^1J͈GXch=h; 8X;Y~kCNߑ~1:M$1nĪF_比kw>mO,ؗ-z*-ctJvLVrigU0mb*l/ {,mf˖-׏VbŊ7~-"w4{XpN6VDt%f:8 v2pbsPkg]Bb9kmNѮ;:KJWm_<*"ÀJ1qJL4(ƠYD H5Gu} -{F:w|"mG8_=1F1:Z!>icNctv/.wՋB1:j< 4Wڗc~ 7E fVܻ\43- >r,B Ni mXbٽ`"-ΰ6;V]ٳu ǑfR@|J}Z_6?Jvm`|m}3X"w tU,⬿5g:#.cc~1sL:uW:vmx{G/:(29|/'jx/Z8p~s|<D( MZqvp`os5kČ^¢ț769Fct&L;߰w?ooϺ$pιؽx4D1`|\p̛7/$_D%&&G1bDj* xC0~܌1_ՋN;-lMK)9Hos57`|2;^ |wB {&ﻏ1:HϼLJ*!w=(7kXwߠWY+Sv7cֻ_1fӠkP?|9gZs}Hڵ3c vzόR=˖-zm"T+V 5U 12| ۸43(B`O,|F8fh)ϠqOWNHݛ99~.%Y9S^¦Y [6fܴ_"Oaa!7pyyy>9L>S+22>I| C? 뮻n) &aY؛BK1~HޤԵ)WUɦ /^ys?tf62z\Ӫ 9}G7טg4w#O3i;Q־e)/cz؃}O3>$ϩ>䓈 Xvus5w]G-zWOpY۷| 3beTNF~UhߞuyVwT w뱩Ud ͺ`|-uժJs+QsƌXϧ,_ϊR/R`C휨OfoTfή7avC ]^@Wa1?.7ٷbUkܖv_c<NHI!߰գn~׀7$.i>{N^OZ|#6̛7AQPPt+axj.L:o'-ŋ/HQQ6NՕ[肢#IrNMJȹz޻l*|gծL[h3Q[u1:z B|mSPRf-.Azh2k}0랪Jn>c,X~j?wG8 w1gϞkvmRFbL$q>HlL^|Yvzm6}\j}ػ oe9;f793P|J܉x+9eE7o<2\q )99/$#k~/)Y7G<D`rp+K:u*={t(--塇p!pPLW'c|&L૯+p+'w@:@P3Cۖ1BBj&g>WUcIߑ`{Z_OMkx S2zsYM13аeVzU%z5L7oO XqS .K.aڴi4hB_g͚5CY ƿB5Uv=9 }IhX`oҊSvoٻx Ưqc\8vZa&k贼^6M|ɛ; +@_ٺew?wl2 oM쇞VN\'[onB[nžʾx,jbL}Y FNN{94]Yh֭>TR/SxrYKmoSή9ck|oEuW-MoK/$&OLE c}$ؿ?^z)?0G ֭[`]LW'We}deeDb*Z>paUl#}˦SYY8&? kʪYluѐ,ۈ;Kqϒ]Y+ awQͰIhD'x2'/yk%K0`ӧOQ?~'?S;;}8fo#U+խaKB#F{I! dzvK~7Y紿I<qrVK~i7BMBWX+Zu!c,LowB2mG==ct}\PPݻy u p{<~_RYYɝwyϋ:^?J#%"C/]6meR1s%(W ,ZP***˯a#7|ɣ~R*Ӎ<7۶mc̜9S= 1b 2HVl cFO%+C}+zMڒ >{Ө琀wTkl@í wx@…ד¿qxUALzC4wsʂ 7.=~` F,zE]̙3i֬۶m>|8*F⊕@[orM7S#Xr Sͱ7j 5`$8H)<JpsH>l*֯1Sfpگq1~R5p+ys?xNIѨRͽNE`ط|V!E1FݨY,)on?i;.Bxp'Y+sl9_Cmz9t(`p>*  rwSQQpkz;6`j[O>zڄGRfrpd`/*,R_ar~FWmqSƛ-[K5;9 ('L^b,`=5gݧ8fЮlhځ>"6i(+޾x{Pv !P8-p%$QTQ}nGB[Ɂϻ|ҿIk(X1CѶ'%H|>oj^Q>%bl>8+Q7c%_bÇg6clHWUU7̔)Sxi۶ݝo Qn jG.^/s=Oݛ6mHhxl,gÎ\2OY1_$>;.?w$98 NSp'Buh_]0a|_~>5ܿd7c\y6\.zAILL#9s?!t̛Oj^BhЀTXCݻI ߥ͍Qߧyf-Zt!5j(nOV\i\trCکx !CHI \p+..fƌ1` 쇱V %Ee{`/Shc\9,U,X 0Y 1S1FIJ1vpvs7cQBln4 1 t'p}svd?V0.$G8aH@ oNq{Fq0/`N{ =HEJ`Ƹ p' '_(F]S?XE"Z`L[H h{1FE1?q IDAT~O˜ߝZ{J{^DB&¿'R'DR`or~r*G%+n$H10F,0F$Łk4lj,n /8^A h1{v{I5w̳"åǂc^(VC/sAT~Ay|sH(0BFe"4BLcgtkZeC##ٽ|_)v/8&d F 1^F>Ne1$GX}5" "ޤ^DDԭ u^`Ι'.Pfo%|v>EDD&Z{{DB$Bx +kZAʕ.%ʡjl>௄wDߩ tAPL6:݈H,ޤ^DDh M ExB)YmGy1fڻRK w16ta+WyY""-7)(Z{{1+ x0HqR0ED 16ޮx gh M ED.ޤ^DA35fddW6mڄs6mv!{t--%ϡVr^=Co;!S(Y$$$вeK9u<<툈DhM ED.ޤ^DjKޟ^馛o~CCUJLL(zloV`PU]>;ybqO**n%,\IIO\=x|fz˂~GsfUW]`KСCk_m*:;JD$ԅNrDD$եNrDJ}k OT{Gdf- pXqӭ[}`_>SNrꫯgJؔVDDյ^DD>8؃s+Ր=ࢋ.k׮̇1g/VO!p;W_ ,ON>}n%l:w̍7h?tFx/""@tK'T[}V酿RX*X%| (D 3s)}'a,;믿ޙ"q1}L}[u4'`ʙ3gwޮ];ڵktaxbz:ޕۅsT{ƴ) Ǩ3?G΂M?pz:U:о,IsUM>h؟P̸guܙkךg(#17#W`/"":{S{gq%wS i5?#Aąbƽ8뮳H*0;Tb"9ϸW`/""Q1Ch{癡[gP+1pJˠ,`ވ>x7P+"")T}P ED$\GK`o W`/оycǎc\ײV82/BBSp;zE\\ц|I%7;W`/"":{S0{Ƙ}ah޼sĚV@[Xo*]ct(!==&mk;WD. Vpm)X{ S 57+,nA-F9JԳ5gk0>64n^6tHw}S ؋zBII؛N6W`/@@rrr-Iۀy5Ω9FgbQ CG}ޡ9 =7lp^DDX M'+\n ~ >>Seר֨30Fv>4'J`o:^D c-7op^$2ZNRs|&pys>̜\bQp<P:ՇH49>{ ED$+t^Hs%EEٴ48#$[Xh:ٷoޝ^caG_ EDӱX M ؋H$-T[p^$:1|Wv\7ccYS;1m"0<< -J[9aR uYF؛j ؋H$וT3W`/=oٲŹnbDc΂>V_4Ok GRRH8Xi^BshU3+fp^DD-/K*dXrCĘ<>Y%a+FJ`oRp/d^+""3{K ]GDfPkgW`/=~y㜲co8|Wc<S&J~,68ԊH]`晐#K=.0lQD'x}V_$ژ<@nn..e>^dt[8'młX M %TƎk/ C~N.N"""""K; }FXSQdr؛ `̸YrD؛x,a.x>2wQXXpgvq58F-Z~~Cz+ zCaYesA/p3hs, GM6e˖-$$$8UJLL:i]ˉ_{\E𚭾x_8pZNmu%FepJJ"&-Çל 1cSO9FX]}L0,9@oU e{-_,Pp/""""rܶ4?صk|DL[}V'CW=DC3f;a~iƌta|r&Nh?o؋#>pWQ9G \+5*GDDDD>:<# <ή>)qcl.k=ka+ͣr~ 6l  wcl ѣsЫ/9ؒHT-7ق\q_[`o#""""r 졽x`ΝՍ~o+}QQ'N$8Xk qK0vHx穬䥗b7~7oП|j M+7)9uSxxGQ4iB)LZn #P`(FL8"a2Hw+fcN|嗹+ckZ ""!r)Fo`oҨSs'̀U@y஻W_%---lEh{-m7}ctՕT̟ǝse]وV}as]v#`eW7@-L6+.qeﭷw*)S M EDDDDNўXZ?LHWUqӍR`a!#uN 0] {`9>B FDDM0{S4M EDDDDNL͙v0L S/R)?1YpyM펠Q9㍐.""""K) """'n0x1~z+p.0?\'""""m4GJ}iTA 8.799*'#qLn w(Q`> EDDNN] ؋D. Oɉ^HdSh/!9 EDDNN EDDDD"B{ )Sp/""rrb-W`/""""N7 +{>{PPt/'Id:݋=.to=;\w<Z*Zi/!큽fB`o+`[+EDDNHW`/""""]^nd a+Wܯt{'W+>Zi/A烸p^NPvѺ ׂ^D0C\ 8hD\8Eq@oHlh|.𺠪}[;O_k? ¹J'< $z8N:D,݋H-KHDap_'{S E"N_mӍ[}0R@WdQ8lzdsXw<#!OÉtJ ?*'6U`/Q\2CQ` /WB(}:3g4K/X\Gzx,իǣ>Nشip90ڙDDD$)NH ؋D0F /O\\{ɓ:tKNcϚz|` Ϫs, t“O>y,7Q9:ӳط|ўs"M]2Ū3;]@z[2v>O%ṁ~w/;p'$Ӭߍ7m[̕HkE[WiKV~yrogAIIyh%o"55?opEr~? g.x_NDDDDq$"tTj8*GH `[շ{.%F*09omN{_{ I4yisҚnixΥ$5hn} InԺ=M7:_`^wx*FFX{+(ٹBJxT؞?&Gֲ%)iѢo.F:NM.t꫘xW7>""""^#‚{5DRp^$$9Cjj*ӦM[nv%z+0Vs-,qU+C>w 94k$NΟ)<&}C=K Zz\A| Ο?ʪӚNZ+~`w&v;5VCm^k; VBGYfC/x\߰a_>_5^xs]`r؋Dfӽ{w KyS;3vňrBۖ}ҺМ $R[ugw iwx;C큷uEOj믿su=z4fbܹ{1\W""" KX9+?'{"Ʌ лwox.1>|3hnձ3{~M=O1V'fd"el:uV"K>qiVv#U%t3Kv뭷eˬ17;ُ]vv6ӦM7xwҥ 8ژ8Nq$891*GHĺ`=n:Hty +sKl oFPùkڪ.NeQU'g}f?.0F}FHYQ)Hd)6~ު ̎}`׷Z+%2n^}U8LF5kVN;~ @ 0W`¹^HD-Z0tP'{qֵu0v%\6! }FWU_Ҭߍ)g*1L$U'F)9mhs6-dv>z [PبG<Pg+;gKݵOr`UrǍCo-t+oرcҥnmTO*0xٮDDDI 1a ؟p E"ZO#l}HynkѢ]v_~yڋi]Q9 OQ(G(xgf1x`[Wc`2Wqa#DwEVm9` idߪK7%o#zκܴ~5FSVIjȯ VqĢn^vNs q! I({"Ql󃤤$zd/"!bwa<cੂ%Ka_zX#!~\8a }U^<9kds) iYGeEu{F4Kț;+:.96aVv|'(O$ 28EDDD^"B{A^H԰ wԉ'{1F&)j*|}nHHk`ջN Xܰ;߄;a %y@^C,J}Nј9}GަUoT܍.==Ν;)KRp>D+*ڶm{D7Ʀ`rsj%ܻi**-dߙ2c IDAT4}d8z\aĩ.}nNʡ;ƥ챯wi1:%ly"1rsCDDD^") CT{"QAf͎vH fg;lu 0V&8ת륓}@6,`frOER[YO_ WCrǿCwҪMpӏAz"}2ǩ>DDDy %dp>LN&W`/222C$2] W׸b|> Ӧ:tyؽt@bFC޽sdXΦJ>#/Y;!6#ylV}qI)F;"aÆS}KD:^}Hp^$j%$%%9هHdjklfqÒ/%7hFϵM?֘]BfoXyvø}>61>Jz۳z̮OʡۭƥY2Hj( OjEDDD^"q r<{XUlu:Ъ9k]x\>_zwBRzt^M0) 6eUfI pNѶ5.wO?#R~Q %#W`ﰣ E}]ZzOĮn[=gsmuW{0DBzsuUqhWͶ}hxe>gS->%6W=p[&V'qgX;+fo!iȑSEDD$)WKp>B)W`/8p>D"O!n qQI\Am[YΞ_ZuBFC 8'ThS3K Z_kXuI^.;UgugXu|j&)>2V#?T"""<j #=W`/3l۶h=xu>^ lGR^-ޞS*wI⭺xzd M/۫J?YuJN{%>6~<>O`%;[u=lt͵dzĨc"\KĞA:B0v-`Æ N!Ylu/>h3˨Uvi)e˖C8[NivmδjK|wtZ }0kl *Wشl߰ln6VR _zhzDbŋe~0HQh/Q[}ȑ`ƍd?"o 1n*;̎Z n?M>sy;ہKιC9Jvm`[76:>O6崳}l1&#gymm\ XpH`CHxn>_~T[qE؛9˴ ] CF=~-?GڹVLZtJ>#M0vLHϦU7?{5`x&`%_q`VrНkԯyc6>>Vj߾}L4~h,A\"""R)}$t[ikκO:˴ ]7?6&/̿>.&ܿ[*XK|Ju{Ѷ5Ī3γjoe9'3{$-[ƛouː!C4i\rӭ/Lqux(H8"""R|Hii8d-€{NHݨn>-Zh;qNIH=C0tP+[ ;wo}vZi/"""G&Ơ6lO?+pK"a ,} {SاZ4~P؛yVֺi-:ZaBq>'pE_!g6-'GAV{Ϡ;InCA۾49oxpg}ٳ&8)w1b>`KkDDD$B( \?pW8ەH8I7Sj _2_)>R{3,nkqV]w;@>94՛Ӯoݕ&dݞs؛M_S^b.{\7UTT裏tdc2rH _~iӦѡvDDD$ٴ%P x9rd͐A$67m^`/Cn^AuVݠkco ٷ|U'7lA|g4KѹouGKJCo{8;K$z7Y~S8***7n][oO :n/Cn宇D']ϰ!冻$ImK$I&LlQ~ <xbo1G /۲uLI$i0$I(>^$I? %I.+}$I?K$I)$IR3$IC_ S %Ifh/I$uR_S %Ieh/I$uB)$IRn2$I!{I$)K$I>^$I-$IAz`bp/I$C{I$%O1$Ir$IF S %I^$IJ_{I$o3$IZ>^$I %I$N`bp/I$M$IZ`bp/I$=Ѱ$I”HSG`[؁}K͕Lvg똉 Gex$IR1$IҀD<ݜ: g a)gBB6%I$"H$IS7"9*fTo/9lʉsK!I$:C{I$Eo}9O^$IC{I$)MoاFpo`/I$u$IFOاdpo`/I$C{I$=b`$It %INpˁ}Jw{{I$ka7 I$UgBS%v %Wg`/I$u$Iԁ8%]_#p|7$I8$IR'FDL"M4B ӥ9&3H ꀵ7$I+%IN8" C/ (W3o`/I$X H$I`-LN*#PX>-QFa>.%I$I!IqH@U>3o `"pZ" `}@5K$I:gK$IHӷG q$ZU+qE`+-(8B$IR`h/I$`}G %I1$Iѕ>?] S %I3$IN`}w{I$k %I4=اbp}$It %I=اRpߓ}$Itx %I$z'OɅ7{I$ %I4f`җ S %I1$IҀ>/S %IC݀$I895@glPdġƱ$I\$I8#y:f_>0HIluLI$)K$ih$IwK$I ^$I %I=7$I>C{I$)M %I`h/I$߂{{I$)wK$I/$I[ %I^$I=$IRr57$Ir$ItK$I^$I\ %Ifh/IBEu'KIJusx}74jBy~T+U lS=b-qMtR prMa7!I6C{I_.܋U<{W֌'/ˁ5xy}z8'&:#pR؍?$Il!Ir06V8 ?v;T ɣY:fɏ^]0Xv#(H3?o#I"$I5xrRW7W7'lS؍c4ذew_'I^$u$i |/fر֜=W\qEܥ{KK`^ү*ZcɼumEc~[z5~{P"ƛ8&j+(h &4V7+,&˼nDD Rz~!@ZV@$B H$! V0R"< hس+XqFῃzo[o!s0'cRϟϲe(*ۧݻ_?>ҿWKy^"I3鼿d`WWPFF|æN!!O8C&̤R3}s1XuZ VXI?ZAtPm.-vWn |,U:X7|pJK[{S7/~ ֭[#?Кtڰ`~a^W=o%KpuԮ7[N$%)IrSŢEx 5d (U39F2OTzwQ&o~سUvl>#oC[+z65mlxvx$Ġ3fyģɁ@[LW,e>oNT0vښDS]A`#|`nΜ9\GBrҕ$I$I bΜ9,_Q8KH@PXUO&d@ݫ <5^^N݅H1/WؿksPN-'. [%Rv'Hி BXa1:Euӹ… 7}it'>u9bŊO~*6msyy _[Iq$IRd@^^կ 50KUƀS]ןq_eP:y ֹ?u>fkA=l =) z56e7@iZee7f̲ٻط|_2dTϜz7O]w?S_+IK)t^{x,$d~f5`TyBkMm"1&_蓾dv[o(-hg/RfEP[p9C&YGMbY#秞3{lpw6l ݒ%K4P7}]woزeKjӏI񦴒$ `Ǒ$Ie Ho׉si ̴ *U̸ϲO9-sM{coN8aAPSA[O~Nt`"̆.cC|w2z4꩗ Ѽ梛naÆza]r%,[l@ 7ܐi6$Ih^$gu3ghM&||Q j*yC9MḆ7gQcoٽ:m}I?^^Nrh/v[#/n؛6u1fDy;F{|Ͱ[s/\j[$I!X$IRg榊+R?H贺XVO'V Uӳ'zឌ7ڎYMu5A=/9P}~&$O{̂)pLn%clo75Ƙ43Wsrƀ_έޚt -@x]I09G$d qg؊&2oY,j~ZcYihR}oʩ~%o W:Tʵ zAH}A`)*aecL㾪zDjhg^M3z+L/ƹ$Ix %IR{1y0{G2\[yO>Moɱ72JgfKhn 2f~挟/Qv!t؛aDhu^p&8;i`;w.%%w>5^$IR %IR{̚5+>pՓɌ]-x~coFz'VPi GfE38ƻ51e߾Q>'IF7o^&C{I0C{IԞ ћ0aB}Hḗ AZS}u,?gujMJ3痿Ӽ/SHZ_J*~:8㔌zo\_f#IS2ue(_\'eh F9 0ӗvl$fT$s$= a!eW)pFZ>͚%iv*`wQQ׾y -x%N$Ȉ| ģ16OC9cD51oM l{2O5De!@᫭M/@AJ~^$gAA.Ȝes0;~ yWa85k6NǭwǍ}J; Mu{xqf2yM u"Vr#Hă} zs̭΁`x&.^eת|N@V]]^%K^$<`.R.+O?nR ufwqt`yz߉/O"-t/2Ӄ⭕4)HQQ }=ؿo|D"LoeN=L\t-#M4c,ΩH/C$^$gk-[C iCz,ٴz=vz\}y0s@6y)c͘MZ ??cMZOvȤٌQPZ {_B𯃺j8;i`yf)>$IR %IR{6[.>pDiu`59F.3;0>eĬ34ltP~a Wϰ[ $OmX͌%7Ԕџg㨋:cΆ~f >/#cC[zuz`$IRgh/IzAee%7n )Gsgmiu)4*=Db1FŠn޿X3jy Zz`NQ] 2ӂ701e ictet?t?fÆ %I %IR{^%֛O xl2ۑ2s]5:5F疖֧>eR{{$$|i9܎u:<W=)s+(t:o=EPcT{ҙ s?`ϓW7ԔџsE쏺)_"7u'\H4M6;4yyyqD"=y;L/&y lI4@K'w裏%)`6W 8XR? |t 3Pۺ}[1dL"(c_GoȘS/ W}4;Hҙ Z,۞c?})@БL\*}[ֲ{z@?k׆J_*~;P /+d|*΃$Iy%$IׯI~D"mr;RH %iu9vbŴ .W>E zKI[o;d§gԱ"s6'g~q]F63O5A3/٧{H477zq?q 7$$I$I:* H~ۑB482~+!9F p8wR5c_L$'|1󆲥Otl-4VMgWug#ϔWP7`#gnưho~jn=\2}-ڑ$I}$IkD"}B6k8x "cN`.mMkzа`N=@Go˺D1Chm5[c{DsɎs6Nꏞ5wnSO~ݻ7]k3̝wɗ%{;vկ~5}S9O!#IC{Iԑ@0bժU\s5mH)vK@z]i j>D3nWX3jb%9bC& ~KG3ourNK'KB+e?Sشizkǁ{I~*݀uٲe,]_mm-\rI7N 8KJ$KC;Ңw\uUԄؒ X2gGq 2<9_>>J[hW 4;=ITn#[~P__*NԆ˗s󪫫9y7ϐZ$I}LK$I< 0i$z.]ʰaBkLꪇz?G+s7k,׼Km^7y m?< , nKk!Ԟ)J`rj… x}3`bv_u@S*&:i $&zSKK$Ia-Ll 1d^da *3"P=^-I$3 %IN꫁}$I %IN}$I %ICȕ>^$I]$IRr-O1$Ir$ItاK$I^$IjG)$IRn1$I/}$I; %I4-O1$Ir$IԢ)$IRgh/I${I$o3$IҀ7P{I$2$IҀ6{I$o݀$I8y'x&>0 fgx$IR.2$IҀrs J`2 v5h"{cI$I8$IfXXo1*'w$IR2$I/)K$Igh/I$> %Ich/I$> %Igh/I$}.)=K$I]ch/I$;}.) %I3$I+}SK$Ich/I$upاNpo`/I$u$It c`ҙ^$I$IR't>^$I9$IR'>^$IY$IaHR`K$I$IBƮNܜ?zFK$I k9 IENDB`pairtools-1.1.3/doc/_static/read_pair_WW.png000066400000000000000000001004401474715105500210040ustar00rootroot00000000000000PNG  IHDR(G%sBIT|d pHYs.$.$* tEXtSoftwarewww.inkscape.org< IDATxw|SUǿIwK  D*8QQpx{{ (n=q#dSfJKMܓ$'IÓ$\n==&V6M T-ZFc"4e9[ V-0EFCՋB4Fh4Fhh4Fh4Fl|Yfc< 8aR8c޿1.,-%cLJvAk\/|:gxP ?<{Q$6+󏏍ݰ3ix|V}}`CO#Jm?mICFvIj[4ⶃN&iJ_s0'|izUYT Fq<~ELYAh&EHZRՋpZyBs:NA=Eg.Zc<4I3+]w+y?&t:*>w+\tȤөW+RQ==t5Xۄ'Wծ+Mb 񽖢l1 -]H?fi,.`{FMP lDĶM0wF@[0M|?I1}"BBxm*ٵZش L /"`0 -j-=:5 }&IN]Į0Gy`xղafĉOO+Rq k\&J@(؜Úo6G59%-Z$V4B8FLkM`{i)==S02߰(+e7h-*+"偾@>-0 1lzsj-;8yrczem%@ܺr+3es?i &P#E88Uy=E=e vVϼ2CKٓ)ag7P+EKJ&'p8X͔n_'J&'p8X-nZ,!d]B''< = {w. OZ; sl,v;/rk!Hr l&!JZ@Ohv[+_]FǓ=e:!GU3`B"c5e:!|^Ūj-2ШX5Z_C͆) \`#İz 5o*LM-׭w#ϯ\Β{hTvbrٽSq:>-*pIM`طWX,d^:EgVj m ˚n s:^=~=sr?])ђ4v2^⻫ɔsG@lX9{CQ+=Oth( 9Peoy9w-JZ|Fp%b'6_h -g{)޸T+=/{d5>6߿u Xȼ StW!qwE^bp|CK%C_%6~8+1F9V?e/qh;;f/LFNNV/tb8Je{^6ⴑnJh4uC'><-k)Q^Us-># DT{W]&ZKdu1IĻ_xJa7AnB#r;ek1wL׳oSlּv8ď7.c ީFˮMzZv:qw+Rw gN5ԋ>Dˡ cR3>CZ6d3 :_U89W ؿa1>xЈSh9u%=תѲ9oaĭ{%>Jf[K-YGh)ݑ+L10}-MCHAaWK)ђuEE# JjDiY|Hﰕ3m2UK᫤ʀiS*)GmRɞ2 K]KX9m 2r,̰Cy,%gdH;<-Y_s-rr]E}^W5,Wݛ(KemQ-j1\SF8\o*[ <_EoFWQ2'a-QySJ(m%zNzVeδ~aDi+-b ړ5IAF$%sYf9/]m QyE>ػkR^ڿa1N3Ar#0ch99qǑzx%ZJeOq^G x(ݾ=n =q(ruk}忾w?z&i^:mjCA)e:^k6ܴtF(ҢQN#!y[%%[VȾ%{P'=%=qv[ֱ5eT-y\7>mCU32ùu!4&^W`ɣPuB7)8X dV5pR 3;:h)m.CW&1r`.zFPClc:gu{;"Lld,|EA|I wZ!dMzN|e| ;-V.=Wrd;-z^{aU aX,dN|(ٺ0/aԅ_MP(+^#>PegY).j-㹹->elVbEx@=^=Zާk{Rļf\l4qz/vϢ㫤ܓ0-mֽ+ZE9{w:kM fk7wi\KLZO__VLM_<Flv;w/h6:4N z{ͮ2!Cib‡T`)ypْy4{;Ji3MP@$i,9+DW} OrA`VV|-}ZB"cȞ2ŏIUlZnxK^Sgb++h93MHHD4S36~UU4lFDW*Uܹo +Ľk\x8 9HZ|\̮gc6d%?\35e?qr̳ɣ&_zƍ=a`%톝E1r+os&*_|?bٳ;5ZCˌxwMŮ,ݻ :α7x~2Tkw D8%Z|f81A-.qp"-#&->br~'giIDUp&_AKZg'*ҕK42Z."Gy$w& lE~-u7O,[b Xx`PhyrRVV{!GВ<8H6i-&<`],;GmbX=ϵC -m|MػC7n6~.g&kd~i4w|l':GOh&-x̤$3cS; sd`jFZ~3zCO7FGv˂[ _D:S̙j\n@S2m?Ɏ?>ޣuQt}2v-/NqyF|mOTSWц\dWefh;aӀ i%􅮚2VRiSW\%$+_4j mEL4ӽvUy 9Ӧ(1t]U^iSJh94`)9&+3hjcmQ!/VGrqu{+*ⱥDvLTg؁8D+^vWa.w]IB"p8X-nS p+{-(\rhX#^WciG:uś)ђ~굴x{)XWg_ߢ|bўLs1<1#(2\^rC :2^[ϰ/!Z~dHZ4ADT-XJ'}F_ɖլ{v5ZȚtG._8Zڒ=%ݶlᓡ@KXLkL.vmb+W\F㎻eV{`>6_Q ZKZL+|->y#fNh KY9m˟!2EقJ˟&ZiS|FC 7?*lEo!C+-e6eJL(7hƍUh48^FqRߌi4pp)"5܎hR|%0ܗ׳3܎zh4 .mp4~C&ruqcY{0?6W?'"{jwυ CFw>_^hZ4|[*=PčxBܧ"!ZDg-0H"&yMz"p=ֵcTYko#ѩ8{<:mf2k8L͕r+ ^Aki  M?s9@m3?Jb-fĠ>f@Cj@dZZ#uE}j4^$ xN)z[SC "+ᣦ&CkĩulkAd:Ǥ?h QF>܋6#1hZ.ϑijCC?{k t l^n /"sk v@bB4-(l͏QipdM j4Ѱ$`+2zS!+J3pb-(XeaEĽBM$p:ic!r_6 }!gu-8D}ԥ 9Fmψ@j'4!Mx} a?b忝 YLŖIx1,54dr$ES iyb-icub-Ay=5Cc{{Ws1"P#~=Ո nU4&"Gk f] jz!.®ο} 3Mll^ x3Q,+p75=ty+Te442> ?{ IDAT74DD$ [!WR%y K"pޫ%b!kY(UǛ'#-k38jx+PMx |j3V 3 j{X@&'9Y`|>X&HC_v*ĽcۯaƎQ_'?K0z#n~E;o0 xa/ ٛƛ<&6}#Ev :4#NmbЇ@?X0~;+0 olLFSk.Z{6ԧ??OT sTߎ<}HRO[m 8z!&[w k}*h$Δ x.m"{qᜨz{Jς~.BuuZ4E";t1Q"?pt~}-E}M7`]tRCqSM@z 5}%M5C{$1QZK>ۄ!&WV84W< PUM*~]眸~Q4M9)<S}4~IB4~KkĪjpU%PQDWqf"# >@ogގL} 8+>СyvVo%\Y8uQOQSڏy̽7]xEC _oKqz"| 2<MfG]ԜzfoJaFm!wQs8D)^w_/ Muѐֿa%юݩs?0ڗsbj4N40@brl~<&"KNv>C1fɭ1lj55qm_b-NxH{ ?V ̙n_Rp5aX :pl`k":983T xPd]jw^qhT:"S1w"n#ow9=?T玱[{&&b?nP-D5O -C{P@yAji;1*VLeU c\'.U%ك. Fz!~#۩yދk4Ƃ4:[>q#>Q錦ӐSEև.߿x# z@{ Y2IUh7 'nRES;=+1*~PF,Gڇ?`W":TXa}>TDJw; BfF~XKb}ZVZ##q/Z5kbmBP-ٙď%t $0EG(֢ Rq>?K:&{XKc菸tW!##JF+Snlmy6R&ʹa,B/T D!ggSgˁ홊Z4k̩Ɋx;iyE&>uJJS89 f`F{t承p?Ex!"(uHw+ <ܝ &,.S'M P TzvGGcX<63Ư6X"SႡ}N?Dөlr\9^-[hXK 7&xQH}׿F9^CJlWyc0F.ULEN8o-*)fx]i8UBZ(a>#J/B=PG`ϝs)N*ghh?[׻M943!aq{EԞ%4撀9irG[~]AZs$fτg aʨYNF ,LyOU^8"L![ ݁0Do v8 r?quC{Mab-31B.jiM@Utmv]D"LET>GXC9 g"i4`Ie o3 eW@Ǣ=Գ{[^X }0'i04wU!d@j4D' vyBe$-+.3UMp75'%* B&P8~}+=ƸyYO'T簵_9ѷ)X<O˪wQt 2l5Op8pc&F.907B΃Gt\s{pjB\SJ dvGhZ2nFWa6|":9oE6 O@Ll{"2I5_Z]rb-d͈ںth4r4`YD9971ja=VDHiVj @=0h4Krb-,@dyRo47Ka6M#s(:')@r豵x(bĽ.4TAIYc`b-&Qr1obV/h|kHWd)My̵?E<'WÁwOr>7#[B-Eق/Q[i4- uC*P]c* E:nG_.Mi{;sX_?ZJs/vj3TCs"ƻi8Yr" -Dghd{w"b96)&hp`'" .13sDK_b^yB7kU\G [iuqZM?jvq g!&F iMx艸0A\l|Cc b@;+ne1x8*Ԣ+|?5G"@1VZD:e OwB8k b,DK"" }E d (Q~[i7'K!@vGLbrl+@.NPj :Q0_ c>b=z9uc%4mG,VDM0dlv4t|ˀ3 ~F F<z_a,OPw聘l@p)j4M착R!ɼ`1R!́~o&(iy.FlؐJ*0a l 3gp8\_*M#A| ,,/ӱcGBCr5xHf8yוjh \s ~R ?8gRhϨQX~=ְ1hw NXwBGVw\> XGb 3/{iwCO :H>:tG}Dv3`x).6١,w5ɉs=iӦlqqg8&f֟ɛo5:rTRzgV,`atR}bb**HLLkWOo^'z_鋧yU6z\IC]Ē$ >?f<_U^‚I $Eδ)Y}{TI˺w6Osi#/^YWgۥygϞ=·DdKeWDQFgG/2guƍc~cB>`2a:.}ߦ_~~cR-Xqe,_FE@F\۴E{vM 291cY9[6ڈTV~:*Ÿ[\<#9تOJJ }QOxx'M&}z_,y|,P=2x9ީ0;b*?kKWwɜ&YT?oiKvjws,}l,E]ow97W*'dvؑ~n7[os3d·O@Kv}q\'Nd̙XV-=AFP6v;3V46Է?1#5&'n۟mMeRh|l3ӈ24xa'ze:$2g߼HE.#zɉ ƛ&'lFN5^ZCetGLN98OkLj2't}'x"p>*|Wj38׏szd6MRŃxo- 䎝L׮ U,wQ689Fŝ}[1kkV̮ᰳo0msNƹw&' W7&'R>49a+-"eQc8lX!t{oyꩧl Q hD ә;w.Ty Νˈ#XҸHD@@ 59Pf_˖c@ަɉE|%߈OбF <6|HUXw)qQIN:xlw>~zӈz#q+;<`ġ񤻏w|;M%$`<#nt{bbҤIK"bWnݺ믿䄓$fϞZUaAq5ꍈcƌJ'' 3k,Iir%<|)ň&gLFa݋d}qʑ۹W ̆Nt8~=r?zMuY!doe%[VqlY6\hu$mh7SChh(?8G(jaL#惀(%|w %͸qox-: ȤS(/"III8'/1;!!\mukr~uvMxKeWY֯3ޭpKKqDreKj}G%uqxgaۼw(ٺƈOJX+YT}=~yLjAFGqhL駪i?f͢З^b3dܹtPwA ӥK^|E.蠚(+ 8=CǎyWD`ϔÖ|n=HLFIu]u23f*g8:[T >S?8S9r$s%}Ʉ x7l6H<|gN( ¸T?W8O>Yw'.I;ή2>ȕ7}$r\44RrʫVz39}|9}r ,.M`g/K2k[~2c/ CJȟGv1>4 #;Mo vl0.gИf~3u$%%qwr-8G}V)̝;y ._~~4d'Kǧ4$U9Fy j4F*㘩2AbT1כ>cӗԝʸ'S*c/!}J?3~7 В&'@ tc:٭]Vm6^^-ǒcftlWm{\KUcHc>_m)*Kx'c]ޥ?R#p%DH-;ENqf:u*ݻ׸%MN8yG\6xg IDAT00a]Nྦ)crh4GTZL)k2K7j2^_#q/qbi#v*X0bT`2歷"??}@BB&MRZJ믿{:&8ѵkWNFb\;,#N?ֽ݂VɆe'D:nlISKn_h ΛoɯZ .Lϑ ΰaØ? ~p}0aB7%MIe^2j4NTF7SJT^؀TMCTƮaz=7G\6mpꩧ駟:=A/XNm+-FܷM"Ǻt?;<n7-XURѣ'.Jpܷ&Zk4*͔5VRH/qtjwR6_s?xOh]ϾQsw9?F9##Nt 7Æ cذaex." #7X@wq7TFeҔTNc̙ 2.þrjňS[u&ef~3&\`:Qq#0FYǦ煕ˍV7wĚB#436?fcY!&]ͥϯ\fuzSh4@CL)7~y3.SfÞ߳/Ǩ'jw6ԋvGm~1a 9 ; b8+׏߫񩌝u*F$X2r36~b#wwP2j#FϲT`c, T&=u6#>-3⤏ہJf'Ŵ.ג)ftW_\~o ۍ]Ɉ L9M`S)eu}#n;p2bl=|Rx2湚45%WRo62dqS1y_L9 a1JOOwS NZ(xm* + m ol-)㍹FK]bB[YL\x80n}1[F%?P)9Rgw9VB"[qe3#N22S^Qf.hJGOKRXd,ƻ3ߒoJЭ)qgY)b[TF&ٵ+S*cQL;r)\NdR'{l]!1zo2mn\gTFOhdݞc< {i)n㝁mδK9+Gjjش z2GtcSq1_I#ڥط*J3erutLJ#V$96q@ö;L5Bv/ƈc;"x@k+P*++7:}۴5eC{([EpFvqF[ntN F\bgi'U%lhj5凗M';Y.xSJƄqP0HS+xgJSy |ϟfh|oI˄EWF{,Lۤ8wULXԴȳ{ &oZ$ I0e-p&~#ḍX:6:bb!ݳ_\( S]SQh4$4*gde256]ޅ5T **r?|1Iiy ڍ#.2(X>ψ-!dwWG4PTd*|G͈AޤtpVm{y_L>+`8l޼}Yrf{{i gՇp%[S{htOvMrr͡YlkI !k{wL w1u:{mMvrT]2re-Fln;+x-CEQIL >dZPI9#x/(ٲڈCIweo>#cXB`m]Lt{;TCn@u>r҉;b5qNa|F7#^Vy۶h$ m;⍲OHd|w>[nz܎5L CS>V齍8oTmQRr1LοЂCm)xh׵hX΢ZJ_si-ZbUhDIrSܧM"wn#g!1t>eANƹwT>||K_zbUn*ٷ l525J Jv\h<͂!B+˕eX3e6W0ms[)+Q^k4@9;<#rv_@ELLD.55ٳ;525[j䘩I >hZh<Ŋ+ҽ =A/!ŋ iH뱩sa.} "$+]2rw1kl>DV';[\P_kY ligt>zx'tF v &(6%%%̟αW6&~9e.%*4wQU?IX"B@DEADB}Cj[u[åR֥P @YdAd Ⱦ&3wL2ܙz3<,9sssgr$Gg*TZ1ͳ>n>p } ] ^ nÿQ\?ЮL=8u8W/32k<ņM$>`NS%&L(؊fmNu-yY_iwg6?a2¾p6&nIK4K_{^ 29 kaY雑YW>h!KAU`lڴ P30 1b;w{NiÔM>y HQ4+Yx4'"'OɁfʑ@fEgаln?.2+2kaɻPm&C^gۂ<3q+f臁@ziʰѯѰծ@2駟Xn]'AZ8s#|>Æ Fa!*&79~U\ӜOW,Axz4dV4Y^-[1g}髽Eed2r{$}> x}BpV[ZȗkV&..Z2+D,}QiG4|spY~/}9x3㝃NG;Ʃ&.V Ͼ*Y,}]7?@pkv/!ƶl>1N?|Wuq7d f/=k׎wde-O-%;v0nZ̊4SqTs7/3$^U39?-3_cƾI+ s}:E3 }F>pu yCؽdjr :]CcLU4ſghrײ9l%Yg^f^ -n |>sⳗ8k{raÆOO}b 5j+WF:W<1ŋ4i]v$g]S\xxVv /گ4fQYX4gULXk̊uʩ<5$o9-ٵCZ\lacgD`}l2$Pk͗92I3Ηعl6CHKa =՟V>yg]+>|ۜȬHfs#G:nݺ'PF C|>Kp#vu[h\V=p h]4 ǭs/ Z;Ml ^/hZ=g~|4R%S#/;0ab䳮 eoG{~2zjr'TxD$9p9`Gw=dVa__itՁvOٹlv^_H]m#kǽzshgYn/b'zo}:xwBz2Drxi||cְ;,tw.iڌ_$QQ]:jhs׬vsmK h""d.Z9r@x ue?@)8K_ md]Hk+fuwדhhg)..:kzRxb^u# 0@Jx9KۄYuÖ/e=1իsKϘukT-G癁vzL.`&֎q__ 8xón`گ^ԾHw.8?GǾb|u?Пy|A|I< Te˖C]+HByfw]-gYp8_ xcw'-Zc-Y~cVwbz\֬y=ize "YpڎuCҡO;:]C5_ `[0,}hZ>-G_U*!C0{lqDO2nݺs 'B~_s}=A1 4 3< Ksm!3h{^'iHr:GR@{Y[eyuO<;^7MoV'w{V/$'HKㄛ4#V}+w.>zu"Y̚5v7 5@W^y{7%')nʵ^˞=9pʞHTm+Vpuكfk7k)ukƘs) EE8ɽ䕐 "^fkNז7%8)Oz\H_~v E-.[ӧO/fR)qw2w\"#'?N~8xЛ1Gړ7n-vtY R+ȊоJ˨߳v:縫"-{#q=}^O2kլ9mg6ȡao9N <^|fx`&֌~x{uB|ɡ;8oR"{Bw2D8=NǬY ԙh>x wu=(Q,Y/T}yǸˏh ;ޤAf&6j\5EELܰŤGM:u]L/Lї5jЩaײ!^|E? "gÆ 4iލ5+0J1b={M4udTtvm;d$NEEE|GIAf˳,qnׯ29n!оqM/LF5jx,ݹ;]UF+m%{|W3xnk^(.{,kW&k;4zG/f5ФV-r?>X"o*#K6mXhQ'&￟W^y0JX~=[}ΛHGcC5ȧv&La~w}̜9ބYr,H_5t֭(۷od5j ӿ^qqqJ]6UDw^ :5T,N:I=AQXXntLȞWHjh#VٖG"'jժEjɿբ߮](*J^:5k,8 [ tfyQDusdرcGh/%(}-.pFD'""^ S"Q&ewcݐQ,#>fLFc R<S' ܁LFܺNX-]m e,s-{ciͻ9|g@`u+DTm\ " 0\%4,K_K$Wc8 yYYR j`2RaB| &+y") /L1f F$"""uD"""xshT1w 08DDD茹+LR\m8doxHua xm6f`SMDDD$r;^ 8Y*EDDv]Kuc( ?0"""Nј"N """"^kMHHTn]fɇ UW~)2/Uy I(b?O]q|]G ` 1n_<8H9/P1Eg H28 ?V鵫1ۘO IDATg0v{HnxD(>xTj@WB&"Au0fc>C`jS8{D|H0ҋ:1 +0""|:(: 6E#R p5ID$Y}7rρQcƣ(￴@`жsED$u:R< b1Km]DII=05=EDDʯ Xu 39Q@*X20SCHߺ:ɡAHٽL-[Rn<|J7oEEl^Sg~N#336m{ǚ5kزeKhh"dggӰaCVMEƍٰa14lؐOcİ|rvY &d] |Lp8m۶MϚ۷bŊD+ x`q_*U|}k֬Hrss}Nj_ zm(ƬgL4/`Yo^^}U_5Bߣ/xw-&ֿߕW^%~iC> >ܮ`ٿ*رc}͛775WwNq|t!")L=i`{.>L]v^`uxHTO3|p'' x 8ĸ tԮ]/.]D*IT^?tܙ._~y`*0ʻ$ 'b~fTR7xoۨDQ]Fw'q:p-pL$J*ٳ'*ӦMs`V l.*k15 @>}]r%̛7.7x>7=c8F1qDMNWC*+ׅ?cJ9 \m= 'G2~BYvv6}:a {- 7D:u3fLJLNڵkǸqB]($)Ե@FFHye{os~MVj1CHRax饗HK T8MԽ scM Gz/i@w#4eO>9T:c̘30b$׋kBz!|MVz;M[=P?N^z;:Ðb} 8[nuGC?q7{H :K|4}Bwr07v?a6M)>^z1tP뷘+:l4^}U>Cu2bڷoog;? nv.8+RI \ |of4L SBJ֊DFC\"3:twjkV W!gJv qHLdddбuh)?D+` gY8%"1ZWK`ԤI/U ,k4h f?n`t9WcnRI*YYYWqK`LT~XWJaÆv3+23='ZI@ծ{)`jEB |-xH#Z*R$HdvOF)"t=wd殁 j½DDF͚5]M@ULD<o~M\`I W"NtBJ8J3"9;zsUbdcݫ8ĥ9xHCŘGJn\hQr$"I!tEΝ;]M΁C" l>,xt`ݳ~$"~Vv` A9Z Eƍ_eP$M΁C"-3NNu&"oÆ vs[:.gժUqID8јmL>NJCDЮ]XԞGbիCIi*D$Νk79~rz~ᇸ$"K7¥2βJeIjgϦصOwΕZ̟?8D*}.LLG؇%"qA͛gw}LPzg̘נD*=2T:_܎CV"??sE"w2)9wŞ05D$)M6-zLPLuz,X.VDbI"cذav8Cr7-|>ƍ+t0ʪˀV{ 0jD$fj77W7c6I| <};>GG>gy={x 999s=Ub*~-+V&F:Wn0מs뭷zHepe! h:3qI6lX,V<u::p#F |* G%###QT&Ѥ2Ɲ2J :'x0\,XIO>u=vsW`'Nd…z$*ُT?a]&qKRڵkݻ7:/qq1xJ 4] 3sf>8&RIEh/S? h$%߿~yF osOhȔ5m4+kPQ8{^ꫯzHedOZbC]<qIӧOBMN̙3K.m۶yJ\ݻ]3\sc0EZ>ZXbΜ9tڕǓaHקO6olwR| bC֯_+`&Wr6n:K=8o 3?RXXSvo߾[yCs@bzw}Wb`վ8jŌqKR vcnn.*clq}0a= +vFIX{. |4}z衘(RD8jC\{10xw3I6jȐ!ՋzUkvE‘i,Yݻk׮R.tfmւ+̶9-q0l0f̘aw=`. ?^&v̙3ի=I>'\U_+M7֭[cHRV*$`վ -Rcv0DkbĈxFY"~ix{ ՞Ht0N>Ν;'Lw5w6S@8%))L-N=ۑ%Kڵk}tޝݻwK*0|p&NȭJ׮]iذaʦ)כGMCVE0`5%!ׄR_pٲe̙3'R<#vXw" }SO>뮻zðիy>}]\Oȇ$bL`Ro;v_W_M&M4HDa5xJw~Œy[aPu?| ~!W?jfG07oXl]twߥv-{n~m bgN x?ҊKt” ADpfׁP&g3r4f.:{丄6I^9""6<;1`WubZ tBh;^I&I^>asr^/n!Aa; fc,'*"zo{DbV&: xxHMץ<njza TVDD0.M*&cBR kgЪ@#Z9oDuSKRW6f%IIdUf^QA֡""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""4H!=!}M"jZ]B~ {H*-P-?@qC)1/yF$:~GkF$"K)3q|U4"J"DDDDDDDD4A!"""""""xN"""""""9{X:DqM#^ٵ,E ( pXu'g ϢFDDD\6f3(K7 iw^`9Ms}>#e ?|e L: :HhfS!ʷ;߭kf[oXc|'Bbx7e]39kDv-⑜rp5 &Q\8{!'E\uC5E@(kZGqM<,Vt N\xR~T-G ]DDD$bQ\sfu9Y㟀M\V;w&H$Xe&3iBDDbi j#?,MEpiڔ}GŎӉf IiS" """gl>=sLp^,cGqMN5n ?u`mF#zׁN vG0EDDbٓ LG3kC.esYE0 "z]1$-MPHY|w *us1Cuw@9bY*"""c/KugXhEu(^csC'sæ:'`;ýfRZu|6p/0\JCGu(v\WEADDDbpPt"XžoJϹwan(c<)}9 J97hBDDbm*աH#Xb:f#6j9'mU n/ Gu2 """gg4D;0"1HlJ>_CP8廀VSg=}y<&gߩGQ1$MPTpp}"rJ yqncv;tr`: ١v{6eO\1\&IœڞȑHli"}m֡w185:Y39ʈ~<9KN'@IwxEbG`?a/!'3whO|k? N"Qۡ""MXfY?Pػe?agw ;Vi1֡jo!O&(*R/H)"5L!s::i :N욘mAyQErpglmC_$P~&TeP<؞ȵM uTJ?#=W.,ު V԰u(N!r G:`&:L|L"0uP0bpb?1+Dy(Rq4O yֱ]ޱ+\]"79=w1sm=.q,VP IEG3"S@uz%<8{YwFvYV_&S÷ϼ;DbG`סxJ4"gA87%Nԡh)6c2:n dvM&.?p|N8A&[/0u(/ED΂Me!yCP@]8`֓BɕÉAHgHh\6Kv.fih-QvdgSb7}1 <;Cfb2}Di.pU "): jot$4gfUu(/Sɘ; 1ո}38 fʈ$4UUB72caE doGqȑd-oKȳδkjEc2p\!tiG)XBDD 30>`ub]BwC0snp^wCDDD$1Lz+0`HV]`=#ֵ1KB}u1IԥpÌADDD"@:[}SE+B q]׍)G """[?'Fq{s80ch!QQ\;cpaƐ4TBDDNgt>){a+ϯ,C!fҬV!1Hlm #?K[Z=`D_± w`96?f IC""oŵIE*k7gaR>C^9b !L61|M ןP̊ ҷq!} -e o\~M"Uv(`&>`N9b)av="rdNdm7jČʲ}X!x ̋LQoDŽr$mIDAT |-dDJŁbKcT( }WϘ#(ZdPnhB8&0)ݗywzoUYL\i\-%hRL¼G'pXZi}Ga؃Gz|i+"n;z^8|;䧯dDz$zN}B}bQDz]2[`5 MuSZnZzCi6ZKYa~c M51'uJAC>˿iP 8 8GVXD}1]'-05Fe{a?2Rv 8ۃۗ[ k+㡲B,jMZ|C?TL5[MZu/]C-F{- "CK8YڗfRm]N'_mpk3Z8f۵49 AQ U(qbӠ7a֚/RZ\ZEMgykՊ3#8R@pD4}f%8T+)S%<>3#$-/]M񮭦'}&AG,<*p(0L1{-:!5#{\0-:iAdd-Z޽*;(91!/>~ !*QM<ĞKM-f0o$5R,@=5陁Jug~~8PG?.EMר%M> Zg/Ex1Z}ϟ3/zv >c؉'Gc'jѲgOd|a'?&Ѳg6/zܰGP]Y|U*=_uǢ F.] R.سnFe mKaۏvʘk=l-]Hovh;;@bo5|^s;LWfNLVs__ ISi?,-Z PewWQ.5h)vUqTH Z|C0h^BJ-vF-R*9cKCr Z夳 -17Ѳ}_&@R'ܦEKLֽ8gEyNS,ֽxE>t?O#wTTe|QXIK"sP3A@UZ%0Dz]J;֪*@ BVϝNY 9 tZ҂=Zkڳ\KEi1kA~%4 g%(4OsPrJA:Peu,: xɘNTܡI7({hQZG,UE["ۥǵ\^Z QVjIeLk,zϘۨY#Pt5Psd_vCpVk)ڡ{⏯]o JC?^JGm(߸˞&B޺jL+fAQ@ޣR˦J; /G@Zzy5~{~\] +x=^T)κ^lznǩ/= yx?)|,/,Ds=9BbWT_[Su/Kn׀ɽrwq/#5iyUœњwoX~R{zѫۨZ}U˾~~.e? f';6Z&]ԛOb׊/ ۔i٥-[afnVq/s':6Zr-_e%ic-u P+-v \ ؝1oWI,㹋RMZZco Pú 'Bj=~©ufϛoV2[orڊ?f}rwqkܝݛaV[!mKLɣV['*zE8zk jP]ʄ23գU3{zPQWM4ձm-=km?Lc_?d|a?ǞEkXav OѢ0{>fmzG ђƦr{!ċh꠸5rMZE]:c\-7|j;j"h3m߿e4\Qc 7mK6R|Mm}.|{;b wP_D%vOQVWA8H{XҤe(5i ;;ӌ@iY={qsY"0Zb~#Z:M!' 2ұ'mzE-cZD%{0޻wm^GKa$?}e-K]I @>{rս L/[Kco1=_`u, URPk;UoRJ;RK|M9%S+R8H5 MTBґ{6GL~w{}?od 8iNZ\]VC|E ;+>>ڷ;o?YƕKꠈ-t8(~v۴e&1@u#NE˶B+euty-]W̮ɣgT4/&BP*Z|5-A;8x!DrEOوUuP*x9TTJ_O8Ы^Rʄ@c8tkzd篇2"[[aWEKQN:+kv8HM|`u ZT%sb79rNj;tNƺK1z~G҉h36ٳ]ՓxyM>jKBqfEOAǑ0 8s/K5f-K%|Bs‰j49*qET|C&jE/`&-YΉJ8 {ϚbK;4Oђԃ2H-cGwЕZ7Iz"wų-OrPX[xoyu s4MZ|C$I*]NդE[sQ|YQκ6}M):jpSa>2Nr[G _ctӖ+up.C{w%S-CnfKjD^1b.ÌըE[ K f6|ƧOkzyI#.2-K:jOIv/:j'٢k~詸D[tmwo*z.7Z*r쀋[ <01t@O]WZhi7ҡEkB#l+K f oWƲ-1('u\IK[zOCPHҲ}AXCԝT)n-&:'\j.Ee R TC38iBLK$m'S3RZZp'W<7L}v-S/ZA"9^nZ֡nMEwWĵ򆯙*r Zhh[.$h1.gh;~_L7j:Mɮ_˵|‹Z$u9/|{ҟ=`jk[/yAD0SXJU`-Ajv*ծ?*6њMIgz&B[ U3E7kLDݙ{q& [CZ{sGUjb WjCDp +fzAPp=A 4h E='U*k;~ޓ T&]ZاHNF ;{ػł=JǓ. ;}UfZ$;N4,|ע3I8~ao^<ӢE*y՛Bzb4=XIo^^1]2vE1Sj^]t@; {__e\-ZZtCW}CƧҩ7X&'ؓDfi!=j/&VftfurRzhMY^ʍ锋 _i)ǽ FѠBu9)/.0=!-Jžş@y~8DKoT1-euGham3Z,a@䶛vMx.-]jt5*qM2{S, FQGP1s *QQvãqxmMWK`߷TZ(3Cj)-Ԣ%,GHX-g{JOڌ6fi%jŸە`şE]}T~\TşMWɛn(Emw/E(Ίr l%:ԫǿ_i9P ]Bt".AAh[ ƢPBb*ZOezOZ"^7w!fn`6*;Q8x\_C51$Ե8F~-Th*Uw<^:*#Q-a5n-^!bx^݂Iګw9 ġjM !Գkwv*@<p :5#BP?븖 vvF9+XE]܄ƱXYKsrsYWA8G5d.<]7P7iA˹h'* ]WǺyѬEBjq+P9^B8PNA Ѩ ;3Q7cW) >bĒjs]j>t{Cݠe6]|pToq6Qbnzmi6 .Զ5 W>.'b4FO#@ u7R@8xnQ #Ujk-4vi!c%`%zIp|lijVE&R]a&㰧U^_xP;=QG+'Η>o5~uMgY{E|ER P/nxf-M0S5k dFcgiw/TTɃCtN wҰjPAqϷ8C=|…} <GhEB%p*UӵA(,DDɸՒ>¼'YXZ]ſ]"E8` ~Ө:@= Np1%ݴx 6/B=*Aݜ >cżvޣYK2 ԬEL:&cKk53wlwÜm:Pa0 ַ$ЄHB5qj:u  :PxAQHdz~G]Cӑ ǼOuլEL^>Bu*9؀fߧbx#w$֠lԸ [ ,\[Tw]¸8[A7P$e~ 6.|ָBcn<4奨B5aAwbprwEV' ؉* oE@yѪHC̎3p0:|Ҭ3|@ՏߨWMʦF^7ƏQBUBQ0ɇ?x6㫚uǁh%PѨHtT=3z^ƼK5[zZa)J.:?P-_9zLL6>[5Z%E%R@(Q?=fqѿPm:"x0TWTHFMujWk<ⴰ5*A7N1|ZZj۸^E#&(dUZ&pl3AaVEM~ԱN+ǯp9QQo^h_{n' Ql 4}3+P|k]z4Iݟ%NAT=!ժ(0).+oHtެ@r/q4ɥ!9{Hx6(cR\ԱU#Lk}WhU8Et\3wiU?܃yYKS*PM}ռT oIZjUYOs5oPmn!Bi LG5gp'5SE" 2gZ.zhҔVX:-D(\I[)/ԊU:CRZ% 'Vz4ϥ^L 3bL\ Ρ%L~xh֖ I^WVEBS#RE+"Tr)ALB19H3R߿HBoGZ B9VEBS"ܑvmi \:T4Z6u fGҶ_^lT-A0m?mu󼩮Z[o%<} B}gU[D`=꼙[H3p 4vk)0! ;ʻe}}SP3Y?($ϯĠZMT69Ƃ Btu<WOID^uZYKA+੭EhA(Ѩ:JMkTa5dsa)fn'c͹XcKi n'& Xp:$h^7w80͝4U:Z7SuT 'A"{9_tsZA/k#IsTAhJ\9.(3"-+0hU:FE Tx{oᓵ*ob~4k'a1p\NrT  3Ղ T "\YKSd*h  `&A 0Yo(ggcPzi⯄êyo0#GG_ A<``'}i6C} us$twAn-B04kݨ+KGAkF]܁yS VZ{LTDrA/p|&+9:E_*E`f-SY`h U]>kL8O@  |+G 'Q[4k$#~%n'Q[' i:W859~FE5=)j+xCը@#*r`+f-:* a=MOG_lp{?(@ TaΦ@[T@MSu\-u} ?AW('s [Y [(W B#^?8Lt&??]v/8( O[FDDGxxsM`Z'4Z".呛k<R15 8ĵ]vhBFRZZ֭[oCMLU;qVb<ZpI'q-0tP@HWdggdح{ !E:?WqKqVF˔jgYɞPV:xmY)Qa1t#ظQo7y@pD41]ef8{*EDu,g xbFݠ yOn]t%&95q*!J޷z+w>E pW;*r=ʄ5@jj*sƍ#2R 0Ú5kJNtbz|: ?WœtZu _xwdލp`AD|'Zv>(ݿٳg7uѷo_JK EX39Z0|p/^Ltt.w|rMʕ+j\ffwp-駟f#$VչY*:6Z5y;\ CΤөx-qY ;*/ΰ嬸 :xcI(S32G]ElTӊ :Kxg]BF Ts;)L4;SN9իW: G:Ή .g}A$y:㻖N>\f_s iJFs [wIGP=/m,J}3z& 3߳gvkA٪;ߏLd?uгgOM3s4cP էFׂO>>( Gq˖-cԩۮŝPcRW} D,VPP/3f >%?m;0{w8f9Q^\fvD|gF\dFRQ;I=6~|̵r6Dю {Ӱ:ؾ|Kpp0fͲ.j ܮI;Ps 焕$kwvݎt./7E .W^ >EOvd|gG\h['\P}t(\gɣ9' s nXsYQN{O=$5G1_K wum"xgaE7T^kȑ#YhQ@8'\3aZ#(ǻk /[AYAڻwSuV &e̵U|Le"u-y떱kp$;2½d,zܰ#%8<>޻v:_'ȑ#3C9Sű(x(kSM:0|LII { ` K;AK/I-A|Ndz9ӰN0[ ڰCtR.+KOvTB*,WAw}lT@;U߈o5R_?֧1-s̘1̟??D W_eժU_޵TK#pƯս{w^_iA0y21ӯ՞(ڹo^5= mtV6߼~D"SF$@;q?xD'[4%}QK@Y`\y啺xsr 7 D|ZOPWN _&$=#Vblhh0l6qKټIx[mr7eoQVGƧf骨$7q_L#W\qsaƍEOV3oyʖumu2N=Cj!tt@ et箻uֺeM60!s`5Jg27&;xgOvTB7cۆmJ[lg}E?hsP3OMc3vX [?7|YEyVgL(pAUt-:uj_B e<Ѱeڶ:CW}k eL~v2Zgҥl߮Ill,-s9wv-:?J8!CЯ_?ZAh8+IFh{ESZ`IUxm]a' 6)ݷ-Nt^t8l>6sMJ32l[]}@pp0Cmvut¨QXpk9g,:,+PFkFY)i?`ء-c|hvavae4k˜8q"s-& S%T* xH=d:Yvʘkm6y$1,+% ;eR764|N=>j؝Nv)b~DRRIIIe4{;<;p8Gpki۶m%R#1euDՄ21i-*'I`P,6#FeUASVǖO5쨄$?ٶN{"uo^h&2zB"[k٬HZ0;_WCӖNNo79-[Z߿?wT ejPƉ}r(_y״SPXX{֩EfȦf;gflחYawq1vllaԛG#{NPh8]ƻ98|][ Y7ѢLGa]t(EkIϞ=A%߽PƢ}]PF~3Ao]t.-v=A_ 7㻆v)}a2N#|7-|?>evǓ/%"a E,1xmpP$H.  -XR&t'a:("nS4xHmͿy=3)ڱٰy}e59?oG!M)^_x(miDx+̶ x- Z%.اAh2莽 {Q/װ#v" ;o2rζ //)ddzmwy9!ѭ ;mN6Eml[= AyyyVs. cCi^EHT+- 7w ػ(/(pY A/`My,:)g\MXT06}'p[d76qan@ozFRgY)iq!մSо}j[O$Ih Yڻw,+5C{0vڢ g4사lR'iϿ~҈lu6-|DA5Av hmmb~|vpD h{öԳ (DtV"QCtRX$œQ Hza] A4999VsOM >m۶MA!Q1$ְvduRϾ6Io$;C {mȣp)mo]a;BB:ތ(ݷ-F AHxAal|nH@qh|ag|<; ;23/0u dURViH>>s>~ev£ IDATrP+WtlxHm$7ɖyNdO0SAUv{*Hʘkj;>C ;(Io7Yba?$B3'<6'^ld% } R^\@Ƣ'lHuabNﳥ9'Qi>D"k 0'J xj*kZW)F~پ}{m x`Ͱˋ^[+yL{{w&vO} jEh32pFvx=f/_n5k(vZ},KN瑗h @at;/tGD2t0B7:V{*[hdӰ3>yVS(BQcY{7~YFdExlO-> @~ v)GRpzp:)/.`G8䂇}tyۗ}hC5sq V%q[NhSfѢE["##>}:aaab}_̟?YfY ͉xg35jxщxgr6O~dwOC*dv%ۖCSHRWyʑJ}N4eVZŒ%K^GL2N:s~mX Ap;(OFff&;v@A9gƂb6-|SM~3ؾJrUǡ pãIHٹr~вK?2d Bׯ>gE9I{ϨTbʔ)b[xٳִ;w`=:>"Y:~HI(~;$u3r~^@HRz-q`:G[T0μ%%?mK͚]c|ETTN B%-`3k ްKTMYڎZSA>pXlY"v-rM7s`ɒ%7W y衇#2XRnz) / $e{˶uw[x{g֞׉[osTÇ[ϸ;pQ<>r-|'Xz rMGPIڻӸ16Ȱ.yYަO԰W2 RRȦf4tyavlE;˗/w k|u =z9Ow2˗s"B3qt;ܰ,kD•jP b킶 RQjqnsmb9?KA9Mp-XGxhKȖ-[:t(כ]W%KpB9XER.b8 / ik Aܿ_/\ uPb6/|ԶNN#".ɰ7} %pLׁ;bao_6 8KFn6_/ɵ^k._70rHC|AK勶}t%Y%43i٥aolm梩`~'GPQs: ~N8 U8쳭T9B`*طoÇgZE ۢϰtsR_KYYYYqnԃBwmEHT { Pi%liަ|gO[ATBWoYMJGJ"%s ŻR2#TdOetkՎ=.Y^FaZxG;~_l|ɓ'ӣS_())aܸqeLjT*9|w?H<ҥK5jw.[lFGݻŋ3p@ 2gvTbG}?i3u "/Xt̽'USeAhz|;hi?࣍/jTG_|"k;@g_H;NKmX |d$gpVA!r[fp)S8,e M;IR$٘v mWR@=![%j\8s$paHځ7{Bs wBZPVT\\LD$~vckp"0|FǝCeر 8S#=oj 'pCM5u3f`Is p .~_VB-k/N:"+V!B D3qD DuunJyGSaȑkғ`ѢE_-S??uK,i?~ѕt)99wuWu7l'?}P2KʶG'ѣG3gvu׮!Hm4٨0l[c{ko5vjuM<ӧꫯ&]Wwmg.Bfg3f ˖-cҤI?Fڶ3Z)spBdAr9%g.a·J7^]lԩ7i(hpbv⮻*Duu5/8Z'/͠O>̘1. T8'K,:x+0C7$ګ1|_dڴiL."_^T|h58Q4h7n۶m0 ~ 4*?Ñ 'ec T!dS-*`!7zv6l>W\qEu00 -weƏbH]믿e˖rʤ{ au!{bpTҸK8rX^f)UcIO l%\B(u@UU?O7n\Rqj2rH^cCRcƌnr0'7Io|)#Ӂ S_x*ȱ=˹8Bj._V2KҌ'6`fϞG%lp wqIn+@t!X*SG t˻>,>:7[8ø~p"qNזUjNL^z)UUқAdgD< < 0`SLI;fjjj?~N$&Mħ>ۄM/&~_fw.ZRũ"0 e >Da2.^*/W^y%-b֭iw]QujjjMr4*%_!:S Ls1{BjN}UуKF=z4#GOS%7*Æ cĈŎOL' D@Ȥ";`xԞCT̤IYU>V,jfgR E N}*җy008,=cTjx 2` a*vꩧQd*!C~T9N25v")q HR9 P4Lr!ŌIڵބՉG.3vظهXj::ӌC=dOTRF.dWY$I)pTqFrD5082dHQD4?j/ JԐ],j%ⵤԣGw߸kpK~ӌCLN}*>9hJZMV Jm9 3f.Aiš,U zdvT :TMXܧI>R訽gIxSA$P χ2sdOJ%*MuK;JJɄDn(Ľd/%d+nli?$u^vtLWk~ xÒrχqϦMKy sW[(!YR)Y:e޺7X$gR:h3%{/n=kx;VJ6Bb?}${H dVH*)k׮j4y>$l}LaLGu+$۵q믿^Ԁ$5x+jگE^CRIYreܬki?UICRJ^DOQP83QC()$+q_,vLN|8*g۽kK*IoviŢ,M?χ4#SF`lٲdtSϓ#IEw;Ox=LeJZ·1@!)MS7r]̏ڹKJ*)|۶+d(&=/_TrS?󸩌RYٺu+rKuwZRHԕ}ywVk6H%3f$0ꫯ.ntR%ZF멌a*:͛93Yn]ڡ0tPZv(E5k,y睸kFKrڎ8ҍH ބDnm> M/GI; z5\{v(EUWWwgݣ4$J} ছn.cv*nR%1QE6m4nw,W_};b>o⮗Vv/8@SO0nܸCܭ~2qaʫ=SN흋䩧gk{2qUWiSz 4ް]l^ӧ/:h6Q;w?aa4`>O~C)3g|d {=ДrWT^G} 3jLTt ^{WL7|k6 xgrK.O>Ç+Nrʨ"KYvm+i_Z&,\O7Zb2 Խ\| py1z芛,uQ$``Ԯ-B\*K7o /N6?(z|୷b„ ,XC-_iӦ1k֬7SI:g75/OHQ/=uTFuɓ'K8mpV'K2qD}ݖ*A {ygS Im{FҨ^z)Ő2ԝDߓYW=!uдix! _~t1a„nSij3zL<9z 8?pLҘ?>cǎ' @5QE2g͛wM#{4C8m*sqQWW^Th͚5q\wuqk)ܘ4^}U`=avz! [l-a4`ҤIq0wܕjEDӢ*ܤL2W;۰aկr +6[jB$)-MfJ;.&p"_M;IR\A vځt-?7{G+#6nyAMIRx80bm&L:hʱt{iV W*=$ilN%gZA73c}Lځt p紴C!RY>!URL[JYaЍ N;NPO2PZK·\Lʯ'F̦3{iQ)?D'y?W0$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$IRwWvek9}/?0pg H$I=wPHa$paN$u[l|PT?vm_T!$IRo6yHi2a@5Ti@$I%`X?಴*$Iv00< 4R6W=p6ewT$IRO)X75)~PRDTC9?*6 $u6n ]1{G퇁w0pb্gC x'Gōqp27.y)`=U~ H{/P墇%h_`XBXj%[s ֵ5FaKts 1!P_T#R.'3+"xܴ\?̉!:fnHĿif'' n7 :+>qrRUv{4?vwزgLIRW%ܙh19na 1&@ko BnT9g*'Rq% GOÑ*A2z^@&r pX}l7nƴ\;ȉacmO^R 8>HTb:Xi}ǟE=T$ueQ;73!.ۿk8n<ϴ-Մpл1ď'pJc"S ~R)~}wfIT$uvmƃ?u#Έ'd _'i^TK*mf %GUN' L0s=`Ñ*0>P$+n$ŭzxpm0P$g`ih+-$Gz.!LJQoBQdɇ'}HrBՖ{1+? aQd5"#v:]bt ՗LEd2P IWճ+a}R ;]HeI] IRW+(2/-OO&b3p}VO\G)Äh;d.+⤱^7cNI1I$8F۵-\$Ok"HJSo{ѣSR8 aaF"2ɬq,PZ!a L|ϵxq{3, p&QRwICgZ[R18@y'/zmա Mu(9.oa+1,$3՗u(=`B{,6Ek1Hċ&K5J bU ;ӍFR(:<}^@I#,h>U"^#h68b3a:FKz4?x =.o%| >s,"n!= =(p$<.Ij?_aa]XXFqaZ?/֞+7%['TIvij;Rwq05P]\%WN<K 4ʐJ!ŀ\o"{=6n֡ho88c"~9ǭ'ScBcA*kz \J,R~EXWnewIEY^E2Β(JQ\'=:R2+fĒ)5_8YX@ ȮCqdvo2'$~{` Uߒm IԝgyP_iLzc:zeΓ{׋'8ţO" -gAlmGjo|%,O_I1l$L3i H RX ܓ,R)ZW(SrHt)q tz`9}7_m8NX%i`"=/ףC2Iԩ{uq 5pR?}{]@ Rwdyupv2crg{}aϞo8vch?R ?[Z |q2J{^c:{eegۻ@=s@%i #r^ԽmnFF}xWFO$F}3 BFk·Z>T 3($ImăB%@u0_:ɛ ޠPH$)sfϢkO?~z̺$\@9&ՈUI5"I*/E2>ZtRqH\fT$ImXvRO;9ţVmJ# 4 0- "w)i"Uc#&qIENDB`pairtools-1.1.3/doc/_static/report-orientation.svg000077500000000000000000000473761474715105500223450ustar00rootroot00000000000000 report-orientation read { walk { pair { default for both parse --walks-policy all and parse2 junction { --report-orientation pairtools-1.1.3/doc/_static/report-positions.svg000077500000000000000000000732751474715105500220360ustar00rootroot00000000000000 report-positions * * * * * * read { * * * * * * walk { * * * * * * outer { default for parse --walks-policy all * * * * * * junction { default for parse2 --report-position pairtools-1.1.3/doc/_static/rescue_modes.svg000066400000000000000000000512541474715105500211410ustar00rootroot00000000000000 rescue_modes 3 UU 2 UU UU all mask 5any, 5unique --walks-policy walk_pair_index 1 R2 R1-2 walk_pair_type R1 UU 3any, 3unique UU WW ! ! { pairtools-1.1.3/doc/_static/rescue_modes_readthrough.svg000066400000000000000000000600761474715105500235370ustar00rootroot00000000000000 Group 2 all mask 5any, 5unique --walks-policy UU UU UU UU 3any, 3unique UU WW ! ! { 3 2 walk_pair_index 1 R2 R1&2 walk_pair_type R1 pairtools-1.1.3/doc/_static/terminology.png000066400000000000000000001007201474715105500210120ustar00rootroot00000000000000PNG  IHDR(sBIT|d pHYs.$.$* tEXtSoftwarewww.inkscape.org< IDATxuUHx qu!aq]` / _'5JB L2q;3]=3ԓNUi:u=DDD$Ӿ|i8LLEjiOg)i_ ˠR%DDDD}@> .\`8pP ~Òuizv? 6f =E kX5=)zɜ6 l]]0:wk50 uWs)|AXVw;`Y mGy8յ=EHi<,)#)<'<"iMeiql <l>DzlLRH|OhHK)6M$eDZ60`Ez̹w8 (%xtMhl6IUx {1MN1a-&;a _&aQ$y?a _.rd8Eb-| 3w/θiFhL7xNrUUDD$[N1x ;9u3pkϗnB&qXqX2kjG{Udn lݵD$ MbwX՝X@,LU s%"0 Kbb:7\/vݷxZ )os yWR& [E"""֮Rd'_b-.dmWa'y ű=-+ޥ++)ǵ1JjqI8ߗEw=X"vdOްmb*ϰoV+öJISl x`1NX6bT:EL4q|۵] E UqkMX+@#]&_ 9)fVa$3BDD*=#Ǧx.Mpq'.\A '"QUZ>u{607  6FrxBOBǞ^` )QDD$]'no&'_i'N 6c@$pn]]xJ9XAd6 m&ـLnu  ZaHl`c',}mNvƦޘuEJsMX6ԋ]7(D$3UpY|%aZR>NbDJhHK'_Yê_$ I2Ů}q\G̒ʀ( -$iMO2α.l}#q]zEk 1cUڮUUDD$܅aI_Im` ߇XpW"x'M$דj^ZH ,|/ %;̶79u]ؼGĔ`ㄎĺv 8O9 wj}]uUu{MqO 6׾1lV5څ2+30x#X%Ve5S%EDD$T]`8%6a}lV $9g޲G Đ&鏡ve})>Vb qMh%0;)k؂uŝU6 뮚JߕcAD,<Ϳ^d8Ǫ \Z퉧x{.֋W,zk}l9Bō5p6> ?>й&cУX""""""""""""""""""""""""""""""""""""""""""rCDD*u l7<`Sn|¸DcS kMS |p;0 `+`+MM1mccK|Md/nx:Ӱ9/EDD8&\6OG*^8K7s9Di2دy)v]=Hck%w D6N>dc;`u~a'pd_2TDDDDKc'XcXM~`wK^Ijo׽:p8l @m6D-v*"""Uѽ@1 vE> aÁDkChͦ Ķ Kja-L]wdZGGYtw."c_d .8He 聝xŪOTENGw+cc TCld)w(> Ǘ~w;64Xx$NGm%;#=,"""IWU l haZ7LBmWн:{@rƐĊ?l;;^K:EQ={ݓh\}Nsmك8ILBD4MߋNF8Heq :SU[u;o8fǰRb*aZ?Z& 6BmNs޿<$urVNy3PU v_>P]ԘWd&L-֝+j.9p7lD&9h _`Ķ8¾kIs*iHl\⑃ʕ Z$r\y3Z8Hp%Z]bM5>ȴ7`x|JS/{b*cX+)p6 VhϢDJ/aT% ?cJ 5"m[\ە`]K^&/^D,'w vxdb-@gcpzP̥XumE*ee,`2;WJ ͫXOa)kF/M^S|@uާב>WіT^bL8$;J&]k9ʄ;%C'=u6\?T(VT# yx<_?%rL\` p6=Ǫ-5q>7?/N XG[y8\zdp*^Ŧ8̵*Zo`i6_PwOB:@Nu_NTm y |._J%KiwU?__[}CvSXqc1+X?Sr{k׼L}x˼^Ϛcus4yPweW]UE$.Z^NknoO񱫪\GyE7@Kn4XnןXn<;wf<kkEXÛ5}ҽACJ}>2U^һ_B=S&b6Oba &ϺۛXc1'I#'I#@3,i\ix4`˝4G;u/gX aQ6@Gg2-󽰮~qwSaEPKX K~&o™v" *VHg.| \ %5Us`k{^uYK L26㽍7Ggh)l?-sЖp.c_Y;u6qGF3)gBRZ56( tʠ|2իc),yy7hh0bn4!hTϵXְkQ[yn=Ф7Nf*{,zΧ*.Mgه[|6-M,s~d{כ=VHvr6ⷜ4͆@$- h&͑y㐊D,{?`Q@>6.4sd {b l; k8Ʀ!Jbq0~e0%g-%TG9m8-vŵ9}N :]Bgm}`TbӽL,fK}IwUuajn4>UwrY֭?cٮϓX&_5XnӖ'{%5oU?}n"}d}7-3ZACuU,RsMbth7)s">p"wn^5r1e{v?:GFn~kJ7mӶ'nxjh*7vݴ>=,53KqZ;µnݕ~7E^ZqLLXW" \-RٌNssEt5@ҸKJwъUeNB;ax;b'CV@w8ρ@KlLZ88 KBIc1&O_]'D*9[sn~)tX܃}%{t+BHa-bwz9l6a[.b< s,n`xѸ/R+[.NA޷/#LԴt\ฺLؤt\l2YȓX4j̥ݝY}>_1xKFիxmAEUiϮ}Y0i^=F=IҸhG_LkBK$i,-їju=IKK1vz\6ړtw1=*4תO˞LYX^*#pl:Xw˷+)M~翽ku|K0Z;.*X}X+sX5VGb1=qFxYX46u`-Nr$ªf]G!۩Jw^/6c4ɾG=5n.>?ye_¸L,:枼EЇ]; &A`U:qkwnitW?8.۷  <<׭Iឳte^a!_GfNCz9Sn'=O̚Azσ=t'̢S pd /\ǎ+cToco`yXz RS)Y_mˬ]Nn/yZz˂WogN,&xl]?ɥۅfvZ2i Ǻo#NkaؘA4NǙ  DMNHZ/_Ǧ_KqAh҈qFaAN8 yDJZhtO.+A8-c.ђi 0Pm36 op?㴄v>UJnNw DI\\gԳb9{n]{p_ ak aYU泧B М~;DՒ^{9ftI,+/k~|3<+@WX'\CއxK4jq`am}7a]_Ǿ/b'z7 K4a=, 8v IDAT51y NmܗwА/C&=r7,+hI9 `%9ֿؘ&X@VW2v~54Kw>y",Z=5JJذ <:lxxrwƢ"n48( \W >`je4y;h~5{~@ d])[qh⌫w$Vt.U Ou0U]-+@CCO!x_#9bh74mЛXMe;^I,(qd7S DRg1eXa8Lg1F?_;):I6`2c!s.ڒǝ\1{EsF` 2մp+RyOZ7}v@:uO?b S֯s5/SS?O(32Kundgm3WҢf-no O yy| j^ȵ`B9/a//!zx43"UMBǷDNo~2RVx%y:鷧Iٵ~yH,uWzm\ŜgXɾ>g4Ųy G__vntCዂ`pf?y9P]vÞGLbRb󹟏3@"ݍ؉ oc쏛{|+HqXf[e8.Z:c]zHw\!V&[=+NT 莽O`Xx l?KtnԋU%8G)5mY[tG/xPŋB*͎ޓMI?]w,_е;[yvcxV1HH ꎿqCq+EG_'eĭ# fϟ譿R}w5>y0:d|cgeK?xzz2S(?5?`OP~44<¹Yu0[287HHuwI|z"\c '`s=M{DZ0O)E& Т6e +TG`-c[< [Xf*oKpD?GnJ$5yZt.8M[N)3cFϞ\?>ѩ'ܴfMoъ:I,7miOZT*4O\ܴyT*pw'm_#1?7QgSg~甜7jon˝̴fN,9С75={&=ϥHGwWWI { WWjp\]c~Opm;Obim:t}p}X RS:rSp}XGj`ZbU"M{^> :NK'9qIbj@r=VЛMߣD}OhqIl'DID8f>Z\︼G/*d,]\[z˧˗^9Uy:G+Bgh]rX6"٫?Ө%c>펻& pdObKi:pDObis44"h}l;ޓXZv>-8%qַ1%R\wPuom$I$swLBl+ؕ[YS˱|TGɈzLx/=دkul,kng_ ȶ4 -@sGE_͠RU&i _X4i%)@N..|PZR'/"spO]0pWRɛXpG+/My<[!tl!.GcW"uY Nx'ca%݀3\'pXvNy s*= p;#qG/|`v.:EZ/e躿vx1JIhŒ=hiYw֒,6EZ*#1תO?=K^],ڸ9\4SpOdVNឭUp~ᤢ;x`dĒ؜{_KbU7acjcn-@+,9U%c.] 898Ϳ$n:Ͽ/t_ӱ֮ΡX+xNyGeSQ?(6$t|~a^%уX2U%a-*&9)g-X"wķ@qt*cn%"}֣iu箆>Zh _ܭm$>nwi)͝Ê6Iͼ|.ѓF52?1̝m8]#/Q{Ҵ'0Wl~Z,jf>ReB,\ҽ=4. ml~n.wA牔:1"JRvsL<&R%Xg imp&IƲd+>{ډ4?TObپb> >Hհǁ~F˯,X;VM,+/2VWcΛȪ_ xe~ D依1Nľ|݉%p{&F|9Xx1=%.$Qi0N6!t, O##V"ك^ys0zDZT5$pNP\r.]'t.Olr8΅5k$O#bnpޗRlxBS/q fӹ3+"P.(IoXފ]8L*Jh֧D.H6#mZwj#^/BbZ`$`VHf$8ޗ)o۱EHvjMoK$]a'bS]KyEDDLU&;!/y ^ęT$4J wشYSlGj"""iw?6@cA*?S\E26;0&I^-{ZTrmQXahM*@%-MX H3q>{3nhRq&}+<|>o."""ZyIi4RR=JWXB¥H,y5N@]EDDB^ iъTٲԉp8ӻL.8hnE* JشG"闇0Kώݱ[H 6DW,a'ߣ7U-vCnW80ȅm6c]S{dZ=`,e/4"VXPyt2(J_^% iE)3bH$PG;ZQM1A,췥A 9ؼ9 ] 39sHEp $o ӈk9ؼ}[q>NDTZw|Vc]Z%sj#8őƼH-pQiDXqg;TKE.1#NmˀDxgщHuC܃0<Hհ?r1pIeq*TJ*D'QH3؈s-ӈ$SK} hi^:J'ȭˁ'QIX5 ކ#t0pAHs"*&{ǿrDDD$C |jBk9+ƺI_|P8p9lj?bcEDDD<*>4`3VHCKrӈ8xD'JEDD$KnmRB + fﱊ%X^("""Rp]q,߉Z%{ƒEw8ˠҠ8{@%9""""5 STV*;܊ kd~B1T`YA肎TpNx=H"i|>bJKŒB&l\JTcp.3JGH 8 *N4"q;X,*4T$- mMxmj.MMv$NBV>6NE؉ix7^%RNq>;Fda-`߻Rwdhe@U2a-6HePPUBp0ca e}o^'O+,ɜWp^DDƺfJmlDN`]jOE]PEDDD*MR) 9XR_a7H:=O@?Hq1}6J)ɱKUgߛ$u)68_)"""R)MׁTB3D$KIwcا)5Ēj)WDDDD\bW%5r+>`#(P KbKºwA-D H8%jweP"Y3?BJ"ـ񊈈H)XKT`=Ήvq _cSjdB[6b{Kd)'c."ݷDNz$";rqEN4"Q8 x8&_uM}8>$t:VDDDDn$ De௄heP"Y#p% |mk\[CcEDDD*/8'Q|y=c''"UAp 0Na|T(38'%XI,q^Q zbŠ9Y\p8T,"""řG+:<މ*=JR^މnFKtv#8""""RN pN}<(cTf5o.}/21fEDDD$I ӈR5pAdPs-` 6bk`c3ZP.p PHhDNtj$DDjU$m 4V Z!8To_ G$mߪL"]\nL_ƥ8p46Ie0wG 8HEV]$TAD f'`VuIBUb`.""م@%""XL:Nޠr%`==it8NQ x8Mgv5DZHr™sKcfa] w"v_)0XGxehui &R yD~ u_$.;; \ao+؅W!{"]WgMık9(qu^RU)ʗ85;Q۰5&>lDYc3j}Ú,f[ /,d|p|ԩV-j v{f-X9X vur`!MY97P+?mۓ~Ɯ͛~]`u-*/D`AѧX/dĦku%UAyع`o"JXBӿ>^z$NxͻPsQc)𬇱TE$3wyGU5<{_*e!\;*IAM.aS5Q'f, l]6'w .޺k'{|>6q]_RZX}s 7qǀA!֒b>Zfm[~k$_\?[mwS3?<^[8ߝ8Tjm'^cNhsGQ5W)sȯUA~E: ,|V~zQCf\o}t:ָc#do}Ѽ|;j8E. \+FQy `4 x{CЕL녕t%͹@m{ %s~gQTlTx.juLÝҡm ?,;?[v߮^u׫PEE4nc+$|ttJ}ۄ$.qTY-NvK?|µMdž_>ۃwЎ|F\H~W0h@>$}er$ekI|n5؄99X5IyK4WArsSOtKq18 IDATk6^uã3gǕܲ6Y۶ըt +l Wrslq={F9H%k;gv'~]IO7(ޠ4wTp}}Ŝz~;"uڥtot ߸ # {.Ԅ {>ǹuC{8ni3gT-#2R?WDq^bm()8( J] uןuJ}7ึ_ZTuC^4Dzuz^Amڻ]떅t=tVs|K Ϡv֥UDBuzi[Z\F8F\ NձGDӰ74:Z*V|?Wq;:~U_Ըإg뾞㻗;uĺ>Օ@(&/):n@6} I^C;ht?b! ߝ`WUC {Of`䞥lYGDhT>?`Xm8N^`) l?Дka{>x&cɔ80 ptۥsb A:u9Cuk7z^NWrN@¼9!Ǹ[O껺>6k:KKhw,kXFH-|tIH%VQKqٲh k'}lK3\]Zv݇B?Q\8^JwwH߿֥N:;uX ~nIx)6Dlv>;&#7!X2ޥ؉/M7,ok`MN>wc'Ki῿[bs*{(߀}hb3wX&/Ӱ@XmL'XQ? ?vb'˱X%I’Wl K2/` k"̀< ԟII 8W¾#<!)񨁽w5Y W,ڸIL(u@R|L`BWPA|22 nI-n%8g16pr ]IVĩ~-qVhF>vmk邝ODHD5Zaݨ\ڦX N5G`kcX8Iǰ>Hk/XX~7;)kp+O0N7aD`s? $˝OLb7wҸ{ޓi8[Y5,&Ih?ykaK,ig)N&K^ XK$.9XDj-k'EmDO.IaZ9+ v#O$K1u$NCM( v~5.tX}o-^L$|<֥CZ]]Zm ]]Z(#"j?ѹWi +L6NI$}>+b|I[,m\\Ѩ%mtoY3~v]ɥw,֓fslXbvk8v q,lu{`FSnt$NW W'r$֕~V,g_l,Tf<m閮cƮZac^NǒA؉ms&bކM^]8{/|k}{ͻu<@#B[v&X; 4kY<~ mP]ӕyuZO>dlpv4+X;{oyXQQԵgh0v9<`]eZOo3̿Ok,i @XDjY"={b1}gf%u{'m+u>LD`c{Ӱ߱ag }$vw6dGhcDtm 9Hֵk ~-?qqpU/%ckI ͝]{viڥ5^ lw\_Sڰ"^A \ܲh*k'ۂ_iNwi=2j4r/{Hztqb=R%{g&gujq8@)xBbmh(Phq/?J Vܝ !F{ M̽dٝyy;ye{L 3_'yZ̀9ۖn6>W@` m"lk=w9AC'\n`{lp}>.5o?n  3cVEXh27agUOpĭ1NF?N¾؀9603s\{wUv+s!.?/e[!7sB 0b2ƞ7띰0=T'^SnŒ+YM2\ dt& =%v'[aEKg2UXyNTǎ7Ѷ%x7bw>Gc^k٘%ЉO ycnHFx˹9j).*;RWWsߔwCE:i<=oTJ5YX߭8{Ӝ[=3z6zAgvs>Ҽcf j;l+gX=zqy}vY8W,b^g{-zVdяߋ ȓ ē.4qg2DP}e;Ƅd2=nL6"r_0ѐwM8N2DfOgŘ yrr5V]YU D)&c-Yhp\HbC$`ȧO ᎍC=5J߄"l2*UuA#ۧlxEZ3CG=9|͓(-`:WpȸW$}ߦm|)-[ql!DVeW{}/z *.kN.o\ ^+p@xHQs|}ws++{[;Ef=&Z|]J~rru)=|ae%cA,SM/l{Id +B6MC"ǒ:/݊{|ROq[gvl9>([FԗdHO aZ4, t><1g/ن/ñ e+ yI ?z3xpW9ï[e5|l)".TZUWsAֳBfγy/M!D 7?1Dj]PI·v'6,qARm*y,vD,*:짃6=9Ӭ' x6Vh8b&Bnj o5DZn CD]rۦl 2_-'!ko ?npVƗB7pwa%!Jo9׆'0̛]W*1ᪧ >/ ǰl*U Dp StFsW W=oy甭N_DRB0dPCg>6)[5~r\ntN8|Š弹k+CZ "8}@Hm&ԩ}:9zrJYnTU!RQֺc@ u|'m{B՛t0APRz/T9)Vnח|ĭz˞N ٧/kU\ZNc]ُMk1`Vc~EI0*ac! i}@Hت α؀6V%6*Tu u od3xNHCd{W-yB?'&$o8˃}4x܄v)[ՍȽsabP8CE2?x+a6=qϩ װcKBP:,_BPN]W; n.l^BP<1.S\Bl=ŷ\G~J6FQDj.yKg}66^_).sR|]{D Mr㜏 Φ!9Vq[R>ꢁy +caU$xWDzV3e.|-y1阡IZk>.raa¤nj>+$GRO l2baaI]Tehs:pq}a\ NH=gm1d ঘsk"oZ'0Z8m;< &O7\O:q ޘƇ >.DӦfzf=BPwIg<>MѠb A]|;>BۺH KFGjk,1JiN0ib\-UP_?+>ԩѥ….ٰӧׇ=@tm$-'W$ԂBlo ۀ'pO<'ҺzMZ}/d&v(6Kf}]}̘퍍UIPdm598;3Ō\3NKf p2[M !8"JU;rcgufgؤ}qva`K0ћX$P{d_2 0)Rb\1,d8e1y'\k^A=z1sVpWwDsxjqQ!9L^2bN=79!DO`McBP[KǘlZ{K)|ݷW3Do IDAT_͜o:n_>ګY@kȏ WayWenr՘WhoKk37E*ͬm6>pzRDpycaB[y}] m|&2nޱצk1uv wPT3]sO}:1o1qj,4s?–B@oƼD.\id6'e@̳/l5 Ԋݱg +r9*S2/ X4X\lT7dn!v>as;Ha^M')3N">Dž{ٜOKאd]!ݘ<ǮH`iV,͐v#{8ó[@}[536͢we}6 KAi1^ڢ-ޘؼ e;JK`$GasgjqAaH^36/Y 2ǧP J1^'!\ &sMB&/W`F{C%1o|.k3gɔu'{]iܾawɾWce#) ؽ8Flc0Kӭk߂%cсW1G ڏQ9s'}࡜>hp|}Ɇ kT՘}Dܱ>ACm$¹ÔU6lQZ#MsD'ثHӸ}R<'k.v 52x=>~&sՔ 8yWF]E|kybVo=/ҲXeWm?7_~4>Dw8a?K]|gbR\O3@ąe 0Sív(ÓTc 7zyEaQV325l"qϯ01fe\- gK-ui8i|k m?q),l\c\F4yh;`4nm]E NTAuX\T sčF3  ֭.`TʴF:I=G BPUo>/{˖_0I\k EE\4\THǢqn}1a~to|=RSGlGuygr!YTlhesKxwCo{ ,M);g#~I!%f?{SZ1_}Tt_rxk|Etgx| س_ZF. lX2;K)H cLJ]('pzbyu܁m`d8F1#CMXR8T!['15ݽmX ps2Ae@;hiy˖p rѡRm+erI3,<ظ)1JSc.eX>.] b ʻo!"7+4J1A25lD$ٔ G!"bBO@)ats_:RoXw$\oˁ/N!BSw'H G->Ju_4k~5qߥ4{Zz)o~m t~Ǘv*pO<%UXyȂmڲ_׭;K?gE_-!D +uUaЄ(`d8m7qޟܗmkVfypl]8*}YphތyW+ ]G! Vrm 96_%[viG42E6BZ?/`s_*Ǿ46pϒ<%w ey싨'H_u`)oӉo82O-0{ev)ڌt= "yvs_p?ou^׺jMBT`?UtLiyoP\”F̤n0 2`qt=W'Py%݇R u-v/M7CS f7$i c9 Q4lX``J=.":K?|?5J.{·d݂MWc5Aqg,'m mWaFx=l1twt ;cρ1U1#g)*.ﱗ:c>B 2E6Tb~(w +x Y星v#}[%ߍ ۦ8Nr"ݽ+1U6Oc^d3v->vnÌdNaqZc`iڵű7awйU ј)W؀̛,,/xoM;1юd-趮$l@> Ax\MD̎~b`v&(>=Ga3rڗh ^E%&̀6m9{O^y;B }-+9"`_B@(rO=0#6cy? }wYl}<{?ѿ LJ\p*A<kX~a7;tbD|)H $9/xrbɸ 햡_ah,1VNBl"yyo+[Hv}?f%3`qo= phu _ϱdcބymw&Z&}" cܢTԀMB zG6܆&|DPUKi?}Cډo4h?4c|L0XL$cDyaFFdy%,"1˟/~>/c6p  M6c|M0_н Xv*#|L$o9]H(`:WTp\@4h,ZQ=RyG%y}yq?WB3 v3 6COfHZ`s/{˃27ܷD*&˟Hn4/> v+NlXWjکa}6SW42LfH{-(Bj Qp{[$/ %XUMi WOF Ir/Jl;YYCR i8nƔD3񌷜M(n )-/`s•Kep0,\&BR~4pi$&y?U_ h.n@K|CmRVA&fqcRш)6#s\"|Xyr3񍷜LnoGX8XPjAFC_N oyhV敽ˋ\S9?]MW!݇=S`kv'j&Բ1}ңet](XJ[F GK+C'qY@ BC C7ړh[~f ' ˱3b8gOXCkR+lo9u?;&X% U]ݧybLOXX2Vd7_t PZ\C;BtT*:7!s9%! "FF$e a=~ ךk|#5HbR'3rB ! Қ>a&V424.[Àq27aQ!s{h{?&s3&?;zHci]Vбs;'k'( JJ(kH]uyD8D. ܺT1"؏$+O[|]KvB}y3*dwÅ7mu7#+f5+[͖5YDZ|tFi؉dA]ј4 ه%hʂT4:57#YB(}537S!q9e<,e ÕKM7HBsvzbt͘2`_CtH][z+aFQ3Wɓ+A\1u,Vt\o96JoyzN{'Oenf ! Mk2M͢MOQ=>(r؏̞R,.~pgBsry[ޓpaze%&BYc~-Xc3Omwbt %hd?aiD2Z2B(3#=F6E6:-_ [AH_1-Խ%QqUm1tAf휲Qa+882CJxo#WB2ul-7t1g8[O<߉3xW ElFc`cM|mNWVGVL|oz˻MD lƛmSN۳%'QZ|11gy;`Y*~NxϘ+Dc\o0ˆ=z4+epb )¼Wؙ0T\!X,6Vң V"WCv{ ΀r7Y^7O"FpAQ@nl/Q?LJW+m$zT#lXüA5B.[oavBSo/g8dLK0ǍZ`c~ 0qE \+GB ޶K;Oǐܓ3}OڣIeb^aU;ac00W R$?-z!&i]gLC <'@Sm{$1;7Vo'baBe7QlKH22g H]n̟܋b 懊,551%=v7`' `}V`63Bʣm L  ?'isV\=baOcP=l&g0cY~N}(BdǼNӰ~o {wos<?>1yq=3x_cֿ Iy 3{kG܏1C+l~mC[u'0Z@0 4*N.oq_E#qۤ )Ag!DnW,x/opSiXLX9xS-n`nr}9ɈF\n3b(lh&]Shc.w 3t9޶>X=1q#{Un]g>#XƥC0f4Fk.{?oҴ˗ʼ@dSX)!D/#R9߈*rO܊Kij9m1gBtYUM02k>vI<"ƅ8mą%*Q&-#Zy|iMVXXXY`p%9 `1!Jx3I5>Xa\q .5C \3K|Ƽ]1v&P i.1-R5L`#VB@/K0#az ֝]nG}v<`c,{BjoK1Ö8ļ3bI0-\[ _~6`ϝ@Yփ3t-|l96u/Q}ayKM1¢VcFH$e_biR 鈭1~r{Hx#&B0Xyc =OQ!$L65=3]^Y BѴ J}Nƅaf=~ˏ͗P'ǩ_.ljXn+l_,'r v documentation" by default. # html_title = 'pairtools v0.0.1' # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. # html_logo = None # The name of an image file (relative to this directory) to use as a favicon of # the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. # html_extra_path = [] # If not None, a 'Last updated on:' timestamp is inserted at every page # bottom, using the given strftime format. # The empty string is equivalent to '%b %d, %Y'. # html_last_updated_fmt = None # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # html_use_smartypants = True # Custom sidebar templates, maps document names to template names. # html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. # html_additional_pages = {} # If false, no module index is generated. # html_domain_indices = True # If false, no index is generated. # html_use_index = True # If true, the index is split into individual pages for each letter. # html_split_index = False # If true, links to the reST sources are added to the pages. # html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. # html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. # html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = None # Language to be used for generating the HTML full-text search index. # Sphinx supports the following languages: # 'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja' # 'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr', 'zh' # html_search_language = 'en' # A dictionary with options for the search language support, empty by default. # 'ja' uses this config value. # 'zh' user can custom change `jieba` dictionary path. # html_search_options = {'type': 'default'} # The name of a javascript file (relative to the configuration directory) that # implements a search results scorer. If empty, the default will be used. # html_search_scorer = 'scorer.js' # Output file base name for HTML help builder. htmlhelp_basename = "pairtoolsdoc" # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', # Latex figure (float) alignment #'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, "pairtools.tex", "pairtools Documentation", "Open2C", "manual"), ] # The name of an image file (relative to this directory) to place at the top of # the title page. # latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # If true, show page references after internal links. # latex_show_pagerefs = False # If true, show URL addresses after external links. # latex_show_urls = False # Documents to append as an appendix to all manuals. # latex_appendices = [] # If false, no module index is generated. # latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [(master_doc, "pairtools", "pairtools Documentation", [author], 1)] # If true, show URL addresses after external links. # man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ( master_doc, "pairtools", "pairtools Documentation", author, "pairtools", "One line description of project.", "Miscellaneous", ), ] # Documents to append as an appendix to all manuals. # texinfo_appendices = [] # If false, no module index is generated. # texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. # texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. # texinfo_no_detailmenu = False pairtools-1.1.3/doc/designnotes.rst000066400000000000000000000110711474715105500173620ustar00rootroot00000000000000Design notes ============= Designing scientific software and formats requires making a multitude of tantalizing technical decisions and compromises. Often, the reasons behind a certain decision are non-trivial and convoluted, involving many factors. Here, we collect the notes and observations made during the desing stage of `pairtools` and provide a justification for most non-trivial decisions. We hope that this document will elucidate the design of `pairtools` and may prove useful to developers in their future projects. .pairs format ------------- The motivation behind some of the technical decisions in the pairtools' flavor of .pairs/.pairsam: - `pairtools` can store SAM entries together with the Hi-C pair information in .pairsam files. Storing pairs and alignments in the same row enables easy tagging and filtering of paired-end alignments based on their Hi-C information. - `pairtools` use the exclamation mark "!" instead of '.' as 'chrom' of unmapped reads because it has the lowest lexicographic sorting order among all characters. The use of '0' and '-' in the 'pos' and 'strand' fields of unmapped reads allows us to keep the types of these fields as 'unsigned int' and enum{'+','-'}, respectively. - "rescued" pairs have two types "UR" and "RU" instead of just "RU". We chose this design because rescued pairs are two-sided and thus are flipped based on (chrom, pos), and not based on the side types. With two pair types "RU" and "UR", `pairtools` can keep track of which side of the pair was rescued. - in "rescued" pairs, the type "R" is assigned to the non-chimeric side. This may seem counter-intuitive at first, since it is the chimeric side that gets rescued, but this way `pairtools` can keep track of the type of the 5' alignment on the chimeric side (the alignment on the non-chimeric side has to be unique for the pair to be rescued). - `pairtools` rely on a text format, .pairs, instead of hdf5/parquet-based tables or custom binaries. We went with a text format for a few reasons: - text tables enable easy access to data from any language and any tool. This is especially important at the level of Hi-C pairs, the "rawest" format of information from a Hi-C experiment. - hdf5 and parquet have a few shortcomings that hinder their immediate use in `pairtools`. Specifically, hdf5 cannot compress variable-length strings (which are, in turn, required to store sam alignments and some optional information on pairs) and parquet cannot append columns to existing files, modify datasets in place or store multiple tables in one file (which is required to keep table indices in the same file with pairs). - text tables have a set of well-developed and highly-optimized tools for sorting (Unix sort), compression (bgzip/lz4) and random access (tabix). - text formats enable easy streaming between individual command-line tools. Having said that, text formats have many downsides - they are bulky when not compressed, compression and parsing requires extra computational resources, they cannot be modified in place and random access requires extra tools. In the future, we plan to develop a binary format based on existing container formats, which would mitigate these downsides. CLI --- - many `pairtools` perform multiple actions at once, which contradicts the "do one thing" philosophy of Unix command line. We packed multiple (albeit, related) functions into one tool to improve the performance of `pairtools`. Specifically, given the large size of Hi-C data, a significant fraction of time is spent on compression/decompression, parsing, loading data into memory and sending it over network (for cloud/clusters). Packing multiple functions into one tool cuts down the amount of such time consuming operations. - ``pairtools parse`` requires a .chromsizes file to know the order of chromosomes and perform pair flipping. - `pairtools` use `bgzip `_ compression by default instead of gzip. Using `bgzip` allows us to create an index with `pairix `_ and get random access to data. - `paritools` have an option to compress outputs with `lz4 `_. `Lz4 is much faster and only slighly less efficient than gzip `_. This makes lz4 a better choice for passing data between individual pairtools before producing final result (which, in turn, requires bgzip compression). pairtools-1.1.3/doc/examples/000077500000000000000000000000001474715105500161245ustar00rootroot00000000000000pairtools-1.1.3/doc/examples/benchmark/000077500000000000000000000000001474715105500200565ustar00rootroot00000000000000pairtools-1.1.3/doc/examples/benchmark/Snakefile000066400000000000000000000243371474715105500217130ustar00rootroot00000000000000cores_choices = [1, 2, 4] chromap = expand( "output/result.chromap.{cores}.pairs", cores=cores_choices, ) juicer = expand( "output/result.juicer.{cores}.pairs", cores=cores_choices, ) hicexplorer = expand( "output/result.hicexplorer.{cores}.cool", cores=cores_choices, ) fanc_bwa = expand( "output/result.fanc_bwa.{cores}.pairs", cores=cores_choices, ) fanc_bowtie = expand( "output/result.fanc_bowtie2.{cores}.pairs", cores=cores_choices, ) hicpro = expand( "output/result.hicpro.{cores}.pairs", cores=cores_choices, ) tadbit = expand( "output/result.tadbit.{cores}.reads", cores=cores_choices, ) tadbit_bowtie = expand( "output/result.tadbit_bowtie2.{cores}.reads", cores=cores_choices, ) pairtools = expand( "output/result.pairtools.{cores}.pairs", cores=cores_choices, ) pairtools_bwamem2 = expand( "output/result.pairtools_bwamem2.{cores}.pairs", cores=cores_choices, ) # mapping only: bowtie = expand( "output/result.bowtie.{cores}.sam", cores=cores_choices, ) bwamem = expand( "output/result.bwamem.{cores}.sam", cores=cores_choices, ) bwamem2 = expand( "output/result.bwamem2.{cores}.sam", cores=cores_choices, ) rule all: input: lambda wildcards: tadbit + tadbit_bowtie + bowtie + bwamem2 + pairtools + pairtools_bwamem2 + chromap + hicpro + fanc_bowtie + fanc_bwa + hicexplorer # + bowtie + bwamem + bwamem2 # + juicer # + pairtools + pairtools_bwamem2 + chromap + hicpro + fanc_bowtie + fanc_bwa + hicexplorer # hicexplorer # heavy because it creates coolers # juicer # run separately with the number of cores equal to tested, b/c multiplw juicers cannot be run with the same path rule test: input: fastq1="data/SRR6107789_1.fastq.gz", fastq2="data/SRR6107789_2.fastq.gz", genomefile="data/hg38/hg38.fa", chromsizes="data/hg38/hg38.fa.sizes", genome_index_bwa="data/hg38/index/bwa/hg38.fa", genome_index_chromap="data/hg38/index/chromap/hg38", genome_index_bwamem2="data/hg38/index/bwa-mem2/hg38", genome_index_bowtie2="data/hg38/index/bowtie2/hg38", genome_index_gem="data/hg38/index/gem/hg38.gem", genome_rsites="data/hg38/hg38.DpnII.bed", threads: lambda wildcards: int(wildcards.cores), output: file="output/result.{mode}.{cores}.{format}", benchmark: repeat( "benchmarks/result.{mode}.{cores}.{format}.benchmark", 5, ) run: if wildcards.mode == "pairtools_bwamem2": shell(""" soft/bwa-mem2/bwa-mem2 mem -t {wildcards.cores} -SP {input.genome_index_bwamem2} {input.fastq1} {input.fastq2} | \ soft/pairtools1.0.2/bin/pairtools parse --nproc-in {wildcards.cores} --nproc-out {wildcards.cores} --drop-sam --drop-seq -c {input.chromsizes} | \ soft/pairtools1.0.2/bin/pairtools sort --nproc {wildcards.cores} | \ soft/pairtools1.0.2/bin/pairtools dedup -p {wildcards.cores} --chunksize 1000000 \ -o {output.file} """) elif wildcards.mode == "pairtools": shell(""" soft/pairtools1.0.2/bin/bwa mem -t {wildcards.cores} -SP {input.genome_index_bwa} {input.fastq1} {input.fastq2} | \ soft/pairtools1.0.2/bin/pairtools parse --nproc-in {wildcards.cores} --nproc-out {wildcards.cores} --drop-sam --drop-seq -c {input.chromsizes} | \ soft/pairtools1.0.2/bin/pairtools sort --nproc {wildcards.cores} | \ soft/pairtools1.0.2/bin/pairtools dedup -p {wildcards.cores} --chunksize 1000000 \ -o {output.file} """) elif wildcards.mode == "chromap": shell(""" soft/chromap/bin/chromap --preset hic \ -t {wildcards.cores} -x {input.genome_index_chromap} -r {input.genomefile} \ -1 {input.fastq1} -2 {input.fastq2} -o {output.file} """) elif wildcards.mode == "fanc_bwa": shell(""" TMP_FILE1=$(mktemp -u output/tmp.XXXXXXXX.bam) TMP_FILE2=$(mktemp -u output/tmp.XXXXXXXX.bam) soft/fanc/bin/fanc map -t {wildcards.cores} {input.fastq1} {input.genome_index_bwa} $TMP_FILE1 samtools sort -n -@ {wildcards.cores} $TMP_FILE1 -o $TMP_FILE1.sorted.bam soft/fanc/bin/fanc map -t {wildcards.cores} {input.fastq2} {input.genome_index_bwa} $TMP_FILE2 samtools sort -n -@ {wildcards.cores} $TMP_FILE2 -o $TMP_FILE2.sorted.bam soft/fanc/bin/fanc pairs -f -g {input.genome_rsites} $TMP_FILE1.sorted.bam $TMP_FILE2.sorted.bam {output.file} rm $TMP_FILE1 $TMP_FILE2 $TMP_FILE1.sorted.bam $TMP_FILE2.sorted.bam """) elif wildcards.mode == "fanc_bowtie2": shell(""" TMP_FILE1=$(mktemp -u output/tmp.XXXXXXXX.bam) TMP_FILE2=$(mktemp -u output/tmp.XXXXXXXX.bam) soft/fanc/bin/fanc map -t {wildcards.cores} {input.fastq1} {input.genome_index_bowtie2} $TMP_FILE1 samtools sort -n -@ {wildcards.cores} $TMP_FILE1 -o $TMP_FILE1.sorted.bam soft/fanc/bin/fanc map -t {wildcards.cores} {input.fastq2} {input.genome_index_bowtie2} $TMP_FILE2 samtools sort -n -@ {wildcards.cores} $TMP_FILE2 -o $TMP_FILE2.sorted.bam soft/fanc/bin/fanc pairs -f -g {input.genome_rsites} $TMP_FILE1.sorted.bam $TMP_FILE2.sorted.bam {output.file} rm $TMP_FILE1 $TMP_FILE2 $TMP_FILE1.sorted.bam $TMP_FILE2.sorted.bam """) elif wildcards.mode == "hicpro": shell(""" cd soft/HiC-Pro_env/HiC-Pro/ mkdir -p output TMP_DIR=$(mktemp -d -u output/tmp.XXXXXXXX) TMP_CONFIG=$(mktemp -u output/tmp.XXXXXXXX.config) cp config-hicpro.txt $TMP_CONFIG sed -i 's/N_CPU = 4/N_CPU = {wildcards.cores}/' $TMP_CONFIG bin/HiC-Pro -i rawdata/ -o $TMP_DIR -c $TMP_CONFIG # Cleanup: cp $TMP_DIR/hic_results/data/sample1/sample1.allValidPairs ../../../{output.file} rm -r $TMP_DIR; rm $TMP_CONFIG """) elif wildcards.mode == "juicer": # Note that this process is not guaranteed to work well in parallel mode; # recommended to run separately shell(""" soft/juicer-1.6/CPU/juicer.sh -g hg38 -d data/4juicer/ -s DpnII -S early \ -p {input.chromsizes} -y {input.genome_rsites} -z {input.genome_index_bwa} -t {wildcards.cores} -D soft/juicer-1.6/CPU # Cleanup: mv data/4juicer/aligned/merged_nodups.txt {output.file} rm -rf data/4juicer/aligned; rm -rf data/4juicer/splits/[^S]* """) elif wildcards.mode == "hicexplorer": shell(""" TMP_DIR=$(mktemp -d -u output/tmp.XXXXXXXX) soft/hicexplorer/bin/hicBuildMatrix --samFiles \ <(bwa mem -A1 -B4 -E50 -L0 {input.genome_index_bwa} -t {wildcards.cores} {input.fastq1} | samtools view -@ {wildcards.cores} -Shb -) \ <(bwa mem -A1 -B4 -E50 -L0 {input.genome_index_bwa} -t {wildcards.cores} {input.fastq2} | samtools view -@ {wildcards.cores} -Shb -) \ --restrictionSequence GATC \ --danglingSequence GATC \ --restrictionCutFile {input.genome_rsites} \ --threads {wildcards.cores} \ --inputBufferSize 1000000 \ --QCfolder $TMP_DIR \ -o {output.file} # Cleanup: rm -r $TMP_DIR """) elif wildcards.mode == "tadbit": shell(""" TMP_DIR=$(mktemp -d -u tadbit_output/tmp.XXXXXXXX) soft/tadbit/bin/tadbit map $TMP_DIR -C {wildcards.cores} --mapper_binary soft/tadbit/bin/gem-mapper --fastq {input.fastq1} --read 1 --index {input.genome_index_gem} --renz DpnII || true soft/tadbit/bin/tadbit map $TMP_DIR -C {wildcards.cores} --mapper_binary soft/tadbit/bin/gem-mapper --fastq {input.fastq2} --read 2 --index {input.genome_index_gem} --renz DpnII || true soft/tadbit/bin/tadbit parse $TMP_DIR --genome data/hg38/hg38.fa || true soft/tadbit/bin/tadbit filter $TMP_DIR -C {wildcards.cores} --format mid || true mv $TMP_DIR/03_filtered_reads/valid_r1-r2_intersection_*.tsv {output.file} rm -r $TMP_DIR """) elif wildcards.mode == "tadbit_bowtie2": shell(""" TMP_DIR=$(mktemp -d -u tadbit_output/tmp.XXXXXXXX) soft/tadbit/bin/tadbit map $TMP_DIR -C {wildcards.cores} --mapper bowtie2 --mapper_binary soft/tadbit/bin/bowtie2 --fastq {input.fastq1} --read 1 --index {input.genome_index_bowtie2} --renz DpnII || true soft/tadbit/bin/tadbit map $TMP_DIR -C {wildcards.cores} --mapper bowtie2 --mapper_binary soft/tadbit/bin/bowtie2 --fastq {input.fastq2} --read 2 --index {input.genome_index_bowtie2} --renz DpnII || true soft/tadbit/bin/tadbit parse $TMP_DIR --genome data/hg38/hg38.fa || true soft/tadbit/bin/tadbit filter $TMP_DIR -C {wildcards.cores} --format mid || true mv $TMP_DIR/03_filtered_reads/valid_r1-r2_intersection_*.tsv {output.file} rm -r $TMP_DIR """) elif wildcards.mode == "bowtie": shell(""" soft/tadbit/bin/bowtie2 -p 4 -x {input.genome_index_bowtie2} -1 {input.fastq1} -2 {input.fastq2} -S {output.file} """) elif wildcards.mode == "bwamem": shell(""" soft/pairtools0.3.0/bin/bwa mem -t 4 -SP {input.genome_index_bwa} {input.fastq1} {input.fastq2} > {output.file} """) elif wildcards.mode == "bwamem2": shell(""" soft/bwa-mem2/bwa-mem2 mem -t 4 -SP {input.genome_index_bwamem2} {input.fastq1} {input.fastq2} > {output.file} """) pairtools-1.1.3/doc/examples/benchmark/benchmark.ipynb000066400000000000000000021104541474715105500230620ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "id": "864d317a-4960-4315-846d-ba2f36014614", "metadata": { "tags": [] }, "source": [ "# Pairtools benchmarking\n", "\n", "Welcome to pairtools benchmarking. These are the instructions on how to test performance of different software for mapping Hi-C and Hi-C-like methods.\n", "Mapping usually results in the file with mapped pairs, which is then converted into binned matrix format. Pairs format is the \"rawest\" interpretable type of data after reads.\n", "\n", "Reviewing the literature suggests that there are at least 6 methods to map Hi-C and Hi-C-like data. These include:\n", "\n", "- **pairtools** is a lightweight Python CLI that extracts and manipulates Hi-C contacts post-alignment. Aslignment can be done by:\n", " - bwa mem\n", " - bwa-mem2, ahn optimized version of bwa mem, which [x2-2.5 improves speed over bwa](https://github.com/bwa-mem2/bwa-mem2)\n", "\n", "- **chromap** is a [fast alignment tool for chromatin profiles](https://www.nature.com/articles/s41467-021-26865-w), not specialized for Hi-C but [parameterized for a broad range of sequencing data including Hi-C short reads](https://github.com/haowenz/chromap#map-hi-c-short-reads). \n", "\n", " Does not require separate step of mapping.\n", "\n", "- **HiC-Pro** is a [pipeline for Hi-C and DNase-C mapping](https://genomebiology.biomedcentral.com/articles/10.1186/s13059-015-0831-x), \"optimized and flexible\".\n", "\n", " It calls mapping within. By default, creates the output cooler files with binned data, but the script can be tinkered in order to stop the processing at the step of pairs. \n", "\n", "- **Juicer** is a [platform for analysis of Hi-C data](https://github.com/aidenlab/juicer), which is already adapted to a wide range of cluster types.\n", "\n", " It calls mapping within. Has an option to stop the data processing at the step of pairs, without further construction of binned matrices. \n", "\n", "- **HiCExplorer** is a [broad-range set of tools for processing, normalization, analysis and visualization Hi-C and Hi-C-like methods](https://doi.org/10.1038/s41467-017-02525-w). \n", "\n", " It [builds Hi-C binned matrix post-alignment with bwa mem](https://hicexplorer.readthedocs.io/en/latest/content/tools/hicBuildMatrix.html#hicbuildmatrix). \n", "\n", "- **FAN-C** is a [set of CLI tools that runs the mapping (bowtie or bwa mem), extracts and manipulates Hi-C contacts](https://genomebiology.biomedcentral.com/articles/10.1186/s13059-020-02215-9). It also has the [tools for data visualization and downstream analysis](https://github.com/vaquerizaslab/fanc).\n", "\n", "- **TADbit** is [multi-task Python API](https://3dgenomes.github.io/TADbit/index.html) that handles all the steps from the alignment of paired-end reads to the detection of Topologically Associating Domain (TAD) borders, compartments and three-dimensional modeling of chromatin based on interaction matrices.\n", "\n", "\n", "*We benchmark these programs on one million of representative reads.*\n", "These reads are taken from random replicate from Rao SSP et al., [\"Cohesin Loss Eliminates All Loop Domains.\"](https://pubmed.ncbi.nlm.nih.gov/28985562/), Cell, 2017 Oct 5;171(2):305-320.e24\n", "
\n", "Generally, it is useful to assess how much computational time you need per million of reads.\n", "
\n", "As long as you have this assessment, you may multiply the size of your experiment by the whole library size (in mlns of reads), because we expect linear growth of computational complexity of reads mapping with library size.\n", "\n", "\n", "The benchmarking consists of four general steps. If you want to reproduce it, you need to run steps 1 and 2 manually in order to create the working environment, and then use snakemake script to run the benchmarks. \n", "
\n", "You may use the commands form the \"3. Run\" section to get an understanding how each indiviaul framework works and what parameters can be changed. \n", "
\n", "Note that you need separate run of juicer with single value of --ncores, because it does not support parallel launches (because it writes to the default output).\n", "
\n", "Finally, there is a visualization section with a display of all the results that we calcualted on our machines. \n", "\n", "1. [Install software](#1.-Install-software)\n", "\n", "2. [Download data and genome](#2.-Download-data-and-genome). \n", "\n", "3. [Run](#3.-Run)\n", "\n", "4. [Visualize benchmarks](#4.-Visualize-benchmarks)\n" ] }, { "cell_type": "markdown", "id": "8ae7b1ea-f64b-4740-8694-2fdb1d7353c4", "metadata": {}, "source": [ "## 1. Install software\n", "\n", "We will use separate conda environments to install different utilities. Each utility will have its own environment and peth to the binaries." ] }, { "cell_type": "code", "execution_count": null, "id": "0f98ab45-3759-4260-ab9f-79e487410d5f", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "mkdir ./soft" ] }, { "cell_type": "markdown", "id": "b9dc2f27-868f-4bfd-bd9f-d88d18d6655f", "metadata": {}, "source": [ "### pairtools" ] }, { "cell_type": "markdown", "id": "cd56a6ab-3836-445c-ab70-73eaa4e80da8", "metadata": {}, "source": [ "#### pairtools v1.0.2" ] }, { "cell_type": "code", "execution_count": null, "id": "f3e0038a-f034-4c40-8e5d-d50f2351679f", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "conda create -y --prefix soft/pairtools1.0.2 python=3.9 pip\n", "conda activate soft/pairtools1.0.2\n", "pip install cython numpy pysam\n", "pip install git+https://github.com/open2c/pairtools.git@v1.0.2\n", "\n", "conda install -c conda-forge lz4-c # conda install -c anaconda lz4\n", "\n", "conda install -y -c bioconda \"bwa>=0.7.17\"" ] }, { "cell_type": "markdown", "id": "a7548c59-7cd2-40f8-85da-7a6b2ede143d", "metadata": {}, "source": [ "#### bwa-mem2" ] }, { "cell_type": "code", "execution_count": null, "id": "695cdebb-7a4b-4ca9-b2a5-f0a178874b77", "metadata": {}, "outputs": [], "source": [ "%%bash \n", "conda activate soft/pairtools1.0.2\n", "\n", "# bwa-mem2: compile from source (not recommended for general users)\n", "\n", "# Get the source\n", "git clone --recursive https://github.com/bwa-mem2/bwa-mem2 soft/bwa-mem2\n", "cd soft/bwa-mem2\n", "\n", "# Compile\n", "make\n", "\n", "# Exit compilation folder\n", "cd ../../" ] }, { "cell_type": "markdown", "id": "0bc9befa-e4cc-4cf3-84d5-fbae94a2e6fb", "metadata": {}, "source": [ "### chromap" ] }, { "cell_type": "code", "execution_count": null, "id": "2f02a8e1-998e-4383-bc8a-d9d493b425ef", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "conda create -y --prefix soft/chromap\n", "conda activate soft/chromap\n", "conda install -y -c bioconda -c conda-forge chromap" ] }, { "cell_type": "markdown", "id": "37f50ca4-74a2-44a3-8038-83a4d7b43c85", "metadata": {}, "source": [ "### HiC-Pro\n", "\n", "[HiC-Pro](https://github.com/nservant/HiC-Pro) is a popular software for Hi-C mapping, its now part of nf-core Hi-C pipeline, supports both fragment-based analysis of Hi-C and fragement-free analysis of DNase-based Hi-C." ] }, { "cell_type": "code", "execution_count": null, "id": "45c9697c-5f49-4a53-bbf0-18535f05e465", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "git clone https://github.com/nservant/HiC-Pro.git soft/HiC-Pro_env/HiC-Pro\n", "conda env create -f soft/HiC-Pro_env/HiC-Pro/environment.yml -p soft/HiC-Pro_env\n", "### Working environment will be soft/HiC-Pro_env\n", "\n", "conda activate soft/HiC-Pro_env\n", "\n", "# Install dependencies\n", "conda install -y -c bioconda bowtie2 samtools pysam numpy scipy bx-python\n", "conda install -y -c r r r-rcolorbrewer r-ggplot2\n", "\n", "# Copy prepared config:\n", "cp configs/config-hicpro_install.txt soft/HiC-Pro_env/HiC-Pro/config-install.txt\n", "cp configs/config-hicpro.txt soft/HiC-Pro_env/HiC-Pro/config-hicpro.txt\n", "\n", "# Configure and install:\n", "cd soft/HiC-Pro_env/HiC-Pro\n", "make configure\n", "make install\n", "\n", "cd ../../../\n", "\n", "# Patch the code to retain only data processing steps with no creating of maps:\n", "sed -i \"s/all : init mapping proc_hic merge_persample hic_qc build_raw_maps ice_norm/all : init mapping proc_hic merge_persample #hic_qc build_raw_maps ice_norm/\" soft/HiC-Pro_env/HiC-Pro/scripts/Makefile\n" ] }, { "cell_type": "code", "execution_count": null, "id": "18e29459-334a-458f-8244-ede873b25258", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "# Note that the configs should be adjusted for your system:\n", "cp configs/config-hicpro_install.txt soft/HiC-Pro_env/HiC-Pro/config-install.txt\n", "cp configs/config-hicpro.txt soft/HiC-Pro_env/HiC-Pro/config-hicpro.txt" ] }, { "cell_type": "markdown", "id": "d00d4aed-94b4-4de6-83b2-9950c9d7b949", "metadata": {}, "source": [ "### FAN-C" ] }, { "cell_type": "code", "execution_count": null, "id": "0ebd9a60-f0d0-4f0b-9a64-d2ea386a15f9", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "conda create -y --prefix soft/fanc python=3.9 pip hdf5\n", "conda activate soft/fanc\n", "pip install fanc\n", "conda install -y -c bioconda samtools" ] }, { "cell_type": "markdown", "id": "a2b58a8e-b828-47c7-87f2-86337657f5e4", "metadata": {}, "source": [ "### Juicer" ] }, { "cell_type": "code", "execution_count": null, "id": "c2611844-0e32-465f-befa-a8e296bf54d2", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "\n", "conda create -y --prefix soft/juicer\n", "conda activate soft/juicer\n", "\n", "conda install -y -c bioconda bwa java-jdk\n", "conda install -y -c conda-forge coreutils\n", "\n", "# Download the recommended stable version:\n", "wget https://github.com/aidenlab/juicer/archive/refs/tags/1.6.zip\n", "unzip 1.6.zip\n", "rm 1.6.zip\n", "mv juicer-1.6 soft/juicer-1.6\n", "\n", "# Download compile jar files of the stable version:\n", "wget http://hicfiles.tc4ga.com.s3.amazonaws.com/public/juicer/juicer_tools.1.6.2_jcuda.0.7.5.jar\n", "mv juicer_tools.1.6.2_jcuda.0.7.5.jar soft/juicer-1.6/CPU/scripts/common/juicer_tools.jar\n", "\n", "# Copy the scripts to some accessible location:\n", "mkdir -p soft/juicer-1.6/CPU/scripts/\n", "cp -r soft/juicer-1.6/CPU/[^s]* soft/juicer-1.6/CPU/scripts/" ] }, { "cell_type": "markdown", "id": "3e02b40b-1f5c-4bf8-89fc-36af2f485c55", "metadata": {}, "source": [ "### HiCExplorer" ] }, { "cell_type": "code", "execution_count": null, "id": "8d5e4ffd-7908-44eb-9d22-22cb24170207", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "\n", "conda create -y --prefix soft/hicexplorer python=3.9\n", "conda activate soft/hicexplorer\n", "conda install -y -c bioconda hicexplorer bwa" ] }, { "cell_type": "markdown", "id": "380efd65-263d-4b24-9921-8d0be8013c7d", "metadata": {}, "source": [ "### TADbit" ] }, { "cell_type": "code", "execution_count": null, "id": "040231d7-c0c4-425f-85a4-da0cfc62eec1", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "\n", "conda create -y --prefix soft/tadbit\n", "conda activate soft/tadbit\n", "\n", "# # Install mappers:\n", "conda install -y -q -c bioconda gem3-mapper bowtie2\n", "\n", "# install tadbit\n", "conda install -y -q -c bioconda tadbit" ] }, { "cell_type": "markdown", "id": "e325db7c-93d8-4e48-9ba6-8867956398cd", "metadata": {}, "source": [ "## 2. Download data and genome" ] }, { "cell_type": "code", "execution_count": null, "id": "aaea1786-7c9b-425c-9aac-de8ac709688c", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "\n", "mkdir data" ] }, { "cell_type": "markdown", "id": "d4372383-a702-44f5-89e7-66746700f765", "metadata": {}, "source": [ "### Download raw data\n", "\n", "Test data from Rao et al. 2017, 1 mln pairs: " ] }, { "cell_type": "code", "execution_count": null, "id": "05b7140b-454d-4bd2-842f-a0d042701a4e", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "\n", "fastq-dump -O data --gzip --split-files SRR6107789 --minSpotId 0 --maxSpotId 1000000" ] }, { "cell_type": "code", "execution_count": null, "id": "2d2952e1-528a-41dc-8efc-be866e958c89", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "\n", "# Put the data in accessible folder for juicer: \n", "mkdir -p data/4juicer/fastq/\n", "mkdir -p data/4juicer/splits/\n", "cp data/SRR6107789_1.fastq.gz data/4juicer/fastq/SRR6107789_R1.fastq.gz\n", "cp data/SRR6107789_2.fastq.gz data/4juicer/fastq/SRR6107789_R2.fastq.gz\n", "cp data/4juicer/fastq/* data/4juicer/splits/" ] }, { "cell_type": "code", "execution_count": null, "id": "083d9534-ce41-45b1-98f4-2007c64fb5f3", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "\n", "# Put the data in accessible folder for HiC-Pro:\n", "mkdir -p soft/HiC-Pro_env/HiC-Pro/rawdata/sample1\n", "cp data/S*fastq.gz soft/HiC-Pro_env/HiC-Pro/rawdata/sample1/" ] }, { "cell_type": "markdown", "id": "a4683297-4109-4786-8faa-26089fa8d3e4", "metadata": {}, "source": [ "### Install genome" ] }, { "cell_type": "markdown", "id": "1c29a2d6-cdf4-4552-b856-9316b8e332d4", "metadata": {}, "source": [ "#### Genomepy installation\n", "will install fasta, bwa and bowtie2 indexes:" ] }, { "cell_type": "code", "execution_count": null, "id": "3bf9ab65-da9c-41f0-adc6-f7f9d268e55e", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "\n", "# Activate bwa plugin for genomepy:\n", "! genomepy plugin enable bwa bowtie2" ] }, { "cell_type": "code", "execution_count": null, "id": "2b7dc978-408d-4b32-8a32-119645b24c9f", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "\n", "# Install hg38 genome by genomepy:\n", "! genomepy install hg38 -g data/" ] }, { "cell_type": "code", "execution_count": null, "id": "3fe79dca-fc66-4b81-904f-bfedc7cfd5b1", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "\n", "# Restrict the genome:\n", "! cooler digest data/hg38/hg38.fa.sizes data/hg38/hg38.fa DpnII --rel-ids 1 -o data/hg38/hg38.DpnII.bed" ] }, { "cell_type": "markdown", "id": "8db4bf50-7e32-4b01-bb2c-a2f1c02565f7", "metadata": { "tags": [] }, "source": [ "#### Build genome index: bwa-mem2" ] }, { "cell_type": "code", "execution_count": null, "id": "e2691bce-a469-495c-aa3e-2abb6105b1f4", "metadata": {}, "outputs": [], "source": [ "%%bash \n", "mkdir data/hg38/index/bwa-mem2/\n", "soft/bwa-mem2/bwa-mem2 index -p data/hg38/index/bwa-mem2/hg38 data/hg38/hg38.fa" ] }, { "cell_type": "markdown", "id": "3274559c-b130-4d40-93f1-59efc3abb1ed", "metadata": { "tags": [] }, "source": [ "#### Build genome index: chromap" ] }, { "cell_type": "code", "execution_count": null, "id": "993b7093-d896-4726-bfd5-77c86bb5d302", "metadata": {}, "outputs": [], "source": [ "%%bash \n", "mkdir data/hg38/index/chromap\n", "chromap -i -r data/hg38/hg38.fa -o data/hg38/index/chromap/hg38" ] }, { "cell_type": "markdown", "id": "aecf762a-f9e4-4b87-863a-ca92ae88bb2e", "metadata": { "tags": [] }, "source": [ "#### Build genome index: GEM" ] }, { "cell_type": "code", "execution_count": null, "id": "3ccdc3c1-f762-4cac-9821-4479d44c2f78", "metadata": {}, "outputs": [], "source": [ "%%bash \n", "mkdir data/hg38/index/gem\n", "gem-indexer -T 8 -i data/hg38/hg38.fa -o data/hg38/index/gem/hg38" ] }, { "cell_type": "markdown", "id": "5a9bd0a9-9dc0-4942-bb1b-cf7b77363bb6", "metadata": {}, "source": [ "## 3. Run\n", "\n", "The banchmarking is usually cumbersome, but it can be simplified by snakemake. We provide a Snakemake pipeline that will allow you to benchmark different approaches.\n", "\n", "The output of snakemake will consist of resulting Hi-C pairs/maps in `output` folder and benchmarking files in `benchmarks` folder. \n", "The file names have the information on parameters in their names:\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "ad48c488-05f4-4b2d-a18d-2b399e8b03b0", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "\n", "# Running \n", "snakemake --cores 10" ] }, { "cell_type": "code", "execution_count": null, "id": "9b086bae-ef42-41bb-9254-42af10c9ab1b", "metadata": { "tags": [] }, "outputs": [], "source": [ "%%bash\n", "\n", "# Cleanup (only if you want to erase all the output)\n", "rm output/*; rm benchmarks/*" ] }, { "cell_type": "markdown", "id": "e46dffea-87ac-4157-8938-ae032d50a591", "metadata": {}, "source": [ "## Manual run\n", "\n", "You may also run them to test individual steps of the pipeline." ] }, { "cell_type": "markdown", "id": "6dcbff7b-8caf-4512-9c44-375eac698730", "metadata": {}, "source": [ "### pairtools" ] }, { "cell_type": "code", "execution_count": null, "id": "7da2496b-fd21-4383-a3df-ba9fadb9e505", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "\n", "soft/bwa-mem2/bwa-mem2 mem -t 5 -SP data/hg38/index/bwa-mem2/hg38 data/SRR6107789_1.fastq.gz data/SRR6107789_2.fastq.gz | \\\n", " soft/pairtools1.0.2/bin/pairtools parse --nproc-in 5 --nproc-out 5 --drop-sam --drop-seq -c data/hg38/hg38.fa.sizes | \\\n", " soft/pairtools1.0.2/bin/pairtools sort --nproc 5 | \\\n", " soft/pairtools1.0.2/bin/pairtools dedup -p 5 --backend cython \\\n", " -o output/result.pairtools.pairs" ] }, { "cell_type": "markdown", "id": "b0c9a7e3-8e08-42bf-9748-cd94eff6731a", "metadata": {}, "source": [ "### chromap" ] }, { "cell_type": "code", "execution_count": null, "id": "e3012cdb-be1c-46ef-bb7a-20eff2d34fba", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "\n", "soft/chromap/bin/chromap --preset hic --low-mem \\\n", " -t 5 -x data/hg38/index/chromap/hg38 -r data/hg38/hg38.fa \\\n", " -1 data/SRR6107789_1.fastq.gz -2 data/SRR6107789_2.fastq.gz -o output/result.chromap.pairs" ] }, { "cell_type": "markdown", "id": "32e60c83-1fab-4fcb-ba0b-8c1258e457c6", "metadata": {}, "source": [ "### HiC-Pro" ] }, { "cell_type": "code", "execution_count": null, "id": "5931f3a6-82f1-4fd8-b65c-9ed648b5f986", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "\n", "cd soft/HiC-Pro_env/HiC-Pro\n", "bin/HiC-Pro -i rawdata/ -o output -c config-hicpro.txt\n", "\n", "cd ../../../" ] }, { "cell_type": "markdown", "id": "43171a68-8928-418c-9779-268a5d4923d3", "metadata": {}, "source": [ "### FAN-C\n", "Based on [CLI tutorial](https://fan-c.readthedocs.io/en/latest/fanc-executable/fanc-generate-hic/fanc_modular_steps.html):" ] }, { "cell_type": "code", "execution_count": null, "id": "802e66a8-4c93-45d6-a735-4a68a1d9184a", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "\n", "fanc map -t 5 data/SRR6107789_1.fastq.gz data/hg38/index/bwa/hg38.fa output/fanc-output_1.bam\n", "fanc map -t 5 data/SRR6107789_2.fastq.gz data/hg38/index/bwa/hg38.fa output/fanc-output_2.bam\n", "samtools sort -@ 5 -n output/fanc-output_1.bam -o output/fanc-output_1.sorted.bam\n", "samtools sort -@ 5 -n output/fanc-output_2.bam -o output/fanc-output_2.sorted.bam\n", "fanc pairs output/fanc-output_1.sorted.bam output/fanc-output_2.sorted.bam output/fanc-output.pairs -g data/hg38/hg38.DpnII.bed" ] }, { "cell_type": "markdown", "id": "46f11121-bff6-4f92-8d80-aa86b01ffcc0", "metadata": {}, "source": [ "### Juicer" ] }, { "cell_type": "code", "execution_count": null, "id": "a1a5571c-b1da-4125-b915-34884be7299e", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "\n", "soft/juicer-1.6/CPU/juicer.sh -g hg38 -d data/4juicer/ -s DpnII -S early -p data/hg38/hg38.fa.sizes -y data/hg38/hg38.DpnII.bed -z data/hg38/index/bwa/hg38.fa -t 5 -D soft/juicer-1.6/CPU\n" ] }, { "cell_type": "markdown", "id": "871ac7b7-0180-4103-a8b3-bd49b7269d83", "metadata": {}, "source": [ "### HiCExplorer\n", "Based on the example: https://hicexplorer.readthedocs.io/en/latest/content/example_usage.html\n", "\n", "Note that it does not procude the pairs, but binned coolers." ] }, { "cell_type": "code", "execution_count": null, "id": "5f14967d-ed63-4d20-a006-bc038d1f1f6f", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "\n", "hicBuildMatrix --samFiles \\\n", " <(bwa mem -t 4 -A1 -B4 -E50 -L0 data/hg38/index/bwa/hg38.fa data/SRR6107789_1.fastq.gz | samtools view -Shb -) \\\n", " <(bwa mem -t 4 -A1 -B4 -E50 -L0 data/hg38/index/bwa/hg38.fa data/SRR6107789_2.fastq.gz | samtools view -Shb -) \\\n", " --restrictionSequence GATC \\\n", " --danglingSequence GATC \\\n", " --restrictionCutFile data/hg38/hg38.DpnII.bed \\\n", " --threads 4 \\\n", " --inputBufferSize 100000 \\\n", " --QCfolder hicexplorer_tmp \\\n", " -o hicexplorer_output.cool" ] }, { "cell_type": "markdown", "id": "3a856970-2770-4d52-b170-2308b9864ea3", "metadata": {}, "source": [ "### TADbit" ] }, { "cell_type": "code", "execution_count": null, "id": "463b8edd-9b9b-405a-ba21-6b76429ece41", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "\n", "tadbit map tadbit_output --fastq data/SRR6107789_1.fastq.gz --read 1 --index data/hg38/index/gem/hg38.gem --renz DpnII \n", "tadbit map tadbit_output --fastq data/SRR6107789_2.fastq.gz --read 2 --index data/hg38/index/gem/hg38.gem --renz DpnII \n", "\n", "tadbit parse tadbit_output --genome data/hg38/hg38.fa \n", "\n", "tadbit filter tadbit_output --format short" ] }, { "cell_type": "markdown", "id": "f2b8fa6a-d282-4ae5-9154-4578be8418dd", "metadata": {}, "source": [ "### Read mapping only" ] }, { "cell_type": "code", "execution_count": null, "id": "6b48d56b-122d-4827-a384-0cfeb797e081", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "\n", "# bwa mem\n", "soft/pairtools0.3.0/bin/bwa mem -t 4 -SP data/hg38/index/bwa/hg38.fa data/SRR6107789_1.fastq.gz data/SRR6107789_2.fastq.gz > bwa-mem.sam\n", "\n", "# bwa mem2\n", "soft/bwa-mem2/bwa-mem2 mem -t 4 -SP data/hg38/index/bwa-mem2/hg38 data/SRR6107789_1.fastq.gz data/SRR6107789_2.fastq.gz > bwa-mem2.sam\n", "\n", "# bowtie2 only\n", "soft/tadbit/bin/bowtie2 -p 4 -x data/hg38/index/bowtie2/hg38 -1 data/SRR6107789_1.fastq.gz -2 data/SRR6107789_2.fastq.gz -S bowtie2.sam\n" ] }, { "cell_type": "markdown", "id": "9b3b93e5-47b1-408f-a4d5-32a85060fd8a", "metadata": {}, "source": [ "## 4. Visualize benchmarks" ] }, { "cell_type": "code", "execution_count": 2, "id": "8eb57b57-db42-420a-a2e7-631fda0676e4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "36 CPUs at 1211 GHz\n" ] } ], "source": [ "# Check the CPU properties:\n", "import psutil\n", "print(f\"{psutil.cpu_count()} CPUs at {psutil.cpu_freq().current:.0f} GHz\") " ] }, { "cell_type": "code", "execution_count": 3, "id": "5a59f6bc-be2d-442b-b4ac-07237f38c38b", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import seaborn as sns\n", "import numpy as np\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", "mpl.rcParams['font.family'] = \"sans-serif\"\n", "figsize_A4 = np.array([11.69, 8.27])\n", "plt.rcParams[\"figure.figsize\"] = figsize_A4.T\n", "plt.rcParams['figure.facecolor']='white'\n", "plt.rcParams['font.size']=16\n", "\n", "import glob" ] }, { "cell_type": "code", "execution_count": 4, "id": "986fae72-ac93-4bff-9749-3b3a70057e17", "metadata": {}, "outputs": [], "source": [ "## If you start from .csv. file: \n", "# df = pd.read_csv('benchmarking_1mln.csv')" ] }, { "cell_type": "code", "execution_count": 13, "id": "dd9e829a-f25e-4c66-b22d-01e008143396", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "39\n" ] } ], "source": [ "# If you start from your own benchmarks:\n", "files = glob.glob(\"benchmarks/*\") #+ glob.glob(\"benchmarks_v1_2022/*\")# + \n", "print(len(files))" ] }, { "cell_type": "code", "execution_count": 14, "id": "08707677-e087-44ca-8e8a-9d74ef4482a4", "metadata": {}, "outputs": [], "source": [ "def get_params(filename):\n", " split = filename.split('.')\n", " util= split[1]\n", " ncores = int(split[2])\n", " \n", " return util, ncores\n", "\n", "timings = []\n", "for f in files:\n", " t = pd.read_table(f)\n", " t[['util', 'ncores']] = get_params(f)\n", " timings.append(t)\n", "timings = pd.concat(timings)" ] }, { "cell_type": "code", "execution_count": 15, "id": "d43f8549-4765-441c-b94c-eb76a950ca4d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sh:m:smax_rssmax_vmsmax_ussmax_pssio_inio_outmean_loadcpu_timeutilncores
0482.10290:08:0217068.9720572.7316931.9116951.7116275.210.02102.18493.82pairtools_bwamem21
1482.52610:08:0217079.4620508.7316941.4616956.3432534.1139.25101.73498.88pairtools_bwamem21
2488.99970:08:0817055.0420508.5916920.9616939.6942104.6178.47100.17502.58pairtools_bwamem21
3484.34600:08:0416981.5920380.6016961.3016962.3745493.36117.7093.0650.54pairtools_bwamem21
4483.31590:08:0316969.0220595.5116944.7516945.7961922.79156.9399.61507.64pairtools_bwamem21
\n", "
" ], "text/plain": [ " s h:m:s max_rss max_vms max_uss max_pss io_in \\\n", "0 482.1029 0:08:02 17068.97 20572.73 16931.91 16951.71 16275.21 \n", "1 482.5261 0:08:02 17079.46 20508.73 16941.46 16956.34 32534.11 \n", "2 488.9997 0:08:08 17055.04 20508.59 16920.96 16939.69 42104.61 \n", "3 484.3460 0:08:04 16981.59 20380.60 16961.30 16962.37 45493.36 \n", "4 483.3159 0:08:03 16969.02 20595.51 16944.75 16945.79 61922.79 \n", "\n", " io_out mean_load cpu_time util ncores \n", "0 0.02 102.18 493.82 pairtools_bwamem2 1 \n", "1 39.25 101.73 498.88 pairtools_bwamem2 1 \n", "2 78.47 100.17 502.58 pairtools_bwamem2 1 \n", "3 117.70 93.06 50.54 pairtools_bwamem2 1 \n", "4 156.93 99.61 507.64 pairtools_bwamem2 1 " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "timings.head()" ] }, { "cell_type": "code", "execution_count": 87, "id": "ba0c1c4f-ac4c-43f5-8245-e32d1d4cc3cf", "metadata": {}, "outputs": [], "source": [ "df = timings.sort_values(['ncores', 'util'])" ] }, { "cell_type": "code", "execution_count": 88, "id": "06fa2f0b-1c9e-473b-bbdd-3157f1d81a1a", "metadata": {}, "outputs": [], "source": [ "df.to_csv('benchmarking_1mln.csv')" ] }, { "cell_type": "code", "execution_count": 17, "id": "306e3829-ab40-4bfb-804b-775b5bf6a170", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['bowtie', 'bwamem', 'bwamem2', 'chromap', 'fanc_bowtie2',\n", " 'fanc_bwa', 'hicexplorer', 'hicpro', 'juicer', 'pairtools',\n", " 'pairtools_bwamem2', 'tadbit', 'tadbit_bowtie2'], dtype=object)" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.unique(df.util)" ] }, { "cell_type": "code", "execution_count": 21, "id": "8b20d808-78aa-4efc-9c2d-999b4e393968", "metadata": {}, "outputs": [], "source": [ "labels = [\n", " 'chromap', \n", " 'pairtools_bwamem2', \n", " 'tadbit',\n", " 'pairtools', \n", " 'tadbit_bowtie2',\n", " 'juicer', \n", " 'hicpro', \n", " 'hicexplorer', \n", " 'fanc_bwa', \n", " 'fanc_bowtie2',\n", " 'bwamem2',\n", " 'bwamem',\n", " 'bowtie',\n", "]\n", "labels_mod = [\n", " 'Chromap', \n", " 'bwa-mem2 + pairtools', \n", " 'GEM + TADbit',\n", " 'bwa mem + pairtools', \n", " 'bowtie2 + TADbit',\n", " 'Juicer', \n", " 'Hi-Pro', \n", " 'HiCExplorer', \n", " 'bwa mem + FANC', \n", " 'bowtie2 + FANC',\n", " 'bwa-mem2',\n", " 'bwa mem',\n", " 'bowtie2',\n", "]" ] }, { "cell_type": "code", "execution_count": 24, "id": "8f31f3be-cf8f-4976-9a60-28e97c13593d", "metadata": {}, "outputs": [ { "data": { "image/png": "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Pz/PBmdXjLNZs2YIDQ2Fl5cXqlSpgho1aqBChQq4e/cuqlevjuXLl+fZ+gwNDbFr1y5UqFABFy9eRMWKFVGhQgXUrl0bTk5OqFGjBrZt26ZUZsWKFfD09ERQUBDKly+PGjVqoEqVKqhVqxZev36Nli1bwtfXN9ux1KhRA1u2bIGpqSkmTpwIBwcH1KxZE/Xq1UOJEiXg5uaGMWPGKI2JdefOHXz99ddwdHREuXLlUK9ePZQrVw6enp549eoVmjVrhoEDB+ZyL1FeY0KLiIiIiIiIClS3bt1Qo0YNjcusXLkSM2bMQJkyZRAaGorw8HB8++23OH/+vNZP08trffr0waFDh1ClShXcv38fCQkJaN68OU6ePIk+ffqoLDNnzhycPXsW/fr1g6WlJW7evIng4GAUK1YMX375JQ4cOIAWLVrkaZzm5uY4fPgwlixZgtq1a+P58+d4+PAhKleujFmzZuHcuXNwdHTM03WWKFECV69exZw5c+Dl5YVXr17h3r17cHBwwODBgzFz5kyl5Z2dnXH+/HnMmDEDlSpVwsOHD/H8+XPUqVMHfn5+OHjwIMzMzHIUS9euXXH37l2MHj0aHh4eePDgAe7evQsLCwt07doV69atw4QJE6TlJ0+ejAkTJqBOnTp4//49bty4gY8fP8LHxwfr16/HkSNHYGRklKv9Q3lPJtSNEkdERERERERERFQIsYcWERERERERERHpFSa0iIiIiIiIiIhIrzChRUREREREREREeoUJLSIiIiIiIiIi0itMaBERERERERERkV5hQouIiIiIiIiIiPQKE1pERERERERERKRXmNAiIiIiIiIiIiK9woQWERERERERERHpFSa0iIiIiIiIiIhIrzChRUREREREREREeoUJLSIiIiIiIiIi0itMaBERERERERERkV5hQouIiIiIiIiIiPQKE1pERERERERERKRXmNAiIiIiIiIiIiK9woQWERERERER5bnJkydDJpNBJpNh1qxZug6HckkIgcDAQPznP/9B/fr1YWdnBxMTE7i5uaF79+44efKkrkOkXHr27BlWr16NYcOGoXr16jAyMirUn18jXQdAREREREREn5Z79+7ht99+03UYlIdOnDiBli1bAgAMDAxQtmxZWFpa4tGjR9i9ezd2796NyZMnY+bMmTqOlHJqyZIlWLJkia7D0BoTWkRERERERLnUv1tXRL99o+swtGbn4opNu/3zpW4hBL799lsYGxvD29sbJ06cyJf1FLSevfsiPCpK12FozdnBATu2bcmz+oQQKFu2LMaNG4c+ffrA3t4eAJCUlARfX1/MmTMHs2bNQr169dCxY8c8W29B6dajC96G689nGABcnF2xe+eePKvPyckJHTt2RN26dVGnTh38+eef2LVrV57Vn9eY0CIiIiIiIsql6LdvsK5rc12HobXB/vmXZPrrr79w5swZzJs3D3fv3s239RS08KgoDJ+xSNdhaG3l1LF5Wl/dunVx7949GBkppxFMTEzw66+/4saNGzh06BBWr16tlwmtt+Fv0PnLJroOI1v2/n06T+ubPHmy0v+3bt2ap/XnNY6hRURERERERHkiPDwcP//8MypXroyxY/M2oUK6ZWNjkymZpahVq1YAgIcPHxZUSPSZYw8tIiIiIiIiyhNjx45FVFQUdu/eDWNjY12HQwUoISEBAGBubq7jSOhzwR5aRERERERElGvHjx/Hpk2bMGDAAPj4+Og6HCpAQgjs2LEDANCoUSMdR0OfCya0iIiIiIiIKFcSEhIwfPhw2NraYsGCBboOhwrY6tWrcf36dZiYmGDMmDG6Doc+E7zlkIiIiIiIiHJl1qxZePz4MZYtWwZXV1ddh0MF6Nq1axg9ejSA9OOgTJkyOo6IPhfsoUVEREREREQ5du/ePfz222/w8vLCiBEjdB0OFaBnz56hY8eOSEhIQL9+/fDTTz/pOiT6jDChRURERERERDn23XffISUlBStWrICBAb9ifi7CwsLQqlUrvH79Gh06dMDatWshk8l0HRZ9RnjLIREREREREeXY9evXIZPJ0KlTp0zzYmJiAADz5s3DsmXLULx4cVy+fLmgQ6Q8FhUVhVatWuHJkyfw8fHBjh07+FRLKnBMaBEREREREVGupKam4s2bN2rnv3//Hu/fv4eZmVkBRkX54f3792jfvj2CgoJQp04d7N+/H+bm5roOiz5D7A9KREREREREORYdHQ0hhMrX4MGDAQAzZ86EEALBwcG6DZZyJTExEZ07d8bFixdRpUoV/Pvvv7C2ttZ1WPSZYkKLiIiIiIiIiDRKTU1Fnz59cOLECZQpUwZHjx6Fg4ODrsOizxhvOSQiIiIiIiIijbZv3449e/YAAAwMDNCzZ0+VyxUtWhQ7duwowMgor5w9exadO3eW/v/+/XsAwJw5c7B48WJp+vXr11G8ePGCDi8TJrSIiIiIiIiISKPExETp70ePHuHRo0cqlytZsmRBhUR5LDk5GZGRkZmmf/jwAR8+fJD+n5qaWpBhqSUTQghdB0FERERERKTP+nfriui36gdFL2zsXFyxabe/rsPQKz1790V4VJSuw9Cas4MDdmzbousw9Ea3Hl3wNlx/PsMA4OLsit079+g6DJ1hQouIiIiIiIiIiPQKB4UnIiIiIiIiIiK9woQWERERERERERHpFSa0iIiIiIiIiIhIrzChRUREREREREREeoUJLSIiIiIiIiIi0itMaBERERERERERkV5hQouIiIiIiIiIiPQKE1pERERERERERKRXmNAiIiIiIiIiIiK9woQWERERERERERHpFSa0iIiIiIiIiIhIrzChRUREREREREREeoUJLSIiIiIiIiIi0itGug6AiPRfWloaXr16BWtra8hkMl2HQ0REnyghBOLi4uDm5gYDA/4um1O8bhMRUUHI7+s2E1pElGuvXr1C8eLFdR0GERF9JkJCQlCsWDFdh6G3eN0mIqKClF/XbSa0iCjXrK2tAQB3796Fu7u70rzU1FTcunUL1apVg6Gh4Wc1LzY2FsWLF0dISAhsbGwKZYyFZZ8Utji5XwrHPO4X7peM8969ewcPDw/pukM5o+m6rYmm96YwlctNWU2fr/xYH/dN4SmXm7LcN+px36j3Oeyb/L5uM6FFRLkmv13B2tpa5ZcrKysr2NjYqPzS8inPk7OxscmU0CosMRaWfVLY4uR+KRzzuF+4X1TNA8Db5HJJ03VbE22Oy8JQLrdlAdWfr/xYH/dN4SmX27IA940m3Dfqfer7Bsi/6zYHHyAiIiIiIiIiIr3ChBYREREREREREekV3nJIRHlmaLcuMDExgZ2LKzbt9td1OERERKSB/LqtLQGBxIREmJqZQgbtbx8p6HK5KZuWlooyzg7o3bYVDAy0v7WG+ybv18d9k//l2GYnfceEFhHlmT86N4O1mSkG+5/QdShERESUBfl1mzJqpesACjHuG/X0b9+wzU76jrccEhERERERERGRXmFCi4iIiIiIiIiI9ApvOSSiPDUx8BYSTMzQpk0blC5dGsuWLdN1SEREREREn72JgbcQnZQMOxNjzPGupnKZESNGICoqCg4ODlixYkUBR0iUPUxo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RERGaG8TLgBSR3uo1Srt7c3LeptzIiIiIiIiqjz8RkZEZIREVjQrW+pgj54vtoNcmQcPDw8AgLu7uwUjIyIiIiIiqt24hhYRkRFSB3udfwFoE1qaf4mIiMiyRCIRlIVK2Nvbl74xERHVGExoEREZobmzYXG8syEREZF16TOqA/ZsOIxDBw5ZOhQiIqpGnHJIREREREREREQ2hQktIiIiIiIiIiKyKZxySESVZt+mOEgkuutXqKGGPF8OqUwKAYJN19X3b2D+xSAiIrJyhvptU0z1lZZu5+3lY/Z+iYioZmBCi4gqzc7tu+Hv769TplQqkZCQgKCgIIjFYpuvIyIiqikM9dummOorrakdERHVDpxySERERERERERENoUJLSIiIiIiIiIisilMaBERERERERERkU1hQouIiIiIiIiIiGwKE1pERERERERERGRTmNAiIiIiIiIiIiKbwoQWERERERERERHZFCa0iIiIiIiIiIjIpthZOgAiqjnGDx0MiUSiU6aGGvJ8OaQyKQQIZa7zqd8AW3btrurQiYiIah1D/bYppvpta2pXkbYqlRJNvDwQ1rc3RCJxmY4nljli98+/lClOIiIqPya0iKjSfPF8T7jIpJW6zzG7fqvU/REREVGRqui3a4be5WoV9u2BSo6DiIhM4ZRDIiIiIiIiIiKyKUxoERERERERERGRTWFCi4is0uy4Mwg/9DfkEgeEhYUhPDzc0iERERERGfTyT38Bru547rnnLB0KEVGtwTW0iMgqpeQ8glKtBgCkp6cjMzPTsgERERERGaFQqQBBgEKhsHQoRES1BkdoEZFVUv2bzIJQdGcilUplwWiIiIiIiIjImjChRURWSfRvIgv/JrZEIv66IiIiIiIioiL8hkhEVslNaq/z2t3d3TKBEBERERERkdVhQouIrJK7xB4eMgkAwNPTEx4eHhaOiIiIiMgwe5EIUKthb29f+sZERFQpmNAisrCNGzdCEASMGzfO0qFYlaXBbRH59BOQFuRh27ZtiIyMtHRIRERERAZF930SyM7Evn37LB0KEVGtwYQWUTkEBARAEARs3LjR0qEQERERERER1TpMaBFZmJubGx5//HHUq1fP0qEQERERERER2QQ7SwdAVNsNGTIEQ4YMsXQYlaLXV3sgEpf8taKGWq2GIAgAhDLXie3tEdr7Wb1jyfPlkMqkBuOQ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X39F3759LR0WWRm1Wv3vE0D+SAFBEEEmk+H+/ftQqVQAoP2XiIiIiIiIyo8jtIjMEBQUxEQElUoQhKKklgBIHeyRnyuHXF4APz8/7Qitst4enYiIiIiIiPTxmxURUSWRyIr+RiB1sEfPF9shX/EIR48exZdffgkPDw8A+nfGJCIiIiIiorLjCC0iokoidbDX+bc4TUJL8y8RERHZDpFIBGWhEvb2+n08ERFZBhNaRESVpOSdDYuLjIzUPlcqldURDhEREVWSPqM6YM+Gwzh04JClQyEion9xyiEREREREREREdkUJrSIiIiIiIiIiMimcMohEVWafZviIJHori2hhhryfDmkMikECLWqzrOut6HLREREZBUM9dummOrzrKldRdqqVCokJSehWdNmencm9vbyKVMMRERUtZjQIqJKs3P7bvj7++uUKZVKJCQkICgoCGKxuFbVZWdnw83NzdClIiIisjhD/bYppvo8a2pXkbaavvvKpYNwdXUt0zGJiKh6ccohERERERERERHZFCa0iIiIiIiIiIjIpjChRURERERERERENoUJLSIiIiIiIiIisilMaBERERERERERkU1hQouIiIiIiIiIiGwKE1pERERERERERGRTmNAiIiIiIiIiIiKbYmfpAIio5hg/dDAkEolOmRpqyPPlkMqkECBYpM7d2wff7NxVWadJRERUIxjqt00x1f9aU7uKtFWplGji5YGwvr0hEomr7Hj8bEJEVHFMaBFRpfni+Z5wkUktHYaesbsOWToEIiIiq2Ot/bbl9a7yI/CzCRFRxXHKIRERERERERER2RQmtIiIiIiIiIiIyKZwyiER1Viz484gs0ABub0U4eHhyMjIgFQqxVdffWXp0IiIiKiWevmnv1AgkaF///7Yt2+fpcMhIrJZTGgRUY2VkvMISrUaEAQkJydDpVJBJOLAVCIiIrIchUoFCAIUCoWlQyEismn8ZkdENZZKrS56IghQqVQAALWmjIiIiIiIiGwWE1pEVGOJhH9vm61Wa0dmCULZbvtNRERERERE1ocJLSKqsdyk9trnHh4eAAAXFxdLhUNERERERESVhGtoEVGN5S4pSmg9eJSvTWhJpVJLhkRERES1nL1IhAKlEvb29qVvTERERnGEFlEViomJgSAICA0NtXQotdLS4LaIfPoJSBVyREZGYsuWLZg6daqlwyIi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ZzSWv/76C126dMHhw4cREBAAkUiE3377DU8//TTOnz+P7du34+mnn8apU6fQqFEjqFQqHDhwAD169MDdu3fLdN75+fkAAAcHh7JdMCIiIiIiIqJqxIQWVci8efOwYsUK3L59G8ePH8edO3cwatQo5OXlYfTo0cjLy9NuGxISAsB4QsvPzw/Hjh3TJlUAaF937twZMplMWx4aGopDhw4hJycHycnJOH78OFJSUnD69GkEBgYiKipK7zhlMXv2bGzZsgU3b95EQkICkpOT0bRpUyQmJuKll17Cpk2b8Ouvv+LKlSs4d+4cTp48CQ8PD8TGxuKnn37S2VdqaiqGDh2K7OxsvP/++3jw4AHOnDmDGzduID4+Hn5+flixYgV++OEHg7HMnz8f4eHhuHv3Lk6cOIG7d+/i+eefR05ODt544w1MnjwZH374If755x/8/fffuH37Njp37oy0tDR8/PHHZp9zfn4+9u7dCwDo1q1bua+dIbvWLsP6BdMgUhVWONlIRERERESmffXudIhUhejfv7+lQyGqMkxoUYX069cP06dPh0hU9FZydHTEhg0b4Ovri5SUFGzdulW7rWaE1uHDh3X2ERsbCw8PD0ycOBFyuRx//vmnTh3wXzJMIzg4GD179oRYLNYpb9u2LVavXg0A+Oabb8p9Xq+88gpeeukl7Wt/f3/MmDEDALB7925ERETgmWee0da3adMGkydPBgC9hNaKFSuQkZGBadOmYfbs2ZBKpdq6rl27IioqCgDwySefGIyldevWWL58OSQSCQBAKpVi2bJlAICYmBiEhITo/Azc3d2xaNEig7GYsmjRIty5c0f7szBFLpcjOztb52FKxp1UqFRKCACuXr1qdkxERERUcWXtt4nI9ikLCyEAUCgUlg6FqMowoUUVMmXKFL0yiUSCV155BQDw888/a8u9vb3RokULpKWl4cKFCwCA+/fvIzExET169EBoaCgA3RFcmuSXJhlWXE5ODtatW4exY8eiT58+6N69O4KDgzFr1iwAwOnTp8t9XoYSOkFBQdrnEyZM0Ktv3749AP2Ezc6dOwFAe01K6tu3LyQSCY4ePYrCwkK9+vHjx+ute9W8eXM4OjoajdVYLMbs378fH3zwAQAgKioK7u7uJrdfunQp3NzctI/69eub3F6tVmmfq1QqE1sSERFRZStrv01ERGQLeJdDqpDA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cjMQHBwMAPD397dnWERERERELsU47gaAoKAg+wVCVMo4hxYRlQnjZPB6by2QAjWhpdfr7RkWEREREZFL0XtrkZWRA0OuQR1zE7kiJrSIqEy06d5A/Xnll1swZ84c5ObmYt++ffYLioiIiIjIxRjH3cYxN5Gr4i2HRERERERERETkVJjQIiIiIiIiIiIip8JbDomoxKz6eht0Oq3JMoEgMyMTei89FNx54krFkEr2CI+IiIjysNRv22KpT3fEesWpazAYcPzEcdSuVbtQT4dj25T8/tg2xa/HMTe5Oia0iKjELP/uR4SFhZksM86T1bRpU3h4eNgpMiIiIrqbpX7blqL26WVdrzh1U1JSEBgYiJPH1iEgIKDU98e2cZx6xanrLG1D5Gp4yyERERERERERETkVJrSIiIiIiIiIiMipMKFFREREREREREROhQktIiIiIiIiIiJyKkxoERERERERERGRU2FCi4iIiIiIiIiInAoTWkRERERERERE5FSY0CIiIiIiIiIiIqfiae8AiMh1PNnrUeh0OpNlAkFmRib0XnooUApUFlSxEhZ8932ZxExEROSuLPXbttjq0x2pXnHqGgy5qBkSjP4PdIFG41Go/Xl4+eDHX38rVJxERFR0TGgRUYn5/JH74O+lL/Z2hq7YUALREBERkS0l1W+7ni5FqtV/6ZoSjoOIiGzhLYdERERERERERORUmNAiIocxftsBjNrwFzJ0Xhg0aBBmzZpl75CIiIiI8vX4L38CAUF4+OGH7R0KEZHbYEKLiBzGzaxsJGVkAQCuXbuGtLQ0O0dERERElL9sgwFQFGRnZ9s7FCIit8GEFhE5jORM00FgamqqnSIhIiIiIiIiR8aEFhE5DIPInR+UO08jEuPvRERERERERHkwoUVEDkPz/4ks/H8iS1EK94huIiIiIiIicg9MaBGRwwjUa01+9/f3t1MkRERERERE5Mg87R0AEZFRkO5OQispPRMVKlSAXq+3c0RERERE+dNqNMjKzYVWq81/ZSIiKhFMaFGZUzg/ElnxbtvGAIChKzZgyZIl2Ldvn30DIiIiIiqAhQ+0Qv+la7Bq3W57h0JE5DZ4yyERERERERERETkVJrSIiIiIiIiIiMip8JZDIioxneevhMbj7o8VgYj8/62mdz+10HKZxtMD/QcNxvjXxpZyxERERO7Lcr9ti60+3ZHq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2f6uXbuGzz//HH369EFkZCT0ej38/f0RFRWFd955B8nJyWUWCxEREREREVFRedo7ACJ39vbbbwOA1aSWj48P6tati2rVqpXI/nr27Ilt27YBAMqVK4eGDRsiKSkJ+/btQ3x8PL788kts2LABNWrUKJH9EREREREREZUGJrSIHFjLli1x9OjREtueh4cHhg4dilGjRqFly5bqbZrx8fHo378/jh8/jv79+2P37t1F2n7n+Suh8bj7Y0UgIv+/r7tvCy1emYdWiw5d7gcAhAQH47tlS4sUNxERkTuy3G/bYqtvtk89D0UKsT0iInIlTGgRuZHly5cjODjYbHmzZs2wcOFCtG7dGnv27EF8fDyaNWtW6O1PmLsIPr5+JRFqoc1962W77JeIiMhZ2bPfLins/4mI3Bfn0CKXs2TJErRs2RJ+fn4IDg7Go48+ikOHDlld/9atW5gyZQoaN24MX19fBAQEoFWrVvj000+Rk5Njsm58fDwURUFUVJTZdt577z11cvqTJ0+alCUmJkJRFERERAC4c4th3knsjfWMrzNnzgDIf1L427dvY9q0aWjevDkCAgLg4+ODpk2b4v3330dmZqbZ+paSWUatWrVCYGAgAODvv/+2uh4RERERERGRvfEKLXIp06dPx7hx41C5cmXUr18fx44dw8qVK/Hbb7/ht99+Q9u2bU3Wv3r1Kjp16oSDBw9Co9GgYcOGyM7Oxq5du7Br1y6sXLkSP/30E7y8vAAATZo0QWBgIPbv34+bN28iKChI3daWLVvUnzdv3oyaNWua/A4AsbGxAIBq1aohJiYG27dvBwDExMSYxGXcny0XLlxA165dkZCQAE9PT0RERECr1eLw4cN47bXX8NNPP+G3336Dt7d3gdouNzcX2dnZAFDgOkRERERERET2wCu0yKW8+eab+OCDD3DhwgXs3r0bly9fxuDBg5Geno7HHnsM6enpJuuPGjUKBw8exD333IO///4b+/fvR0JCAnbv3o1KlSph3bp1mDRpkrq+RqNB27ZtYTAY1MnVgTvJoO3btyM0NBTAvwkso7sTWsOGDTOpv23bNpNX5cqVbR6nwWBAv379kJCQgAEDBuD8+fM4fvw4EhIScPr0abRr1w7btm3DW2+9VeC2+/nnn3H79m14eHigdevWBa5nbytmT8eS6ROhMeSgf//+eO655+wdEhEREZWy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o0bluy8AOHPmTIHWIyIiIiIiInJknEOLiIiIiIiIiIicChNaROTUflu8FzoPbzz44IP2DoWIiIjKyI7VCfh10V/QeXgX+Ep1IiJyLUxoEZFTMxgMUBQF2dnZ9g6FiIiIykjqjXSI4c6E8XmfVE1ERO6DCS0iIiIiInIqeecYNRgMdoyEiIjshQktIiIiIiJyKoqiqD9rNPyThojIHfHTn4iIiIiInIrO69+HtQcFBdkvECIishsmtIjIqWk0GogItFqtvUMhIiKiMqL31kLRKBARBAcH2zscIiKyAya0iMipdR0chazcdKxZs8beoRAREVEZadO9Ae5/LBpZuemYM2eOvcMhIiI7YEKLiIiIiIiIiIicChNaRERERERERETkVDzzX4WIqGBWfb0NOp3pXFYCQWZGJvReeihQSqWsYkil0jkgIiIiF2ap37bFVt9sr3ocAxARuS8mtIioxCz/7keEhYWZLMvNzcW+ffvQtGlTeHh4lHoZERERFYylftuWova/ZV2PiIjcA285JCIiIiIiIiIip8KEFhERERERERERORXeckhExSYiAIDU1FSkpKSYlOXm5iItLQ0pKSkWbx105TJjW7BN8m8TR4uT7eIYZWwXtou1Yzf2O1Q0tvptW2z93zhSveLUtfX+Ko39sW0cp15x6rJtrGPbWOcObVPa/bYiHBEQUTGdOnUKNWvWtHcYRETkJs6dO1eouZ/IFPttIiIqS6XVb/MKLSIqtuDgYADA2bNnERgYaFbeokUL7N6922JdVy5LSUlBeHg4zp07h4CAAIeMsazLbLWJI8VZ1mVsF7ZLYcrcuV1EBNHR0ahatarFelQw+fXbttj6f3OkekWtm9/7q6T3Z496Ra3LtrGObWMd28Y6d2ib0u63mdAiomLTaO5MxxcYGGjxw9jDw8Pqh7SrlwFAQECAWbkjxegobeJocbJdHKMMYLtY467totPp1H6Hiia/ftuW/M5LR6lX3LrW3l+lsT+2jePUK25dto11bBvrXL1tSrPf5miAiErdc88957ZljhKHI5XZ4khxsl0co8wWR4qT7eIYZVT6SuO8LI16xa1blvtj2zhOveLWLcv9sW0cp15x65bl/lytbTiHFhEVW0pKCgIDA5GcnFzkzL0rYruYY5tYxnaxjO1iGduFiovnkHVsG+vYNtaxbaxj21jHtik+XqFFRMWm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7r//fqlQoYJotVqpUqWKtGrVSsaNGye7du0qwBGa6tatmwCQ/fv3myw/e/asTJs2Tbp06SLVqlUTLy8vKV++vERFRcmUKVPkxo0bFrdX1BgTExPl+eefl1q1aoler5egoCBp3LixjB07Vk6cOGGyblZWlpQrV05CQkIkMzOz0MdMRK6lJP94y8zMlIkTJ0pERIRotVqpXLmyDBgwQI4ePWrxj9x169aJoiji6+tr9lll9MYbbwgAiYqKkqysLHV5WSe0RES+/fZbiY6OFi8vLwkODpaePXvK4cOHrSauHDWhJXInCWRMSOTtC1JSUuS9996TVq1aSUBAgOj1eomIiJCOHTvKjBkzTNq1KH2drf+f1NRUGTdunFSvXl10Op1Ur15dxowZI6mpqfmODw4ePChPPfWU1KhRQ7y8vCQwMFDuueceGThwoHz33Xdy69Ytk/WLmtASEZk1a5Y0btzYJJFkbVyS1+3bt2X16tXy/PPPS4sWLaRq1aqi1WrFz89PGjRoIM8884zZeCKvoowRLl++LE888YSEhoaqSbP8zg2jc+fOyWeffSa9evWSe+65R4KCgsTT01PKly8v7dq1k+nTp0tKSopZvfwSWrZelt4L//zzj0yYMEGaNGkifn5+4u3tLbVq1ZJu3brJ7Nmz5fLlywU6HqMLFy6Ip6enNGvWzGJ5aSS07n7pdDoJDw+X/v37y5YtW6xu+/333zdLPDsrRcTON48TERGRie3bt6Nt27YYPnw4vvjiC3uHUyDz58/HsGHDMH36dIwdO9be4RARERGVqREjRmDevHnYunWrOq+Wo8nJyUHdunWRlpaGkydPmjz50RkxoUVEROSAevbsidWrV+P48eMlNkloacnNzUW9evWQmZmJv//+G15eXvYOiYiIiKhMXbp0CbVq1UJMTAx+++03e4dj0ddff40nnngCn376KZ599ll7h1NsnvYOgIiIiMzNmDEDTZo0wblz5xw+oXXhwgUMHjwYsbGxTGYRERGRW6pSpQoWLFiAQ4cOIS0tzSGvflIUBZMnT8aIESPsHUqJ4BVaRERERERERETkVDT2DoCIiIiIiIiIiKgwmNAiIiIiIiIiIiKnwoQWERERERERERE5FSa0iIiIiIiIiIjIqTChRUREREREREREToUJLSIiIiIiIiIicipMaBERERERERERkVNhQouIiIiIiIiIiJwKE1pERERERERERORUmNAiIiIiIiIiIiKn8n+WvD5hzeyaVAAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, axes = plt.subplots(nrows=1, ncols=2, sharey=True)\n", "\n", "cmap = ['#FD7F69', '#9FC9DD', '#89A76F']\n", "\n", "style_dict = dict(\n", " orient='h',\n", " palette=cmap,\n", " edgecolor=\"k\",\n", " linewidth=2.0,\n", " errwidth=2.0,\n", " capsize=0.07)\n", "\n", "ax = axes[0]\n", "b = sns.barplot(x=\"s\", \n", " y=\"util\", \n", " data=df.sort_values('util'),\n", " order=labels,\n", " hue='ncores',\n", " hue_order=[4,2,1],\n", " ax=ax,\n", " **style_dict\n", ")\n", "plt.setp(b.patches, linewidth=0.5)\n", "\n", "ax.set_ylabel('')\n", "ax.set_xlabel('Time (sec)')\n", "ax.set_yticklabels(labels_mod)\n", "ax.set_axisbelow(True)\n", "ax.grid(which='both', axis='x', color='k')\n", "#ax.set_xscale('log')\n", "ax.set_xlim([0, 5e3])\n", "ax.set_xticks(np.arange(0, 6000, 100), minor=True)\n", "ax.grid(which='minor', axis='x', alpha=0.2, color='k')\n", "ax.get_legend().remove()\n", "\n", "ax = axes[1]\n", "b = sns.barplot(x=\"max_rss\", \n", " y=\"util\", \n", " data=df.sort_values('util'),\n", " order=labels,\n", " hue='ncores',\n", " hue_order=[4,2,1],\n", " ax=ax,\n", " **style_dict)\n", "plt.setp(b.patches, linewidth=0.5)\n", "\n", "ax.set_ylabel('')\n", "ax.set_xlabel('Maximum Resident Set Size (MB)')\n", "ax.set_yticklabels(labels_mod)\n", "ax.set_axisbelow(True)\n", "ax.grid(which='both', axis='x', color='k')\n", "ax.set_xticks(np.arange(0, 30000, 1000), minor=True)\n", "ax.grid(which='minor', axis='x', alpha=0.2, color='k')\n", "\n", "fig.suptitle('Benchmark of different Hi-C mapping tools for 1 mln reads (5 iterations)', y=0.99)\n", "\n", "# (x, y, width, height)\n", "bb = (fig.subplotpars.left, fig.subplotpars.top+0.002, fig.subplotpars.right-fig.subplotpars.left, 0.2)\n", "ax.legend(bbox_to_anchor=bb, title=\"Number of cores\", loc=\"lower right\", ncol=3, borderaxespad=0., bbox_transform=fig.transFigure, frameon=False)\n", "\n", "plt.savefig(\"benchmarking_1mln.pdf\")" ] }, { "cell_type": "code", "execution_count": 25, "id": "1f41e7db-0f80-45f6-96f6-d1ae81055b83", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABLQAAAMrCAYAAABQzMu7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzddXgUV9sG8Hvj7gIECe4WHALBvTgEl7a0UFqsfSlQJEhLoVC80NIWdwnQAsVJcbfgFjwQIQrx8/2Rb6e7yXo22QTu33XtBZk558wzM7tnZp+dOSMTQggQEREREREREREVEGamDoCIiIiIiIiIiEgfTGgREREREREREVGBwoQWEREREREREREVKExoERERERERERFRgcKEFhERERERERERFShMaBERERERERERUYHChBYRERERERERERUoTGgREREREREREVGBwoQWEREREREREREVKExoEeVzq1atgkwmU/mysLCAu7s7mjRpgp9++gmxsbGmDjfXBAUFQSaTwdfX19Sh5CuK74/87NWrVxg5ciTKly8PW1tbKeZVq1YZdTma3ifHjh2TlhsWFqayfnx8PCZNmoSqVavC3t5eKh8UFKRUbvv27WjZsiU8PDxgbm7O96YRybf54MGDdSrv6+sLmUyGpk2bZpsXFhYmtXfs2DGjxJecnIw1a9agT58+KFu2LFxcXGBlZQVPT080bNgQX3/9Nc6fP2+UZZFmubF/STNd+tHcVND63ufPn2PHjh0YP348mjdvDicnp1w7/uW2pk2b6tU3k3b54Rxu+fLlkMlk+Oijj1TOV/cdJOtr27ZtBscgP45nPdeiTO/r9lmwYAFkMhm6deuWo3aY0CIqwNLT0xEdHY3jx49j3LhxqFKlCkJDQ00dFpGShIQENGzYEIsXL8bdu3eRlJRk6pBUysjIQOvWrfH9998jNDQUb9++VVnul19+QY8ePXD48GFERUUhIyMjjyPNXz6kpMK2bdtQtmxZDBo0CJs2bcL9+/cRGxuL1NRUREZG4vTp0/j5559Rt25dBAQE4NatW6YOmQoA/mCjm4LY9zZq1Ajdu3fH7NmzcfToUcTHx5s6JCJJfHy8lCTJr8mS97V/zA/JTFMbNmwYChcujODgYJw4ccLgdpjQIipA9u7di/j4eOkVHh6O06dP45NPPoFMJsOzZ8/QqVMnJCcnmzpUIsmG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frzKuorb+fTp06JSpUpq2/j8889VtnHjxg3h5eWldZ0iIiJU1k9OThbW1tYCgPjll19UltGECS2ifE7XhJbiybq6hFRgYKB0QvH555+LU6dOiYiICPHy5Uuxbds2qRPz9PRUebInb7906dLCzMxMjB07Vly5ckVERUWJGzduiE8++UQq891336mM4eeff5bKlClTRvz555/i4cOHIjo6Wty7d0+sX79edOnSRUyfPl2pnvxkycXFRbi7u4vKlSuLLVu2iOfPn4vXr1+LrVu3iiJFiggAwtHRUURFRWVbtjyhVaRIEWFtbS1atGghjh49KiIiIsSDBw/EhAkTpNgmTZokOnXqJBwcHMRPP/0k7t+/L6KiosShQ4dEhQoVBADh5OSkcjl//fWXCAgIEPPnzxchISHi/v37IjIyUoSGhopff/1VlCtXTgAQJUuWFO/evctWX3Gf+/j4iKJFi4o///xTPHnyRLx+/VocPHhQxMTEZCurKC0tTXz66acCyPxiOnfuXJX7Q5uoqCjh4+MjAAgrKysxdepUcefOHREZGSn+/fdf0bZtW2n5X331lVLdxMREER8fL/r16ycACH9/fxEfHy+93r59q3McGRkZomnTptKyhg0bJq5evSoiIyPF2bNnpQSr/ORVn4TW27dvRXx8vLT/ixcvrhRnYmKiSE1NFfHx8eLGjRtSG3v37lUqp/iF+9tvv5XK9erVSxw+fFi8evVKvH79Wuzbt080aNBAABC2trbi+vXr2WKVn7zIt/2gQYPE2bNnRWRkpLh//74ICQkRQmR+2fb39xcAhLW1tRg/fry4ePGiiIqKEk+fPhUrV64URYsWlU6ssp64K55YlS5dWtja2orp06eLW7duiejoaHHp0iXRqVMnqcyKFSuy7WNN2yTrdtGFvK38kNB6+/atdGKsbwLWEIrv0ZIlSwpvb2/x22+/iSdPnoiIiAixfft2UahQIWn+5s2bpffY6dOnRVRUlLh9+7ZSX5x1n8n5+fmJMWPGiD179ohr166JiIgI8ejRI7F//37RvXt3qf6+fftU1leME4AYMWKEuHbtWrbPJADRt2/fbPUV903JkiWFpaWlmDRpkrh9+7aIjIwUx44dU0pMTJw4UWMbmhJapUuXFgDE4MGDxZkzZ0RUVJS4f/++mDBhgpR07tevn8r1VPxS06pVK/Hvv/+KyMhI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lkMiIiIiIiIiInIqTGgREREREREREZFTYUKLiIiIiIiIiIicChNaRERERERERETkVJjQIiIiIiIiIiIip8KEFhERERERERERORUmtIiIiIiIiIiIyKkwoUVERERERERERE7FRegAiKjumDR8KGQymSDb1kADZYkScoUcIogEG8+afuba2lpvTblaXY6W/r6IHtAPYrHE4v20N3seP0c4dubaWFtXX46drePZ69j5BATiy63bbI6dyNlYe92ujfdXe/SrTl9b31ut3R7fb4iIqo8JLSKym08e7wNPhVzoMMhq/YQOgGzGY2dPE7btEzoEolrF67YpNf/eyvcbIqLq4y2HRERERERERETkVDhDi4iIiOq12SknkFeqglIqR0xMDHJzcyGXy/H5558LHRoR1UHjvv8dpTIFBg0ahF27dgkdDhGR0+IMLSIiIqrX8kpVyC0phUYkQm5uLnJyclBUVCR0WERUR6nUakAkgkqlEjoUIiKnxoQWERER1Wv5yv/+U5mbmwsAKCwsFCocIiIiIrIAE1pERERUr6k1mopvRCKo1WoAgEZbRkREREQOiQktIiIiqtfEIlHFNxoNxOKKj0YibRkREREROSQmtIiIiKhe85ZLdd/7+voCADw9PYUKh4iIiIgswKccEhERUb3mI6tIaN26U6JLaMnlciFDIqI6TCoWo7S8HFKp1HxjIiIyiTO0iGpQUlISRCIRoqKihA6FiIhMWBrREXEP3Q+5Som4uDhs3LgR06dPFzosIqqjEgY8AEVpCfbs2SN0KERETo0JLSIzQkJCIBKJsG7duirbRUVFQSQSITY21q7brfzl6uqKli1bYvLkyTh9+rRdtkNERERERETkbJjQIqpBbm5uuPfee9G0aVObxwgNDUXPnj3Rs2dPtGzZEpcvX8bnn3+O+++/H7t27bJjtERERERERETOgWtoEdWgbt264cyZM9UaY86cOZg4caLu5+vXr2Ps2LH46aefMGnSJFy4cAEeHh7VjNQ++n6+A2KJUG8rGmg0mn+fTGaPp5PZOp41/cy1tbXemnINSlWlkEllFsRbk+x5/Bzh2JlrY21dfTl2to5nn2MndpEgqt8jAABliRJyhfF1tGypu7tcrVajUdMQPDrsCQT6+WFz4ldm4iayP+uv27Xx/mqPftXbpm3vrZZvT6NS4oHwjlaMTURExjChReRkAgMDkZCQgJCQENy8eRN79+7FsGHDhA4LADA3fgPc3B0juUZE5CziF7wsdAhUT/G6LYz4BS/jy63bhA6DiMjp8ZZDohpUU4vCBwUFITQ0FACQkZEBALhw4QJEIhFCQkIAAGvWrEHXrl3h6en5718L/3Pw4EEMHz4cgYGBkMlkCA4Oxvjx4/Hnn3/aNU4iIiIiIiKimsCEFpGT0mg0JutiYmIwdepUXL9+HW3atIGPj4+uLi4uDhEREdi2reIvg506dcLt27eRkJCAzp07Y/fu3TUdOhERAdi2ehk2LpsPsboM0dHRiImJETokIqphn78+A2J1GQYNGiR0KERETo8JLSIndO3aNWRmZgIAWrVqpVd3+fJlJCQkYMeOHbh48SIOHz6Mq1evAgDS0tLw4osvQqPRYNmyZfjnn39w+PBhXLt2Dc8//zxKSkowZswY/PPPP7W+T0RE9U1xUSFuF+QBAHJycpCbmytsQERU48rLyiACoFKphA6FiMjpMaFFZKFJkyZBJBKZ/EpOTq6VOG7cuIFx48ZBqVSiQYMG6Nevn159eXk5Fi1ahCFDhujKXF1dAQDLly9HWVkZHn/8cbz66qsQiyveAuRyOT766CO0a9cO+fn5iIuLqzIGpVKJgoICvS8iIrJOcVGh3s95eXnCBEJ1Hq/bRERUF3FReCILhYaGIiAgwGT9yZMna+QD4ptvvolPP/0UQMV/djIyMlBaWgqpVIo1a9bA09PToM/48eONjvXjjz8CAP73v/8Z1IlEIrz44ot49tln8eOPP2LRokUmY1q6dClef/11W3aHiIj+pdGoAfz3PDS1Wi1cMFSn8bpNRER1ERNaRBaaM2cOJk6caLI+KiqqRmZpZWRk6BZ+l8lkCAoKQu/evfHKK68gPDzcoL2fnx/8/PwMyvPy8pCdnQ0AaNu2rdFttWvXDgBw7ty5KmOaPXs2ZsyYofu5oKAATZo0sWh/iIiogkgkhkZTDg0qklraWbNE9sbrNhER1UVMaBEJICIiwqCsUaNG2Lx5s0H5559/XmUi7W7u7u5Gy4uKinTfm5ppFhgYCAAoLCw0Wq8ll8shl8stjomIiAy5enjq1tACoPcADyJ74nWbiIjqIia0iASQmppqUNasWbMa3aaHh4fu+xs3bqBRo0YGba5fvw4ARm9jJCIi+3L1qHivLSrIg5+fH3x9fQWOiIhqmsTFBSqVClKpVOhQiIicHue2EwlAo9EYfF24cKFGt+nj4wN/f38AQHp6utE2p0+fBgC0bt26RmMhIiJg2PMzMXrmYqjFLkhMTDT7QA4icn6TFr4LtdgFe/bsEToUIiKnx4QWUT3yyCOPAABWrlxpUKfRaHTl2nZEREREREREjogJLaJ65JVXXoGLiwt27NiBFStW6J6oVVpaiunTp+PUqVPw9vZGTEyMwJESERERERERmcY1tIjqkfDwcHz44YeYNm0a/u///g/vvPMOmjZtioyMDOTl5UEul+PLL79EUFCQTeMvfGaYoE/p0mg0EIlEgo9nTT9zbW2tt6a8tLQUMpnMonhrkj2PnyMcO3NtrK2rL8fO1vEc+diZKtceP4lEgojIB3XlAf6B2Lplu5m9IKo+W67btfH+ao9+1elr63urpduTSoR/3yYiqguY0CKqZ2JiYtCxY0csX74cqampSEtLg7+/Px599FHMnj0bbdu2tXnsqbNGQOHKpygREVXHjrX7hQ6B6glet4XBc5yIyD6Y0CIyw9LF2pOSkgzKoqKioNFoanS7WiEhIRZvq2fPnujZs6cNUREREREREREJj2toERERETmAg7vT8cuW45BJXBEdHc31DInqoB+/PAqZxBWDBg0SOhQiIqfHGVpEREREDkBZrILyjgoAkJOTI3A0RFQT1Go1RCIRVCqV0KEQETk9ztAiIiIicgClJWV6P+fl5QkTCBEREZETYEKLiIiIyAFo10HUPiVNrVYLGQ4RERGRQ2NCi4iIiMgBaBNZ2sSWWMyPaURERESm8JMSERERkQOQKfSXNvXx8REmECIiIiInwIQWERERkQOQu0ohd5MCAPz8/ODr6ytwRERkb2KxGBqNBlKpVOhQiIicHp9ySEREROQAegxuCwDYsXY/EhMTBY6GiGpC/zGdsWPtfuzbs0/oUIiInB5naBERERERERERkVNhQouIiIiIiIiIiJwKbzkkIrvZtT4FMpkwa0JooIGyRAm5Qg4RRIKNZ00/c21trbemXK1WIyMzA6GtQgV9opo9j58jHDtzbaytqy/HztbxHPnYmSqv6vgF+AdatN9E1WXtdbs23l/t0a86fW19b7VmezzHiYjsgwktIrKbrZu3Izg4WJBtl5eXIy0tDeHh4ZBIJIKNZ00/c21trbemvKCgAN7e3jh/di+8vLws3k97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TTOueJ4SUV3EhBYRERERWUUkEun+Uy4WiwWOhsi56M4fESB3rXqG1d1Kbivh7x8AwPIZWmq1mucpEdVJTGgRERERkVVkChfdzBIfHx9hgyFyMtrzR+4qRZ8nO1nVd8fa/UhMTER5eTnS0tIQHh4OiURisn10dDRycnJ4nhJRncSEFhERERFZRe4qRcntUkilUvj6+godDpFT0c7KsnZ2li205yfPUyKqi5jQIiIiIiKr9BjcFjvW7se+ffuEDoXI6fQY3LbWthUXF1dr2yIiqm28mZqIiIiIiIiIiJwKE1pERERERERERORUeMshEdnNrvUpkMlqfj0IYzTQQFmihFwhhwgiwcazpp+5trbWW1OuVquRkZmB0Fahgj4ByZ7HzxGOnbk21tbVl2Nn63iOfOxMlTvC8avusQvwD6yBqKg2WXvdro33V3v0q05fW8/N2tpHnndERP9hQouI7Gbr5u0IDg4WZNuWPu2npsezpp+5trbWW1NeUFAAb29vnD+7F15eXhbvp73Z8/g5wrEz18bauvpy7Gwdz5GPnalyRzh+9j525HysvW7XxvurPfpVp6+t56YQ+0hEVN/xlkMiIiIiIiIiInIqTGgREREREREREZFTYUKLiIiIiIiIiIicChNaRERERERERETkVJjQIiIiIiIiIiIip8KEFhERERERERERORUmtIiIiIiIiIiIyKm4CB0AEdUdk4YPhUwmE2TbGmigLFFCrpBDBJFg41nTz1xbW+utKVery9HS3xfRA/pBLJZYvJ/2Zs/j5wjHzlwba+vqy7GzdTxHPnamyu15/HwCAvHl1m3VGoPqJ2uv27Xx/mqPftXpa+u5aY99bBAQxHOZiMgKTGgRkd188ngfeCrkQodBVusndABkMx4752af4zdh2z67jEP1D6/bpgjz3spzmYjIOrzlkIiIiIiIiIiInAoTWkRERERERERE5FR4yyERERGRk5qdcgIlMgUeeeQRtGjRAnFxcUKHRET/mp1yAnmlKvjIpFga0bFGtjFt2jTcunULvr6+PP+JqN5hQouIiIjISeWVqgCRCGVlZcjNzRU6HCKqJK9UhdyS0hrdxq1bt5CTk1Oj2yAiclRMaBERERE5qXylSvd9Xl6ecIEQkQHt+XmrpBQx+/4w275EpkB0dLTF46tUKhQWFgLg+U9E9RMTWkREREROSq3R/Pe9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bdu2TYrfx8dHNGzYUNStW1f6o1smk4nJkyfrbLtq1SppXX18fES9evWk5HJQUJBITk7W2W7//v3C0dFRABDe3t4iKChIODs7CwCiQoUK4sGDBzrbXbhwQRQvXlwAEO7u7iIoKEi4u7sLAMLT01NcunTJrG1w5MgRUaJECenHwcFBABDOzs4a5bdv37bJ9b93754oX768tE5BQUHC29tbABCOjo7i4MGDFts2UVFR0v6kXrfs6wdADB48WErk2Oq2Wb9+vbQ+lStXFiEhITp/evToodW2sO835myborLf2BImtIhIi7F/mBWGK76FEfvPdrHvbBf7jmzBzp07RatWrYS7u7twdnYWderUEQsWLCjwySwhhLh9+7aYMGGCaNWqlShXrpxwcnISjo6Owt/fXwwYMEAcP348x/YRERGiU6dOwtPTUzg4OIiqVauKKVOmiJSUlBzbXbx4UfTp00eULFlSKJVK4e/vL0aNGiXi4+MNxjtkyBDh4+MjlEql8PHxEUOHDhV37twxed3VDh48KP3RnNPPrVu3bHb94+Pjxeeffy78/f2FUqkUJUuWFH369DGYBDR12zx79kxMnz5ddOjQQfj7+wsXFxehVCqFr6+v6NGjh9izZ0+Oy7OVbbNy5Uqjtkv58uV1ti/M+40526ao7De2RCYE379OVNRFRESgS5cu0v+Tk5ORlpYGZ2dnjUERo6Ki4Ofnp9H266+/xsSJEwEAAQEBcHFxwcWLF6FSqdCxY0ds377dpgcatAXsP9vFvrNd7DsiIiIi67K3dgBEZH0ZGRl4+vSpVvnLly/x8uVL6f+vD2AIABMmTECdOnUwf/58nD59Gg8fPkStWrXwwQcfYPjw4fyjLB+w/2wX+852se+IiIiIrIt3aBERERERERERkU2RWzsAIiIiIiIiIiIiUzChRURERERERERENoUJLSIiIiIiIiIisilMaBERERERERERkU1hQouIiIiIiIiIiGwKE1pERERERERERGRTmNAiIiIiIiIiIiKbwoQWERERERERERHZFCa0iIiIiIiIiIjIpjChRUREREREBEAmk0Emk1k7DDJRhQoVIJPJEBsba1K7999/HzKZDL/88kuexEWWc+jQIchkMrRo0cLaoeQoODgYXl5eSE5OtnYoOg0aNAj29va4cuWKtUOxCCa0iIiIiIjIotQJBplMhtGj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qFFDekuh2oIFC/D5558DAHx8fFC2bFmkpKTg2rVrSE9Ph4+PD44eParxRd/cGPfv349u3bohKSkJCoUCNWrUgEqlQkxMDF68eIHJkydrjQ02dOhQ/PTTT/jtt9/Qs2dPo9aXiIiIqDAYNmwYli9fjn/++UcaV6ugyczMRNWqVZGcnIybN29qvPnRFvEOLSIiIjOZe2UzJ+XKlcObb76Jixcv4vz58xp15ly1NjfGNm3a4OLFixg+fDjKly+PK1eu4M6dO6hYsSLGjBmj9WrpjIwMbNmyBd7e3ujSpYuJW5KIiIjItk2dOhXOzs6YNm2atUPRa926dYiJicHkyZNtPpkF8A4tIiKiAiciIgJNmzbF4MGD8dNPP1k7HKOsXLkSgwYNwpw5czBmzBhrh0NERESU77Zs2YKLFy9i9OjRBTJhtHr1aty+fRvjxo2Dvb29tcPJNSa0iIiICqCuXbti165duH79usVe45xXsrKyUK1aNaSlpeHatWsm3ZFGRERERGQO20/JERERFUJz585FnTp1cOfOnQKf0Lp37x769++P0NBQJrOIiIiIKF/wDi0iIiIiIiIiIrIpHBSeiIiIiIiIiIhsChNaRERERERERERkU5jQIiIiIiIiIiIim8KEFhERERERERER2RQmtIiIiIiIiIiIyKYwoUVERERERERERDaFCS0iIiIiIiIiIrIpTGgREREREREREZFNYUKLiIiIiIiIiIhsChNaRERERERERERkU/4PgTXGeNU1nlwAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, axes = plt.subplots(nrows=1, ncols=2, sharey=True)\n", "\n", "cmap = ['#FD7F69', '#9FC9DD', '#89A76F']\n", "\n", "style_dict = dict(\n", " orient='h',\n", " palette=cmap,\n", " edgecolor=\"k\",\n", " linewidth=2.0,\n", " errwidth=2.0,\n", " capsize=0.07)\n", "\n", "ax = axes[0]\n", "b = sns.barplot(x=\"s\", \n", " y=\"util\", \n", " data=df.sort_values('util'),\n", " order=labels,\n", " hue='ncores',\n", " hue_order=[4,2,1],\n", " ax=ax,\n", " **style_dict\n", ")\n", "plt.setp(b.patches, linewidth=0.5)\n", "\n", "ax.set_ylabel('')\n", "ax.set_xlabel('Time (sec)')\n", "ax.set_yticklabels(labels_mod)\n", "ax.set_axisbelow(True)\n", "ax.grid(which='both', axis='x', color='k')\n", "ax.set_xscale('log')\n", "ax.set_xlim([1, 5e3])\n", "# ax.set_xticks(np.arange(0, 5000, 100), minor=True)\n", "ax.grid(which='minor', axis='x', alpha=0.2, color='k')\n", "ax.get_legend().remove()\n", "\n", "ax = axes[1]\n", "b = sns.barplot(x=\"max_rss\", \n", " y=\"util\", \n", " data=df.sort_values('util'),\n", " order=labels,\n", " hue='ncores',\n", " hue_order=[4,2,1],\n", " ax=ax,\n", " **style_dict)\n", "plt.setp(b.patches, linewidth=0.5)\n", "\n", "ax.set_ylabel('')\n", "ax.set_xlabel('Maximum Resident Set Size (MB)')\n", "ax.set_yticklabels(labels_mod)\n", "ax.set_axisbelow(True)\n", "ax.grid(which='both', axis='x', color='k')\n", "ax.set_xticks(np.arange(0, 30000, 1000), minor=True)\n", "ax.grid(which='minor', axis='x', alpha=0.2, color='k')\n", "\n", "fig.suptitle('Benchmark of different Hi-C mapping tools for 1 mln reads (5 iterations)', y=0.99)\n", "\n", "# (x, y, width, height)\n", "bb = (fig.subplotpars.left, fig.subplotpars.top+0.002, fig.subplotpars.right-fig.subplotpars.left, 0.2)\n", "ax.legend(bbox_to_anchor=bb, title=\"Number of cores\", loc=\"lower right\", ncol=3, borderaxespad=0., bbox_transform=fig.transFigure, frameon=False)\n", "\n", "plt.savefig(\"benchmarking_1mln_log.pdf\")" ] }, { "cell_type": "code", "execution_count": 89, "id": "475f8c97-3de4-4ff1-b1e9-6a01331a6c52", "metadata": {}, "outputs": [], "source": [ "labels = [\n", " 'chromap', \n", " 'pairtools_bwamem2', \n", " 'tadbit',\n", " 'pairtools', \n", " 'tadbit_bowtie2',\n", " 'juicer', \n", " 'hicpro', \n", " 'hicexplorer', \n", " 'fanc_bwa', \n", " 'fanc_bowtie2',\n", " # 'bwamem2',\n", " # 'bwamem',\n", " # 'bowtie',\n", "]\n", "labels_mod = [\n", " 'Chromap', \n", " 'bwa-mem2 + pairtools', \n", " 'GEM + TADbit',\n", " 'bwa mem + pairtools', \n", " 'bowtie2 + TADbit',\n", " 'Juicer', \n", " 'Hi-Pro', \n", " 'HiCExplorer', \n", " 'bwa mem + FANC', \n", " 'bowtie2 + FANC',\n", " # 'bwa-mem2',\n", " # 'bwa mem',\n", " # 'bowtie2',\n", "]" ] }, { "cell_type": "code", "execution_count": 90, "id": "3b2cd5e8-71bf-4039-a6b1-be7565b84759", "metadata": {}, "outputs": [], "source": [ "df = timings.sort_values(['ncores', 'util'])\n", "df.loc[:, \"max_rss_gb\"] = df.loc[:, \"max_rss\"]/1024\n", "df.loc[:, \"min\"] = df.loc[:, \"s\"]" ] }, { "cell_type": "code", "execution_count": 91, "id": "08e08c97-3e00-438e-810e-77eae9c6804b", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABLQAAAMpCAYAAAAdBGqwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd1gUV9sG8HvpHQQEBVHsBbGgYBd7j703NFFjb0mMNWKLJRp7SUxi793Erij2XlGxY0FRilSln+8Pvp13F3aXpYPev+vaS5k558wzs7MzZ5+dOSMTQggQEREREREREREVEDp5HQAREREREREREVFGMKFFREREREREREQFChNaRERERERERERUoDChRUREREREREREBQoTWkREREREREREVKAwoUVERERERERERAUKE1pERERERERERFSgMKFFREREREREREQFChNaRERERERERERUoDChRZTPrV+/HjKZTOVLT08PNjY2aNiwIX777TdERETkdbg5xtvbGzKZDM7OznkdSr6iuH/kZ+/fv8fo0aNRvnx5GBsbSzGvX78+W5ejaT85c+aMtNyAgACV9aOiojB16lS4urrC1NRUKu/t7a1Ubs+ePWjWrBlsbW2hq6vLfTMbybf5gAEDtCrv7OwMmUyGRo0apZkXEBAgtXfmzJlsiS8uLg4bN25Er169ULZsWVhZWcHAwACFCxdG3bp18cMPP+DatWvZsizSLCfeX9JMm+NoTipox97AwEDs3bsXEydORJMmTWBhYZFj57+c1qhRowwdmyl9+aEPt2bNGshkMnzzzTcq56v7DpL6tXv37kzHID+Pp+5rUYovdfssWbIEMpkMnTt3zlI7TGgRFWBJSUkICwvDuXPnMGHCBFSuXBl+fn55HRaRkujoaNStWxfLly/H48ePERsbm9chqZScnIwWLVpgzpw58PPzw6dPn1SWW7VqFbp27YpTp04hNDQUycnJuRxp/vI1JRV2796NsmXLwsvLC9u3b8fTp08RERGBhIQEhISE4NKlS/j999/h4eEBT09PPHz4MK9DpgKAP9hopyAee+vVq4cuXbpg/vz5OH36NKKiovI6JCJJVFSUlCTJr8mSL/X4mB+SmXlt6NChKFq0KPbt24fz589nuh0mtIgKkMOHDyMqKkp6BQUF4dKlS/juu+8gk8nw5s0btG/fHnFxcXkdKpFk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Pn0qTb927Zqwt7cXAMSECROU6pw+fVraNnZ2duLixYvSPPk2vHPnjjA0NBRGRkbizz//FElJSVKZgwcPCgsLC6Grqytu374tTV+4cKEAIFq0aCFCQ0OVlvny5UuxePHiDG0Pyh1MaBEREREREVG2UkxoCSHEunXrBABRvnx5kZiYKJXLqYSWsbGxCAwMVJqXmJgoihUrJiW1YmJilOZ//PhRGBkZCQBpkhry9alatarKeNzc3AQA8csvv0jT4uLiRJEiRYSurq64efOmynrypM7GjRulafKEFgCxaNEilfU0iYiIECYmJgKA2LdvX5r5V69eFQCETCZTSiQJkfmE1s6dOwUAYWdnJ0JCQtIt//jxYyGTyQQAldtG3p6pqamUdBTifwktAGLPnj0q2+7cubMAIJYuXapy/vLlywUA8e2330rT5MlMxeQh5X8cQ4uIiIiIiIhyVL9+/VC2bFk8evQIW7ZsyfHltW7dGg4ODkrTdHV14erqCiBlsHoTExOl+VZWVihZsiQA4MWLFyrbVXfbmXz6sWPHpGmXLl1CUFAQ3NzcUL16dZX12rdvDwAqx5cCgP79+6ucrsn58+fx6dMnFC9eHB06dEgz393dHXXq1IEQAidOnMhw+6ocOHAAQMqYafLbGDU5ceIEhBCoX7++ym3TpUsXFCtWDDExMbhw4UKa+ZaWlirXLT4+HocPH4aurq7asb9UbXMnJycAwL59+1SO3UX5E8fQIiIiIiIiohylq6uLadOmoX///pg1axZ69+4NPb2c+zpaunRpldMLFy6c7vyHDx8iOjpa5fyKFStqnP748WNp2r179wCkDPJev359lfXCw8MBAIGBgWnm2drawtbWVmU9TeQxVKhQQe0g8i4uLrh06ZJSvFkhHzerdu3aGYqxUqVKKufr6OigQoUKePPmDR4/foxWrVopzS9btix0dXVVthsbGwsDAwO0adNGZdvi/5+2qbjNBw4ciN9++w3r16/HkSNH0KpVKzRo0ACNGzdGqVKltFonyn1MaBEREREREVGO6927N+bMmYNHjx5h06ZNGDhwYI4tK/XVV3LyBE968+VJj9Ts7OxUTre3twcAREVFSdMiIiIApAx+HhwcrDHez58/p5lmamqqsY468mSculgB1fFmRWRkJICUq9y0kdUY1W0b+TaPj49XeWWXIsVB5B0cHHDp0iVM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iHJN3baVAAAH/jmLHTt25HE0RERERESkjRZ93LBj1XGcOHE9r0MhkvAKLSIiIiIiIiIiKlCY0CIiIiIiIiIiogKFCS0iIiIiIiIiIipQOIYWEWWbfzech4FB2oEiBQTiYuNgaGQIGWSwK2yfB9ERERGRInXnbXVSn8/za72s1E1OTsaTp09QtkxZ6Oho/9s/t032L4/bJv/Uk9e1siyUoTpEOY0JLSLKNnt37UexYsXSTE9KSsLt27dRrVo16Orq5kFkRERElJq687Y6mT2f53a9rNSNjIyEpaUlnj06AQsLixxfHrdN/qmXlbpf07Yhyk94yyERERERERERERUoTGgREREREREREVGBwoQWEREREREREREVKExoERERERERERFRgcKEFhERERERERERFShMaBERERERERERUYHChBYRERERERERERUoTGgREREREREREVGBwoQWEREREREREREVKExoERERERERERFRgcKEFhERERERERERFSh6eR0AEX05BnbuCAMDgzTTBQTiYuNgaGQIGWQAACs7e2zZuy+3QyQiIqL/p+68rY6q83l+rJeVusnJSShd2Bo9WjWHjo5uji+P2yb/1MtK3YK0bXSNTLD/2HGt6xDlZ0xoEVG2+bNDY5gbGWpV1mufTw5HQ0RERJpk5Lz9dWme1wHkY9w26hWMbdNj2+G8DoEo2/CWQyIiIiIiIiIiKlCY0CIiIiIiIiIiogKFCS0i+uJ8/PgRHTp0gJOTE4yMjFC8eHFMnToVycnJautcunQJgwYNgpWVFezs7DBu3DjEx8fnYtRERERERESkLSa0iChXTTp/F72PXEasgRGGDRuWI8uIiIjAw4cPMWTIECxZsgQymQzz5s3Dzp07VZZ///492rVrhydPnuDXX3+Fp6cnlixZgjlz5uRIfEREREREuW3S+buAhRXatGmTY/1wotzEhBYR5arw+AQkCQHIZAgLC9O63rFjx6Cnp4euXbsCACZPngyZTIZp06alKVusWDE8fPgQ06ZNw9ChQzF+/HgAwOPHj1W2ffHiRURERKBmzZoYPnw4Zs2aBQBYsWJFRlePiIiIiChfCo9PAGQyJCYmZqgfTpRf8SmHRJSrIuISpP+Hh4drXa9ly5YICAjA2rVrMXLkSKxevRqenp7w9vZOU1ZP73+HtuTkZBw6dAgA4OHhobLtokWLAgCePn2KJ0+e4PDhlKe/hIWFISwsDNbW1lrHSURERESUH2W2H06UXzGhRUS5KlmI//1fw5hWqixevBhXrlzBypUrYWtri61bt0JXV1dt+bi4OHh5eeHEiRMYNWoUWrVqpbJc7dq1MXz4cKxatQoVK1aEiYkJ9PX1kZCQAKEQLxERERFRQZWVfjhRfsRbDokoV+nIZP/7v07GDkExMTHS5dExMTH4+PGj2rLh4eFo2bIlduzYgenTp2Px4sXSPCEEYmNjERcXJ01btmwZ/vvvP5w9exYXL15EYmIinJ2dYWNjk6EYiYiIiIjyo6z0w4nyI+7FRJSrLA31pf9bWVlpXU8IgYEDB+LNmzeYN28ehBDo1q0bPn36lKZsdHQ06tWrB19fX7Rq1QoVKlTAjh07cO3aNQDAy5cvYWxsjBIlSkh1pk2bhosXL+LOnTvo06cPhBAqx+ciIiIiIiqIMtsPJ8qveMshERUImzdvxuHDhzFixAj8/PPPMDU1xahRozB8+HCsX79eqWxISAgePHgAADh69CiOHj0KAHBzc8PgwYNVtv/y5UscOHAA8fHxKFeuHDZs2ID+/fvn6DoRERERERFR5jChRUS5yspAHxFxCUhKTs7QYOv9+vXDokWLpDGzRo4ciZEjR6os6+zsnGbsq6SkJNy+fVvt/I0bN+L27duoVq2axnG5iIiIiIgKIisDfYR9joOevj4fekRfBCa0iChXza1fBQDgtc8Hq1evzuNoiIiIiIi+DnPrV0GPbYdx+Mo1/oBLXwSOoUVERERERERERAUKE1pERERERERERFSgZDihJZPJIFN43CfRl+bMmTOQyWRo1KhRXoeSLRo1agSZTIYzZ87kdShERERERERE2YJjaH0lkpKScPLkSfz333+4cOECnjx5gvj4eBQpUgSenp4YO3Ys3Nzc8jrML8L69esREBCAAQMGwNnZOa/DyVXN1h2Ajq6qw4qAEOL/k+EpCXEdPV00at5SKhEXGwdDI0MUtrbGrh3bcidgIiKir5j687Y6ac/n+bNe1pYZnxAPA32DDNfjtsn+5XHbZLyeSIhDeQd7dbVgYlUoA8shyt+Y0PpKrF+/HoMGDQIA6OnpoVy5ctDX18fjx4+xadMmbNu2DStXrsSQIUPyONK8Z2JigvLly6N48eKZqr9+/Xr4+vqiUaNGX11Ca8qazTAxNctSG2t+GZdN0RAREZEm2XHeJqL8Zc0v43DoxDGV8xSf+k30JeAYWl8JIQTc3NywadMmhIeH4/79+7h9+zaCgoIwYMAAJCYmYvjw4bh79262LM/b2xsymQzr16/PlvZyk4eHB/z9/bFx48a8DoWIiIiIiIiIVGBC6yvRpUsXXL9+HX379oWpqak03cLCAmvXrkXlypWRlJSEv//+Ow+jJMpZkZGR6NSpE5ycnGBkZITixYtjypQpSE5OVln+48eP6NChA5ycnGBqaoq2bdti6tSpassTERERERFR7shSQmvr1q3w8PCAmZkZrK2t0bFjR/j5+aUpV7VqVchksjRX/7x//14aZH7atGlp6qkazDooKAjLly9Hy5Yt4ezsDCMjIxQqVAienp7YtGlTptdFcbD7ffv2oW7dujAzM4O9vT28vLwQFBQklV23bh1q1KgBU1NT2NnZYejQoYiIiFDb9ps3bzB69GiUK1cOxsbGsLKyQuPGjbF7926V5RXX++7du+jQoQNsbW1hYWGBZs2a4fr161LZc+fOoVWrVrC2toa5uTnatm0Lf3//NG0WKlRI7WD+enp6aNKkCQDg8ePH6W+sXBYQEACZTAZnZ2cIIbB8+XK4urrCxMQEdnZ26NevH169eqWyrp+fH6ZPn446deqgaNGiMDAwQNGiRdG5c2dcvHhRZR11g8IrxgEAa9euhbu7O8zNzaX3SyaTwdfXFwDQuHFjab9SdbXaq1evMGzYMJQsWRKGhoawtbVF69atceTIEY3b49ChQ2jVqhVsbW1haGiIkiVLYvjw4Xj9+nX6G1NBYmIili5dCg8PD5ibm8PQ0BAODg6oW7cupk+fjvDw8Ay1VxBER0fD398fQ4YMwZIlSyCTyfDrr79i5cqVKstHRETg4cOHGDJkCH7//XfIZDLMmzdPbXkiIiIiIiLKHZlOaC1YsAB9+vTB69evUbFiRSQmJuLAgQPw8PDA+fPnlco2bNgQAKQv+nKKf6eeFxcXhytXrsDQ0BC1a9eWpv/1118YPXo0zp07Bz09Pbi6usLCwgJnz55F//79MWzYsMyuEgBg+fLl6Ny5M16/fo0yZcogIiICGzduRNOmTREbG4sxY8bg22+/RXh4OEqWLImPHz/ijz/+QIcOHSCESNOer68vKleujOXLl+PNmzcoW7YsLCwscObMGXTr1g0//vij2liuXLmC2rVr4+zZs3B2doaOjg5OnTqFJk2a4P79+9i1axeaNGmCW7duoWTJkkhOTsbhw4fRsGFDvH//PkPrHRsbCwAwNjbO2AbLZSNGjMDo0aMRGRmJSpUqISoqCps3b0bNmjXx6NGjNOXHjh2LmTNnwt/fH4UKFYKrqysSExOxb98+NGzYEFu3bs1UHMOGDcOQIUPw/v17VKhQAVZWVrC0tES9evVgYWEBAKhcuTLq1asnvezt/zc445UrV1C1alWsWbMGwcHBcHV1hbGxMY4ePYo2bdrgl19+UbncSZMmoV27djh27BiMjY3h6uqKDx8+YPXq1ahatapSsjM9PXv2xNixY3Ht2jXY29ujatWq0NPTw9WrVzFz5kwEBARkattkxboZ46GTnIg2bdpoXWf79u2QyWTo3r07AGDKlClqk+R2dnbw8/PDtGnTMHToUIwfPx4A1I4lUKxYMTx8+BDTpk3D999/jz59+mgsT0RERESUF/atWoC/fxkLneTELH8nJiooMp3Qmjp1KhYtWoTAwEBcu3YNQUFB6NOnDz5//oy+ffvi8+fPUllPT08A6hNajo6OuHr1qpRUASD97eHhASMjI2l6o0aN4OPjg6ioKDx9+hTXrl3Dy5cvcefOHVSsWBFr1qxJs5yMmDRpErZu3YrXr1/j9u3bePr0KcqUKYMHDx6gV69e2LBhA06ePIlnz57Bz88PN2/ehLW1NXx9fXH06FGltt6+fYvOnTsjMjISv/76Kz5+/Ii7d+/i1atXuHDhAhwdHbFo0SL8999/KmOZNm0ahg0bhvfv3+P69et4//49OnTogKioKIwcORJDhgzB/Pnz8e7dO9y4cQOBgYHw8PBAcHAwfv/9d63XOTY2FgcPHgQA1KtXL9PbLqcFBgbir7/+wrZt2/Dy5Utcv34db968QbNmzRAcHIz+/funSSoOHToUd+/excePH/HgwQPcuHEDHz58wP79+2FsbIxhw4YhKioqQ3G8efMGmzZtwoEDB/Dq1Stcu3YNb9++RfXq1XH+/HlUr14dQEpy9Pz589KrdevWAIBPnz6he/fuCA8PR/fu3fHu3Ttcv34dr1+/xvr166Grq4tZs2aluVLrv//+w7x586Cnp4fNmzfj9evXuH79Ot69e4dOnTrh48eP6Natm9JnT50bN25gz549cHJywoMHD/D06VNcvXoVr169QlhYGNauXQsbG5sMbZfskJSYCBmAhIQErev07NkTQ4YMwd69ezF//nz89ttv8PT0hLe3d5qyenp60NXVBQAkJyfj0KFDAIBmzZqpbDt1eXmyXl15IiIiIqK88Dk6CsnJSZABCAsLy+twiHJFphNarVu3xvjx46Gjk9KEiYkJ/vnnHxQpUgQvX77E9u3bpbLyK7TOnj2r1Iavry+sra3x3XffIS4uDpcvX1aaB/wvGSZXv359NG7cWPqSKVelShUsX74cALBly5bMrhYGDRqEXr16SX8XK1YMP/30EwBg//798Pb2RtOmTaX5rq6u0pMBUye0Fi1ahLCwMIwdOxaTJk2CoaGhNK9u3bpYs2YNAGDx4sUqY6lcuTIWLlwIAwMDAIChoSEWLFgAIOW2OE9PT6X3wMrKCjNnzlQZiyYzZ85EUFCQ9F7kV4mJKb829OzZU5pmY2ODLVu2wMjICFevXlW6PRUAunbtCldXV6VpMpkMHTp0wNixYxEZGYl///03Q3EkJSVh5syZaN++vTQtI1e2bd26Fa9evYK9vT02bNgAc3NzaZ6Xlxe+//57AMDcuXOV6s2bNw9AylVq8iuFgJRx0DZv3gxbW1sEBARg27Zt6cbw5MkTACnbp2LFikrzLCwsMGjQIDg5OamtHxcXh8jISKVXXlq6dCmqVKmCXbt2wdraGlu3bk1zjFAUFxeH3r1748SJExg9erTSZ15d+b59++LKlSsYNWpUuuWJiIjyk/x23iai7Pc5+n8/0n+JQ4cQqZLphNaIESPSTDMwMMCgQYMAAMeO/e9RoXZ2dqhQoQKCg4Px8OFDAEBoaCgePHiAhg0bSmMVKV5ZJU9+yZNhiqKiorB27Vp4eXmhRYsWaNCgAerXr4+JEycCAO7cuZPZ1VKZ0KlWrZr0/2+//TbNfPkVOc+fP1eavnfvXgCQtklqrVq1goGBAS5evIjExMQ08wcOHJhm3Kty5crBxMREbazqYlHn0KFDUqJkzZo1sLKy0qpeXlG139nZ2aFr164AlPc7uVevXmHevHno3r07mjRpgvr166N+/frYsWMHgMztL/37989wHbnjx48DAAYPHqx09aHcmDFjAAAXL15ETEwMgJSxny5dugQAGDVqVJo6JiYmGDx4sFL7msiTVadOncrULzhz586FpaWl9NKU/MoNMTEx0nrExMTg48ePasuGh4ejZcuW2LFjB6ZPn46lS5dK84QQiI2NRVxcXJryO3fuxODBg9UmoImIiPKr/HbeJqLsJ8T/HlrEBxjR10IvsxVTX9WRenrqwcUbNmwIf39/+Pr6omLFijh79iyEEPD09ETt2rVhYGAgJbQSExNx8eJF6OnpoW7dukrt3Lp1C+3atcPbt2/VxpaVSyxLly6dZlrhwoWlf+XjI6maHx0dLU2Ljo6WxiCSX8GlTmxsLEJDQ5XGWFIXCwDY2tri1atXGmNVjEWd69evo2fPnhBCYNKkSejWrVu6dVLz9vbGjBkz1M4fOHAgBg4cmGb6unXrMGDAgAwtS19fH2XKlFE5T91+t2HDBgwdOlTpdtbUMrq/2NrawtbWNkN1FMljrFSpksr5ZcuWhYGBAeLj4/Hs2TNUqVIFT58+RXJyMgwNDVGqVCmV9VxcXJTa16ROnTqoVasWrly5AicnJzRv3hwNGzaEp6cn3Nzc1D5AQG7SpEnS+FNAytMD86pzLISAl5cX3rx5g5EjR+Kvv/5Ct27dcP36dSn5K/fp0yc0bNgQDx48QKtWrVChQgVs374ddnZ28PT0xLt37+Du7g57e3sEBQUhOjoa9erVw4MHD6QHUezYsQNFihSRHqRARESU3+Wn8zYR5QyZTAdCJAGAdAcP0Zcu0wktOzs7ldPlSZnU4xJ5enrizz//hK+vL4YOHap0S6GxsTHc3d1x+fJlxMfH4+bNm4iJiUHt2rVhamoqtZGUlITu3bvj7du3aNOmDX7++We4uLjAysoKurq6ePr0KcqWLZtm/J369eunibNo0aLYtWtXmumpvwADkL7cq5qnOF9x/CbFpx5euHBBZT1FqsY9Sm95mmJNz8OHD9G6dWtER0djyJAh+PXXX7Wql1rx4sVVjrv16tUrvH79GmXLllW5r6RO3mnDxsZG7cFZ1X737NkzDB48GAkJCfjhhx/Qt29flC5dGmZmZpDJZPjrr7+k+RmhuE9mhjzZqO4zJJPJULhwYQQGBkrrI69TuHBhte+xus+eKjo6Ojhy5AhmzJiBzZs348CBAzhw4AAAoESJEvD29taYcDQ0NFS6hTYvLVq0CIcOHcLw4cMxYMAAlC1bFmPGjMHw4cPTPFkyPDwcDx48AJByW6781lxPT0+cOnUqTdshISFS+WPHjklXAHp6ejKhRUREBUZ+Om8TUc4wNjNHTGQ4AOT7u26IskumE1rBwcEoVqxYmukfPnwAAKVxgYC0A8P7+vrC0tISVatWleZfuHABV69elRJAqcfPunr1Kp4+fYoSJUpg7969aU7Mr1+/VhmrqoRSiRIl0l3HrDAzM5P+Hx8fD319/RxdXkYEBASgefPmCAkJQc+ePbF69epMt/Xtt9+qvA1TfuXW5MmTM3wlljqhoaFITk5WmdRStd/t3LkTCQkJ6NmzJxYuXJimjrr9JafJ9w15zKkJIRAcHAzgf+sjrxMcHAwhhMqklvzJlqk/e+oUKlQIS5YsweLFi3Hnzh2cPXsW+/fvx+nTpzFw4ECYmZlJt3LmZz/++CN+/PFHJCUl4fbt29KTMFVxcHBAYmKiyvG1kpKS0sx3dnaWEtXy9qtVq6ZxfC4iIiIiIiLKeZm+FlE+Fpa66eXKlVOa7ujoiFKlSklPdLt79y4aNGggJSfkyaszZ86oHT9LfgtfjRo1VP7KpG4sJCFEmpe8rZxiaWkJBwcHAMD9+/dzdFkZERQUhGbNmiEwMBDt2rXDxo0bC8wlqQkJCXj27JnKear2O/l7nPq2VbmsjLWmSXpXycljlF/5k9qTJ08QHx8PXV1d6bbSMmXKQEdHB3FxcWrHR5PvZ6k/e9rEW61aNYwePRo+Pj7SWHRr167NUDvZQVdPDwLIVwlgIiIiIqL8ztjMHDo6uhAArK2t8zocolyR6UzGqlWr0kyLj4/H33//DQBo0aJFmvnyBNXs2bORnJysdAVW3bp1oaenBx8fH5w/fx66urppbhWUP0lOfiWKooSEBCxZsiSzq5MjOnfuDAD5Jq6wsDA0b94cz549Q+PGjbFr164ClzhQtd8FBwdLt48q7nea9hd/f/8MP91QW/LlqrqNFABatmwJICVhpGpsr2XLlgEA6tWrJ93eaGZmJiXm5E/zVPT582f89ddfSu1nVu3atQFA4zh1OWXg9N+RrKOHw4cP5/qyiYiIiIgKqk7DJ+C7mUuQrKOXpTtwiAqSTCe0Dh06hKVLl0q343z+/BmDBw/G27dv4eTkhJ49e6apI09gHTx4UOlvIOULu5ubG86cOYPIyEhUq1YtzQDstWvXhp6eHi5cuICNGzdK0yMiItCnTx+ViYu89PPPP8Pa2hobNmzA+PHj0zw+NSwsDP/88w9mz56d47HExMSgbdu28PPzQ61atXDw4EGVT9jLz/T09LBq1Sqlsc/CwsLQt29fxMbGombNmmjcuLE0T54QXbVqFW7fvi1Nf/z4Mbp16wYDA4MciVM+aLviUzsV9erVC8WLF8f79+8xYMAApQH8N2/ejD/++AMApCul5H7++WcAKeuzdetWaXpUVBT69++P4OBgODs7q/zspbZlyxbMmjUrzZWKoaGhUkLNzc0t3XaIiIiIiIiI8kKmE1qzZ8/G2LFj4eDgAA8PDxQpUgQbN26EkZERNm/erHLAcvkVWkIImJubp/nC7OnpKSXIUo+fBQBFihTB2LFjAQBeXl4oUaIEatasiaJFi2L//v1YvHhxZlcnRxQrVgwHDx6Era0tFi9eDDs7O1SpUgW1a9dG6dKlYWtri++++w5+fn45HsuyZctw+fJlACnJrVatWqF+/fppXqNGjcrxWDLL0dER3333Hbp37w5nZ2e4u7ujWLFiOH78OGxsbLBx40al2/06duyI2rVr4+PHj6hZsyYqVaoEV1dXVKhQAaGhoZg6dWqOxNmjRw8AwPz581G+fHl4enqiUaNG0gDkJiYm2LlzJywtLaUn5rm7u6N48eLo168fEhMTMXXqVLRu3Vqp3Xbt2mHixIlISEhAnz59ULx4cbi7u6No0aLYvXs3ChUqhJ07d0pXiGkSHByMX375BSVLlkSxYsXg4eEBV1dXODg4wMfHB46Ojpg1a1b2bxwiIiIiIiKibJDphNaECROwZcsWODk54f79+5DJZGjfvj2uXLmSZuwruVKlSkkDyderVy/NwMqKSSx1bSxYsABLlixBhQoVEBQUhJcvX6JZs2Y4d+4cWrVqldnVyTH16tXDgwcPMGXKFFSqVAkvXrzA3bt3oaOjg1atWmHVqlVYunRpjscRFxcn/d/Pzw8XLlxQ+bp3716Ox5IVK1euxNKlS2Fubg4/Pz+YmpqiT58+uHHjBipWrKhUVk9PD8eOHcOoUaNgb2+Pp0+fIjw8HN999x1u3LgBR0fHHImxQYMG2Lp1Kzw8PBAYGIizZ8/C19cXQUFBUplatWrhzp07+P7772Fra4u7d+8iOjoaLVq0wKFDh9Qmk+bOnYt///0XzZs3R3R0NO7evQtbW1sMHToUd+7cgbu7u1YxdunSBfPnz0fz5s2hq6uLe/fu4d27d6hcuTJmz54NPz8/FC9ePFu2BxEREREREVF2y/BTDuVXUAFA79690bt37wzV1/RkubZt2yq1r4pMJsOYMWMwZsyYdOPLCE31FJ90pkqjRo00zi9cuDBmz56t9a2FZ86c0Tg/vQHtVcXi7e0Nb29vrZafHXJqeTKZDKNHj1b7FLvULCwssGzZMuk2OkUDBgxQ+QRGde9nevuBol69eqFXr14ay5QoUQJr1qzRqj1F7dq1Q7t27bQur2p/cnJywoQJEzBhwoQML1+T6YM7qX3IgLqnM6aer6uri/qedZTnQSAuNg6GRoaQQXUb6ZUpbGuHqZN/ycDaEBERfdk0nbfVSe98nl/qZaVufHx8poam4LbJ/uVx22iuB6GDUmWUf9QvzAHh6SuS4YQWEZE6Q37uBiPjtE8gzQ/2/6N6TDMiIqKvVX4+bxNR+vb/44szJ47ldRhEeSbTtxwSERERERERERHlBSa0iIiyQdOmTWFvb4/atWujRIkSGDVqlNLYdakJIbBw4UKULVsWBgYGsLW1xS+/8JZIIiIiIiIibfCWQyKibFClShV0794db968we7du7FixQpUqFABI0aMUFl+6tSp+PXXX+Hh4YGffvoJMTExSg8OICIiIiIiIvV4hRble/LB2NMbDJ9IlYuHHuDY5hsw1DXJ0BNFt2/fDplMhq5duwIApkyZgpo1a6q9imrx4sXo3LkzatasKT0hUt0AnzExMfj9999hZmaGY8eOoW/fvhg3bhymTJmSwbUjIiIioq+NYv922LBheR0OUZ7hFVpE9EWL+5wAkZzy9Jjo6Git6/Xs2ROnT5/Gn3/+iZEjR2L16tVwc3PD9OnT1dapWLEiQkNDAQB9+vTBoEGDVJZ78OABYmNjYWNjg8qVKyMwMBDFihXD3LlzM7ZyRERERPTVUezfhoWF5XU4RHmGV2gR0RctPjZR+n9UVFSG6i5duhRVqlTBypUrYW1tjTlz5kBXV1dt+V27dmHu3LmoWbMmtm/fjn///VdlOXkboaGhGDRoEDZu3IiQkBAMHjw4Q/ERERER0ddHsX8bHh6ed4EQ5TEmtIjoiyaEUPl/bcTExEi/esXExCAyMlJj+YYNG6J58+b4+eefkZSUhPXr10vLjY2NlQaJL1WqFHR0Ug6/EydORL9+/eDi4oLY2NgMxUdEREREXx/FPm1ycnIeRkKUt5jQIqIvmuI4VurGtFJFCAEvLy+8efMG8+bNgxACEydOxKdPn9KUPXr0KPr3748///wTu3fvlm5LrFq1KgDg5cuXMDY2RqlSpQAAVlZW6NOnDwBgwoQJWLx4Me7evYuiRYtmej2JiIiI6Oug2KeV/0hK9DXiGFpE9EUzMNJD3KcEAIC5ubnW9RYtWoRDhw5hxIgR+Pnnn2FsbIwxY8Zg5MiR2LBhg1JZW1tb3Lt3D/v27UNCQgKKFSuGiRMnahxva/ny5ZDJZNi4cSOEEGjUqBG8vb1Rr169zK0oEREREX0VFPu3VlZWeRsMUR5iQouISIUff/wRP/74o/T3iBEjUK9ePVSrVi1N2Zo1a+LWrVtISkrC7du3Ua1aNaWxtuRP6pTPBwBLS8s0ibH0bmkkIiIiIiKiFLw+kYi+aIbG+pDpyCCEgJmZWV6HQ0RERESUJYr9W2tr67wOhyjPMKFFRF+0um0roWXfGohL+oQxY8bkdThERERERFmi2L9dvXp1XodDlGeY0CIiIiIiIiIiogKFCS0iIiIiIiIiIipQmNAiIiIiIiIiIqIChU85JKJs8++G8zAw0E8zXUAgLjYOhkaGkEGW7fO1KWNna5+JNSIiIvpyqTtvq6PN+Tg/1MtK3eTkZDx5+gRly5SFjo72v/1z22T/8rht0q/nVKy41nWIvkRMaBFRttm7az+KFSuWZnpSUhJu376NatWqQVdXN9vnZ6QNIiIiSqHuvK2ONufj/FAvK3UjIyNhaWmJZ49OwMLCIseXx22Tf+plpW5ebhuirxlvOSQiIiIiIiIiogKFCS0iIiIiIiIiIipQmNAiIiIiIiIiIqIChQktIiIiIiIiIiIqUJjQIiIiIiIiIiKiAoUJLSIiIiIiIiIiKlCY0CIiIiIiIiIiogKFCS0iIiIiIiIiIipQmNAiIiIiIiIiIqIChQktIiIiIiIiIiIqUJjQIiIiIiIiIiKiAkUvrwMgoi/HwM4dYWBgkGa6gEBcbBwMjQwhgyzd+VZ29tiyd19uhExERPTVUnfeVie983l+qZeVusnJSShd2Bo9WjWHjo5uji+voG8b9tmIKC8xoUVE2ebPDo1hbmSY5Xa89vlkQzRERESkSXadt788zfM6gHxMeduwz0ZEeYm3HBIRERERERERUYHChBYRfbU6dOgAmUwGmUyG2NhYlWXOnDkDmUwGPT091KxZE3p6epDJZHB2ds7dYImIiIiIiEjCWw6J6Ku0du1anDp1Kt1ylSpVwrZt25CcnIyAgADcuXMHO3fuRK1atXIhSiIiIiIiIlKFV2gRUb4x6fxdDPO5gVgDI/To0QPDhg3Tqt727duhp6eHCRMmAAAmT54MmUyGadOmqSz/9OlTjBs3DosXL063bTs7O/Ts2RM9evRAixYtcPfuXQDAjz/+qOVaEREREeVP8r7XpPN38zoUlZYuXYrevXtr3Sckoq8LE1pElG+ExycgLDYeABASEoKwsDCt6vXs2RODBw+Gj48PRo8ejfnz58PT0xPe3t5pyiYlJaFv375o1qwZBg8enKH4zp07B39/f3h6esLd3T1DdYmIiIjyG3nfKzw+Ia9DUSk6OjpDfUIi+rrwlkMiyjci4pQ7U+Hh4VrXXbx4Mc6cOYNVq1bB1tYWW7duha5u2sdtr1ixAvfv38eSJUvw9OlTafrz58+RkKC5M7d582YAwE8//aR1XERERET5lbzv9TE2HsN8bmS4vvyq+vQkJCRAX18/w+1HRkYCyFifkIi+HkxoEVG+kSxEyn9kspS/k5O1rhsTEyN1emJiYvDx40c4ODikKffy5UtER0ejTp06StOrVKmC7du3o2bNmoiNjYVMJoOh4f8eZX7jxg3cvHkTFStWRJs2bTK6akRERET5jrzvJQDpKvkMkckQEhKSvUGpkJE+IRF9PZjQIqJ8Q0cmQ5IQgBCATAYdHe3uihZCYODAgXj//j1+/fVXzJw5E926dcP169dhYmKiVNbLywsNGjSQ/u7WrRuAlKuvihQpgpcvX6JMmTKwt7dHUFCQVO73338HAIwfPx6y/0+4ERERERVk8r6XDEAhI4MM1w/7HAfbwoXTLZfZK7RCQ0MhhNC6T0hEXxcmtIgo37A01Ff6ddDKykqreosWLcLhw4fRrVs3TJgwAebm5hg1ahSGDx+O9evXK5WtWrUq3Nzc0rTRsWNH+Pv7q2z/1atX2LNnD2xsbNC7d2+t14eIiIgoP5P3vQoZGWB1kxoZru+1zwc7duzQWCYpKQm3b99GtWrVVA4Hoalet27dEBERoXWfkIi+LkxoEVG+YWWQ8std2Oc42NrawtraWqt6P/74I8aNG4fbt28DAEaOHImRI0dqVVf8/6X2SUlJAABnZ2dpmlzx4sURGxuL27dvK92GSERERFSQyfte8n/zGzMzM+jr62vdJySirwsTWkSUb8ytXwWAdr/2EREREVHWyPte+dWYMWMyfGUXEX09eDMyEREREREREREVKExoERERERERERFRgcKEFhERERERERERFShMaBEVMOvXr4dMJsOAAQMyVC8gIAAymQzOzs45EhcRERERERFRbuGg8F+Aq1evYsOGDfD19UVgYCCio6NhaWmJcuXKoX79+ujRowdq1Ej7GN4BAwZgw4YN6bbv5eWF9evXq6zn5uaGGzduqK179+5dVK1aVfr79OnTaNSokfYrl4MaNWoEX1/fDNdL/QS8UaNGYcWKFQCA48ePo3nz5mrrrl+/HgMHDlSaZmBgAEtLS9jb28PNzQ3NmzdH165dYWRklOHYMmvJkiUIDw/H2LFjs/RY5GbrDkBHV9VhRUAIAZlMBkCW7nwdPV00at5SqURcbBwMjVQ/YbCwtTW2b92c6biJiIi+RurP2+qkdz7PL/Wytsz4hHgY6BtkuN7XuG1U9dlU0dSPy4t6ha2tsWvHtgy3S0T5CxNaBdinT58waNAgbNuWcjDW19dH6dKlYWFhgbCwMFy9ehWXLl3Cb7/9htatW+Pw4cMq27Gzs0PZsmXVLqdcuXJq5928eRMPHjxApUqVVM7ftGlTBtYod7m6uiIxMTHN9AsXLgAAKleuDEtLS41tJCQkYPv27dLfmzZt0pjQkjM0NETNmjUBpCTIIiIiEBAQAD8/P2zcuBHjx4/H6tWr0aVLl4yskkb6+vooX748HB0d08xbsmQJXr58iQEDBmQpoTVlzWaYmJplIcrMWfPLuFxfJhERUUGXV+dtorzGviPRl4EJrQIqISEBLVu2xPnz51G0aFHMmTMH3bt3h6mpqVQmPDwcBw4cwIIFC+Dj46O2rdatWytdgaWt8uXL49GjR9i0aRPmzp2bZn5ycjK2bt0Kc3NzmJub4+3btxlehioBAQEoWbIkPD09cebMmUy3s3z5cpXTU36tSpmf3tVkR48eRUhICKysrBAeHo69e/di9erVSu+DKkWKFMH58+eVpiUlJeHq1auYN28eDh48iK5du2LNmjX4/vvvtV8pDRwdHeHv758tbRERERERERHlJY6hVUB5e3vj/PnzcHBwwJUrVzBw4MA0SRQrKyt4eXnhzp07mDZtWrbH0KlTJ5iammLr1q1pbsMDAB8fH7x9+xZdunSBsbFxti8/P5BfgTZixAi4uLggJiYG+/bty1Rburq6qFOnDg4cOIDJkycDSLmd8cmTJ9kWL2VO06ZNYW9vj9q1a6NEiRIYNWoU4uLi1JZfv349XFxcYGxsjEKFCqFZs2a4e/duLkZMRERERET0ZWNCqwAKDw/HsmXLAADLli2Dk5OTxvJ6enqYMmVKtsdhamqKjh074tWrVyrHopIne/r27Zvty84PIiIi8O+//wIAevfujd69ewPIntssZ82aherVqyMhIQGLFi1SWy4qKgrjx4+Hs7MzjIyMUKpUKUyZMgWfPn1KU1bVoPDyAeZfvnwJAChZsiRkMpn0ysoVcF+SKlWqYM6cOZg4cSLMzc2xYsUK/PXXXyrLvnnzBoMGDcKrV68wd+5cdOrUCadOncLQoUNzOWoiIiIiIqIvFxNaBdDhw4cRHR2NIkWKoGPHjnkaS79+/QAAmzcrD8j96dMn7Nu3D46OjmjcuHFehJbjdu7cidjYWFStWhWVKlVC7969IZPJcOrUKbx79y5Lbevo6GDIkCEAgEOHDqksExcXB09PTyxZsgRmZmYoW7YsAgIC8Ouvv6Jp06Yqk1qp2dvbo169ejA0TBk0s2bNmqhXr570Sm8Msdyyb9UCbF0wDftWLch0GyNGjMCcOXMwYsQIbN++HTKZDF27dgUATJ48GXp6eli9erXKuosXL0bnzp1Rs2ZNFC9eHMD/bk1NTT7IqoWFBZo1a4a6desCAKytrTMdOxERERFlj32rFkAnOREtW7bEsGHD8jocIsoCJrQKoIsXLwIA6tSpA11d3TyNpVmzZihSpAh2796N2NhYafr+/fsRFRWFPn36QEfny9zN5Fdi9enTBwDg7OyMunXrIikpCVu3bs1y+/Xr1weQcsVPUFBQmvm7d+/Ghw8fcOvWLfj5+eHevXu4e/cunJyccPnyZUyfPj3dZbRu3Rrnz59HkSJFAAC7du3C+fPnpVf16tWzvB7Z4XN0FGIiw/E5OirTbXz8+BERERH4+PEjevbsiSFDhmDPnj0YOXIk5s+fj4YNG0pJRFUqVqyIjh074vjx4+jTpw8GDRqkspyTkxNWr16N4OBguLq6YvDgwXB1dcW6desyHTsRERERZY/P0VGQAUhMTERYWFheh0NEWcBB4QugwMBAAFC6dSwrNmzYgA0bNqidv2/fPrVXgunq6qJXr15YvHgxDh48iO7duwP48m83DAgIwPnz5yGTydCzZ09peu/evXHhwgVs2rQJP/zwQ5aWoXgr6YcPH6Skk1xiYiKWL1+OqlWrStMqV66MlStXon379li9ejV++eUXmJubZykOVeLi4pTGkIqMjMz2ZSiSJ7I+RUVg64K048HpJCeid+/eSEhIgL6+vso25B2W8PBwAMDSpUtx+fJlrFy5Era2tti8eTM+fPigNoZdu3bhypUr2LNnD7Zv345OnTqpfAplREQE5s+fD3Nzc6xcuRL37t3Dr7/+iqFDh2Lnzp0ZXXUiIqIsy+3zNlF+pvgDqbxfSEQF05d56cwXLioq5SCs7kl68tupUr/UPcnQzs5O6Taz1C8bGxuN8aS+7fD9+/c4efIkqlatCldX10yuZf62efNmCCHQoEEDpcRT9+7doa+vjzt37uDevXtZWobi+/t/7N17fM71/8fxx2fnGdvMmLOhKWeVU5ERCZ1QzNchpNRYipyFKeWQY3Lo5JxD5Vh8U7+E0IEyRDmViSIzjLHz5/fHvrsy13Vt19jp4nm/3XbbdX3ep9fnctnn2mvv9/uT8W9+rXLlyvHEE09YHX/00UepWLEi8fHx7Nix46ZisGfChAn4+flZvrLbx+1mmWba/76bxMddsPoygJiYGC5evEhMTIzNr7S09D4yvsfHx1uSXPHx8Zw/fz7LGJo1a8ZDDz3EsGHDSE1Ntfx/Mk2ThIQEyy8Ku3bt4o8//qBp06Z06dKFV199FYD169fbvHmCiIhIXsvv67ZIYZbxuRL+/VwoIs5JM7ScUMaMm/j4eJvlJUuWpEmTJpbnv/zyCxcvXrTbX9u2be0muxxx9913U7NmTb744gtiYmJYvnw5KSkpNz076/jx41SuXNlu+datW23uYxQaGprnm5lnJO8yNoLPEBgYSOvWrdmwYQNLlixh8uQb3/Pp8uXLlse+vr5W5XfeeafN5ZyGYXDnnXdy4sQJDh8+TJs2bW44BntGjBjBoEGDLM/j4uLy9MOxYbhgmqkYhkGRYtb7el2Ou0DJwMBsZ2ilpaXh4uKCaZr07NmTkydPMnHiRCIjI+nSpQvvv/++VbsvvviCZcuWcd9993HixAnWr18PYJkZFx0dTeXKlQkKCuLUqVNUrFgRwzD45ptveOeddzhw4ACQPnvO3r5bIiIieSm/r9sihVnG50rglt0aReR2oYSWEypXrhyQnvCxpWXLlrRs2dLyvFWrVnz99dd5GlP37t0ZMWIEK1euZOnSpbi4uFgle3LKy8srU2IuQ2JiIrt378bX19fmDLC8nhX2448/cujQIdzd3enUqZNVebdu3diwYQPLli1j4sSJN3yhPHHihOVxqVKlrMptHcsQFBQE2J7ZlRs8PT0tG8nnB++ixYiPu0CRYn50Hfq6Vfm8MQNZtmwZUVFR1KtXz+becmFhYcTExODv78/UqVPZsGED/fv3Z9iwYfj4+PDiiy8yceJE1q5dm6ldYGAg+/fvZ82aNSQnJ1O+fHmGDx9ud4+yatWq8f777zN9+nSGDh2Kl5cXbdu2Zdq0abnyWoiIiORUfl+3RQqzjM+VAP7+/gUai4jcHCW0nNB9993H7Nmz2blzJ6mpqQW+MTykJ3FGjhzJ5MmTOXHiBA899BBly5a9qT5Lly7N9u3brY5nzNy6++6783wmli2LFy8GIDk5OcvlmKdOnWLz5s20atXqhsbJOPeKFStaElTXOnv2rN22GXtB5cX+WQXBu2ixTN9vRPHixUlOTqZ48eIMHjyYwYMHW8oiIiIIDw8nKirKql39+vXZs2cPqampNhNmwcHBlqWEqanpf+3r1asXffr0seoro1xERERECoZ30WJcjruAu5ub7kIt4uSU0HJC7dq1o2jRopw5c4Y1a9bw1FNPFXRIVKhQIdNSv1t1M/jk5GRWrlwJQIkSJXBzs/1fKD4+nsuXL7NkyZIbSmilpaXx3nvvAfDII4/YrHPo0CHLErprmabJoUOHgPTZQo4o7EvhOvQbetN9zJ4925KQEhEREZHbU4d+Q5k3ZiCbNm0q6FBE5CZp0bATKl68OBEREQC89NJLmZamFaQBAwbQsmVLWrduTceOHQs6nDzx3//+l5iYGHx8fDh+/DinT5+2+bVq1SoAVq9ezZUrV3I8zujRo9m7dy/u7u5275Z48uRJPvvsM6vjGzZsIDo6Gh8fH5tLNm3x9vYG4OrVqzmOVURERERERCS/KaHlpMaNG8d9993HX3/9RaNGjZg/f36mTcQhfTbRp59+apmtk9c6dOjA//3f/7Fp0yaKFi2aL2PmtyVLlgDp55rVObZs2ZIyZcpw+fJl1qxZ41DfaWlpfPfddzzxxBO8+eabAMydO5eqVavarO/m5saLL76Y6W6KBw8etCQ7X3jhBYeXHFapUgVI32hfREREREREpLDTkkMn5eHhwVdffcUzzzzDxx9/TJ8+fXjhhReoWrUqvr6+nDt3jr///tsyO6h169a0aNHCZl///e9/adq0qd2xQkJCWLBgQZ6chzO5cOGCZUZUjx49sqzr6upKly5dmD59OkuWLKFbt26Zyk+fPm15zU3TJC4ujujoaMsm7iVLluTdd9+lQ4cOdsd46qmnOHToEHXr1qVmzZoYhsEvv/yCaZo0aNCAcePGOXxuYWFhbNiwgfDwcGbPnm3ZG2zGjBlaoiciIiIiIiKFjhJaTszHx4eVK1cyaNAgFi5cyLZt2zh16hRHjx7Fz8+P2rVr07RpU7p27co999xjt59//vnHsom4LdfP/LpdffLJJyQmJlK6dOlMd5G0p3v37kyfPp3/+7//4/Tp05QuXdpSlpiYyI4dOwBwd3fHz8+PSpUqcc899/DQQw/RqVOnbO9G5OnpydatWxkzZgyrV6/m9OnTVKxYkf/85z+8+uqr+Pj4OHxuPXr04Pz583z44YccOXKEX375BUhP4omIiIiIiIgUNkpo3QIaNWpEo0aNctxu4cKFLFy4MF/aHT16NMfj2HPtXeXygr2+n3vuOZ577jmH+7nnnnus+urVqxe9evW6mfCs+pg+fTrTp0/Ptl12r9uAAQMYMGDATcU29rkOVpvUZzBNM8vN52+m3NXVlWYPNiExIRFPL08M0uuVKhnE6k/XOn4CIiIit5Gsrtv2ZHe9LiztbqZtUlISHh4e+TaeXpv8b+fumvNzEJHCRwktEck1fYd1wss765ll+Wnd/G0FHYKIiEihVdiu2yL5RZ8RRW4N2hReREREREREREScihJaIiI3oWXLlgQGBuLh4UGlSpWYPHkyiYmJ2bZ74oknMAwDwzBISEjIh0hFRERERERuHUpoiYjchDp16jBhwgTmzJlDsWLF+Pjjj/nwww+zbPPBBx/w9ddf51OEIiIiIiIitx4ltETklrBzw0G++XQvOzcczLZueHg4YWFhhIeHW5WtXLkSwzB46qmnABg5ciSGYTBmzBibfU2fPp0nn3ySBx98kIoVKwJkuQnpn3/+ySuvvOLQRv4iIiIikru+/OhnPFy9adeuXUGHIiI3SQktEbklJF5NJvFKMolXk7OtGxsbS0xMDLGxsVZlYWFh9O3bl1WrVhEREcGkSZMIDQ1l7NixdvurVq0aVatW5csvv6Rt27b06dPHZr3U1FRGjx5Ny5Ytc3THTBERERHJHWlpaRiGQXJy9p8ZRaRw010OReSWkJSQAqQntr75dC8AHq5ehIWFWeokJyfj7u5uSWRduHDBZl8zZ87k+++/Z/bs2QQGBrJs2TJcXV3tjr169WpOnz7NW2+9xZdffsnnn39Op06drOq98847/P7778ybN4+jR49ajv/+++/ccccdOT5nERERERGR25USWiJySzBN838PIPFK+l/cDMOFmJgYu23S0tJsHo+Pj7ckveLj4zl//jxBQUF2+2nWrBkALi4udOrUiUWLFtGpUydM0yQxMRHDMPD09CQ6OporV67QtGnTTO1r1qzJ/v37LUsWRUREREREJGtKaInILcEwjPSklgGe3u4AJMQnUrJkKUuda2dopaWl4eJiveraNE169uzJyZMnmThxIpGRkXTq1IkffvjBqu4XX3zBsmXLaNKkCaZpMmvWLCB9o3iA6OhoKleuTFBQEKdPn6Znz56ULVuWypUrW5JfAMuWLVMyS0REREREJAeU0BKRW4KHlxuJV5Lx9HanxVN1AVg3fxsrV64E0vevioqKol69enTt2pWYmBj8/f2t+pk2bRobNmygf//+DBs2DB8fH1588UUiIiIYMGBAprqBgYHs37+fNWvWkJKSQrly5ejVq5fdDeTr1q2LaZrUq1cv0xLGDh064OXlRVxcXC69GiIiIiIiIrc2JbRE5JaQMSsr43tWAgICMn2/1iuvvMLQoUMtzyMiIoiIiLAkxK5Vv3599uzZY3meUcfdPT2G4ODgf5dC2pBVmYiIiIjkPhcXF1JTUi2f10TEeSmhJSK3hPsfqeFw3blz5+ZhJCIiIiJSWLXudg/r5m9j88bNBR2KiNwk6w1kRERERERERERECjEltERERERERERExKkooSUiIiIiIiIiIk5FCS0REREREREREXEq2hReRHLNZ4u24+FhfccYE5PEhEQ8vTwxMHK93F6dUiWDbvKMREREbl32rtv2OHI9LgztbqZtWloaR44eIeSOEFxcHP/bv16b3B8vL9vpM6LIrUEJLRHJNas/WUv58uWtjqemphIVFUW9evVwdXXN9XJH64iIiMi/7F237bnRa21+t7uZtnFxcfj5+XHs0Ff4+vrm+Xh6bQpPOxFxPlpyKCIiIiIiIiIiTkUJLRERERERERERcSpKaImIiIiIiIiIiFNRQktERERERERERJyKEloiIiIiIiIiIuJUlNASERERERERERGnooSWiIiIiIiIiIg4FSW0RERERERERETEqSihJSIiIiIiIiIiTkUJLRERERERERERcSpuBR2AiNw6endsj4eHh9VxE5PEhEQ8vTwxMBwq9y8VxEer1+R5zCIiIrcre9dte7K7nheWdjfTNi0tlaolAwhr8xAuLq65Mp4+04iI5A0ltEQk17z3RAuKeXnmSl8912zOlX5ERETEtty8bt9aHsrV3vSZRkQkb2jJoYiIiIiIiIiIOBUltERERERERERExKkooSUit7UnnngCwzBwc3MjMTHRbr3vvvuOZ599Fn9/f0qVKsXAgQNJSkrKx0hFREREREQkg/bQEpHb1vvvv8/XX3+dbb0zZ87w6KOPkpKSwoQJE9i2bRszZszA19eXcePG5UOkIiIiIiIici3N0BKRQqfHFz+Q4OFFu3btHG6zcuVK6tevT+fOnQEYOXIkhmEwevRom/WPHj3KwIEDmT59erZ979y5k4sXL1K/fn369evH66+/DsA777zjcHwiIiJy+7mRzzQiIuIYJbREpNBJTksDwyA5OdnhNmFhYXTo0IHVq1cTERHBpEmTCA0NJTIy0qpuamoq3bt3p1WrVjz33HPZ9l2mTBkgPQl25MgRNm7cCEBsbCyxsbEOxygiIiK3lxv5TCMiIo7RkkMRuWUMHjyYY8eOMXv2bAIDA1m2bBmurq5W9WbNmsWBAweYMWMGR48etRw/deoUSUlJeHt7Z6rfuHFj+vXrx5w5c6hevTpFihTB3d2d5ORkTNPM8/MSERERERGRzJTQEpFbxtWrVy0zpuLj4zl//jxly5a1qnf8+HEuX77Mfffdl+l4586diYqKok6dOiQmJmIYBp6engC8/fbbtGvXDl9fX3x9fbn77rsJDg6mRIkSeX9iIiIiIiIikomWHIrILcE0TSIjIzl58iQTJ07ENE06derElStXrOr27t2bTz75xPKVYfz48VSsWJHo6Gi8vb2pVKmSpWz06NHs3LmTvXv30q1bN0zTtLs/l4iIiIiIiOQtzdASkVvCtGnT2L59O/369WPYsGH4+Pjw4osv0q9fPxYuXJipbt26dalbt65VHy1atMDX15eLFy9alUVHR7Nu3TqSkpKoVq0aixYt4umnn86r0xEREREREZEsKKElIoWOu4sLSampuLu7O9zmlVdeoWXLltSrVw+AiIgIIiIiHGprmiapqalERUUBEBwcbLU31uLFi4mKiqJevXo29+USERERud6NfKYRERHHaMmhiBQ6S9o0wispwXI3QRERERFnpM80IiJ5RwktERERERERERFxKkpoiYiIiIiIiIiIU1FCS0REREREREREnEq+bgpvGAaA1WbLIoXJwoUL6d27Nz179rS6O54zCg4OJjo6mj/++IPg4OA8HavVgnW4uNr6sWJimub/fgYYDpW7uLnS/KGHLTUSExLx9PLMcvys6gQGFGfE0CGOnYiIiMhtwP51257srueFpd3NjZmUnISHu0eO25mmiZmSzF1lgzKV+JcKstNGRERuhu5yKJLLZsyYwYULF3j55Zfx9/cv6HDy1ah5SyniU7Sgw7Bp3piBBR2CiIhIoVKYr9vOat6YgWz4alNBhyEiclvQkkOR6/j5+XHnnXdSpkyZG2o/Y8YMxo0bx4ULF3I3MBEREREREREBlNCSPNKrVy8Mw2DLli0FHUqOdejQgd9++40JEyYUdCgiIiIiIiIiYoMSWiIiuWjQoEG4ublhGAYJCQl263333Xc88MADFCtWjFKlSjFw4ECSkpLyMVIRERERERHnVWAJrWXLltGwYUOKFi1KQEAA7du355dffrGqV7duXQzDYN++fZmOnzlzBsMwMAyD0aNHW7Vr3ry51Qyh06dPM2vWLB5++GGCg4Px8vKiePHihIaGsmTJkhs6j4wYANasWcP9999P0aJFCQoKomfPnpw+fdpSd8GCBdx77734+PhQqlQpXnjhBS5evGi375MnTzJgwACqVauGt7c3/v7+tGjRgk8//dRm/WvPed++fTzxxBMEBgbi6+tLq1at2L17t6Xut99+S5s2bQgICKBYsWI88sgj/Pbbbzf0GuS1LVu2YBgGzZs3Jzk5mXHjxlGtWjW8vLwoV64c/fv3JzY21mbb77//nqFDh1K/fn1KlSqFp6cnFSpUoEePHhw4cMBmm4ULF2IYBr169bIbR0pKCpMnT6Z27doUKVKE4OBgS7vo6GgAKleubHl/2JqtduDAAXr06EH58uXx8PAgKCiIJ598ku+//97ua2GaJkuXLiU0NBR/f3+8vb256667GDZsmN3XwJ74+Hhee+016tSpg4+PD15eXlSoUIHmzZszceJEkpOTc9SfwAcffMCuXbuyrXfmzBnatm3Lvn37mDhxIqGhocyYMYMpU6bkQ5QiIiIiIiLOr0ASWpMnT6Zbt278+eefVK9enZSUFNatW0fDhg3Zvn17prrNmjUDYOvWrZmOX/v8+rLExER++OEHPD09ady4seX4Bx98wIABA/j2229xc3Ojdu3a+Pr6sm3bNp5++mnCw8Nv+JxmzZpFx44d+fPPP7njjju4ePEiixcvpmXLliQkJPDSSy/xzDPPcOHCBSpXrsz58+d59913eeKJJ2ze9XHr1q3UqlWLWbNmcfLkSUJCQvD19WXLli106tSJwYMH243lhx9+oHHjxmzbto3g4GBcXFz4+uuvefDBBzlw4ACffPIJDz74IHv27KFy5cqkpaWxceNGmjVrxpkzZ274NchrpmnSoUMHIiMjAahevTr//PMPc+bMoVGjRvzzzz9Wbbp3785bb73F8ePHCQoKonr16ly6dImlS5fSoEGDG1oSaZom7du3Z9iwYVy9epUaNWpYkphNmjTB0zP9Lnv169enSZMmli8/Pz9LH+vXr+fee+9l6dKlxMfHU7duXUzTZPXq1TRp0oT333/f5rjdu3enR48ebNu2jRIlSlCjRg3++OMPJk+ezD333MPvv//u0DmkpKTQqlUrxo4dy4EDB6hQoQK1a9cmLS2Nb7/9lhEjRhAfH5/j16awWTNnMssmj2bNnMm4pKXwxhtv0L9/f4farlixAsMweOqppwAYNWoU9evXZ8yYMTbrHz16lFdeeYVBgwZl2/d3333HxYsXadGiBf379+f1118H4L333nPwzERERKSwWTBuEC5pKbRr166gQxERuS0USELr1VdfZerUqZw6dYpdu3Zx+vRpunXrxtWrV+nevTtXr1611A0NDQXsJ7TKlSvHjz/+mGlpT8bzhg0b4uXlZTnevHlzNm/ezKVLlzh69Ci7du0iOjqavXv3Ur16debNm2c1jqNGjBjBsmXL+PPPP4mKiuLo0aPccccdHDx4kP/85z8sWrSI//u//+PYsWP88ssv/PzzzwQEBLB161a++OKLTH399ddfdOzYkbi4ON58803Onz/Pvn37OHHiBDt27KBcuXJMnTqVzz//3GYso0ePJjw8nDNnzrB7927OnDnDE088waVLl4iIiKBv375MmjSJv//+m59++olTp07RsGFDzp49y7Rp027o/PPDzp07+fbbb9m8eTOHDx9mz549HDt2jLp163L06FGbiYoxY8Zw7NgxYmJi2L9/P1FRUcTExPDBBx+QnJxMnz59SEtLy1EcO3bsYNeuXezcuZOjR4+ye/dudu/eTdu2bdm+fTulS5cG4JNPPmH79u2Wr7vvvhtI//ft0aMHiYmJvPTSS5w5c8by/+CNN94gLS2N/v37W81KnD17NsuWLaNYsWJ8+eWXHDt2jJ9++ono6GiaNGlCdHQ0Xbt2degc1q1bx/fff0/dunWJjo7mt99+Y9euXZw6dYrTp08zY8YMPDw8cvS6FEZXL18iPu4CVy9fAuDixYucP3/eobZdunShb9++rFq1ioiICN566y3uuecexo4da1U3NTWV7t2707JlSzp06JBt3xnvkX379nHkyBE2btwI4HBsIiIiUvikpqRggGa5i4jkkwJJaLVt25ZBgwbh4pI+fJEiRZg/fz6lS5cmOjqaFStWWOpmzNDatm1bpj62bt1KQEAAffr0ITExMdMyrYykVEYyLEPTpk1p0aIFrq6umY7XqVOHWbNmAfDRRx/d0Dk9++yz/Oc//7E8L1++PEOGDAFg7dq1REZG0rJlS0t57dq16du3L4BVQmvq1KnExsby8ssvM2LECMuMH4D777+fefPmATB9+nSbsdSqVYspU6ZYEhKenp5MnjwZSF82Fxoamun19/f357XXXrMZS2GSkpJCZGQkLVq0sByrWLEiixcvBmDVqlVWM5SefvppqlSpkumYm5sbffr0oUuXLvz+++9ZLvGzJTU1lblz53LfffdZjl2bOM3OnDlziIuLo169epkSRy4uLowcOZJ27dqRnJycafmZaZqWf8PXXnuNhx56yFJWunRpVq5ciYeHBz/88AObN2/ONoYjR44A8Mwzz1C+fPlMZSVLluSll16iSJEidtsnJiYSFxeX6aswykhkXbn079LenNx9cubMmdSpU4fZs2cTEBDAG2+8YfXzA9JnaB44cIChQ4fy559/Wo7//vvvNvfFaty4Mf379+ePP/6gWrVqjB49Gnd39xycmYiIiOOc5botIiKSEwWS0LI1k8bDw4Nnn30WgE2bNlmOlypVirvuuouzZ8/y66+/AnDu3DkOHjxIs2bNaN68OZB5BldG8isjGXatS5cu8f7779OzZ09at27NAw88QNOmTRk+fDgAe/fuvaFz6tOnj9WxevXqWR4/88wzVuUZM3auT8KsXr0awPJ6XK9NmzZ4eHiwc+dOUlJSrMp79+5t2dcrQ7Vq1SwJClux2oulMLn2PXKtOnXq0LRpU0zT5Msvv7Qq/+233xg7diwdO3akefPmNG3alKZNm1reMzn9N/fz8+OJJ564sZMAS4wRERE2y1966aVM9QB+/fVX/vzzT7y8vHjuuees2pQrV44nn3zSqp09FSpUAGDDhg1cuXIlZycATJgwAT8/P8tXRn+FjWmm/e+7Scb/iJzMyIuPj7fsTRYfH2/3F4Djx49z+fJlmjZtmmmGVs2aNTl8+DCmaZKQkEBiYqKl7J133rHMusz4v1yxYsUcnqGIiEj2nOW6LSIikhNuBTFo9erVszx++PDhTMebNWvGb7/9xtatW6levTrbtm3DNE1CQ0Np3LgxHh4eluRESkoKO3fuxM3Njfvvvz9TP3v27OHRRx/lr7/+shtbTjfWzlC1alWrYyVLlrR89/X1tVt++fJly7HLly9z/PhxAMsMLnsSEhI4d+4cQUFB2cYCEBgYyIkTJ7KM9dpYHNGrVy8WLVpkt/za2VTX+uabbyzJSEeVL1+eYsWK2SyrXr0627dvt3rvTJgwgVdffTXLJEZO/81DQkJsztJxVEaMNWrUsFles2ZNIH3j8Li4OHx9fS1tKlasiI+PT5btrn8NbGnfvj3BwcF8+eWXlC1bljZt2vDAAw/QvHlzSz9ZGTFiRKa9ouLi4grlh2PDcME0UzEMg7T/JbUyZiZmxzRNevbsycmTJ5k4cSKRkZEMHz6ctm3bWr0Pe/fuTdOmTUlLS+OPP/6wJMiXLVtGxYoViY6OpnLlygQFBbFhwwYgfel1xYoVSUlJYc6cOZimydChQ+0mOkVERG6Us1y3RUREcqJAElqlSpWyeTwjMXPp0qVMx0NDQ3nvvffYunUrL7zwQqYlhd7e3jRo0IDvv/+epKQkfv75Z+Lj42ncuHGmX/xTU1Pp3Lkzf/31F+3atWPYsGHUrFkTf39/XF1dOXr0KCEhITe85t3W8qyMWVL2lm5llF+7Kfy1dz3csWNHtuNeu99YVrFkF8/1M7ocVa1aNZo0aWJ1/MiRI/zzzz/UqlUr02boGWwdy4699w3Yfu9s27aNkSNH4urqyoQJE3j88cepVKkSRYoUwTAMXn31Vd54440c/5vbSyg5KiNpmN3/A0g/H19f32zbXNvu+v8/tvj4+PDtt98yZswYPv30U1auXMnKlSuB9ETbpEmTePTRR+229/T0zLQUtrDyLlqM+LgLFCnmx+W4C0D6EltHTJ06lQ0bNtC/f3+GDRuGt7c3L730EhEREVZJ3Lp161K3bl1SU1OJioqyHO/QoQNeXl42k6bHjx9n1qxZXL16lWrVqrFo0SLat2+vhJaIiOQ6Z7lui4iI5ESBJLTOnj1rtW8PYLlL3fWzH67fGH7r1q34+flRt25dS/mOHTv48ccfLUmg6/fP+vHHHzl69CiVKlVi9erVVhf1a/e9KUhFixa1PE5KSir0++qMHDmSkSNHWh3PmLk1a9asHM/Esufs2bN2y2y9dzL2QxsyZIhlxsy1CurfvGjRoly8eJF//vnH5my5a+80mXE+Ge8LW3dyvL6dvVls1ytfvjzz58/nvffe46effmLLli18+umn7N69m/bt27Njxw4aNWrk8HkVRt5Fi1m+X467gJ+fH8WLF3eo7eDBgzPdTbR///40adIk01Jie1JSUjLN4gsODsY0zUwJr6VLl1q1054mIiIizsvVzY3k5ORC//ldRORWUSB7aGXshWXveLVq1TIdL1euHFWqVOHvv/9m9+7d7Nu3jwceeMCydCgjebVlyxa7+2dlLOO79957bf6F6kb3zsptfn5+lC1bFoADBw4UcDSFy59//ml3SaSt907Gv/n1S08z5NW/eXaz3TJiPHjwoM3yjH/3oKAgy1LVjDYnTpyw+xpktLv+/0923NzcaNSoEcOGDWPXrl106dKF1NRU5s+fn6N+CqMO/YbSdejrdOg3lDQXN0aNGsXs2bMLOiwRERG5BfUeO400FzfL3YtFRCRvFUhCa86cOVbHkpKS+PDDDwFo3bq1VXlGgmr8+PGkpaVlmoF1//334+bmxubNm9m+fTuurq40bdo0U3tvb28g8+yXDMnJycyYMeOGzye3dezYEaBQxVQYXPseudYvv/zCt99+i2EYme7+l9W/+ZdffplnCa2McW0tBwV4+OGHgfRNwW15++23M9WD9D3CKlasSEJCAh988IFVm7/++otVq1ZZtbsRjRs3tvQpIiIiIiIiUhgVSEJrw4YNzJw507J31NWrV3nuuef466+/qFChAl26dLFqk5HAWr9+fabnkL4c65577mHLli3ExcVRr149q03Y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3lSqVClT/SVLltisLyIicju50Wu1iIjkDv3kFREphDy8/l0R7u/v73C7adOmsX37dvr168ewYcN46623+PXXX+nXr5/N+idOnODTTz+ldOnSdOvWLdv+T5w4wddff+1wfRERkVvVjV6rRUQkd2gPLRGRQsjT252E+CTc3d0JCAhwuN0rr7xCy5YtqVevHgARERFERETYrV+xYkWSk5Mtz1NTUy2Pg4ODMy2nyKj/ww8/UK9evWz35RIREbmVeXq7k5SQQlpqGsWLFy/ocEREbjuaoSUiUgjd/0gNklKvsmnTJubOnVvQ4YiIiMh17n+kBg93v5ek1KvMnj27oMMREbntKKElIiIiIiIiIiJORQktERERERERERFxKkpoiYiIiIiIiIiIU9Gm8CKSaz5btB0PD3er4yYmiQmJeHp5YmDkenl+jJEfMaSlpXHk6BFC7gjBxcWFUiWDbI4jIiKSG+xdt+1x5FpYGNrdTNvrr8WO0PVaRKRgKKElIrlm9SdrKV++vNXx1NRUoqKi7N4Z72bL82OM/IghLi4OPz8/jh36Cl9fX5tjiIiI5BZ71217HLkWFoZ2N9P2Rq/F194lWERE8oeWHIqIiIiIiIiIiFNRQktERERERERERJyKEloiIiIiIiIiIuJUlNASERERERERERGnooSWiIiIiIiIiIg4FSW0RERERERERETEqSihJSIiIiIiIiIiTkUJLRERERERERERcSpKaImIiIiIiIiIiFNRQktERERERERERJyKEloiIiIiIiIiIuJU3Ao6ABG5dfTu2B4PDw+r4yYmiQmJeHp5YmDkSrl/qSA+Wr0m909CRETkNmHvum1PdtfrgmynzwUiIrcfJbREJNe890QLinl55stYPddszpdxREREblX5ed3Oa/pcICJy+9GSQxERERERERERcSpKaImIiIiIiIiIiFNRQktExAbTNJkyZQohISF4eHgQFBTE22+/bbf+ggULqFOnDk2aNCEwMJBWrVqxb9++fIxYRERERETk9qGElog4lRHb99H1v9+T4OFFeHh4no3z6quvMmTIEAICAnjnnXcYMWKE3Y1zf//9d5555hlOnDhB//79ad++PV9//TUvvPBCnsUnIiIi6Xp88QMJHl60a9euoEMREZF8pISWiDiVC0nJpJomGAaxsbEOt1u5ciX169enc+fOAIwcORLD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izJv3jyHZmnFx8czZMgQAHr27GmZCXQrWLp0KfBvEguwLDv84osvOHv27E2PUaFCBQD++ecfq7KUlBTCw8Pp0qWL5ViJEiX46KOP8PLy4scff2TLli03HYMtEyZMwM/Pz/KVEWdhYppplsdpaWlZ1LQ2c+ZM6tSpw+zZswkICGDZsmU27zY5a9YsDhw4wPDhwzl69Kjl+O+//05SUpJV/Yw+zp07x7PPPsvixYuJiYmhW7dunDt3LkcxioiIOMoZrtsiIiI5pYSWg/r37291zMPDg2effRaATZs2WY5/9dVXmKZJ06ZNufvuu63aPfnkk5QvX574+Hh27NhhOZ6RlLp2iWHG49DQUEJDQ4mOjiY6OhqAv/76i2PHjlG2bNlMSbObkZGI69WrF25u1jfBLFOmDA0aNODy5cv89NNP2fbXp08fjhw5Qvny5XnrrbdyJcbCYPv27fzxxx8UKVKE9u3bW45Xr16devXqkZKSkinJeaN8fHwAMiU+r2XrfVmqVCnLcrlr35e5acSIEVy8eNHy9eeff+bJODfDMP798ZaRiHZUfHy8ZZlifHw858+ft1nv+PHjXL58mfvuu4+QkBDL8Tp16nD48GFM0yQhIcGy71yVKlUssQwfPpwePXpQs2ZNEhISLP+vRUREcpszXLdFRERySgktB1WvXj3L49dudp7xuEaNGjbbuLi4cNddd1m1u/fee/Hx8eHnn3/m8uXLQPoMLMMweOCBBywJr4xZWbk9Owtg//79AMydO5emTZva/MrYCP/UqVNZ9jV8+HDLjK61a9dmuXG8PRmbmF//lfHLv62yazfFzysZSwoff/xxS9IpQ8YsrdxYdpjxPvD19bUqc3d354477rDZztb7Mjd5enri6+ub6auw8S5azPLY39/f4XamadKzZ09OnjzJxIkTMU2TTp06ceXKFau6vXv35pNPPrF8ZVi6dCkVK1YkOjoab29vKlWqZImjTZs2AAwdOpTp06ezb98+ypYta/fnhYiIyM1yhuu2iIhITllPwRGb7C2Vy1iSd+0MmowkRFbL62y1c3Nz4/777+err75ix44dtG7dmm+//ZbatWsTEBCQaUni008/nScJrYsXLwJkeffGDFktOZwyZQqTJk3C09OTdevWce+9995QPA0aNKB8+fJWx3fv3k1iYmKmDfDzS2JiIh9//DGQeblhhv/85z8MGzaMXbt2cejQIe68884bHivjL6i23kslSpSwO/PI1vtLHDNt2jQ2bNhA//79GTZsGD4+Prz44otEREQwYMCATHXr1q1L3bp1rfpo3749Pj4+NjejHzp0KCVKlGDx4sWYpknz5s2ZMmUKXl5eNpcpioiIiIiIiDUltBx09uxZm4mVjL2NihX7dzZI0aJFM5XZcubMGat2kL6P1ldffcXWrVspXbo058+fp3v37gDccccdlCtXLk9naGXE/tVXX9GqVasb6uP9999nyJAhuLm58fHHH/Pggw/ecDzXznq5VnBwMNHR0TbvMJnXPvvsM8sm448//niWdZcsWcL48eNvaJyDBw9aEiINGza0Kj937hxpaWk2k1q23pe3G++ixbgcdwF3N7cczQ585ZVXGDp0qOV5REQEERERpKamEhUVlWXblJQUoqKiLHcTDQ4OttqYv2jRoixYsMDmnlwiIiKSc65ubiQnJ+Pu7l7QoYiISD7SkkMH/frrr1ker1atmuVYxuODBw/abJOWlsZvv/1m1Q4y76N17f5ZGZo1a8axY8f4+eef+e233yhVqpRl+WJuyFj25MgMLVtWrFjBCy+8gIuLC4sWLco24eOMMpYSFitWjKCgIJtfGQmUpUuXZnunQXvmzZsHpC8frFy5slV5cnIyx44ds9nW1vsyK/mxTDO/deg3lDQXNzZt2sTcuXMLOhwRERHJI73HTiPNxY2NGzcWdCgiIpKPlNBy0Jw5c6yOJSUl8eGHHwLQunVry/HWrVtjGAbbt29nz549Vu1Wr17NyZMn8fHxsVoy17BhQ7y8vNi1axf//e9/gX/vfnjt49dee82q7Fre3t5A1ssCbenYsSMA7777LgkJCTlqu3HjRp5++mnS0tKYM2eOzeV4zu7cuXOWf5f169dz+vRpm19//PEHXl5eREdH8+233+Z4nC+++MLynhs5cqTderbel2fPnrXMbLv2fZmVG32/iIiIiIiIiBQEJbQctGHDBmbOnGmZbXP16lWee+45/vrrLypUqECXLl0sde+44w5LYujpp5/m999/t5T9/PPPln14IiIirJaEeXp60qhRI5KSkvjiiy+oUaMGJUuWtJRnzNZav359pufXq1KlCvDvskRHdejQgcaNG/Pbb7/x2GOPcfTo0UzliYmJbNiwgWeeeSbT8e3bt/PUU0+RnJzM5MmTef7553M0rrNYsWIFycnJVKxYMculnr6+vjz22GNAzjaHP3r0KK+88gqPPvooqampdO/e3bLk9Hpubm7MmTMn07LM2NhYunfvTkJCAvXr16dFixYOjZvxftm2bdsNzygTERERERERyS/aQ8tB48eP5+WXX2bixIlUqFCBQ4cOERcXh5eXF0uXLqVIkSKZ6s+dO5fDhw+zf/9+qlWrRq1atUhOTrYsQ2zVqhWRkZE2x2rWrBlbt27FNE2rpEn16tUpVaqUZY8ke0mVsLAwxowZw6OPPkqdOnUsd7NZsWIFpUuXtnueLi4urF69mkceeYT/+7//IyQkhDvuuIMSJUpw6dIljh49SlJSkmXT8Qx9+vTh6tWrlk3g161bZ7P/UaNG0bZtW7vjF3YZyalu3bplu0yve/fulrvfzZo1y7KvUoZOnTrh6ekJQHx8PH/99Zfl39XDw4PRo0fz6quv2u2/XLlytGvXjs6dO1OpUiVKlizJgQMHuHr1qmXTcUeXEnbo0IFRo0axYsUKvvvuOypWrIiLiwu9evWiV69eDvUhIiIiIiIikl+U0HLQ0KFDKV++PDNmzODAgQO4u7vz+OOP8/rrr1OnTh2r+iVLluS7775j2rRpfPzxxxw+fBgXFxcaNGjA008/zfPPP29348rQ0FBef/11y+PrNWvWjE8//ZSAgABq1apls4/hw4eTmprKihUrOHjwIImJiQAOLSMsU6YM3333HfPnz2fFihXs37+fEydOEBQURMOGDXnooYfo1KlTpjYZ/ScmJrJjxw67fWdshu+Mjhw5wg8//ABgd9bUtdq2bUuJEiU4d+4cn332mdVrtnv3biA9iejr60uJEiVo0qQJDzzwAN27d880M8+e2bNnc9ddd/H+++/zyy+/ULRoUTp27Mgbb7xBpUqVHD63qlWr8tlnn/Hmm2+yZ88eTpw4YbkDX06Mfa6D3TsvmqaZZYLtZstt1XF1daVp6H3pZZgkJiTi6eWJgXU/N1t+bZ0K5SuyZpXtpK6IiEhhkdV12x5HrscF0c7d1SPHfYuIiHNTQisb1y6/6tq1a472hfLx8WH06NGMHj06R2O2bNkyy2Vf9u78dy13d3ciIyPtzgJr3rx5lmN4enoSHh5OeHh4tmMBHD9+3KF6uSUvx9uyZYvN4yEhITlajufu7k5MTEymY7buepdT1/cxYMAAyzLW7GT1urVu3drhPbfs6TusE17enjfVx61g7fycLfUVEREpCLfSdXvd/G0FHYKIiOQz7aElIiIiIiIiIiJORQktERERERERERFxKkpoiYg4GdM0mTJlCiEhIXh4eBAYGMiwYcPs1j948CAPPvggXl5elClThqlTp5KcnJyPEYuIiIiIiOQu7aElInKTdm44SOLVZDy93bn/kRoAhIeHExsbS0BAAHPnzs3V8UaPHs3EiRNp2LAhQ4YMIT4+nvPnz9usm5KSwhNPPMGff/7J+PHj2b17N8uXLyckJIRx48blalwiIiIF4cuPfsbD1Zt27dqxcePGgg5HRETyiWZoiYjcpMSrySReSSbx6r+znmJjY4mJiSE2Njbb9itWrMAwDHr06AHAuHHjMAzD5g0lrl69yowZMyhatCibNm2ie/fuDBw4kNdee81m35s2beLo0aM88sgjDB48mHnz5uHq6prrSTYREZGCkpaWhmEYmn0sInKbUUJLROQmJSWkAOmJrW8+3Yunq7clkXXhwoVs23fp0oW+ffuyfv16AGbMmEFoaKjNu5T+/vvvJCQk4OnpSa1atfDx8aFChQqsXr3aZt9HjhwBoGLFigAUK1aMYsWKcfbsWS5evJjTUxURERERESkUlNASEblJpmn+7wEkXknGMFxIS0sDsHzPzsyZM6lVqxYAxYsXZ9myZbi6ulrVyzh27tw5nn32WRYvXkxMTAzdunXj3LlzOYtXRERERETESSmhJSJykwzD+N8D8Czijmmm4eKS/uM143t2rt0H68qVK3b3xCpXrpylz+HDh9OjRw9q1qxJQkIC0dHRmKZJYmIiiYmJAISEhAAQHR0NwMWLF7l06RIlS5bEz8/vxk5YRERERESkgCmhJSJykzy80u+v4entToun6pKYepWAgAAA/P39s21vmiY9e/bk1KlTluedOnXiypUrVnWLFStG165dARg6dCjTp09n3759lC1blho1ahAdHU2TJk2oUqUKAA8//DBVq1Zl48aNTJ06lRdeeIG0tDReeOGF3Dh1ERERERGRAqGElohIAZs6dSobNmzgueeeA+D111/n119/pV+/fjbrz5w5k6effprFixcTGRlJ8+bN+e9//4uXl5dVXTc3N9auXUvjxo0ZNWoUmzdvpkuXLowYMSJPz0lERERERCQvuRV0ACIizs7T2z3Td8AyQyvje1YGDx7M4MGDiYuL4/3336dv374MHjzYbn0/Pz8WLVpksyw4OJjdu3dTr149y7FatWqxZcsWAFJTU4mKisLDwyPbuERERJyBi4sLqSmpuLu7Z19ZRERuGUpoiYjcpPsfqWF1bO7cuQUQiYiIyO2ndbd7WDd/G5s3bi7oUEREJB9pyaGIiIiIiIiIiDgVJbRERERERERERMSpKKElIiIiIiIiIiJORXtoiUiu+WzRdjw8rDdkNTFJTEjE08sTAyPXy/NjjJzEUKF8RZvlIiIihYm967Y9jlwLC6pdqZJBDvcrIiK3BiW0RCTXrP5kLeXLl7c6nnFnvXr16uHq6prr5fkxRk5jEBERKezsXbftceRaWBjaiYjI7UFLDkVERERERERExKkooSUiIiIiIiIiIk5FCS0REREREREREXEqSmiJiIiIiIiIiIhTUUJLREREREREREScihJaIiIiIiIiIiLiVJTQEhERERERERERp6KEloiIiIiIiIiIOBUltERERERERERExKkooSUiIiIiIiIiIk5FCS0REREREREREXEqbgUdgIjcOnp3bI+Hh4fVcROTxIREPL08MTBuqrx4qdJ8tHpNnsQvIiJyO7F33bYnu+t1YWl3M23T0lKpWjKAsDYP4eLimqPxXL2KsHbTlzmKU0REbpwSWiKSa957ogXFvDzzdIyeazbnaf8iIiK3i/y4bjunh26oVdjyjbkch4iIZEVLDkVERERERERExKkooSUich3TNJkyZQohISF4eHgQGBjI8OHD7dYPDg7GMAzc3NyoX78+bm5urF27Nv8CFhERERERuc1oyaGIyHVeffVV3nzzTRo2bMiQIUOIj4/n3LlzWbapXr06r776KsePHyc4OJgGDRrkU7QiIiIiIiK3H83QEhGnMGL7PsI3/0SChxdhYWGEh4c73HbFihW4ubkxdOhQAEaOHIlhGIwePdqqbnx8PNOmTaNo0aJs2rSJ7t27M3DgQMaNG5flGKVKlaJdu3a0bt2asLAwypUrl7MTFBEREafV44sfwNefxx57rKBDERG5bSihJSJO4UJSMrEJSQDExMQQGxvrcNsuXbrw3HPPsXnzZgYMGMCkSZMIDQ0lMjLSqu7BgwdJSEjA09OTWrVq4ePjQ4UKFVizJus7K27bto3ixYvTpEkTnnrqKc6ePZuj8xMRERHnlZyWBoZBcnJyQYciInLbUEJLRJzCxcTMHxAvXLiQo/bTp08nJCSEOXPmEBAQwLJly3B1tb4dd8axc+fO8eyzz7J48WJiYmLo0aOH3TGfeeYZPvroI9asWcO9997L2rVrGThwYI7iExEREREREcdpDy0RcQppppn+wDDSn6el5ah9fHw8cXFxlsfnz5+nbNmyVvWqVKmCi4sLaWlpDB8+HC8vL2bOnMlPP/3E6dOnMU2ThIQEDMPA0zP9VudjxowBIDU1lcuXL/Pdd9+xb9++Gz1VERERERERyYZmaImIU3D5XyKL/yW2XFwc//Flmia9e/fmzJkzvPnmm5imSadOnbhy5YpVXX9/f7p16wbA0KFDmT59Ovv27aNs2bJUrlyZ6OhovL29qVSpEgD79u2jdevWTJ8+nQULFvDWW28B0LRp05s5XREREREREcmCZmiJiFPw83S37KEF6YknR02dOpWNGzfSqVMnhg4dSrFixXjxxRfp168fCxcutKo/a9YsDMNg8eLFmKZJ8+bNmTRpks1ZYSVLlsTLy4tJkyZx/vx5AgICGDBgABMmTLiR0xQREREREREHKKElIk7B38MdgNiriQQGBhIQEOBw28GDBzNw4ECioqIAiIiIICIiwm59Pz8/Fi1alOlYamoqUVFRBAcHY2YsfwTKlCnD+vXrM9WpV6+ezf25RERE5Nbk7uJCUmoq7u7uBR2KiMhtQwktEXEKE5rWAaDnms2sXLmygKMRERER+deSNo0IW76Rz77aVdChiIjcNrSHloiIiIiIiIiIOBUltERERERERERExKkooSUiIiIiIiIiIk5FCS2RArZw4UIMw6BXr14FHYqIiIiIiIiIU9Cm8CI3IDg4mOjoaBYsWKBE1DVaLViHi6utHysmpmliGAZg3FS5i5sbzR962Ob4iQmJeHp52o3P092NjZ+td+BMREREbn32r9v2ZHe9Liztbm7MpOQkPNw9smxnJidyZ9mga0ejiH/xHMYoIiI3QwktkQLm5+fHnXfeSZkyZQo6lJs2at5SivgULegw7Jo5tF9BhyAiIlJoFPbrdmE2b8xANny1yfI8NTWVqKioggtIROQ2pISWSAHr0KEDHTp0KOgwRERERERERJyG9tASEcklVatWpX79+ri5uWEYBoZhsHbtWrv1J02aRLVq1XBxccEwDL799tv8C1ZERERERMSJKaElkkt69eqFYRgsXLjQZnlkZCSGYRAZGZnpeHabwsfGxjJ27FjuvvtufH19KVq0KNWrV+eFF15gz549VvVTUlKYN28eTZs2xd/fHy8vL+666y5effVV4uLirOpfO358fDwjR46kWrVqeHl50bx58xy+ClK5cmU++ugjli9fzvLly2nQoIHdulevXuWRRx6hcuXK+RihiIiIiIiI81NCS6QQ27t3L7Vr1+a1115j3759VKhQgZCQEP766y/effddZs6cmal+XFwcLVu2JDw8nO+++w5/f39CQkL4448/eOONN2jcuDH//POPzbGuXr1Ks2bNmDhxIm5ubtSoUQNPT/sbrDubBeMG4e3uwmOPPeZwmxUrVmAYBk899RQAs2fPxs3NjdGjR9ttU7x4cdq1a0dYWBhdunShXLlydutGRkYyffr0W2L/NBERkdvFgnGDcElLoV27dgUdiojIbU0JLZFCKi4ujscff5y//vqLNm3aEB0dzYEDB9izZw8XL15k27ZtPPTQQ5naPP/882zbto2WLVty5MgRjh8/zv79+zl9+jQdO3bk119/pX///jbHW7VqFZcvX+bAgQMcPHiQn3/+mXXr1uXHqeaL1JQUDMMgOTnZ4TZdunShb9++rFq1igEDBrBo0SKaNWtmNcvuWnv27KF48eJ4e3vTsWNHzp49mwvRi4iISGGRmpKCATn6TCEiIrlPm8KLFFLvvvsuJ06coHr16qxdu9ZqttQDDzyQ6fm+fftYsWIFlSpVYs2aNRQrVsxSVrx4cZYsWcKuXbtYtWoV0dHRVKpUKVP71NRUli9fTvXq1S3HvLy8bMaWmJhIYmKi5bmtpYy3ipkzZ/L9998zZ84c/P39Wbp0Ka6urjbr9urVC3d3d2rWrMm8efNYs2YNRYoUYenSpfkctYiIyL9up+u2iIjcPjRDS6SQypgd9dJLLzm09G/NmjUAdO7cOVMyK0ORIkVo1aoVpmna3Hy8Zs2a3HPPPQ7FNmHCBPz8/CxfFSpUcKidM4qPjyc2NhZIX5Z5/vx5u3VHjx5NmzZteOyxx3jjjTeA9EQjgGmaJCQkkJSUlPdBi4iIXON2um6LiMjtQzO0RAqpX3/9FYDGjRs7VH///v1AemJr586dNutER0cDcOrUKauya2dmZWfEiBEMGjTI8jwuLu6W/HBsmiY9e/bk5MmTvPnmm4wbN44uXbqwe/duihQpkqnuvn37eOWVV6hduzZ79uxhwYIFADRt2hRIf+0rV65MiRIlOHPmDADbtm3j8OHDluebNm3Kx7MTEZHbxe1y3RYRkduLEloihVTGcgB/f3+H6l+8eBGAo0ePcvTo0SzrXr161eqYj4+Pw7F5enreUhvG2zN16lQ2bNhA//79GTp0KOfPn+ett96iX79+VnezLFmyJF5eXixevJhLly5RunRpXn75ZctMLVvmz5/PokWLLM9nzZqVV6ciIiK3sdvlui0iIrcXLTkUySWGYQDps3psiY+Pz1F/GcsGL1y44FD9okWLAvD+++9jmmaWX1ltan6rcnVzwzRN3N3dHW4zePBgTNPknXfeASAsLIyUlBSrZBZAmTJlWLt2LZs2beLKlStER0czffp0y0yu4OBgUlJSMs3CWrhwYaZ/l4ykpIiIiBRerm5umJCjzxQiIpL7lNASySUZM5zs3dUuu1lT16tZsyYA33//vUP1a9SoAcAvv/ySo3FuF73HTuNqchqfffZZQYciIiIiTqz32GmkubixcePGgg5FROS2poSWSC6pUqUKALt27bIqO3nyZI73R2rfvj2QvgzNkY3EO3ToAMDSpUs5d+5cjsYSERERERERcSZKaInkkrZt2wKwdu3aTH+x+/vvv+nWrRspKSk56q9v375UqlSJAwcO0LFjR6uN3Ldv385HH31keV6/fn06d+7MuXPneOihh9izZ0+m+qmpqWzZsoVu3bplunW3iIiIiIiIiLNRQkskl1SvXp0+ffqQkpLCI488QpUqVbj77rupWLEi//zzD/369ctRf8WKFWPdunWULl2aDRs2ULFiRWrVqsXdd9+Nv78/DzzwAF999VWmNh9++KElmXXPPfdQqVIlGjduTJ06dShWrBgtWrRg2bJldvf5EhEREREREXEGSmiJ3IDU1FQAPDw8Mh2fN28er732GlWrVuXUqVOcPXuW559/nu+++87huxVeq27duvzyyy+MGDGC6tWr88cff3Ds2DHKli1LeHg4AwcOzFS/aNGifPHFF3z00Uc8/PDDXLlyhZ9//pmYmBjq1KnDsGHD+PHHH/Hy8rrhcxcREREREREpaG4FHYCIM8q4G931SSo3NzdGjx7N6NGjrdpERkbavLtgr1696NWrl92xSpQowZtvvsmbb77pUGwuLi507dqVrl27OlQ/u/FzYuxzHXBxsZ0nN03TcifIvCh3pI5hGDR7sAkG1nVMTBITEvH08ryh8tzoI6B4YFanJyIikquyum7b48j1uDC0u5m2SUlJVn+0BDDTDKrcUR2AkgEBNxSTiIjkHiW0RHLo+PHjXLp0CUhfZij/6jusE17engUdhtNa88GWgg5BRERuI7pu58y6+dvY8lXObvIjIiJ5R0sORXIgKSmJYcOGAVCzZk0qV65cwBGJiIiIiIiI3H6U0BJxwNGjR2nUqBElS5bk448/xtXVlSlTphR0WCIO27JlC4Zh4ObmRv369XFzc8MwDIKDg+22admyJYGBgXh4eFC+fHlefPFF3SFTREREREQKBS05FHHA5cuX2bVrF35+frRu3ZoRI0bQvHnzgg5LxGE1atRg+fLlpKWlcfz4cfbu3cvHH39Mo0aN7LapU6cOXbp0wTAMpk6dyjvvvEO1atW4//778zFyERERERERa5qhJeKAevXqkZaWxvnz59m0aZOSWZIrdm44yDef7mXnhoM2y8PDwwkLCyM8PNxm+YoVKzAMg6eeegqAkSNH4ubmxty5c63qlipVii5duhAWFkbr1q3Zt28fAIMHD7Yb3/Tp03nyySd58MEHqVSpEsANb8wrIiLizL786Gc8XL1p165dQYciIiL/oxlaIiIFJPFqMolXku2Wx8bGEhMTY7e8S5cufPPNN7z33ntEREQwd+5cmjVrRt++fbMc99tvv+W3334jNDSUBg0aZFm3WrVqnDt3DoBu3brRp08fDh60nYATERG5VaWlpWEYBsnJ9q/bIiKSv5TQEhEpIEkJKUB6YuubT/fi5V6E+++/n2effRbDMIiNjQXgwoULdvuYOXMm33//PbNnzyYwMJClS5fyzz//ZDnu0qVLARgyZEi2Ma5evZrTp08zZcoUVqxYwRNPPEGVKlUcPEMREREREZG8oYSWiEgBMU3zfw8g8UoyhuGCl5eXZUZUhrS0NLt9xMfHWxJf8fHxnD9/Pssxf/rpJ37++WeqV6+eadmEaZokJiZajdWsWTMA3NzcePLJJ1m0aBHjxo1z+BxFRERERETygvbQEhEpIJb9qAzwLOKOaaaRkJBAiRIlCAwMxMUl/Ud0xvfrmaZJz549OXnyJBMnTsQ0Tbp06UJCQoLdMadNmwbAoEGDMu2HFR0djbe3t2X21RdffMHTTz/Nu+++y7x58xg9ejSQvlG8iIiIiIhIQdMMLRGRAuLh5UbilWQ8vd1p8VRd1nywhe92/sjFixfx9fUlLCyMmJgY/P39bbafOnUqGzZsoH///gwbNgwfHx9efPFFJk6cyNq1a63qnzhxglWrVlGiRAm6du2aZWyBgYHs37+fNWvWkJKSQrly5Rg+fDhjxozhwIEDuXD2IiIiIiIiN04JLRGRAuLp7Z7p+/UCAgIyfb/e4MGDM92lMCIigvDwcKKiomzWr1ixIgkJCURFReHp6ZmpLDg4GNM0SU1NJSoqivr167Nnzx6rPlJTU7M9LxERkVuNi4sLqSmpuLvbvmaLiEj+U0JLRKSA3P9IjSzL586dm0+RiIiISFZad7uHdfO3sXnj5oIORURE/kd7aImIiIiIiIiIiFNRQktERERERERERJyKEloiIiIiIiIiIuJUlNASERERERERERGnok3hRSTXfLZoOx4e1nf/MTFJTEjE08sTAyPXy/NjjPyIIbBEKZv9ioiI5AV71217HLkWFoZ2N9M2LS2NI0ePEHJHCC4umf/2X6pkUI5iEBGRvKWElojkmtWfrKV8+fJWx1NTU4mKiqJevXq4urrmenl+jJEfMcTFxeHn52ezbxERkdxm77ptjyPXwsLQ7mbaZlyLjx36Cl9f3xyNKSIi+UtLDkVERERERERExKkooSUiIiIiIiIiIk5FCS0REREREREREXEqSmiJiIiIiIiIiIhTUUJLREREREREREScihJaIiIiIiIiIiLiVJTQEhERERERERERp6KEloiIiIiIiIiIOBUltERERERERERExKkooSUiIiIiIiIiIk7FraADEJFbR++O7fHw8LA6bmKSmJCIp5cnBkaul99MH/6lgvho9ZqcnKaIiMgtwd512x5HrseFod3NtE1LS6VqyQDC2jyEi4trno2nzx8iIjdPCS0RyTXvPdGCYl6eBR1GjvRcs7mgQxARESkQznjdzh8P5fkI+vwhInLztORQREREREREREScihJaIiIiIiIiIiLiVJTQEhHJY5MmTaJatWq4u7tTv359tmzZkqk8LCyMMmXK4Ofnl21f0dHR1K9fH19fX7y9vbnrrruYPXt2HkUuIiIiIiJSOCmhJSKSx65evcojjzxC5cqVbZYbhsGzzz7rUF+GYdCmTRvefvtt3njjDU6dOkVERAQHDhzIzZBFREREREQKNSW0ROS2NGL7PsI3/0Sie/pmuP379+eNN96gf//+2bZdsWIFhmHw1FNPATBy5EgMw2DMmDE260dGRjJ9+nRKly5tt7+xY8c6FHfFihUZN24cjz76KA8++KBDs7pERESk8OjxxQ8keHjRrl27gg5FRMSp6S6HInJbupCUTGxCEhjpt9Y+f/48Fy9exN3dPdu2Xbp04ZtvvuG9994jIiKCuXPnEhoaytixY9m/f39eh86vv/5KvXr1AHB1dWXGjBnUrFkzz8cVERGRm5eclgaGQXJyckGHIiLi1DRDS0RuSxcT//0QGRYWRmxsLAAXLlxwqP3MmTOpU6cOs2fPJiAggGXLluHq6poXoVqpXLkyX375Je+99x6BgYGMHz+eY8eO5cvYIiIiIiIihYESWiJyW0ozzfQHhkFMTAxpaWnpx//3PTvx8fGWJFh8fDznz5/PkzhTU1NJSEjI9FdcHx8fHnroIZ577jk6d+5MTEwMa9euzZPxRURERERECiMltETktuTyv6WGmCaBgYG4uKT/OMz4nhXTNOnZsycnT55k4sSJmKZJp06duHLlis3627Zt44MPPuCff/4BYOPGjXzwwQeW8pUrVzJ//nzL80WLFrFhwwYAlixZgre3Nz169ABg/vz5DBkyhAULFjB58mSWLFkCQN26dXP4CoiIiIiIiDgv7aElIrclP0/39D20SE8ohYWFERMTg7+/f7Ztp06dyoYNG+jfvz/Dhg3Dx8eHF198kYiICAYMGGBVf/78+SxatMjyfNq0aQCWOxsOGzaM6OhoS/mAAQMIDQ3lkUceseorICCA5cuXM2fOHDw8PAgJCeHFF1+kVatWOTp/ERERERERZ6YZWiJyW/L3cCfAywPjf0sPixcvjp+fH8WLF8+27eDBgzFNk3feeQeAiIgITNPMNMvqWgsXLsQ0TVJSUti9ezcpKSmYGUsegePHj2OaJhcvXgTg4sWLbNmyBYBevXphmiYrVqwAoH379hw6dIiEhATi4uL46aef6NWr142+DCIiIpLP3F1cwDQduhGNiIjYpxlaInJbmtC0DgA912wGYPbs2URFRVnuHigiIiKSF5a0aUTPNZvZsHkzqampBR2OiIjT0gwtERERERERERFxKkpoiYiIiIiIiIiIU1FCS0REREREREREnIr20BLJQ1u2bKFFixaEhoZaNvm+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e+45APbv32+pN336dP7zn//wn//8h08//dTu+MOGDeP555+3PH/++edZvHixw/GLiIiIiMi/vw8U9/Jg7oP34pWUQEBAAJCz3w8k/2hTeBERwN/Dndiribi5u1suXI4YPHgwgwcPBtKXBIaFhTFhwgS7e2hFRkaydu1am+XdunWjX79+XLx4EV9fX6vynj17UrduXerVq2c5dvz48Ux1UlNTiYqKcjh+ERERERFJ/33g2u+A5feCnPx+IPlHCS0REWBC0zqELd/Ixh923dSG7iIiIiIi4nwmNK1jdWzu3LkFEIk4SksORURERERERETEqSihJSIiIiIiIiIiTkUJLRERERERERERcSraQ0vyzJYtW2jRogWhoaFs2bKloMPJV7frubdasA4XV1s/VkxM08QwDNJvhJvb5bkzBi4utGzTzk7/kJiQiKeXJyUDAvhk5XK79URERJyB/eu2PY5cjwtDu5sbMyk5CQ93jxy302uT++PptSks7W5uzML42pjJidxZNujaVpbP+sb/2vmXCrLXXAoJJbQkS8HBwURHR7NgwQJ69eplt17z5s3ZunUrY8eOJTIyMkdjbNy4kRUrVrBjxw7OnDlDamoqQUFB3HvvvXTq1Iknn3wSd/d/7zQRGRnJuHHjsu33dksmFQaj5i2liE/Rgg4jz80bM7CgQxAREblpt8t1W0TkevPGDGTDV5sszzPuFF6vXj3dIMqJKKEleaZIkSLceeedVKxY0Wb52bNnCQsL45tvvgGgWLFiVKlSBXd3d06cOMHq1atZvXo1ISEhbN26lTJlymRq7+vrS+3ate2On1WZiIiIiIiIiDgvJbQkzzRs2JDffvvNZtnFixdp2rQphw8fJiQkhLfeeot27dplmom1e/du3nrrLT755BPOnDljldC6++67NQNLRERERERE5DakTeGlQPTv35/Dhw9To0YNvvvuO5544olMySyA+vXrs3LlSlatWoWPj08BRSqS//z8/DAMI9NXcHCw3fotW7YkMDAQDw8PKlWqxOTJk0lMTMy/gEVERERERPKZElqSZ7Zs2YJhGDRv3jzT8aNHj7J8efqG2h9++CElSpTIsp8OHToQEhJyU7F8++23uLq64uPjw6FDh6zKDx48iLe3N66urnz77beW45GRkRiGQWRkJKdPn6ZPnz6ULVsWLy8vqlevzpQpU0hJSclx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s4NuF95Fi2X6y46jG+dPnTqVDRs20K9fP3r16kVISAgvvfQS/fr1Y+HChVb1//zzTz799FNKly5Nt27dsuw7MDCQ/fv3s2bNGlJSUihXrhy9evXK8uYCIiJye7ldr9siIhmf34sU86Pr0Nctx+eNGcjKlSstz1NTU+nUqRMXL17UzbGciFKPku/uv/9+gBztu5WboqKimDBhgiXzPnToULvTTTNklST6559/ADLth2VP0aJFM7W5nmmalrEc6e/6frt164Zpmll+3cisNknnXbQYPr7+QHoiKSAgwKF2gwcPxjRN3n77bQD69++PaZo2k1kAFSpUIDk5mb///tvqF5CyZcuSkpLC6dOnAahfvz579uzh0qVLXL16lUOHDhEREYG7u/uNnaSIiIiIyC0i4/O7d1HHflfLyWd8KXiaoSX5rlOnTowePZo9e/bw/fff07hx43wbOyEhge7du5OUlMT48eOJiori008/5YUXXuDTTz+12+7XX3+1efzKlSucOHECSL/LXHaqVavG3r17OXjwoM3yI0eOkJSUhKurK1WrVnXgjNJlLGH85ZdfHG4jOdeh31DA+i86IiIiIiJS+GR8fnfESy+9RL169bK9cZMUHpqhJfkuJCSEsLAwAPr06WPZKNuetWvXcuTIkVwZe+TIkRw4cIDGjRszfPhw5s2bR+nSpVm1ahWLFy+2227nzp1ERUVZHZ8/fz4JCQlUqlSJO++8M9vxH374YQDef/99EhISrMozZvA0adIkR8sAH3jgAQIDA9m7d69mYImIiIiIiMgtTwktKRCzZ8+matWqHDx4kMaNG7N+/XqSk5Mz1YmKiqJr16507NjxpjeQB/jmm2+YMWMGRYoUYfHixbi6ulKiRAnmz58PwIsvvmiZbXU9Nzc3evXqRXR0tOXY9u3bLfsUXb9xtz3/+c9/qFixImfOnKFXr16WPbUAli5dyrvvvgvA8OHDc3RuXl5evPbaa0D6DLg1a9ZgmmamOr/88gvDhg1jx44dOepbREREREREpLDRkkMpEMWLF2fHjh107tyZbdu28cQTT1CsWDGqVKmCm5sbf/75p2WfqbvuuougoCCrPvbs2WP3jn6QvgfVf//7XyB90/RevXphmiZTp04lJCTEUq9t27a88MILzJs3j549e7J582ar5NTzzz/P+vXrueOOO6hVq5ZlryKAxx57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E7169RLbtm0TSUlJGvlzG9ASQoiwsDBRs2ZNjUCSvuuSrF68eCHCw8PFyJEjRYMGDUTZsmWFlZWVcHBwEFWrVhUffvih1vVEVrm5Rnj8+LHo37+/8PT0lINmho4NtXv37on//e9/okuXLqJatWrCxcVFWFpaipIlS4pmzZqJuXPnioSEBK1yhgJa2b10vRf++ecfMXHiRFGrVi3h4OAgbG1tRYUKFUTbtm3FkiVLxOPHj43aH7UHDx4IS0tLUadOHZ3pryOg9epLqVQKb29vERwcLI4cOaJ33V9//bVW4NlcSUIU8M3jREREpOH48eNo2rQpBg4ciJUrVxZ0dYyyevVqfPDBB5g7dy4+++yzgq4OERERkUkNGTIEK1aswNGjR+V5tQqb9PR0VKpUCYmJibh586bGkx/NEQNaREREhVDnzp0RHh6O69ev59skoa+LSqVC5cqVkZKSgr///hs2NjYFXSUiIiIik3r06BEqVKiAwMBA/PrrrwVdHZ3Wrl2L/v37Y/HixRg+fHhBVyfPLAu6AkRERKRt3rx5qFWrFu7du1foA1oPHjxAnz59EBQUxGAWERERFUtlypTBunXrcPnyZSQmJhbK0U+SJGHatGkYMmRIQVclX3CEFhERERERERERmRVFQVeAiIiIiIiIiIgoJxjQIiIiIiIiIiIis8KAFhERERERERERmRUGtIiIiIiIiIiIyKwwoEVERERERERERGaFAS0iIiIiIiIiIjIrDGgREREREREREZFZYUCLiIiIiIiIiIjMCgNaRERERERERERkVhjQIiIiIiIiIiIis/L/1jVvyIyGAbEAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, axes = plt.subplots(nrows=1, ncols=2, sharey=True)\n", "\n", "cmap = ['#FD7F69', '#9FC9DD', '#89A76F']\n", "\n", "style_dict = dict(\n", " orient='h',\n", " palette=cmap,\n", " edgecolor=\"k\",\n", " linewidth=2.0,\n", " errwidth=2.0,\n", " capsize=0.07)\n", "\n", "ax = axes[0]\n", "b = sns.barplot(x=\"s\", \n", " y=\"util\", \n", " data=df.sort_values('util'),\n", " order=labels,\n", " hue='ncores',\n", " hue_order=[4,2,1],\n", " ax=ax,\n", " **style_dict\n", ")\n", "plt.setp(b.patches, linewidth=0.5)\n", "\n", "ax.set_ylabel('')\n", "ax.set_xlabel('Time (sec)')\n", "ax.set_yticklabels(labels_mod)\n", "ax.set_axisbelow(True)\n", "ax.grid(which='both', axis='x', color='k')\n", "#ax.set_xscale('log')\n", "ax.set_xlim([0, 5e3])\n", "ax.set_xticks(np.arange(0, 5000, 100), minor=True)\n", "ax.grid(which='minor', axis='x', alpha=0.2, color='k')\n", "ax.get_legend().remove()\n", "\n", "\n", "# Add text, slowdown over chromap\n", "ncores_order = [4, 2, 1]\n", "for icore, ncores in enumerate(ncores_order):\n", " for ilabels, util in enumerate(labels):\n", " if util==\"chromap\":\n", " continue\n", " \n", " df_reference = df.query(f'ncores=={ncores} and util==\"chromap\"')\n", " mean_reference = np.mean(df_reference['min'].values)\n", " df_target = df.query(f'ncores=={ncores} and util==\"{util}\"')\n", " mean_target = np.mean(df_target['min'].values)\n", " \n", " slowdown = mean_target / mean_reference\n", " \n", " w = b.patches[0].get_height()\n", " \n", " b.text( s=f\"x {slowdown:.1f}\", \n", " x=mean_target+150, y=ilabels + (icore-1)*w,\n", " ha = 'left', va = 'center', fontsize=8, weight='bold')\n", "\n", " \n", "\n", "ax = axes[1]\n", "b = sns.barplot(x=\"max_rss\", \n", " y=\"util\", \n", " data=df.sort_values('util'),\n", " order=labels,\n", " hue='ncores',\n", " hue_order=[4,2,1],\n", " ax=ax,\n", " **style_dict)\n", "plt.setp(b.patches, linewidth=0.5)\n", "\n", "ax.set_ylabel('')\n", "ax.set_xlabel('Maximum Resident Set Size (MB)')\n", "ax.set_yticklabels(labels_mod)\n", "ax.set_axisbelow(True)\n", "ax.grid(which='both', axis='x', color='k')\n", "ax.set_xticks(np.arange(0, 30000, 1000), minor=True)\n", "ax.grid(which='minor', axis='x', alpha=0.2, color='k')\n", "\n", "fig.suptitle('Benchmark of different Hi-C mapping tools for 1 mln reads (5 iterations)', y=0.99)\n", "\n", "# (x, y, width, height)\n", "bb = (fig.subplotpars.left, fig.subplotpars.top+0.002, fig.subplotpars.right-fig.subplotpars.left, 0.2)\n", "ax.legend(bbox_to_anchor=bb, title=\"Number of cores\", loc=\"lower right\", ncol=3, borderaxespad=0., bbox_transform=fig.transFigure, frameon=False)\n", "\n", "plt.savefig(\"benchmarking_1mln.pdf\")" ] }, { "cell_type": "code", "execution_count": 92, "id": "c7c68d19-7606-4d35-a150-580fd5c78cd6", "metadata": {}, "outputs": [], "source": [ "dct_mapper = {\n", " 'bowtie': 'bowtie', \n", " 'bwamem': 'bwamem', \n", " 'bwamem2': 'bwamem2', \n", " 'chromap': \"\", \n", " 'fanc_bowtie2': 'bowtie',\n", " 'fanc_bwa': 'bwamem', \n", " 'hicexplorer': 'bwamem', \n", " 'hicpro':'bowtie', \n", " 'juicer': 'bwamem', \n", " 'pairtools': 'bwamem',\n", " 'pairtools_bwamem2': 'bwamem2', \n", " 'tadbit': 'GEM', \n", " 'tadbit_bowtie2': 'bowtie'\n", "}\n", "df.loc[:, \"mapper\"] = df.util.replace(dct_mapper)" ] }, { "cell_type": "code", "execution_count": 93, "id": "2996f9c4-0ed4-4d81-80aa-7044eed59648", "metadata": {}, "outputs": [], "source": [ "df = pd.merge(df, df, left_on=['mapper', 'ncores'], right_on=['util', 'ncores'], suffixes=[\"\", \"_mapper\"])" ] }, { "cell_type": "code", "execution_count": 94, "id": "90943478-8a46-486d-b6d7-74a1306dbc70", "metadata": {}, "outputs": [], "source": [ "labels = [\n", " 'pairtools_bwamem2', \n", " # 'tadbit',\n", " 'pairtools', \n", " 'tadbit_bowtie2',\n", " 'juicer', \n", " 'fanc_bwa', \n", " 'hicexplorer', \n", " 'hicpro', \n", " 'fanc_bowtie2',\n", " # 'bwamem2',\n", " # 'bwamem',\n", " # 'bowtie',\n", "]\n", "labels_mod = [\n", " 'bwa-mem2 + pairtools', \n", " # 'GEM + TADbit',\n", " 'bwa mem + pairtools', \n", " 'bowtie2 + TADbit',\n", " 'Juicer', \n", " 'bwa mem + FANC', \n", " 'HiCExplorer', \n", " 'Hi-Pro', \n", " 'bowtie2 + FANC',\n", " # 'bwa-mem2',\n", " # 'bwa mem',\n", " # 'bowtie2',\n", "]" ] }, { "cell_type": "code", "execution_count": 113, "id": "7d976913-dc1e-49f3-ac37-5bc2f16a13fd", "metadata": {}, "outputs": [ { "data": { "image/png": "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APTv35+JEydSr149mjVrRkJCQpbGKCIiIiLyJBUrVgyA48ePEx4eztatWwG4c+cOERERdOvWjYMHD7J48WK+/vprADp16sSwYcOy1F9q9+B+fn4plgdWrVqVJk2a0K1bNyAx2LVv3z7279/PkiVLstS/5A6aMSUiud5HH30EwHvvvWfZZmOT+Ovr999/59NPP2X06NEcOnSI3r17W22jR48eREdHM2XKlDT7unr1Ki+88AK3b98mJCSEUqVKERMTw6RJkwgICCBfvnyWT5ju3r3LjRs3UrTh6elJeHg4P/zwAwDPPvssn332GTNnzmTIkCGULl2a7t27c+jQocyfDBERERGRLIiI+d+qhbt371rdx9fXl0GDBnHhwgV8fHwYO3YsefLkARJTaRw4cICVK1dSu3ZtNm3axKuvvsrq1av55JNPrLbXuXNngHQ/PLZ2D/4oGxsbfvjhBw4fPsyJEyeYN28eAwcOZOHChaxZswYfHx8qVqzIV199lZHTIbmIAlMikqsdPnyYHTt2ULFixWS5qby8vIDET066du3KiBEjgMR16tYYjUbi4+Mt04+tOXfuHA0aNOC3335j48aNtG/fHoCHDx9y584dFi9eTLly5Zg7dy6AZemfNc7OztSpUweAt99+mw8++IBjx44xZ84cfvrpJ0qVKpXlT5ZERERERDLLmCQxeFr3xPPmzePy5cvs2bOHvXv3Eh8fj7e3Nx4eHqxZs4YHDx7QuXNnXn31VQYMGADApk2brPf5//2ktWLgxIkTPPfccynuwa2xsbGhZs2aVKlShbFjx9KwYUOee+45+vbty6hRoxg+fDiTJ0/mwYMHaZ4LyV20lE9EcrWPP/4YSMwtlTSZYf369SlTpgxHjx4lKCiI8PBwAF544QWr7axYsYKePXvSrFkzy7TjpMLCwujTpw/37t3jnXfeISoqijVr1lClShXKli3LtGnTKFWqFDY2Nnz++eesW7eO119/PUPBJScnJ3r27Gnpd9myZfz666+prsUXEREREcluNgYDCf8fnDKvPrBmzJgxeHl5ER8fz/z58zGZTJanSvv4+ACwZMkS3N3dCQ0NBRI/LLZmzZo1APTr148vv/wyRXlYWBj+/v5EREQkuwevWLFimsdy+PBhVq5cycmTJzEajRiNRr7++msSEhIwmUxpBt4k91FgSkRyrRs3bvDll19S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mJiYZPtERERQqlQpateuTf369R+rv4iICAYOHIinpye+vr6UKlWKdevWWcp/+eUXXnvtNRo3boyzszOVK1fm7NmzKdqJiYnhjTfewMXFhSpVqnD48GFLWZ8+fRg1atRjjVNEREREROTvoqV8IvK32b/nELExseTBiW1fHMMhbx7qt6qULW3v3XKaqL8e4mDrxOzZs/nss8/SrVOtWjU6duyIwWDgo48+4vPPP6dBgwa8/fbbln3efPNN7ty589jjM5lMtGrVij179tCxY0fKlSuHyWQiLi4OgN9//52GDRty7949OnbsSIMGDTh27BixsbEp2lq1ahXr169n+vTpBAcH8+677/Ljjz9y6NAhdu3axYkTJx57vCIiIiKSO+3fc4h7UfcB+O38b7Rs2TLFPqtXryYhIYGWLVuydevWv3uIIpmiGVMi8reJjYklJiYx0BLzII6Yh3HZ1nbMwzhMRhMGg4F79+5lqM6sWbNo27Ytzz//PF5eXgAYDAZL+Zo1a/jyyy+ZOnVqum0FBwdjMBjo2LGj1fJt27axZ88eGjRoQEhICC1atGDChAl07twZgAULFvDnn3/y7rvvMmDAALp168bcuXOpUqVKiraioqJwcHCgefPmlC5dmoiICKKjo5k6dSrz5s0jb968GTp+EREREXn6xMbEYjKZMJlMREdHW93HaDQCWD4EFcnNFJgSkX81Hx8fypQpw3fffcdLL71E7969Abh69SoDBw5k2rRpVK5c+bH7MS+3+/333/Hw8KBBgwb4+vpy6tSpZOWbN2/Gz88PV1dX2rZtS1RUVIq22rZti4eHB9WrV2fLli28/fbbBAYGUrlyZZo1a/bYYxUREREREfm7KDAlIn+b2Njkn9jERsdnX9tJ2rIWzEnN+vXrWbt2LbVr1+a7777jq6++AuCtt97C29ubVq1acf369cQ+YmO5cOGC1Xa6d+9OXFwcq1atslpua2sLJAamFixYQK9evTh06BABAQHJyo1GIzNmzKBly5asX7+ewMDAFG15enoSHh7Ozz//zIULF6hduzbBwcEMHTqUd955h5IlS1K3bl0OHTqU4fMgIiIiIk+HpPfUDx8+zMGRiGQPBaZE5G9jMpkAMGBI9jo7285su40aNaJ9+/aMGDGChIQEgoODAbh48SJhYWH4+PjQvXt3AMLCwqhTp47VdoxGI/Hx8SQkJFgtL1euHABVq1alS5cu9OjRA4Bff/01WXmrVq3w9/enZ8+eycof5ezsjK+vL56envTp04cpU6YQHh7O3Llz2bFjBxUrVmTo0KEZPg8iIiIi8nTIzntokdxAyc9F5G9jMBgS18NjwoAhWT6n7Grb/H16vvnmG1atWoWfnx8mk4m5c+cCiQnRAWbOnMndu3cBOHHiBIGBgZQrV46PPvrIanuhoaH07t2bDh06sGbNmhTlLVq0oEyZMhw9epTZs2ezb98+AJo2bQpA//79mTNnDl988QUODg7s2bMnWXlq5syZg5OTEwEBAXzyyScALF26lKNHj+Lk5JTueRARERGRp0vS+16RfwIFpkTkb2Nvn8eS/BzA3jH7fgXZO9oR8yBxWrOrq2u6+xcsWJATJ06wYcMG4uPj8fT0JCAggHHjxgHJA0L58uWz/PvKK69kaXx58uRh8+bNvPXWW4wePRonJyd69OhhCXT5+Piwbt06Ro8ezfTp0/H09GTSpEnJnhD4qMuXLzN58mRLEMvX15du3boxa9YsihUrZglUiYiIiMg/R9J7aj30Rv4JFJgSkX+l2rVrc/ToUcvrhIQEwsLCyJMnT4p9/f39OXToEDVq1Ei1vR49etCrV680+6xUqRI//fSTpa8aNWpYcksBvP7667zyyitWy6zx8vLi9u3blvHb2try2WefERISkmY9ERERERGR3EI5pkTkb2PvYI+Dgz0ADk55cMibMgiUVQ5582CwSZzW7OLikm3tioiIiIjkJvYO9hgMiWkxHB0dre5jY5P4p761D11FchvNmBKRv009v9oAbP16Cy+1s55EPKvqt6oEwMZlOxgyZEi2ti0iIiIikluY76nv3r5HhfIVrO7TqVMnfvzxR0JDQ//OoYlkiWZMiYiIiIiIiIhIjlBgSkREREREREREcoQCUyIiIiIiIiIikiMUmBIRERERERERkRyhwJSIiIiIiIiIiOQIPZVPRLLNyuA12Nmm/LViNBotj6wFiDfGs2nZTkyYiImOwcHRAQOGZHWyWla4YJFsPCIREZF/rtSu22l59JqeW+tlta4JEw8ePMDJySnFPcaT6C8n6mW1rs5N6nLq3Dg4OnLt6rVU9ylUqFCm2xXJCQpMiUi22b5tB8WLF0+2LSEhgbCwMGrUqIGtre3fViYiIiJps3bdTkta19/cVO9x6kZGRuLu7k5ERARubm5PvD+dm9xT73HqPi3nRiS30lI+ERERERERERHJEQpMiYiIiIiIiIhIjlBgSkREREREREREcoQCUyIiIiIiIiIikiMUmBIRERERERERkRyhwJSIiIiIiIiIiOQIBaZERERERERERCRHKDAlIiIiIiIiIiI5QoEpERERERERERHJEQpMiYiIiIiIiIhIjlBgSkREREREREREcoQCUyIiIiIiIiIikiMUmBIRERERERERkRxhl9MDEJF/jjdav06ePHlSbDcajdjYWI+DJy2zs3egSrVquLm5MXHixCc6VhERkX+71K7baUnrmp6b6mW1rslkolb1arR6sTkGgyFTdaMiIimWzw0Dyet5FC7CyvUbMtWWiMi/iQJTIpJtVi2cj6uLS5brX7wbSdnyFRg3blw2jkpERESsedzrtiQ3dsR7TGr4bIrtPTb8lAOjERF5emgpn4iIiIiIiIiI5AgFpkREREREREREJEcoMCUiIiIiIiIiIjlCgSkREREREREREckRCkyJyD9WZGQkPXr0wMPDAxcXF9q0acOtW7eeaJ+XL1+mSZMmuLm54e7ubnVMPXv2xN/fH3d3d15//XWuX79uKT99+jQDBgzA2dmZwoUL88477xAXF2e1r61bt1KqVCnc3d0ZMmSIZfvZs2cpVqwYN2/ezP4DFBERkWz3888/07BhQ1xdXS3X/9jY2GT7RERE4OXlhcFgoH79+o/V37179xg0aBBFixbF3t4eLy8v1q1bZ3XfKVOmkD9/fnx8fJJtDwkJwc/PD5PJ9FhjERHRU/lEJFfoNnQYsbH/C8AMGjSIvn37PlabQ4YMISQkhDfffJNChQoRGBjItWvXaNas2eMON1UxMTEULlyYdu3a8dlnn1kd04oVK3jjjTeoUKECkydPJiIigm3bthEfH0+bNm24fPkykyZN4ujRowQFBeHh4cH48eNTtDVgwADKlClD586dmTp1KlWrVqV69er079+fwMBAihQp8sSOU0RERP7HfB/T7Zv9rGhR73/bv9lPrL0jLVu2ZOvWrVbr/vnnn7Rv3x6TycS0adPYvn07QUFBuLm5MXHiRMt+b775Jnfu3HnssZpMJoYMGcKxY8fo1KkTTZs25dKlS1Y/CPvtt98YM2YMAwYM4Nq1a/z3v/8lJiaG27dvM3LkSL7//nsMBsNjj0lE/t00Y0pEcoW4uPhkr//6668M1YuJiUmxLT4+nsjISFasWEGBAgWYN28eEyZMoFatWhw+fJjTp09bbeuVV17Bzs6OM2fOpNlndHS0lfEn3syVK1eOtWvX0rlz5xT7JB3T8OHDGT9+PLVr12b79u2cPn2ab7/9lnPnzuHn58e7777LokWLsLW15ZNPPrE6jqioKCpVqkTTpk2BxE8/ly1bRnx8PH369EnzGERERCT7mO9j4ozG5NuNRjAYUp39DHD8+HEiIiJo0qQJgwYNYtKkSQDMmzfPss+aNWv48ssvmTZtWrpjWb58OQaDgY4dO1ot37ZtG8eOHcPPz4/Q0FA6d+7MxIkTrd67REVFAeDn50eNGjWAxPugoUOH0qtXLypXrpzueERE0qPAlIg8lb799lu8vLxwcnLi9ddfZ8eOHZw8eZIePXrwxx9/8Ntvv5GQkECJEiUsn+SVLFkSgHPnzmWpz7CwMGrWrEnevHmpVasWa9eu5fz58yxfvpzPP/883fppjSk8PJzw8HAAihYtCoCrqyv58uXj1q1bREREpGhv8ODBzJ8/n+eff54qVapQtmxZxo0bx6effqpPL0VERJ4SBQsWBBIDVOHh4ZaZVXfu3OHOnTtcvXqVgQMHMm3aNKpUqfLY/R05cgSAGzdu4OrqipOTE3Xq1OHUqVMp9q1atSpNmjShW7duloDZwYMH2b9/P2PGjHnssYiIgAJTIpJL3b17N83y1atXM2bMGEJCQoiKisLf35+qVaty69YtChQoYLWO8ZFPMR+1ceNGoqOjqVChgtXyhQsX0qpVKzZs2EDVqlXp1q0b5cuXZ+PGjdSrV89qnfSkN6a0yidOnEh4eDj79+/nwIEDzJs3jz59+nDv3j3q1KmDt7c377zzjnI/iIiI5GJVq1blzTff5MKFC/j4+DB27Fjy5MkDJC67e+utt/D29qZVq1Zcu3YNgNjYWMv3j+rRowdxcXGsWrXKarmtrS0Av//+O59++imjR4/m0KFDBAQEpNjXxsaGH374gcOHD/Pzzz8DMGzYMBYuXMiaNWvw8fHBx8eHkJCQxz0NIvIvphxTIpIrpRewCQoKwt/fH1tbW7p06cLZs2cxGo2UK1eOsLAwSpcuja2tLVeuXMFkMmEwGLh8+TIAZcuWtdpmQkIC8fHx2NvbW51xNHnyZEveptdff53p06dz6dIlTCZTqm0m9eiYAC5dugQkLgG0s0v8lXzjxg0gMcnp3bt3KVSoEO7u7iQkJKRo09zvxo0bOXv2LBs3bqRZs2ZUrlyZcePGUaZMGVq0aGH5NFZERERynzlz5jBy5EiuXLmCs7Mzzz77LN7e3hQoUICLFy9y7NixZMnHw8LC6N69O3/++WeKtoxGI/Hx8dja2mJjk3IegvneoUqVKnTt2pV79+4xefJkfv31V6tjs7GxoWbNmkRGRgJQv359nnvuOVq0aMHixYsxGo306dOHdu3a4eTklB2nQ0T+ZRSYEpFcydqNVFIeHh7JXptv1szBGzc3N7p06UJISAhvvfUWBQsW5MiRI9SsWZNKlSpZbbNt27b8/vvv/PLLL1ZnTT0a3ClSpAgFCxYkLCzMsu3evXusWbOGX375xbItODgYPz8/atasaRnTjBkzKF++PEeOHKFRo0ZUqlQJHx8fypQpw549e/j44485dOgQRqORN998M81zERUVxeDBgxk9ejSOjo4kJCQQFhbGsmXLgMScWyIiIpJ7jR07Fm9vb+Lj45k/fz4mk4mxY8cCMHPmTMtM8lOnTjFhwgTKlSvHwIEDrba1YsUKevbsSYcOHVizZk2K8hYtWlC8eHHCwsIICgqypBIw56xMzdGjR4HEp/QZjUaMRiNff/215fv0PlQUEUmNAlMikis9GnjKijlz5mA0GgkNDSU+Pp5WrVqlehOXXW7fvp3iaYKDBw9m/Pjx1KxZkzlz5pCQkMDGjRvZsmULL7/8MvPnzwfAzs6OL7/8kl69ejF27FhcXFwYPHgwo0aNSrPPUaNG0aRJE2rXrg3A9OnT6du3L0FBQfTo0YPmzZtz/PjxJ3PAIiIi8tguXbrEJ598wsOHD/Hx8SE4OJju3bsDyQNG5g/J8uXLR6NGjbLUV548efj444+ZP38+77//Pm5ubgQEBDBz5sxU6yQkJDB48GAAChQogIuLC7NmzSIwMBCDwUBQUBAuLi5ZGo+IiAJTIvKP5e7uzooVKyyvzTOJUvPf//6XGjVqWHIvZIW3t7dlmV5kZCTu7u5ERETg5uZmGVNwcDBhYWFW+6pSpQqLFi3K1Djmzp2b7Nj8/f0tn34CVpcAioiISO4REhKSoeu+v78/JpMpzXuagIAAq/mikipdujQ//PBDhu81bG1t2bVrF+7u7pZtgwcPtgSrREQeh5Kfi0iukCdP8jh5vnz5cmgkIiIiIpljvo/J80gqgjw2NmAyWZKZi4hISgpMiUiusCLoY6ZPncKXX35J5cqV+eSTT3J6SCIiIiIZsiLoY3xcHVnRIvlTele0qIdjbDRbt27NoZGJiOR+CkyJiIiIiIiIiEiOUGBKRERERERERERyhAJTIiIiIiIiIiKSIxSYEhERERERERGRHKHAlIiIiIiIiIiI5Ai79HcREcmYVwN6Y2tr+1ht2NjYkJBgpPqzNXF1z4eDo4PV/WKiY1KUFcqfnzWrQh+rfxERkX+L7Lhu/xOZAEMW6kVERPLd8TNUeKZIsu0ehYukUkNEROBvDkwZDIm/4k0m09/ZrUimLF++nJ49e9KjRw+WL1+e08N5bN7e3ly6dIkLFy7g7e39RPuaNH0mzs7O2dLWvPkL6DR0dKbqLBz3Trb0LSIi8m+QnddtSbx3ibhzmy3ff5vTQxEReapoKZ9INgsKCmLChAncvXs3p4ciIiIiIiIikqspMCXyCHd3d8qXL0+xYsWyVD8oKIiJEycqMCUiIiIiIiKSDgWm5IkICAjAYDCwffv2nB5KprVu3ZozZ87wwQcf5PRQRERERERERP7RFJgSkX8tk8nEzJkzKVeuHHnz5uWFF15g5MiRlvIOHTpQrFgx7OzsqF279mP1dfbsWZ599lnc3NxwcXGhbdu2zJ8/31IeExPDiBEjKFWqFPXr1+e5555jz549VtuKiYnhjTfewMXFhSpVqnD48GFLWZ8+fRg1atRjjVVERESejOnTp+Pj44ONjY3VD3E3b95M5cqVsbe3p3Tp0ixZssRSZjKZmDJlCsWLF8fJyYnu3buzd+/eLI8laXsODg7UrVs31fZiYmLo3r07AL6+vsnuPXr16qV7DxF5LDkWmFq1ahV169bFxcWF/Pnz8/rrr3Py5MkU+1WvXh2DwcDx48eTbb958yYGgwGDwcDYsWNT1PP390/xy/7GjRvMnTuXF198EW9vbxwdHcmXLx+NGzdmxYoVWToO8xgANmzYQP369XFxcaFIkSL06NGDGzduWPb97LPPqFWrFs7OzhQuXJgBAwYQERGRattXr15l8ODB+Pj4kDdvXjw8PGjSpAlffPGF1f2THvPx48d57bXXKFiwIG5ubjRt2pRDhw5Z9t21axctWrQgf/78uLq60qpVK86cOZOlc/Ckbd++HYPBgL+/P3FxcUycOBEfHx8cHR3x9PRk0KBB3Llzx2rdffv2MXz4cGrXrk3hwoVxcHCgRIkSdOvWjVOnTlmts3z5cgwGAwEBAamOIz4+nhkzZlC1alWcnJzw9va21Lt06RIApUqVsrw/rN14nDp1im7dulG8eHHs7e0pUqQIbdu2Zd++fameC5PJRGhoKI0bN8bDw4O8efNSoUIFRowYkeo5SM39+/cJDAykWrVqODs74+joSIkSJfD392fatGnExcVlqr2n0ZgxY3jvvffInz8/c+bMoVevXjg4/O9JfwaDgT59+mRLXwaDgZYtWzJnzhwmTZrErVu3GDx4sOV9OH78eGbMmEGtWrUYNmwYZ8+e5eWXX7b6c121ahXr169nwoQJGAwG3n33XQAOHTrErl27rP5OFBERkZz38OFDWrVqRalSpVKUnTt3jrZt2/LgwQPmzJlD/vz56du3Lzt27AAgJCSEMWPGUKFCBWbOnMm1a9d49dVXs5w+YsWKFZb2Pv74Y3777TdatWpltb2VK1fy3//+FyDZvce2bdvYuXOn7j1E5LHkSGBqxowZdOnShStXrlCxYkXi4+PZtGkTdevWZffu3cn2bdSoEYDlF7JZ0tePlsXExLB//34cHBzw9fW1bF+yZAmDBw9m165d2NnZUbVqVdzc3Ni5cyfdu3dn4MCBWT6muXPn0qZNG65cuULZsmWJiIggJCSEF154gejoaIYMGUKvXr24e/cupUqV4q+//uLTTz/ltddes/qUwh07dlClShXmzp3L1atXKVeuHG5ubmzfvp033niD//znP6mOZf/+/fj6+rJz5068vb2xsbHhxx9/5Pnnn+fUqVOsW7eO559/nqNHj1KqVCmMRiNbt26lUaNG3Lx5M8vn4EkzmUy0bt2aCRMmAFCxYkX++OMP5s+fT7169fjjjz9S1OnatSsffvghFy9epEiRIlSsWJGoqChCQ0OpU6dOlpYamkwmXn/9dUaMGMHDhw+pVKmSJRjp5+dnCWzUrl0bPz8/y5e7u7uljc2bN1OrVi1CQ0O5f/8+1atXx2QysX79evz8/Fi8eLHVfrt27Uq3bt3YuXMnBQoUoFKlSly4cIEZM2ZQs2ZNfvvttwwdQ3x8PE2bNmX8+PGcOnWKEiVKULVqVYxGI7t27eL999/n/v37mT432WX54k+5d/sGS8cNZcP8GRmqs2H+DGyM8bRs2ZLZs2enu//9+/f5+OOPcXFx4dtvv6VLly506dKFiRMnWvZZs2YN48ePz1D/wcHBGAwGOnbsaLW8XLlyBAYG8vLLL9OkSRNcXFySlX/99ddAYrCsXbt2vPjii9y9e5eVK1emaCsqKgoHBweaN29O6dKliYiIIDo6mqlTpzJv3jzy5s2boTGLiIhI9pj5wWTu3b5huRdJzYQJE5g1a5bVXKaffvop8fHxDBs2jAEDBhAYGAjAJ598AsC8efMAmDVrFm+++aYlKLVq1SqrfZlTayxcuNBquXnm9qxZsxg0aJDlbxVr7ZnvPSDxic/me4/+/fuzYMEC3XuIyGPJkcDUmDFj+Oijj7h27RoHDx7kxo0bdOnShYcPH9K1a1cePnxo2bdx48ZA6oEpT09PDhw4QHR0tKXM/Lpu3bo4Ojpatvv7+/PTTz8RFRXFuXPnOHjwIJcuXeLYsWNUrFiRhQsXpugno95//31WrVrFlStXCAsL49y5c5QtW5bTp0/TqVMngoOD+eGHHzh//jwnT57kyJEj5M+fnx07dvDNN98ka+v69eu0adOGyMhIpk6dyl9//cXx48e5fPkye/bswdPTk48++oivvvrK6ljGjh3LwIEDuXnzJocOHeLmzZu89tprREVF8dZbb9GvXz+mT5/O77//zuHDh7l27Rp169bl1q1bfPzxx1k6/r/D3r172bVrFz/99BNnz57l6NGjnD9/nurVq3Pu3DkGDRqUos64ceM4f/48t2/f5sSJE4SFhXH79m2WLFlCXFwcvXv3xmg0Zmoce/bs4eDBg+zdu5dz585x6NAhDh06xEsvvcTu3bspWrQoAOvWrWP37t2Wr2effRZI/Pl269aNmJgYhgwZws2bNy3/D6ZMmYLRaGTQoEEpZgl+8sknrFq1CldXV7777jvOnz/P4cOHuXTpEn5+fly6dInOnTtn6Bg2bdrEvn37qF69OpcuXeLMmTMcPHiQa9eucePGDYKCgrC3t8/UeclO9+/dA8BoTODhvagM1Xl4LwoDiUG3e/9fPy2nT58mOjoaBwcHqlSpgpubG61atWLDhg2PM/Q0/fLLLxQqVIjatWvz559/8vHHH1O5cmUAyw3qd999x5UrVzh69CgA4eHhKdpp27YtHh4eVK9enS1btvD2228TGBhI5cqVadas2RMbv4iIiFiXEB8PgAGyPOvcfM338vICoGTJksm2P1puvnewdq+QHf0l1a5dO8uHrN9++y1vv/02EydOpF69err3EJHHliOBqZdeeolhw4ZhY5PYvZOTE8uWLaNo0aJcunSJNWvWWPY1z5jauXNnsjZ27NhB/vz56d27NzExMcmWP5mDS+agllmDBg1o0qQJtra2ybZXq1aNuXPnAlidnZARffr0oVOnTpbXxYsX57333gNg48aNTJgwgRdeeMFSXrVqVfr16weQIjD10UcfcefOHYYOHcr777+fbGlR/fr1LZ96zJo1y+pYqlSpwsyZMy2BBQcHB2bMSJx1sn37dho3bpzs/Ht4eFg+kXl0LLlJfHw8EyZMoEmTJpZtXl5ehISEAPDll1+mmDHUvXt3SpcunWybnZ0dvXv3pmPHjvz2229pLp2zJiEhgQULFvDcc89ZtiUNgKZn/vz5REZGUqNGjWQBIBsbG0aNGkXLli2Ji4tj5syZljomk8nyMwwMDEx2A1C0aFHWrl2Lvb09+/fv56effkp3DOYbjl69elG8ePFkZYUKFWLIkCE4OTmlWj8mJobIyMhkX9np/v3/BZYyE5gyi4pKv47598Cff/5Jnz59WL58OXfv3qVbt278+eefmRxx4nstLi4u1U8tIXF553fffcfChQvx8PBg6tSpnD9/HkjMOVG8eHFGjRpF69atLTMArc2o9PT0JDw8nJ9//pkLFy5Qu3ZtgoODGTp0KO+88w4lS5akbt26yZbviojIv9eTvm7Lk5Heh6fplS9btoy4uDj69+//2P15enpy5MgRAI4fP07t2rX57LPPmDlzJkOGDNG9h4g8lhwJTFmb2WJvb2/J5fLtt99athcuXJgKFSpw69YtfvnlFyDxD8nTp0/TqFEj/P39geQzqsxBLHNQK6moqCgWL15Mjx49aN68OQ0bNqRBgwaWhMfHjh3L0jH17t07xbYaNWpYvu/Vq1eKcvMMmkeDKevXrwdINbdNixYtsLe3Z+/evcT//6czSfXs2dOS98rMx8fHEmiwNtbUxpKbJH2PJFWtWjUaNGiAyWTiu+++S1F+5swZxo8fT5s2bfD396dBgwY0aNDA8p7J7M/c3d2d1157LWsHAZYxvvXWW1bLhwwZkmw/SJxpc+XKFRwdHenbt2+KOp6enrRt2zZFvdSUKFECgC1btvDgwYPMHQDwwQcf4O7ubvkyt5ddkgZjTKaMzWhLup+1YM6jSpcubQnOjhw5kq5du1K6dGmio6MtecIyw2g0Eh8fT0JCQqr7ODs706xZM/r06UPTpk25ffs2GzduBBLz6YWHh7N//35Wr15Nu3btAFJNuu7s7Iyvry+enp706dOHKVOmEB4ezty5c9mxYwcVK1Zk6NChmT4OERH553nS123JHuXKlQOw3IeY/zVvf7TcnMvWvP1RCQkJxMfHpxpwSq+/Rzk7OwPwzDPP0KdPHz744AOOHTvGnDlzdO8hIo/FLic6rVixYprbz549m2x7o0aNOHPmjOUX3s6dOzGZTDRu3BhfX1/s7e0tQYb4+Hj27t2LnZ0d9evXT9bO0aNHefnll7l+/XqqY8tsAmmzMmXKpNhWqFAhy79ubm6plidddnTv3j0uXrwIYJlRlZro6Gj+/PNPihQpku5YAAoWLMjly5fTHGtGlkAlFRAQQHBwcKrlSWc3JbVt2zZLUDGjihcvjqurq9WyihUrsnv37hTvnQ8++IAxY8ak+QlQZn/m5cqVSzHrLjPMY6xUqZLVcvPSrps3bxIZGYmbm5uljpeXl+WmILV6j54Da15//XW8vb357rvveOaZZ2jRogUNGzbE39/f0k5a3n//fYYNG2Z5HRkZma03uQaDwRJcMhgyFj83GGwwmRIs9dPj4eFBly5dWLFiBcOHD6dkyZKEh4fzzDPPWH42a9euTfaAgqVLl+Lp6UmrVq1StBcaGkrv3r3p0KFDslmfZlOnTuXOnTtUrlyZmzdvsnXrViAxIAWJS0R/+OEHvLy8+O677/j8888pX7487du3T/M45syZg5OTEwEBAZYcFEuXLuXo0aNpznoTEZF/jyd93ZaM27lzJ2fPnrXkdd26dStOTk7UqFGDfv36MWvWLGbNmoW9vT2LFi0C4M0337T826tXL4YNG8Zrr73G5s2bcXd3TzWVQ9++fQkODmbBggUMGDAgRfmAAQPo06cPw4YNo3Xr1ixbtizN9swWLlyIk5MTPXv2tOTI1L2HiDyOHAlMFS5c2Op2c4Dl0WU4jRs3ZtGiRezYsYMBAwYkW6qXN29e6tSpw759+4iNjeXIkSPcv38fX1/fZH/AJyQk0L59e65fv07Lli0ZMWIElStXxsPDA1tbW86dO0e5cuWyvCbc2i9h8x/Hqf2CNpcnnd2R9I/g1B4Vn1TSfFxpjSW98WTkD3lrfHx88PPzS7E9PDycP/74gypVqiRL+m1mbVt6UnvfgPX3zs6dOxk1ahS2trZ88MEHvPrqq5QsWRInJycMBgNjxoxhypQpmf6ZpxYYyihz8C+9/weQeDxubm7p1klaLyPL2Jydndm1axfjxo3jiy++YO3ataxduxZIDJhNnz6dl19+OdX6Dg4OyZaYZjdnZxeiohKXGeR1sR6MfFReF1fuR94FSDWA+ai5c+diMBgICQnBZDJRq1YtFixYYFmaOWLEiGSzp/r370/jxo2tBqbSU6RIEZYtW8a8efOwt7fH09OT9957j6ZNm1r2CQ4O5urVq+TNm5f27dvz8ccfp5lM9PLly0yePNnyu8LX15du3bpZkqqaA1UiIvLv9qSv25Jxy5YtS/ahrjm/64QJEyhXrhzr1q1j9OjRDB48GE9PTxYuXGj5MDcgIIArV66wcOFCdu7cSdmyZZk/fz4eHh5ZGkuPHj24du2apb1q1aoxa9asdNv78MMP2bt3LwDNmzene/fuuvcQkceSI4GpW7dupchrA1hyqjz6R+WjCdB37NiBu7u7ZaZB48aN2bNnDwcOHLD8gfZofqkDBw5w7tw5SpYsyfr161NcnK9cuZINR/b4kj6pKzY2ljx58uTgaNI3atQoRo0alWK7eSbV3LlzMz0zKjW3bt1Ktczae8ecL+y9996zLNVMKqd+5i4uLkRERPDHH39Ynb2W9MmI5uMxvy+sPXnw0XoZDcoUL16cZcuWsWjRIg4fPsz27dv54osvOHToEK+//jp79uyhXr16GT6up5G7u7vl5jAhIYGwsDCqVatmKTfPXjSX1ahRI9XZcj169LC6ZNesd+/elmW0Sdsz8/Pz47fffstQX2ZeXl7cvn3b0qatrS2fffaZJe+aiIiI5C7Lly9n+fLlltfm675Z69atad26tdW6BoOBcePGMW7cOKv3Eun1lVZ7mXHhwgXLahBbW1uCg4PTXEEhIpKeHMkxZc4Vldp2Hx+fZNs9PT0pXbo0v//+O4cOHeL48eM0bNjQkh/GHITavn17qvmlzH9g1qpVy+onRlnNLZXd3N3deeaZZwA4depUDo8md7ly5UqqSw2tvXfMP/NHl3SaPamfeXqzz8xjPH36tNVy88+9SJEilou+uc7ly5dTPQfmeo/+/0mPnZ0d9erVY8SIERw8eJCOHTuSkJDAsmXLMtVOdnL+/0CcjY1tpmZMmUg8nqQBXhEREZEnzdYu8fN+E+T6D5ZFRHKbHAlMzZ8/P8W22NhYli5dCiROCX2UOdA0efJkjEZjshlR9evXx87Ojp9++ondu3dja2tLgwYNktU3L4dJOhvFLC4ujqCgoCwfT3Zr06YNQK4aU26Q9D2S1MmTJ9m1axcGgyHZ0+rS+pl/9913TywwZe7X2jJLgBdffBGAefPmWS2fM2dOsv0gMYeWl5cX0dHRLFmyJEWd69ev8+WXX6aolxW+vr6WNnNKQN/+uBQsSu/AIFq/OTxDdVq/ORyjjR1bt261JJAXERER+Tv85/0xuBQsarkXERGRjMuRwNSWLVuYPXu2JbfSw4cP6du3L9evX6dEiRJ07NgxRR1zIGrz5s3JXkPiMqeaNWuyfft2IiMjqVGjRopk476+vtjZ2bFnz55ky1wiIiLo0qWL1eBFThkxYgT58+cnODiYYcOGcffu3WTld+7cYdmyZUyePDlnBphD7OzsGD9+fLInMF69epXu3bsDiQG9pEvjzMHJadOmceHCBcv2gwcP0qtXL0seoexWunRpIPmTIpMaOHAgbm5uhIWF8c477xAbGwskPtVtxowZbNmyhTx58vDuu+9a6hgMBt577z0Axo8fz48//mgpu3nzJh07diQ2NhZfX99UE84nNWvWLIKCglK87y9fvmwJfNWsWTMTRy0iIiIiIiKSeTkSmJo8eTJDhw7lmWeeoW7duhQtWpSQkBAcHR0JDQ21mpzbPGPKZDLh6uqa4o/mxo0bWwJdj+aXAihatKjl8aU9evSgZMmS1K5dm2LFirFx40ZmzZqVzUeZdcWLF2fz5s0ULFiQWbNmUbhwYapVq4avry9lypShYMGC9O7dm5MnT+b0UP9W9evXp0GDBvj7+1O+fHlq1qxJqVKlOHr0KKVLl04xA6lfv36ULl2a8+fPU6FCBapVq0aFChWoW7cu7u7uliecZLcOHToAiQGoqlWr4u/vj7+/vyV/wDPPPMOKFSuwt7cnKCiIokWLUrduXYoVK8aIESOwsbFh3rx5yXIdAQwaNIjOnTsTGRlJ06ZNKVeuHLVq1cLLy4tdu3bh5eVlyauVnkuXLvHOO+9QtGhRSpUqRb169ahYsSKlS5fm5MmTVKlSJdnTe0RERERERESehBwJTA0fPpyVK1dSokQJTp06hcFg4NVXX2X//v0pckOZlS5d2pIw3c/PL0VS4KTBqNTamDFjBkFBQVSoUIEbN25w6dIlmjZtyq5du2jRokU2HV328PPz4/Tp04wePZpKlSpx4cIFjh8/jo2NDS1atGD+/PnMnj07p4f5tzIYDGzYsIEJEyZgNBo5ffo0hQoVYuDAgezfv5+iRYsm29/NzY3du3fTvXt33Nzc+PXXX4mNjWXYsGH8/PPPGU4SnlndunVj9uzZVKtWjfPnz7Njxw527NiRbObbq6++yuHDh+nSpQuOjo6EhYVhMplo3bo1u3fvpl+/flaPPzQ0lJCQEBo2bMgff/zBqVOnKFmyJO+99x5HjhyxzNZKz4ABA5gwYQKNGjUiLi6OsLAw/vrrL+rUqcPcuXM5cOBAlp6cKCIiIiIiIpIZf+tT+cwzmgA6d+5M586dM1U/raeotWrVKln71hgMBoYMGZJq/pn06me2jre3d5rl/v7+aZYXKlSIyZMnZ3jJ3vbt29MsNycDT01Wjj816T0FJKvy5MnD+PHjGT9+fIb2L1asWKpPCZkwYQITJkxIsT0gIICAgIAU29P7eSU1ePBgBg8enOY+VapUITQ0NEPtmRkMBrp160a3bt0yXMfaz71ChQqZOo8iIiIiIiIiT0KOzJgSERERERERERH5W2dMicg/2zuDBmBjkz3x7oSEBA60ex57R+uPXDaZTBgMhmTbbG1tafS8HzHRMTg4OmAgebkJ099aZjQaKVg0Hy1aNaNokWKs/2JjZk6BiIjIE5Wd1+1/EhOmFNf09NjY2hIdHU295+o/oVGJiPxzKTAlItmme+/O2fq0w61fb+HV7ikfZvB08Qdg07KdOTsMERGRR2T3dfvf6u7te5T3Kc+mTZtYuypjD6IREZH/0UckIiIiIiIiIiKSIzRjSnK9zCQdFxEREREREZGnh2ZMiYiIiIiIiIhIjlBgSkREREREREREcoQCUyIiuUxkZCStW7emRIkSODo64uXlxejRozEajZZ9li9fTqVKlXB0dKRMmTIsXbo0y/19+umn2NnZYTAYkn316tULgMuXL9OkSRPc3NwwGAz4+/un2lZMTAwdOnSgYcOGVK9encOHD1vKevXqxcSJE7M8ThERERER+edRYEpEcp39ew6x66e95MGJbV8cY++W0zk9pMeyd8tp7G3z8uKLLzJw4MB097937x5nzpyhX79+BAUFYTAYmDp1KvPnzwfgm2++oWfPntja2jJ//nxcXFzo378/hw4dytL4XnjhBVauXMnq1atZvXo1VatWBaBu3bpAYrCpcOHCtGvXLt22Vq5cyYYNG+jXrx8Gg4F3330XgG3btrFz506GDx+epTGKiIjkNvv3HOLHb3Zw+NBhVq5cyb1793jllVdyelgiIk8dBaZEJNeJjYklJiYWgJgHccQ8jMvhET2emIdxGAwG4uPjuXPnTrr7Fy5cmJMnTzJ27FgGDBjAsGHDADh27BgA3377LQC9e/emV69elmDX2rVrrbYXHBxM7dq16dy5s9XysmXL0qFDBzp27Ej9+vX55ZdfKFiwID169ACgXLlyrF27NtX6SUVFReHg4ICvry+lSpUiIiKC6Oho+vfvz4IFC8ibN2+6bYiIiDwNYmNiMZlMyR7SExf3dN+ziIjkBAWmRERyGTs7O2xtbQEwGo1s2bIFSJzZBFC0aFEAdu7cyeXLl9m2bRsAV65ceey+Z8+eTXx8PIMGDcpSEKldu3Z4eHjQqVMntm7dyttvv83EiROpV68ezZo1e+zxiYiIiIjIP4sCUyKS68TGJv+0MTY6PodGkj2Sjv/u3bsZrhcTE0Pnzp35/vvvGTx4MB07dgTgzTff5LnnnmPDhg2ULFnSMoMq6Se2SXXv3p19+/YRGhqaZn+RkZEsWbKEvHnzMmjQoAyPMylPT0/OnDnDZ599xrlz56hduzafffYZM2fOZMiQIVSpUgWAI0eOZKl9ERGR3OLR+xUREckaBaZEJNcxB1gMGJK9flolHX/SBOZpuXv3Li+++CJr165l/PjxzJ4921Lm6urKnj17OHXqFPv27ePjjz8GoFKlSlbbMhqNJCQkkJCQkGafixYtIjIykh49elCoUKEMjdMaZ2dnqlatiqenJ3369OGDDz7g2LFjzJkzxzL76/33389y+yIiIrnB035/IiKSWygwJSK5jsHw/wEpTMleP62Sjt/GJv1fuw8ePKBRo0bs2LGDFi1aUKFCBdasWcNPP/0EQEREBEOHDuXAgQP8+OOPvPfee+TNm5euXbtabS80NBQ/Pz9Lzihr4uPjmTNnDjY2NpacVmb37t1jyZIlfP311wD8/vvvLF26lDNnzqR5HHPnzsXJyYmePXtagmIrVqyw9CciIvI0e9rvT0REcgu7nB6AiMij7O3zWJKfA9g7Pt2/quwd7Yh5kDjd38PDI9397969y+nTiU8i/Oabb/jmm28AaNSoER9//DE2Njbs2LGDRYsWYTAYqFevHpMnT8bR0THLY1y3bh1XrlyhdevWlCtXLlnZ7du36du3r+X12bNn6d+/P3379rUsL3zUjRs3mDp1Knv27AGgefPmdO/e3fJkwUmTJmV5rCIiIrnBo/crIiKSNU/3X3si8o9k72APQHRMDA5OeXDImyeHR/R4HPLmIfp+LHny5CF//vzp7v/MM88QHx9vSYBulpCQQFhYGK6uroSFhVkts6ZHjx5Ur16dGjVqpNpnp06dUp1x5e3tnWK5Qlr9QWKC9ps3b1qOwdbWluDgYObOnYu7uzv169dPta6IiMjTwN7B3pJnynydzJPn6b5nERHJCQpMiUiuU8+vNgBbv97CS+3q5PBoHl/9VpXYtGynZSleermeREREJPcz36/cvX2P8j7l2bRpE+vXr8/hUYmIPH2UY0pERERERERERHKEAlMiIiIiIiIiIpIjFJgSEREREREREZEcocCUiIiIiIiIiIjkCAWmREREREREREQkR+ipfCKSbVYGr8HONuWvFaPRiI2N9Th4WmUxsTFsXLYDA4Zk202YiImOwcHRIVeXGY1Gws+FU65sOYoWKWb1GEVERHJKatfttKR13c5N9bJa14SJBw8e4OTklOK6nhp7e3uuXrmKu7t7VoYpIvKvp8CUiGSb7dt2ULx48WTbEhISCAsLo0aNGtja2v6ryiIjI3F3d+f8r9/j5uZm7ZSJiIjkGGvX7bSkdc3LTfUep6752h0REZGpa7e5PxERyTwt5RMRERERERERkRyhwJSIiIiIiIiIiOQIBaZERERERERERCRHKDAlIiIiIiIiIiI5QoEpERERERERERHJEQpMiYiIiIiIiIhIjlBgSkREREREREREcoQCUyIiIiIiIiIikiMUmBIRERERERERkRyhwJSIiIiIiIiIiOQIBaZERERERERERCRHKDAlIiIiIiIiIiI5QoEpERERERERERHJEQpMiYiIiIiIiIhIjrDL6QGIyD/HG61fJ0+ePCm2G41GbGysx8EzUmZn70CVatUs200mE1FRUTzzzDNMnTo1ewYvIiLyL5PadTstaV23c6Lew/v3KezqgkfhIqxcvyHT7YuISM5TYEpEss2qhfNxdXHJ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B6Z69eqVrP7u3buTfRUtWjTN4zQajbRv357Tp0/TsWNHrl69Snh4OKdPn+bChQs0bNiQ3bt3M27cuAyfu6+++ooHDx5ga2uLr69vhuvldubZUs2bN6dgwYJA4syppGWPo0KFChQoUADAam6ua9eusWTJElavXs2lS5c4dOgQV69epWnTpty6dYvu3bunG6gpWrQou3fv5qWXXgJg1KhRyd4v1nJw/dOdO3cOwBKUK1myJIBlFlp4eLjVcvP2zMpMe23btrU87XLLli28/fbbTJw4kXr16tGsWbMs9S8iIvJvYP4w6vjx44SHh7N161YA7ty5w507dyz7zZgxA0i8Lg8fPvx/wa8smjRpEm5ubnh4eKTaXtmyZfH396dbt26MHj2anj17sm/fPvbv38+YMWMeq38RkaeBAlMZ9NJLLzFs2DBsbBJPmZOTE8uWLaNo0aJcunSJNWvWWPYNDw9n/fr1QGKAokyZMpay2rVrM3fuXAA++eQToqKiLGWNGjUCkgefjh49SmRkJO3bt6dkyZLpBqYe15YtW9i7dy916tRhxYoVFClSxFJWvHhx1q5di4uLCwsXLszQrKn79+/z3nvvAdCjRw/LzJx/gtDQUOB/wSjAspzvm2++4datW4/dR4kSJQD4448/UpTFx8czcODAZJ/UFShQgJUrV+Lo6MiBAwdS5E7KLjExMURGRib7yin37997ou2nd0OakRvWP//8k/79+z92f56enmzYsIHdu3dz4cIFateuzWeffcbMmTN55513ePnll/H19eXQoUMZ6ktERP4dctN1O7tk9vrv6+vLoEGDuHDhAj4+PowdO9Yye8lkMuHs7MzYsWMtHy4WKFCADz/8kGXLllltr0ePHsTFxaX6kBpze19++SWhoaEUKlQo1fZsbGz47rvvOHz4MCdOnGDevHkMHDiQhQsXsmbNGnx8fPDx8UmWe0pE5J9EgakMGjRoUIpt9vb29OnTB4Bvv/3Wsv3777/HZDLRoEEDnn322RT12rZtS/Hixbl//z579uyxbDcHl5Iu3TN/37hxYxo3bsylS5e4dOkSANevX+f8+fM888wzyYJfj8McUAsICMDOLuVDG4sVK0adOnW4d+9essTLqenduzfh4eEUL16cDz/8MFvGmBuYAwNOTk68/vrrlu0VK1akRo0axMfHJwtWZpU5D0HSAGZS1t6X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m8yePZuuXbty/vx5qlWrRmpqKtu2baN27dp8/fXXmc598sknAax+qWf8+eaypKQkDh48aPn2wGz58uW89NJL7N27FycnJ2rWrIm3tzd79uyhR48eub4htGXhwoW0a9eO8+fP8+CDDxIXF8eaNWto3LgxiYmJDB06lN69e3P16lUqVKjAlStXWLp0Kc8995zNpxTu3r2bwMBAFi5cyIULFwgICMDb25tdu3bRoUMHXnnllSxjOXjwICEhIezZs4fy5cvj4ODAl19+SaNGjfjhhx/YtGkTjRo14siRI1SoUAGj0cgnn3zCk08+yaVLl/L9GRQmMTExHDhwACcnJzp27EjdunWpUKEC8fHxfPjhhzleX7VqVTp37kxycjLTp0/PVZu//fYbe/fuBWDQoEG3FP+d8Pe1awAYjWncuJZg52j+u25cS+Dv+KsAxMbGcvny5VxdN3nyZEaMGEHp0qWtyqpXrw5A+/btqVu3LidOnMDX1zfLGVOrV6/GYDDQpUsXm+VGoxFIn+3XuHFjqlatCkDx4sUBaN26NZ07d6Z58+Y89dRT2cadkJCAq6srzZo1o0KFCly7do3ExET69+/P4sWLcXd3z9X7FxGR/5601NRMf+aXue/Navxz+fJlYmNjuXLliuWY0Wi0bA/RpEkT6tatC/zbFy5dupTU1FSGDx/OgAEDmDx5MgCLFy+22Ya57+3UqZPN8ueff56dO3cydOhQxo4dS8uWLTEajZYv69966y0A5s2bx+DBgwkLCyMhIYH169db1ZWx761YsSJxcXGWvvett97Czc0tNx+biNzllJi6yYQJE5g7dy6//vor3333HRcvXqRr167cuHGDbt26cePGDcu5DRo0ALJOTPn5+fHtt99mmgVj/rl27dqZftE2bNiQr776ioSEBE6dOsV3333H2bNniY6Oplq1aixZsiTf32qMHTuWdevWcf78eaKiojh16hQPPvggP/74I507dyYiIoL/+7//43//+x/Hjx/n+++/p3jx4uzevZsdO3Zkquu3336jXbt2xMfHM3PmTK5cucLRo0c5d+4c+/btw8/Pj7lz5/Lxxx/bjGXixIkMHDiQS5cucejQIS5dusRzzz1HQkICL774Ii+88AKvvfYav//+O4cPH+bXX3+ldu3a/Pnnn7zxxhv5ev+FjXm2VLNmzSxL6cw33bmdHTd58mQcHR1ZtWpVtk/fM9u/fz8AxYoV46GHHspH1CIFb/78+aSmpjJ48OB8J3169OhB37592b9/P9WqVWP58uV07tyZ4cP//cZ669at3H///Tz77LPcd999bNq0yWZd7du3x8fHh6CgID755BNCQ0OZOnUqderUoWnTpvmKT0RE5HZ78MEHWbp0KX/++Sc1a9akX79+1KxZk1WrVgHpX4oC+Pv7A1CuXDkgfSZVfmR82M8ff/zBgQMHcHV1pX79+tm2Zz6eUca+d/v27QwZMoQpU6ao7xX5j1Fi6iZPP/00w4cPx8Eh/aPx8PBg5cqVlC5dmrNnz7JhwwbLueYZUzdvWr17926KFy9Onz59SEpK4sCBA5nK4N+klln9+vV56qmncHR0zHT8oYceYuHChUD6VNf86Nu3L507d7b8XLZsWUaOHAmk37CFh4fTuHFjS3nNmjV54YUXAKwSU3PnzuXy5csMGzaMsWPHZuqY6taty5IlSwAsS2BuFhgYyJw5c3BxcQHSO7bZs9OnKu/atYsGDRpk+vx9fHyYOnWqzVgKmwoVKmTaM8f8Cg8Pz3Teu+++C5BpBoh52dyOHTv4888/c2wrICCAbt26kZKSkqtZU+aN0suXL5/Ld5O9pKQk4uPjM70K0t9/X7P8XTOm7Ofmz97WFPz8io+PZ/ny5bi7u2dajnCznj17kpKSYvn/5mbffvst69ato3r16mzZsoVnn32W9evXZ9qTomHDhnz88cdMnTqVq1evMnLkSFJSUqzq8vPzIyYmhm+++YZTp05RvXp1IiIimDNnDkOHDqVcuXLUrl1bDwYQkbvO7e63peCY+97rCXGsmz0x05L60NBQy+zljH3y5cuXmTVrFkWKFGH9+vWMGzeOY8eOWZby3cw82zgr5r43475Rtly4cIHGjRsTGxvLmjVrbC7hz6m9jH3v6dOnqVWrFqtWrWLOnDm8/PLLPPPMM4SEhKjvFbnHKTF1E1s3SC4uLvTt2xeAzz77zHK8ZMmSVK1alT///NOySe5ff/3Fjz/+yJNPPknDhg2BzDOqzEksc1Iro4SEBJYtW0bPnj1p1qwZTzzxBPXr12fMmDEAWW4amBNba7ODg4Mtf+/du7dV+cMPPwykr1nPaPPmzQCWz+NmLVq0wMXFhf3795NqYypzr169LPtemVWuXBkPD48sY80qlsKmVq1a1KtXz+pl/rYI4Ouvv+b06dN4eHjQpk0by/Fq1aoRHBxMampqpuRndiZOnIiTkxMRERE5fjYJCemDHE9Pz7y/MRtmzZpF0aJFLa8HHnigQOo1y7iE1GTKfvAkt4/5szf/H5vTQDYvVq9eTXx8PD179qREiRJZnmc0GklNTSUtLc1m+bp167h+/TrNmzendevWlkH4tm3bLOeUKlWKFi1aMHHiRKpXr853331ntTegmaenJyEhIfj5+TFt2jRmzJhBdHQ0CxYsYPfu3VSrVi3TbCwRkbvB7e63peCY+16TycTf8Vf5O/4qBtKX1MfGxlr64ox98pdffsnp06epX78+nTp1YsKECUD6hucmk4mAgAAAzp49m+nPm58abZZT3wtw7NgxHn/8cX755Re2bt1Kx44dLWVZtWc+frOMfW/fvn2ZNWsW0dHRLFy4kHfeeYdq1aoxbNiwrD80EbnrOdk7gMKmWrVq2R7/+eefMx1/8skn+emnnyw3LHv27MFkMtGgQQNCQkJwcXGxJKZSU1PZv38/Tk5OlrXfZkeOHOGZZ57ht99+yzK23O7vcrNKlSpZHTPfCJYoUQJvb+8sy69d+3fmyrVr1yzLxswzqrKSmJjIX3/9RalSpXKMBcDX15dz585lG2vGWHIjLCyMiIiILMuz2m9m586dlqRiXmzatCnHGUnmpXrPPvusVZKoa9euREVFsXbtWoYMGZJje5UqVaJHjx6sXLmSadOmWaZr21KkSBEA/v777xzrzY2xY8dmujmPj48v0EGuwWCwJKcMBuXP7cVgcMBkSsNEenLKPJMxJ3v27OGrr77ijz/+AGD79u2cOnUqU0J76dKlODg45JjkWbt2Lb169aJjx46MGjXKqrxKlSpAeiKqevXqlm93zZuqd+vWDR8fH2rXrs3Ro0c5fvw4np6eWQ7GzRYuXIibmxthYWF8/vnnQPqG7UeOHNFeUyJy17nd/bYUHHPfazAY8ChSFIBr8Vcp8c/2D5cvX8ZoNGbqkytXrozBYGDnzp289dZb/PDDD0D6SgWDwcALL7zAvHnzmDdvHi4uLrzzzjsAWc6oMve9oaGhNr8wPXr0KM888wxxcXG8/PLLJCQksGHDBgIDAwkMDGTQoEH07t2b4cOH07ZtW1avXo2Xl1emFRy2LFiwAA8PD3r16sWnn34KpPfvUVFRli+xReTepMTUTUqWLGnzuDnBYp55YtagQQPeeecddu/ezYABAzIt1XN3d+exxx7jwIEDJCcn8/333/P3338TEhKSKSmRlpZGx44d+e2332jZsiWjR4+mRo0a+Pj44OjoyKlTpwgICLC59CQ3bP0iN89ayuqXvLk848yVjE/p27dvX47tZtyPK7tYcorn5hlWuVW5cmXq1atndTwmJoY//viDwMBAihYtalVu61hBSEpK4r333gOwuZFz586dGT16NN999x0nT5603HBnZ+LEiaxdu5a1a9cybty4LL+J8vPzA8jVflS54erqmmkZZ0Hz9PQiISF9mYG7V5Hb1o5kz92riGXzc0hfWpsbq1evZs2aNZaf58yZA2SeaXnhwgXatm2b5b/Z3Bo0aBBnz55l3bp1DB48mPvuu4++fftankJZrFgxNm3axIoVKyybwk6ePJmiRYtm+U3wuXPnmDlzJkuXLgXS94Pr0aMH8+bNo0yZMixYsOCWYhYRudNud78tBcfc93oUKUqXUel92ZJJL7Nx40YAQkNDiY2NzdQnBwUFsWLFCubOncuoUaNwc3Pj6aeftuzPGhAQwKZNmxg/fjwvvfQSfn5+jB07Nl9fxEL6bCnzfUHG7TsmT55MYGAgYWFhnD9/niVLlrBnzx4eeughBgwYkO044ty5c0yfPt1yj9GsWTO6d+/OunXr8PPzy7REX0TuPUpM3eTPP/+kbNmyVsfN3/ybZ56Y3bwB+u7duylatChBQUGW8n379vHtt99aftHevL/Ut99+y6lTpyhXrhybN2+2GjicP3++AN7ZrfPy8rL8PTk5GWdnZztGk7Nx48Yxbtw4q+PmmVQLFy7Md4ecHx999JFlP4Bnn30223PXrl2bq72jypcvT1hYGMuWLWPq1KlZbp5unqFn3qxeG6DL7bRy5UpeeuklgoODrfbNM4uLi7M5W/NmYWFhhIWFkZaWRlRUlFW5k5MTs2fPpkuXLjbbW7hwIX369Mk2lpv5+/tz6dIlS3uOjo5ERERYZmBmFYuIiIi99OrVi169emVZ3rZtW9q2bQvk3I+Z+96sdO3aNdsnhhsMBiZNmsSkSZNy1R6k972xsbGWn80P+Rk6dGie+nARuTtpjcxNzHtFZXW8cuXKmY77+flRsWJFfv/9dw4dOsTRo0d54oknLNNrzUmoXbt2Zbm/lHkWy6OPPmrz26z87i1V0IoWLcr9998PYJkiLLlnThoVKVKEUqVK2XyZH+v77rvvZpqtlp0JEybg4uLC+vXrOXnypM1z7r//fsuTUt5+++0CeDe3l+c/SVAHB0fNmLIjd68ieHr7AOnLbc3/PkVERCQzRyenTH/ml7nvzWr8U7x4cXx9fSlWrNgttSMiUpgoMXUTWzftycnJrFixAkifVnozc6Jp+vTpGI3GTDOi6tati5OTE1999RVff/01jo6OlgSBmXm/kkuXLlnVnZKSwptvvpnv91PQ2rVrB1CoYrob/PXXX5a18h9++CEXL160+Tp9+jRubm6cPXuWvXv35qpuf39/+vTpQ1paGlOmTMnyPPNGmMuWLeOTTz7Jts7ffvst30+BLAhh/frj5VuaPlPfpO0g632F5M5oO2gUXUZNw+jgxMaNG1m8eLG9QxIRESmUXhk7AS/f0vSa/MYt1WPue7Ma/yxevJiNGzdqaZuI3FOUmLrJ9u3bmT9/vmW2yo0bN+jXrx+//fYbDzzwAJ06dbK6xpyI+vDDDzP9DOnL3x555BF27dpFfHw8wcHBVstXQkJCcHJyYt++fZn2ZYmLi6Nr1642E1b2Mnr0aIoXL05ERATDhw+3enz85cuXWblyZa6Wof2XbNiwgZSUFPz9/a2Wcmbk7e1N69atAbJclmfLuHHjcHV1ZePGjVnum9O8eXOGDx+O0Wikbdu2TJkyJdOUaUhfyjp37lxq1qzJd999l+v2RURERERERPJDiambTJ8+nWHDhnH//fdTu3ZtSpcuzZo1a3Bzc+Pdd9+1uTm3ecaUyWSiSJEiPPLII5nKGzRoYEl02UpKlC5d2vII1J49e1KuXDlq1apFmTJl2Lp1a6ZNBe2tbNmyfPjhh/j6+jJv3jxKlizJQw89REhICJUqVcLX15c+ffpw/Phxe4daqJiTTF27ds1xM/du3boB6U/5S0xMzFX9ZcuWpV+/fpkeHWzL3LlzmTp1KiaTifDwcEqVKkWVKlWoU6cOAQEBlC5dmldeeYXExERq166dq7ZFRERERERE8kuJqZuMGjWKyMhIHnjgAX744QcMBgPPPvssBw8etNobyqxixYqWDdPr1atntTlfxmRUVnXMnj2bN998k6pVq3Lx4kXOnj1LkyZN2Lt3Ly1atCigd1cw6tWrx48//sj48eOpXr06p0+f5ujRozg4ONCiRQvefvtt5s+fb+8wC42YmBgOHjwI/Jt0ys7TTz/NfffdR1xcHB999FGu2xk3bhxubm45njdx4kROnjzJqFGjCA4OJjY2lu+//54rV65Qr149ZsyYwalTp2w+OVBERERERESkIOmpfP/IuNF0ly5d8nxTnt2T81q1apXjRtYGg4GhQ4cydOjQHOPLreyuKV++fLblDRs2zLa8RIkSTJ8+PddL9nbt2pVtuXkD+Kzk5/1nZfXq1axevbpA6srpc4T0R/TmJX5nZ2erJXa5aadMmTLcuHEjV21UqFCB1157LdcxiYiIiIiIiNwOmjElIiIiIiIiIiJ2oRlTIlJgXh48AAeHgsl3p6Wl8W37Rri4OdssN5lMWe7XVZjKkpOTcXFxsXsct1Lm5ORI/QaPZz6OiaTEJFzdXDFgyHWZ0WjEt3QxWrRqavVvJb912rOsVInSbH5/q41PTkSk8CvIfvteYsJk9bs/N67fuE7UoT15by+bfhhIf6r3P/1wyRKl1O+IyD1HiSkRKTA9+nTJ1T5XufXJp9t5tkfWTzGUu1VDewdQYLatzPsNiIhIYVHQ/fZ/3Z0Yt6jfEZF7kb4iERERERERERERu1BiSkRERERERERE7EKJKRERERERERERsQslpkRERO6A2bNn065dO5ydnTEYDOzatcvqnMqVK2MwGLLdBDc3UlNTGTVqFK1atcLDw4NSpUrRo0cP4uLiAEhKSmLBggVUqFABNzc36tSpw759+2zWlZSURIcOHfDy8iIoKIgTJ05Yynr37s24ceNuKVYRESkYu3btsvQhGV/ly5cH0vuGkSNHUqFCBR5//HHuv//+TH1DXh04cICGDRtSokQJ3N3dCQwMZN26dZbyFStW8Mgjj1C8eHEaNGjAU089xaFDh2zWlbGvCQwM5PDhw5ayvn37qq8RuccpMSUiInIH3Lhxg3r16lGhQoUsz+nRo0eBtLV27VreeOMNPD09eeONN6hcuTJr167ltddeAyA8PJw1a9bw6KOPMm/ePE6ePMkzzzzD5cuXreqKjIxk8+bNhIeHYzAYmDdvHgA7d+5kz549TJw4sUBiFhGRW1O9enXWr19veYWGhgJQp04dIL1vmDNnDkWKFGHEiBEEBARk6hvy6uTJkxgMBiZMmMCkSZOIiYmhe/fuREdHA+mJq2rVqvHaa6/RtGlT9u7dS6tWrUhLS7Oq6+a+ZsSIEQAcOnSIvXv3qq8RuccpMSUihc7BfYfY+9V+nPFg5/vR7N/+o71DEslk//Yf+ezdw7g4ujNw4MBcXTN58mRGjBhB6dKlszxnzJgxuapr9erVGAwGunTpYrPcaDQCULp0aRo3bkzVqlUBKF68OACfffYZABMmTGDgwIG0aNGCq1evEhkZaVVXQkICrq6uNGvWjAoVKnDt2jUSExPp378/ixcvxt3dPVcxi4jcy776bA/OePB55Pe3XNf+7T/mafwzcOBAQkNDmTx5Mp06daJTp06EhoZaEkSvvPIK8G/f4O/vT+3ata36hpuZ+5pOnTrZLO/UqRM7d+5k6NChjB07lpYtW2I0Gjl69CgAb731FpGRkfTr148JEyZQrFgx/vjjD3777TerujL2NRUrViQuLo7ExERmzpzJW2+9pb5G5B7nZO8ARERulpyUTFJSMgBJ11PsHI2ItaQbKZiMJgwGg81ZRvbWo0cPDhw4wPLly6lWrRoAnTt3Zvjw4UB6wuro0aN8/vnnFC1alO+/T7+RiomJsaqrffv2vPbaawQFBeHo6Mi4ceOYOnUqderUoWnTpnfuTYmIFGJGoxEDBkvy51Yk3UjJ0/jn8uXLxMbGZjr28ccf89NPP9GgQQMee+wxIL1vOHjwIMuWLWPHjh1A5r4hr1xdXS1//+OPPzhw4ACurq7Ur1/fqvzIkSNcuXKFqlWr4ufnZ1XXzX3NO++8w9SpU6lRo4b6GpH/ACWmRKTQSU7OPBhLTky1UyQitmX8N3n16tU73n7Pnj3p1q0bJpPJ8s10Rt9++y3r1q2jevXqzJgxg1WrVrF+/Xoef/xxhgwZwqxZs4iOjmbcuHGMGzeOokWLAmAymazq8vPzIyYmhmPHjlG6dGkOHDjAsGHDiI6OZujQoWzdupVSpUqxcOFCnJw0rBARuVXmPibpRgo734/OVObi6GZZopeSkoKzs7PlC5KM/dHcuXMBGDlypOXYt99+S2RkJLVq1aJz587s2rUrU99wM3Nf4+CQ/SKbCxcu8PTTTxMbG0tkZKTVkvVdu3YxfPhwSpcuzQcffGCzvox9jZ+fH1euXGHcuHGsWbOGl19+mW3btlGqVCnefvttatWqlW08InL30VI+ESl0zDfHBgyZfhYpLDL+myyIb8fzymg0kpqaanOfDoB169Zx/fp1mjdvTuvWrRkwYAAA27ZtAyAoKIjNmzdz8OBBoqOj6dChA0CWg31PT09CQkLw8/Nj2rRpzJgxg+joaBYsWMDu3bupVq1avr9xFxGRzCx9jCl95njGl8HgQGxsLLGxscTFxREbG2vph8x/Hj582PK7uWXLlpZ6zX1Dp06daNCgAS+88ALwb99ws5z6GoBjx47x+OOP88svv7B161Y6duyYqXzDhg20atWKokWLsmvXLqpXr55lXRn7mr59+zJjxgxiYmJYuHCh5f0MGzYsx89PRO4+SkyJSKFjfiKZCVOmn0UKi4z/JnP6Jtlsz549bN26lT/++AOA7du3s3z58kznrF271vL35cuXs337dpt1rV27Fnd3d3r27GmzvEqVKkD6zcaqVat4/fXXAahZsyYA+/btIyIigh9++IEVK1awcuVKqlSpYnVDcbOFCxfi5uZGWFiY5UZlxYoVHDlyhNRUzWwUESkIlj7GAK4ezpleJpMRX19ffH19KVq0KL6+vpZ+yPznnDlzgPS9pTL2V+a+YeXKlWzbts0yq8rcN9zM3Nd0797dZnlUVBRPPPEEFy5coH///iQkJLBhwwaOHz8OpPcPXbp0wcHBgU6dOnH48GE2bNhg6QezsmDBAjw8PNTXiPyHaM69iBQ6Li7Olj2mAFzc9KtKChcXNyfL/h8+Pj65umb16tWsWbPG8rP5xqFv376WYxm/Ce7Xrx8NGjSgRYsWeY5v0KBBnD17lnXr1jF48GDuu+8++vbty7Rp0yznbN++nVWrVuHl5UVoaChz587F3d09y2/Gz507x8yZM1m6dCkAzZo1o0ePHsybN48yZcqwYMGCPMcpIiLWzH2Mq7szT7UPylS2beUeNm7cSFpaGlFRUQQHB9OlSxdiY2Px8fHh3LlzvP/++5QuXZquXbtmunbQoEGcP3+e9957j1dffRVfX1+rviEvoqKiiIuLA7A8sRXSH/YRGBjI3r17MZlM3Lhxw9LnQfpTXUuWLGmzznPnzjF9+nT27dsHQEhICN27d7f0NYsWLcpXrCJSuOluT0RE5A5YuXIlL730EsHBwTg6Oto8Jy4uDm9v70zHbCWKwsLCLN8kR0VFWZU7OTkxe/ZsunTpYrO9evXqsW3btmxjuZm/vz+XLl2ytOfo6EhERAQRERGWOG3FIiIid46/vz8pKbY3TndycuL111/n1VdftSS1susDzH1NfstXr17N6tWrMyXRcupz/P39LRu5p6Wl4ejoyKpVqzJ9sSMi9x4lpkSk0HFxdQEgMSkpfeq6u7OdIxLJzNXdmeTEVIxpxiwfsy0iIv8dDg4OpBnTcHTIXbI/O+ZxT27HP+Z+SP2RiNytlJgSkUKnTr30DZg/+XQ7T7d/zM7RiFir2yp989ZtK/ewePFiO0cjIiL21qj5k+njlq4Nbrkucx+TW+qHRORup83PRURERERERETELpSYEhERERERERERu1BiSkRERERERERE7EKJKRERERERERERsQslpkRERERERERExC70VD4RKTCRERtwcrT+tWI0GnFwsJ0Hz64sKTmJrSt3Y8CQ6bgJE0mJSbi6uRbqMqPRSMypGAIeDMj0HgtTjIXlMylscea2rFSJ0oiI3K2y6rezk12/XZiuy++1Jkxcv34dDw8Pq9//Oclq3JJTe1n1N7aULFEqTzGJiNwNlJgSkQKza+duypYtm+lYWloaUVFRBAcH4+jo+J8qi4+Pp2jRovzv5Bd4e3sXyhgLy2dS2OLMb5mIyN3EVr+dnfz+/rvT193KteZ+Ki4uzqqfuh3tqU8REdFSPhERERERERERsRMlpkRERERERERExC6UmBIREREREREREbtQYkpEREREREREROxCiSkREREREREREbELJaZERERERERERMQulJgSERERERERERG7UGJKRERERERERETsQokpERERERERERGxCyWmRERERERERETELpSYEhERERERERERu1BiSkRERERERERE7EKJKRERERERERERsQslpkRERERERERExC6c7B2AiNw7OrRtg7Ozs9Vxo9GIg4PtPLitsht//02JIp4kJSbh6uaKAUOmchOmfJc5unmw9bPP8/P2RERE7ilZ9dvZya5PL0zX5fdak8nEo0EP0ap5MwwGQ84XZJAQF0+ZYt5W449s28tm3HI7rruVa43GNCqVKE5oi6Y4ODje9vb02RSe627l2rv5s/EpWYrIzVtyXYfknxJTIlJg1i15myJeXrdcz8TRI5n2xMMFEJG10PWf3JZ6RURE7jYF1W9Luts5fik8mto7gEJMn03W7s7PpueWr+wdwn+GlvKJiIiIiIiIiIhdKDElIiIiIiIiIiJ2ocSUiIiIiIiIiIjYhRJTIiIiIiIiIiJiF0pMiYjkoG3bttSqVQsnJycSExMBOHPmDAaD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eNHs1KlTh+joaGbNmsWOHTs4evQonp6eNGvWjKFDh9KyZctc13WzWbNm0bp1axYtWsTevXuJjo7Gy8uLsmXL0qZNG55//nkaN26c7/pFRERERERECpISU5KtM2fO5Oo8W/saNWzYMMcnGQA888wzPPPMM7mOKTw8nPDw8FyfD7B27VrWrl2bZbmHhwc///xztnWULl2aFStW5Kq9nN57uXLlWLJkSa7qgry957p161K3bt1cnZubp02IiIiIiIiI3C5KTIlIgXl58IA8zR7LTlpaGt+2b4SLm7PNcpPJlOW+XrdS5uTkSP0Gj2c+jomkxCRc3VwxYLBZ9kBZf7Z8sC2ntyUiIlJoFGS/fS8xYbLq73Pj+o3rRB3ak/f2shmb3I7rbuXa5ORkXFxc7lh7+mwKz3W3cu2d/GxMRgN+ZSvi6uaa7Xkl9BTuQkWJKREpMD36dMHNza3A6vvk0+0826NBgdV3O21dudveIYiIiORJQffb/3V307hF5F61deVuFrwxl+DgYBwdHe0djuSSviIRERERERERERG7UGJKRERERERERETsQkv5RLKRn43WRURERERERCR3NGNKRERERERERETsQokpEZE7rGnTpjRu3Bh3d3fKli3LkCFDSEpKAuDnn3+mS5cuFCtWDHd3d6pWrcqiRYtuqb24uDhmzZqFn58fLi4u+Pv7s2nTJgAaNWpErVq1cHJywmAwWF6rV6+2qicpKYkOHTrg5eVFUFAQJ06csJT17t2bcePG3VKcIiIiIiK3y5UrV3juued44IEHcHNzw9/fn/Hjx2M0GgFYunSp1ZjYYDAQFhaWr/bCw8Ot6spY3+bNmwEoVaoU3t7ePP744+zcudNmXff6OFxL+USk0Dm47xDJSck448HO96NxdXembqvq9g7Lpv3bfyThyg1cHT0YOHAgixcvzvGamjVrUrduXfz9/Zk3bx5vvfUWVatWZfDgwRgMBurVq0f9+vW5evUqkydP5sUXX6Rhw4ZUrVo1z/GZTCZat27N/v376dSpE02bNuXs2bOkpKQAMGHCBL777jvKly+P0WikX79+JCUlUbt2bau6IiMj2bx5M6+99hoRERHMmzePzp07s3PnTvbs2cOxY8fyHJ+IiMi94KvP9uCMB59Hfk+zro/YOxyR/4z9238k6UZKpvuF+fPnk5SURPHixTONzePi4jhx4gQvvPACJUqUYNasWcycOZPSpUszaNAgGjduTMOGDXFwSJ+/M3PmTI4dO0adOnXyFVv79u0zjd9vrs/d3R2AN998k5MnTzJv3jxCQ0P5448/rOq618fhSkyJSKGTnJRMUlIyAEnXU+wcTfaSbqRgMpowGAxcvnw5V9e88cYb7N69mwceeIDNmzfz008/YTAYAAgICGDAgAGUK1eO33//nTfeeINr165lWdfq1avp1asXHTt2ZNSoUVblO3fuZP/+/QQHB7NmzRrS0tIyPRq8UaNGFC9enODgYDZu3EhiYiKtWrWievXqpKWlZaorISEBV1dXmjVrxp49ezh58iSJiYn079+fxYsXWzpXERGR/xqj0YgBg2XmhYjcGUk3UqzuF65du0ZcXJzVuWXLluXEiRM4OjqmX5uUxLBhw4iKigLgwQcfJDg4GEdHR86dO8eJEyfw9fXNcsZUTuPwwMBAAgMDAWzW9/TTTwPQpEkT7r//fubNm5fl+7zXx+FayiciYgft2rWjcuXKfPbZZ3Tt2pW+fftayk6fPk3p0qV5+OGHuXjxIm+++SY1atTIVzuHDx8GIDY2Fh8fHzw8PHjsscf44YcfrM594403AHjllVds1tW+fXt8fHwICgrik08+ITQ0lKlTp1KnTh2aNm2ar/hERERERO4EJycnS1LKaDSyfft2ID0xdLP58+eTmprK4MGDCyTpk119Dz74IM8++yz33XefZbuNm93r43AlpkSk0ElOzvytR3Jiqp0iyVnG2K5evZrr615//XXWr1/PY489xoYNG/joo48sZX5+fnz66ae88847+Pr6Mn36dP73v//ZrKdnz56kpKTw7rvv2iw3d76xsbEsXryY8ePHc+jQIatvfnbt2sXhw4epVasWDRs2tFmXn58fMTExfPPNN5w6dYrq1asTERHBnDlzGDp0KOXKlaN27docOnQo15+DiIiIiEh+mcfiSTdS0rcAcXQnPj4eyHpsnpSURJcuXfjiiy946aWX6Ny5c6by+Ph4li9fjru7O4MHD86y7ZzG4bmt74MPPmDq1KlcvXqVkSNHWrbcyOheH4crMSUihY7JZALAgCHTz4VRxtjyMn3/kUceoUOHDowZM4a0tLRMm427u7vTtGlT+vXrR8eOHYmNjWXr1q026zEajaSmplotuzMLCAgA0r+J6dq1K6NHjwbg5MmTmc7LabaUmaenJyEhIfj5+TFt2jRmzJhBdHQ0CxYsYPfu3VSrVo3hw4fn5iMQEREREbkllrG4KX0LEIPBwXLM1tj86tWrNG/enI0bNzJ58mTmz59vdc4777xDfHw8PXv2pESJElm2ndM4PLf1NWnShIkTJ1K9enW+++47jh49arOe3IzDhw0blm0shZUSUyJS6Jj3WzJhyvRzYZQxNvNGidnZsWMHYWFhfPDBByxdupSJEycCEBQUBMCsWbN48803Wb16NbNnz2bt2rWZym+2du1a3N3d6dmzp83yFi1aUKlSJU6ePMn8+fMtiamMU5bPnDnDp59+Svny5Wnfvn0u3jUsXLgQNzc3wsLCLJ3xihUrOHLkCKmphXeGm4iIiIjcOyxjcQO4ejhjMhktx24em1+7do169eqxe/duWrRoQdWqVdmwYQNfffWV5ZzU1FQWLFiAg4NDjl+25jQOz6m+Pn36ALBu3Tpefvlljh8/jqenJw8++GC27d6L43Btfi4ihY6Li7Nl83MAF7fC+6vKxc3JsuGij49Pjuf7+vpy/PhxNm/ejNFoxM/PjzFjxjB58mQg/XGxS5cuZdOmTbi4uBAQEMCQIUNo0qRJjt/G2OLs7MyWLVvo3bs348ePx9vbm7CwMObMmWM5JzIyEpPJxMsvv2xZ+pedc+fOMXPmTJYuXQpAs2bN6NGjB/PmzaNMmTIsWLAgz3GKiIiIiOSVeSzu6u7MU+2D2LpyN6V87icuLs5qbB4bG8uPP/4IpH9ZvGPHDgAaNGjAl19+CcCmTZs4f/48bdu2taw8uBXvvfdelvWZ43vppZfw9vamSZMmTJ48maJFi2ZZX07j8EWLFt1yzPZQeO/2RETuQbVq1eLQoUNERUVZnvqRUe/evXnkkUdsltkSFhZm+bbE/ESRm1WvXp0lS5ZkWef48ePZtGlTrtoD8Pf359KlS5b2HB0diYiIICIiAiDbWERERERE7KF8+fJZbhFi/gK4c+fOdOvWLVf15WYc3qVLF7p06WKzbO7cuSxfvpzY2Fi8vb1z1WZO4/C7lRJTIlLouLi6AJCYlISrhzOu7s52jihrru7OJCemYkwzUrx4cXuHIyIiInbg4OBAmjENR4fcfckjIgXDfJ+Q8X7By8sLZ2dnjc3vIkpMiUihU6deLQA++XQ7T7d/zM7RZK9uq+oAbF25m8WLF9s5GhEREbGHRs2fTB+3dG1g71BE/lPMY/GMhg4dmuvVB1I4aPNzERERERERERGxCyWmRERERERERETELpSYEhERERERERERu1BiSkRERERERERE7EKJKRERERERERERsQs9lU9ECkxkxAacHK1/rRiNRhwcbOfBsytLSk5i68rdGDBkOm7CRFJiEq5uroWm7IGy/jbfg4iISGGVVb+dnez67cJ0XX6vNWHi+vXreHh4WPX5Oclq3JJTe1mNMW7HdbdyrdFoJOZUDAEPBuTpc73T71GfTcFfdyvX3unPpqRvqVyfK4WHElMiUmB27dxN2bJlMx1LS0sjKirK5iNb77UyERGRu4mtfjs72fWHhem6W7k2Pj6eokWLEhcXh7e3921v7278bP538gt9NjfRZ5M1e302cnfRUj4REREREREREbELJaZERERERERERMQulJgSERERERERERG7UGJKRERERERERETsQokpERERERERERGxCyWmRERERERERETELpSYEhERERERERERu1BiSkRERERERERE7EKJKRERERERERERsQslpkRERERERERExC6UmBIREREREREREbtQYkpEREREREREROxCiSkREREREREREbELJ3sHICL3jg5t2+Ds7Gx13Gg04uBgOw9+K2WJN65TqkiRTMdNmEhKTMLVzRUDBgB8SpYicvOWvLwVERGRe15W/XZ2suub7XHdjb//pmQRL6vjtsYDuWsvjUolihPaoikODo65vi6v7WlsIiLyLyWmRKTArFvyNkW8rAeHt8vE0SOZ9sTDOZ7Xc8tXdyAaERGRu8ud7rdvh9yOBfKmaQHXZ01jExGRf2kpn4iIiIiIiIiI2IUSUyIiIiIiIiIiYhdKTImIiIiIiIiIiF0oMSUiIiIiIiIiInahxJSISAa7du3CYDBkejk5OdG6detM58XFxeHv74+TkxNhYWH5bu/AgQM0bNiQEiVK4O7uTlBQEDt27Mh0zokTJ2jdujXFihWjbt26PPTQQ/z8889WdSUnJxMaGoqXlxeBgYEcPnzYUjZlyhTGjx+f7zhFRETkzipfvrzVmGTr1q1A+vjhhRdeoHTp0ri7uxMYGMi6detuuU3z+MZgMBASEmI5fvHiRbp37w5AyZIlqVixIlOmTMFkMlnVkZSURIcOHWyOR3r37s24ceNuOU4RubcoMSUid6Xu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RERERERERDrBwBQREREREREREekEA1NERERERERERKQTDEwREREREREREZFOMDBFREREREREREQ6wbfyEVGhCd26C/p66pcVhUIBuVxzHLww0tIV6Ti0KRwAICCQkpwCI2MjyCBTyVPUaQqFAtH3olG9WnWV4yhOZSwudVLcysl6KR5pOdWLtVU5EFH+aWu3s5Nd26yLfFn7AFlld23JaX/arjvZye/+8puvgm3FXK9LRFTcMTBFRIXmdNgZVK5cWWVZRkYGoqKi0KBBA+jp6ZWptISEBFhZWeHP34/D0tKyWJaxuNRJcSsn66V4pOWmXogo/zS129nJ7vtanPIVJG921533sb+C5iMiKg34KB8REREREREREekEA1NERERERERERKQTDEwREREREREREZFOMDBFREREREREREQ6wcAUERERERERERHpBN/KR0QFJoQAACQmJiIhIUElLSMjA0lJSUhISND4Nq7SnKasC9ZJznVS3MrJeikeaawX1ou2Y1e2O5Q/2bXb2cnu/6Y45StI3uy+X+9jf6yb4pOvIHlZN9qxbrQrC3WT23ZbJtiyE1EB3b9/H1WrVtV1MYiIqIx49OgRKleurOtilFhst4mIqCjl1G5zxBQRFZiNjQ0AIDY2FlZWVmrpjRs3xuXLlzXmLc1pCQkJqFKlCh49egRLS8tiWcaiTsuuTopTOYs6jfXCeslLWlmuFyEEGjVqhEqVKmnMR7mTU7udnez+34pTvvzmzen7Vdj700W+/OZl3WjHutGOdaNdWaib3LbbDEwRUYHJ5ZnT1VlZWWm8qOrp6Wm92Jb2NACwtLRUSy9OZSwudVLcysl6KR5pAOtFm7JaL4aGhlK7Q/mTU7udnZzOy+KSr6B5tX2/3sf+WDfFJ19B87JutGPdaFfa6yY37TZbdSJ670aNGlVm04pLOYpTWnaKUzlZL8UjLTvFqZysl+KRRu/f+zgv30e+guYtyv2xbopPvoLmLcr9sW6KT76C5i3K/RXXuuEcU0RUYAkJCbCyskJ8fHy+I+mlEetFHetEM9aLZqwXzVgvVFA8h7Rj3WjHutGOdaMd60Y71s1/OGKKiArMyMgIM2bMgJGRka6LUqywXtSxTjRjvWjGetGM9UIFxXNIO9aNdqwb7Vg32rFutGPd/IcjpoiIiIiIiIiISCc4YoqIiIiIiIiIiHSCgSki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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, axes = plt.subplots(nrows=1, ncols=2, sharey=True)\n", "\n", "cmap = ['#FD7F69', '#9FC9DD', '#89A76F']\n", "style_dict = dict(\n", " orient='h',\n", " palette=cmap,\n", " edgecolor=\"k\",\n", " linewidth=2.0,\n", " errwidth=2.0,\n", " capsize=0.07)\n", "\n", "cmap1 = ['#ECECEC', '#BFBFBF', '#868686']\n", "style_dict1 = dict(\n", " orient='h',\n", " palette=cmap1,\n", " edgecolor=\"k\",\n", " linewidth=2.0,\n", " errwidth=2.0,\n", " capsize=0.07, \n", " alpha=0.8)\n", "\n", "\n", "ax = axes[0]\n", "b = sns.barplot(x=\"s\", \n", " y=\"util\", \n", " data=df.sort_values('util'),\n", " order=labels,\n", " hue='ncores',\n", " hue_order=[4,2,1],\n", " ax=ax,\n", " **style_dict\n", ")\n", "plt.setp(b.patches, linewidth=0.5)\n", "\n", "\n", "b1 = sns.barplot(x=\"s_mapper\", \n", " y=\"util\", \n", " data=df.sort_values('util'),\n", " order=labels,\n", " hue='ncores',\n", " hue_order=[4,2,1],\n", " ax=ax,\n", " **style_dict1\n", ")\n", "plt.setp(b1.patches, linewidth=0.5)\n", "\n", "\n", "ax.set_ylabel('')\n", "ax.set_xlabel('Time (sec)')\n", "ax.set_yticklabels(labels_mod)\n", "ax.set_axisbelow(True)\n", "ax.grid(which='both', axis='x', color='k')\n", "#ax.set_xscale('log')\n", "ax.set_xlim([0, 5e3])\n", "ax.set_xticks(np.arange(0, 6000, 100), minor=True)\n", "ax.grid(which='minor', axis='x', alpha=0.2, color='k')\n", "ax.get_legend().remove()\n", "\n", "\n", "# Add text, runtime percentage out of mapper timing\n", "ncores_order = [4, 2, 1]\n", "for icore, ncores in enumerate(ncores_order):\n", " for ilabels, util in enumerate(labels):\n", " if util==\"chromap\":\n", " continue\n", " \n", " df_target = df.query(f'ncores=={ncores} and util==\"{util}\"')\n", " mean_target = np.mean(df_target['min'].values)\n", " mean_mapper = np.mean(df_target['min_mapper'].values)\n", " \n", " prc = 100 * (mean_mapper) / mean_target\n", " \n", " w = b.patches[0].get_height()\n", " \n", " if prc>100:\n", " signature = f\"~0 : ~100 %\"\n", " else:\n", " signature = f\"{prc:.0f} : {100-prc:.0f} %\"\n", " \n", " b.text( s=signature, \n", " x=mean_target+150, y=ilabels + (icore-1)*w,\n", " ha = 'left', va = 'center', fontsize=8, weight='bold')\n", "\n", " \n", "\n", "ax = axes[1]\n", "b = sns.barplot(x=\"max_rss\", \n", " y=\"util\", \n", " data=df.sort_values('util'),\n", " order=labels,\n", " hue='ncores',\n", " hue_order=[4,2,1],\n", " ax=ax,\n", " **style_dict)\n", "plt.setp(b.patches, linewidth=0.5)\n", "\n", "\n", "b1 = sns.barplot(x=\"max_rss_mapper\", \n", " y=\"util\", \n", " data=df.sort_values('util'),\n", " order=labels,\n", " hue='ncores',\n", " hue_order=[4,2,1],\n", " ax=ax,\n", " **style_dict1\n", ")\n", "plt.setp(b1.patches, linewidth=0.5)\n", "ax.get_legend().remove()\n", "\n", "\n", "\n", "# Add text, runtime percentage out of mapper timing\n", "ncores_order = [4, 2, 1]\n", "for icore, ncores in enumerate(ncores_order):\n", " for ilabels, util in enumerate(labels):\n", " if util==\"chromap\":\n", " continue\n", " \n", " df_target = df.query(f'ncores=={ncores} and util==\"{util}\"')\n", " mean_target = np.mean(df_target['max_rss'].values)\n", " mean_mapper = np.mean(df_target['max_rss_mapper'].values)\n", " \n", " prc = 100 * (mean_mapper) / mean_target\n", " \n", " w = b.patches[0].get_height()\n", " \n", " if prc>=100:\n", " signature = f\"\"\n", " else:\n", " signature = f\"{prc:.0f} : {100-prc:.0f} %\"\n", " \n", " b.text( s=signature, \n", " x=mean_target+550, y=ilabels + (icore-1)*w,\n", " ha = 'left', va = 'center', fontsize=8, weight='bold')\n", "\n", " \n", "\n", "ax.set_ylabel('')\n", "ax.set_xlabel('Maximum Resident Set Size (MB)')\n", "ax.set_yticklabels(labels_mod)\n", "ax.set_axisbelow(True)\n", "ax.grid(which='both', axis='x', color='k')\n", "ax.set_xticks(np.arange(0, 30000, 1000), minor=True)\n", "ax.grid(which='minor', axis='x', alpha=0.2, color='k')\n", "\n", "# fig.suptitle('Benchmark of different Hi-C mapping tools for 1 mln reads (5 iterations)', y=0.99)\n", "\n", "# (x, y, width, height)\n", "bb = (fig.subplotpars.left, fig.subplotpars.top+0.002, fig.subplotpars.right-fig.subplotpars.left, 0.2)\n", "# ax.legend(bbox_to_anchor=bb, title=\"Number of cores\", loc=\"lower right\", ncol=3, borderaxespad=0., bbox_transform=fig.transFigure, frameon=False)\n", "\n", "plt.savefig(\"benchmarking_1mln.mappers.pdf\")" ] }, { "cell_type": "code", "execution_count": null, "id": "a08db361-28ab-4a3d-a69a-4d6869e28a39", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "test", "language": "python", "name": "test" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.13" } }, "nbformat": 4, "nbformat_minor": 5 } pairtools-1.1.3/doc/examples/benchmark/benchmarking_1mln.csv000066400000000000000000000431411474715105500241550ustar00rootroot00000000000000,s,h:m:s,max_rss,max_vms,max_uss,max_pss,io_in,io_out,mean_load,cpu_time,util,ncores 0,444.776,0:07:24,3496.51,4314.64,3468.51,3472.45,0.0,780.64,398.88,1775.19,bowtie,1 1,446.6064,0:07:26,3495.83,4314.77,3466.35,3470.77,0.0,1568.73,396.66,1776.07,bowtie,1 2,439.4402,0:07:19,3495.91,4314.39,3468.05,3471.94,0.0,2373.96,403.7,1781.37,bowtie,1 3,449.5572,0:07:29,3497.03,4314.64,3469.36,3473.22,0.0,3148.84,394.6,1784.75,bowtie,1 4,449.9673,0:07:29,3490.93,4314.89,3470.16,3471.92,40.96,3942.04,393.64,1785.49,bowtie,1 0,280.5757,0:04:40,6019.11,6453.95,5994.93,5998.23,7.86,746.23,366.91,1031.28,bwamem,1 1,286.6525,0:04:46,6004.57,6453.95,5986.34,5988.55,1485.98,1679.14,356.05,1027.24,bwamem,1 2,300.468,0:05:00,6009.04,6517.95,6000.2,6000.56,6660.16,2736.5,375.23,1138.7,bwamem,1 3,336.5047,0:05:36,6027.58,6645.95,6018.34,6018.94,8138.28,3669.41,375.65,1280.85,bwamem,1 4,323.7325,0:05:23,6012.26,6453.95,6002.96,6003.52,8932.21,4602.32,391.87,1291.62,bwamem,1 0,169.2031,0:02:49,17583.51,21017.69,17574.31,17574.8,13309.02,870.68,260.2,441.72,bwamem2,1 1,190.2805,0:03:10,17611.99,20913.7,17601.16,17601.72,29713.3,1554.78,185.67,357.92,bwamem2,1 2,198.262,0:03:18,17553.89,20425.7,17545.7,17546.26,46154.95,2487.69,161.87,328.04,bwamem2,1 3,117.1978,0:01:57,17591.75,20553.7,17583.7,17584.1,46179.89,3669.41,358.44,430.41,bwamem2,1 4,142.6662,0:02:22,17615.75,20688.82,17606.59,17607.45,62596.36,4602.32,301.67,447.83,bwamem2,1 0,155.4555,0:02:35,19062.05,20632.42,19039.34,19042.16,14756.57,0.02,78.1,122.2,chromap,1 1,129.4362,0:02:09,19034.41,20605.15,19011.44,19014.27,14756.57,88.36,86.69,116.07,chromap,1 2,130.3877,0:02:10,19034.32,20605.15,19011.52,19014.34,14756.57,176.69,86.2,121.96,chromap,1 3,133.456,0:02:13,19030.1,20598.45,19007.18,19010.0,14756.57,265.02,84.37,128.14,chromap,1 4,129.5292,0:02:09,19045.01,20615.43,19022.31,19025.15,14756.57,353.35,87.22,134.56,chromap,1 0,4261.7448,1:11:01,7186.76,8679.24,4290.61,5702.39,1719.48,10257.31,36.77,348.34,fanc_bowtie2,1 1,4077.2502,1:07:57,7188.25,8680.68,4290.98,5703.88,1719.5,20183.4,34.11,330.67,fanc_bowtie2,1 2,4131.9376,1:08:51,7189.56,8681.8,4292.67,5709.75,1719.51,30697.16,35.35,351.1,fanc_bowtie2,1 3,4050.4727,1:07:30,9027.23,10823.83,5831.42,7385.27,1719.51,42084.66,35.13,382.96,fanc_bowtie2,1 4,4020.6237,1:07:00,9032.61,10828.28,5837.03,7391.75,2343.53,52412.16,34.58,394.25,fanc_bowtie2,1 0,2731.6263,0:45:31,7185.57,8945.22,5718.36,5838.26,0.38,7029.16,35.71,346.69,fanc_bwa,1 1,2715.4035,0:45:15,9044.39,10839.64,5846.46,7385.01,0.42,14315.23,32.27,353.83,fanc_bwa,1 2,2769.2431,0:46:09,7188.17,9009.55,5735.71,5855.89,0.44,21877.82,37.54,374.56,fanc_bwa,1 3,2706.3695,0:45:06,9043.16,10838.74,5844.58,7393.22,0.44,29434.04,35.55,376.27,fanc_bwa,1 4,2682.8176,0:44:42,6172.31,8945.66,5679.21,5812.1,0.44,37010.45,30.23,380.22,fanc_bwa,1 0,961.0734,0:16:01,21569.48,23347.51,21492.25,21513.06,2618.56,0.02,138.26,532.15,hicexplorer,1 1,908.2106,0:15:08,22286.37,23347.51,22206.49,22228.31,2618.56,0.54,140.61,522.7,hicexplorer,1 2,896.8171,0:14:56,21604.46,23347.51,21524.48,21546.3,2618.56,1.05,138.93,499.36,hicexplorer,1 3,910.574,0:15:10,22440.63,23347.51,22361.79,22382.79,2618.56,1.56,140.63,542.86,hicexplorer,1 4,895.9424,0:14:55,21516.94,23347.51,21469.93,21475.81,2618.56,2.07,138.9,529.28,hicexplorer,1 0,1111.7203,0:18:31,6730.91,7406.83,6675.2,6682.8,237.25,1090.37,186.34,87.74,hicpro,1 1,1130.0595,0:18:50,6730.21,7406.82,6675.14,6682.36,903.14,2215.98,186.08,80.43,hicpro,1 2,1123.3536,0:18:43,6712.22,7406.82,6674.77,6677.97,5265.45,3341.59,182.57,89.92,hicpro,1 3,1181.2436,0:19:41,6715.32,7406.82,6675.26,6680.12,6316.99,4467.2,177.76,100.38,hicpro,1 4,1116.4777,0:18:36,6715.52,7406.82,6674.92,6679.32,6490.31,5592.8,188.64,114.97,hicpro,1 0,951.7772,0:15:51,5457.95,5857.16,5432.96,5439.95,0.0,2882.08,95.15,7.25,juicer,1 1,946.1429,0:15:46,5458.0,16410.45,5433.02,5439.99,0.0,4613.73,92.49,14.04,juicer,1 2,950.1664,0:15:50,5458.07,5857.16,5433.16,5440.17,0.2,7180.02,95.32,26.17,juicer,1 3,1004.5055,0:16:44,5458.27,16410.45,5433.17,5439.37,0.2,10377.86,93.19,30.43,juicer,1 4,1088.6224,0:18:08,5458.32,5857.16,5433.14,5439.08,0.2,13611.21,94.37,43.31,juicer,1 0,1031.7979,0:17:11,5868.29,8533.19,5732.12,5752.16,0.57,0.02,101.37,1048.77,pairtools,1 1,1057.2271,0:17:37,5866.38,8533.06,5731.94,5746.23,5193.45,39.25,101.33,1078.93,pairtools,1 2,1020.0639,0:17:00,5753.98,8533.06,5731.69,5732.67,10586.02,78.47,102.21,1056.3,pairtools,1 3,1044.6887,0:17:24,5852.79,8533.19,5734.25,5766.39,15784.64,117.71,99.64,29.63,pairtools,1 4,1046.266,0:17:26,5824.86,8533.06,5734.24,5757.25,21050.2,156.94,99.64,38.13,pairtools,1 0,482.1029,0:08:02,17068.97,20572.73,16931.91,16951.71,16275.21,0.02,102.18,493.82,pairtools_bwamem2,1 1,482.5261,0:08:02,17079.46,20508.73,16941.46,16956.34,32534.11,39.25,101.73,498.88,pairtools_bwamem2,1 2,488.9997,0:08:08,17055.04,20508.59,16920.96,16939.69,42104.61,78.47,100.17,502.58,pairtools_bwamem2,1 3,484.346,0:08:04,16981.59,20380.6,16961.3,16962.37,45493.36,117.7,93.06,50.54,pairtools_bwamem2,1 4,483.3159,0:08:03,16969.02,20595.51,16944.75,16945.79,61922.79,156.93,99.61,507.64,pairtools_bwamem2,1 0,611.4665,0:10:11,13519.86,15003.46,13507.46,13508.44,22937.93,2801.37,50.95,5.28,tadbit,1 1,442.9993,0:07:22,13559.35,15003.46,13509.66,13529.09,40809.44,6184.54,55.05,25.04,tadbit,1 2,385.3129,0:06:25,13561.27,15003.46,13508.5,13522.26,40809.46,9295.42,59.39,22.13,tadbit,1 3,390.4362,0:06:30,13561.43,15003.46,13509.03,13522.27,40809.5,12333.14,58.93,23.74,tadbit,1 4,447.8446,0:07:27,13560.76,15003.46,13509.25,13528.03,51014.88,15465.8,51.07,24.5,tadbit,1 0,862.2741,0:14:22,3639.61,4465.74,3612.88,3616.18,9401.06,3187.84,73.44,23.31,tadbit_bowtie2,1 1,815.1788,0:13:35,3640.85,4464.65,3582.08,3602.21,9401.11,6292.2,82.09,20.52,tadbit_bowtie2,1 2,817.2921,0:13:37,3736.97,4560.27,3712.91,3716.56,13567.1,9504.59,81.15,19.79,tadbit_bowtie2,1 3,819.7936,0:13:39,3640.98,4464.65,3617.2,3619.83,13567.22,12458.8,80.4,19.48,tadbit_bowtie2,1 4,760.4646,0:12:40,3641.41,4464.98,3621.55,3622.75,13567.24,15676.85,81.76,20.99,tadbit_bowtie2,1 0,444.1354,0:07:24,3496.54,4314.39,3479.12,3481.87,27.41,783.47,400.27,1779.49,bowtie,2 1,446.9715,0:07:26,3496.32,4314.39,3478.36,3481.27,27.41,1570.48,397.44,1782.37,bowtie,2 2,484.7029,0:08:04,3511.4,4338.64,3490.33,3495.52,27.41,2346.41,368.72,1797.04,bowtie,2 3,450.6565,0:07:30,3488.59,4313.88,3466.99,3471.75,27.41,3148.2,393.42,1786.37,bowtie,2 4,453.0468,0:07:33,3488.74,4314.02,3466.96,3470.63,27.41,3936.13,392.09,1793.93,bowtie,2 0,330.2381,0:05:30,6045.63,6645.95,6021.65,6027.11,5173.52,870.68,375.32,1240.4,bwamem,2 1,329.5853,0:05:29,6028.34,6645.95,6019.0,6019.59,6654.07,1803.59,382.07,1265.1,bwamem,2 2,297.1758,0:04:57,6003.03,6453.95,5994.1,5994.56,9493.45,2736.5,363.55,1091.44,bwamem,2 3,263.866,0:04:23,5991.57,6453.95,5982.83,5983.36,10181.14,3669.41,388.27,1039.2,bwamem,2 4,258.637,0:04:18,5992.16,6453.95,5983.26,5983.78,10181.15,4477.87,351.12,927.49,bwamem,2 0,141.9624,0:02:21,17604.44,20094.61,17587.78,17591.4,16300.85,870.68,311.82,444.2,bwamem2,2 1,133.0894,0:02:13,17620.68,20849.7,17603.97,17607.69,26647.44,1554.78,267.76,361.73,bwamem2,2 2,119.1224,0:01:59,17591.03,21040.61,17573.69,17577.37,26647.45,2736.5,354.15,430.73,bwamem2,2 3,119.2461,0:01:59,17618.88,20912.61,17601.95,17605.61,26647.45,3669.41,353.61,437.38,bwamem2,2 4,119.4407,0:01:59,17610.04,20579.05,17592.86,17596.52,26647.46,4602.32,352.7,443.75,bwamem2,2 0,99.0323,0:01:39,19065.62,20682.54,19043.42,19050.13,14756.72,0.02,106.11,105.91,chromap,2 1,93.6757,0:01:33,19075.63,20687.33,19053.32,19060.02,25886.48,88.36,121.88,118.06,chromap,2 2,120.2376,0:02:00,19145.25,20776.39,19130.55,19133.61,37626.33,176.69,104.51,132.92,chromap,2 3,83.0685,0:01:23,18948.87,20569.96,18934.38,18937.44,41077.34,270.34,159.69,144.2,chromap,2 4,98.8891,0:01:38,19049.5,20677.47,19034.7,19037.84,41077.34,353.35,126.08,140.51,chromap,2 0,2463.1096,0:41:03,7184.84,8822.2,4290.22,5704.96,1790.3,9624.3,17.33,337.56,fanc_bowtie2,2 1,2388.2986,0:39:48,7183.59,8820.36,4839.33,5975.55,1790.35,20084.17,17.7,322.7,fanc_bowtie2,2 2,2313.5663,0:38:33,6195.27,8222.25,3496.78,4531.77,1790.41,30597.45,18.65,343.23,fanc_bowtie2,2 3,2351.3693,0:39:11,9008.62,11035.56,5810.7,7349.54,1790.42,41169.94,17.91,356.34,fanc_bowtie2,2 4,2369.8083,0:39:29,7186.87,8822.57,4288.14,5702.9,1790.45,51675.89,19.01,377.66,fanc_bowtie2,2 0,1774.8625,0:29:34,9036.59,11062.79,5886.57,7381.14,180.82,6716.99,24.32,331.93,fanc_bwa,2 1,1740.5138,0:29:00,7185.89,9381.23,5771.89,5896.22,180.85,14316.39,27.45,352.99,fanc_bwa,2 2,1693.8652,0:28:13,7188.38,9315.89,5720.5,5842.73,180.88,21905.75,22.64,337.38,fanc_bwa,2 3,1673.5139,0:27:53,7184.62,9376.55,5740.96,5861.3,180.95,29485.2,22.17,333.76,fanc_bwa,2 4,1671.1137,0:27:51,7186.76,9379.55,5780.07,5902.28,180.97,37075.34,22.58,346.62,fanc_bwa,2 0,746.2236,0:12:26,22026.01,24493.83,21948.96,21969.79,2997.02,0.53,170.7,512.85,hicexplorer,2 1,710.6231,0:11:50,23024.07,24502.34,22945.46,22966.38,3015.5,0.54,171.76,495.71,hicexplorer,2 2,705.1923,0:11:45,22126.58,24493.83,22047.82,22069.79,3015.5,1.05,176.52,507.18,hicexplorer,2 3,712.7222,0:11:52,23066.12,24493.83,22987.89,23008.64,3015.5,1.56,171.49,518.58,hicexplorer,2 4,715.7957,0:11:55,22876.23,24493.83,22797.87,22819.07,3015.5,2.58,172.73,557.14,hicexplorer,2 0,1073.3043,0:17:53,6730.26,7406.83,6678.91,6685.25,9.88,1089.03,184.85,64.55,hicpro,2 1,1038.1439,0:17:18,6730.3,7406.82,6675.17,6685.6,9.89,2215.98,182.2,73.83,hicpro,2 2,1033.7443,0:17:13,6730.34,7406.82,6675.99,6686.95,221.47,3341.59,185.87,88.03,hicpro,2 3,1022.0066,0:17:02,6731.1,7406.83,6675.88,6688.85,222.14,4467.19,188.24,109.28,hicpro,2 4,1094.391,0:18:14,6730.64,7406.82,6676.12,6689.47,222.14,5592.8,175.63,105.96,hicpro,2 0,502.114,0:08:22,5634.02,34265.69,5609.24,5616.47,70.82,2785.59,175.44,10.71,juicer,2 1,502.401,0:08:22,5634.24,6057.17,5609.44,5616.5,70.89,5661.32,175.44,14.17,juicer,2 2,502.5511,0:08:22,5634.45,6057.17,5609.73,5616.78,70.92,8537.05,175.43,18.41,juicer,2 3,500.9428,0:08:20,5634.69,6057.17,5609.77,5616.84,70.92,11412.78,175.96,24.15,juicer,2 4,500.3197,0:08:20,5634.83,6057.17,5610.01,5617.05,70.92,14367.65,176.2,21.5,juicer,2 0,519.8764,0:08:39,6037.57,9285.21,5901.66,5924.11,5249.05,0.02,194.04,1009.67,pairtools,2 1,483.1521,0:08:03,6037.39,9285.21,5901.68,5924.15,5249.05,39.25,200.27,974.78,pairtools,2 2,480.6768,0:08:00,6037.79,9285.21,5903.83,5941.17,5249.05,78.47,201.33,980.38,pairtools,2 3,465.3507,0:07:45,6037.73,9285.21,5903.88,5941.19,5249.05,117.7,194.76,924.69,pairtools,2 4,466.1686,0:07:46,6038.33,9285.21,5903.87,5941.35,5249.05,156.93,194.4,930.11,pairtools,2 0,228.2886,0:03:48,17383.15,22336.79,17245.43,17268.2,0.0,0.02,186.3,427.67,pairtools_bwamem2,2 1,221.768,0:03:41,17381.39,22167.71,17243.96,17266.91,0.0,39.25,193.13,437.76,pairtools_bwamem2,2 2,221.3263,0:03:41,17362.04,22295.71,17224.0,17246.68,0.0,78.47,193.49,445.19,pairtools_bwamem2,2 3,217.581,0:03:37,17340.12,22400.79,17203.5,17233.95,0.0,117.7,196.51,452.01,pairtools_bwamem2,2 4,223.3371,0:03:43,17393.16,22144.79,17255.85,17277.7,0.01,156.93,192.59,462.11,pairtools_bwamem2,2 0,610.9462,0:10:10,13529.42,15232.48,13516.34,13517.79,36766.11,2801.28,49.41,96.95,tadbit,2 1,376.1804,0:06:16,13569.33,15232.48,13545.14,13547.36,61864.18,5678.4,62.61,85.0,tadbit,2 2,300.593,0:05:00,13570.71,15232.47,13518.36,13536.02,61954.27,9211.43,31.59,15.96,tadbit,2 3,297.5085,0:04:57,13570.71,15232.48,13518.59,13531.8,61954.29,12339.2,53.0,24.9,tadbit,2 4,296.7615,0:04:56,13570.29,15232.48,13518.88,13531.85,61954.32,15451.43,72.1,28.21,tadbit,2 0,463.5859,0:07:43,3666.75,4713.83,3630.19,3636.92,0.02,2804.57,129.07,84.87,tadbit_bowtie2,2 1,455.2237,0:07:35,3666.76,4713.65,3630.33,3637.05,0.04,6087.06,128.93,11.28,tadbit_bowtie2,2 2,455.0799,0:07:35,3666.91,4713.66,3630.34,3637.1,0.07,9386.64,128.87,14.03,tadbit_bowtie2,2 3,458.9496,0:07:38,3667.79,4714.59,3631.29,3638.12,321.35,12458.88,123.9,12.09,tadbit_bowtie2,2 4,452.953,0:07:32,3667.88,4714.02,3597.93,3621.82,321.36,15940.75,129.9,20.51,tadbit_bowtie2,2 0,420.8718,0:07:00,3496.11,4314.01,3471.04,3476.4,15.42,768.89,393.0,1654.84,bowtie,4 1,422.8224,0:07:02,3496.45,4314.02,3471.73,3477.1,15.42,1557.63,391.27,1658.74,bowtie,4 2,419.9842,0:06:59,3494.73,4314.02,3470.36,3475.6,15.42,2354.96,393.91,1662.14,bowtie,4 3,420.7907,0:07:00,3495.93,4314.02,3471.43,3476.67,15.42,3145.49,393.27,1666.11,bowtie,4 4,412.5256,0:06:52,3497.47,4314.64,3472.82,3478.16,15.42,3952.15,401.55,1671.29,bowtie,4 0,252.8627,0:04:12,6006.18,6453.96,5982.69,5986.96,0.83,746.23,358.77,908.39,bwamem,4 1,261.662,0:04:21,6007.87,6453.96,5984.64,5988.93,5174.14,1803.59,380.15,999.85,bwamem,4 2,274.3422,0:04:34,6024.01,6581.96,5999.88,6003.05,6023.34,2736.5,373.3,1032.61,bwamem,4 3,298.8224,0:04:58,6014.57,6453.96,5990.63,5993.79,11196.66,3669.41,359.87,1087.63,bwamem,4 4,285.7411,0:04:45,5997.78,6453.96,5988.62,5989.24,12674.78,4477.87,357.24,1036.2,bwamem,4 0,111.3764,0:01:51,17591.11,20784.61,17566.66,17572.18,0.02,932.93,377.1,420.58,bwamem2,4 1,111.2423,0:01:51,17569.3,20537.94,17544.68,17550.22,0.02,1865.84,376.76,425.65,bwamem2,4 2,112.9415,0:01:52,17579.97,20665.95,17555.33,17560.86,0.02,2798.75,371.87,432.32,bwamem2,4 3,111.3421,0:01:51,17573.66,20489.7,17548.98,17554.51,0.02,3731.66,376.83,437.97,bwamem2,4 4,111.3777,0:01:51,17544.64,20889.7,17520.3,17525.84,0.02,4353.51,270.46,325.61,bwamem2,4 0,63.9876,0:01:03,19049.48,20739.12,19027.24,19032.6,14756.71,0.02,122.87,79.43,chromap,4 1,46.2109,0:00:46,17981.29,19696.59,17959.17,17964.53,14756.71,88.36,86.01,43.67,chromap,4 2,46.4987,0:00:46,17964.62,19692.91,17941.91,17947.24,14756.71,176.69,85.48,49.23,chromap,4 3,46.4768,0:00:46,17972.1,19695.5,17949.51,17954.84,14756.71,265.02,85.79,55.0,chromap,4 4,46.1236,0:00:46,17970.75,19693.68,17948.35,17953.68,14756.71,353.35,86.4,60.65,chromap,4 0,1480.6598,0:24:40,6107.95,8576.53,3509.07,4446.13,0.04,9605.84,30.34,315.13,fanc_bowtie2,4 1,1496.7858,0:24:56,9031.23,11498.52,5833.15,7371.95,0.07,20128.0,29.31,332.72,fanc_bowtie2,4 2,1463.532,0:24:23,7184.77,9101.79,4217.2,5669.65,0.07,31165.73,31.89,344.45,fanc_bowtie2,4 3,1450.3658,0:24:10,6120.51,8586.21,3510.02,4468.34,0.07,41105.85,30.36,336.53,fanc_bowtie2,4 4,1452.4516,0:24:12,7187.97,9104.71,4292.93,5709.08,0.07,51577.66,30.16,338.06,fanc_bowtie2,4 0,1150.8569,0:19:10,7186.05,9953.48,5723.31,5859.42,5224.05,6719.89,32.08,312.36,fanc_bwa,4 1,1135.3056,0:18:55,7224.26,9950.27,5660.22,5824.15,5224.08,14390.72,35.73,329.42,fanc_bwa,4 2,1125.9794,0:18:45,9041.66,11507.65,5849.72,7432.53,5224.11,21886.05,34.66,314.55,fanc_bwa,4 3,1128.931,0:18:48,9044.25,11511.71,5853.64,7435.73,5224.14,29477.74,34.51,319.67,fanc_bwa,4 4,1128.7103,0:18:48,9040.23,11509.34,5851.56,7432.95,5224.14,37075.91,34.49,326.24,fanc_bwa,4 0,596.2727,0:09:56,23080.44,26188.7,23034.84,23042.16,0.0,0.53,199.86,493.7,hicexplorer,4 1,594.7958,0:09:54,23219.5,26188.7,23173.16,23180.65,0.0,1.04,203.29,503.47,hicexplorer,4 2,609.9005,0:10:09,23002.46,26188.7,22956.89,22965.46,0.0,1.05,192.2,508.65,hicexplorer,4 3,597.4554,0:09:57,23259.77,26188.7,23215.77,23224.37,19.97,2.01,204.19,518.44,hicexplorer,4 4,622.1449,0:10:22,23509.05,26188.7,23466.36,23474.47,5281.18,2.58,171.82,538.96,hicexplorer,4 0,619.9254,0:10:19,6759.34,7631.43,6704.49,6717.01,3.34,1088.32,295.46,59.78,hicpro,4 1,558.5864,0:09:18,6759.78,7631.43,6705.0,6715.83,3.34,2216.0,327.68,66.81,hicpro,4 2,550.9692,0:09:10,6760.03,7631.43,6716.98,6725.62,3.34,3341.63,337.46,79.54,hicpro,4 3,549.0615,0:09:09,6759.72,7631.44,6717.38,6725.84,3.34,4467.26,338.57,88.86,hicpro,4 4,548.9341,0:09:08,6760.25,7631.43,6717.1,6725.58,3.34,5592.88,339.01,94.98,hicpro,4 0,297.0198,0:04:57,5996.96,6457.18,5977.55,5979.61,3412.56,2785.59,297.18,6.35,juicer,4 1,319.5797,0:05:19,5989.58,6457.18,5979.42,5981.48,9268.84,5739.07,309.19,7.78,juicer,4 2,327.0335,0:05:27,5988.18,6457.18,5977.84,5978.92,10206.69,8537.05,311.25,12.23,juicer,4 3,331.7378,0:05:31,5988.45,6457.18,5978.38,5979.71,16123.1,11364.07,297.09,18.28,juicer,4 4,334.7347,0:05:34,5989.59,6457.18,5979.36,5980.55,19292.39,14066.95,290.47,19.62,juicer,4 0,241.5991,0:04:01,6399.55,10581.27,6265.49,6303.07,0.17,0.02,385.61,935.31,pairtools,4 1,241.5127,0:04:01,6398.66,10581.27,6265.65,6303.01,0.17,39.25,386.39,940.88,pairtools,4 2,242.2225,0:04:02,6399.6,10581.27,6266.3,6303.79,0.17,78.47,384.74,943.77,pairtools,4 3,241.9401,0:04:01,6398.33,10581.27,6264.49,6301.69,0.17,117.7,385.22,947.96,pairtools,4 4,242.4722,0:04:02,6399.78,10581.27,6265.86,6303.43,0.17,156.93,384.24,951.72,pairtools,4 0,149.1161,0:02:29,18032.98,24632.93,17895.58,17910.56,6662.34,0.02,321.06,482.55,pairtools_bwamem2,4 1,129.8502,0:02:09,18011.57,24911.85,17874.46,17889.42,7215.82,39.25,336.11,443.2,pairtools_bwamem2,4 2,149.7954,0:02:29,17943.55,24532.52,17806.29,17821.07,13922.12,78.47,316.37,488.94,pairtools_bwamem2,4 3,151.1137,0:02:31,17982.62,24665.18,17847.23,17861.77,30195.88,117.7,311.36,487.72,pairtools_bwamem2,4 4,151.164,0:02:31,18000.05,24454.96,17865.51,17883.09,46478.44,156.93,310.2,489.74,pairtools_bwamem2,4 0,258.4889,0:04:18,13609.79,15690.48,13542.78,13567.37,15901.3,3103.55,57.27,19.48,tadbit,4 1,226.7053,0:03:46,10086.89,15275.6,10018.9,10043.75,15902.2,5596.25,40.62,76.32,tadbit,4 2,228.1718,0:03:48,8939.3,15275.61,8872.51,8896.66,15902.23,9327.17,39.3,23.97,tadbit,4 3,226.9155,0:03:46,9170.13,15275.61,9102.29,9127.05,15902.26,11800.28,40.77,79.04,tadbit,4 4,225.4808,0:03:45,9664.37,15275.61,9635.06,9642.85,15902.27,14928.92,41.44,83.32,tadbit,4 0,320.7662,0:05:20,3689.32,5212.95,3650.62,3659.72,0.02,3171.16,145.76,25.25,tadbit_bowtie2,4 1,348.5605,0:05:48,3687.51,5211.26,3648.52,3653.68,3011.82,6430.47,170.42,20.75,tadbit_bowtie2,4 2,338.4871,0:05:38,3688.18,5211.85,3649.18,3654.37,3012.64,9240.8,172.35,8.57,tadbit_bowtie2,4 3,340.9527,0:05:40,3689.14,5212.57,3649.83,3654.76,3014.55,12098.38,165.3,65.98,tadbit_bowtie2,4 4,346.3,0:05:46,3688.78,5212.19,3649.61,3654.97,3060.71,15516.58,170.85,94.72,tadbit_bowtie2,4 pairtools-1.1.3/doc/examples/duplicate_distance.ipynb000066400000000000000000005130661474715105500230260ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Should one consider pairs with sligthly mismatching coordinates as duplicates?\n", "Is there a significant enrichment of pairs shifted on one or both sides by just a few base pairs? If so, we should allow small offsets in the deduplication procedure.\n", "\n", "Let's investigate it in an example dataset. It was generated using the Arima Hi-C kit, and published in Ghurye et al. 2019." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from pairtools.lib import headerops, fileio\n", "import pandas as pd\n", "from scipy.spatial import KDTree # Change to cKDTree for faster performance with scipy <1.6.0\n", "import matplotlib.pyplot as plt\n", "from matplotlib.colors import LogNorm\n", "import seaborn as sns" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Read in the pairs file and get the header, take columns from the header\n", "def read_pairs(pairs_file):\n", " pairs_stream = fileio.auto_open(pairs_file, 'r')\n", " header, pairs_stream = headerops.get_header(pairs_stream)\n", " columns = headerops.get_colnames(header)\n", " df = pd.read_table(pairs_stream, comment=\"#\", header=None, names=columns)\n", " return df\n", "\n", "def dup_dist(df, r, cols=['pos1', 'pos2'], p=1):\n", " # KDtree is a data structure that allows for fast nearest-neighbor lookup\n", " tree = KDTree(df[cols].to_numpy())\n", " # Find all pairs within a distance r of each other\n", " pairs = tree.query_pairs(r, p=p, output_type='ndarray')\n", " df['dist1'] = pd.NA\n", " df['dist2'] = pd.NA\n", " ids1 = df['readID'].to_numpy()[pairs[:, 0]]\n", " ids2 = df['readID'].to_numpy()[pairs[:, 1]]\n", " # Calculate the distance between the pairs (we know they are within r of each other, but not the exact distance)\n", " dists1 = np.abs(df[cols[0]].to_numpy()[pairs[:, 1]]-df[cols[0]].to_numpy()[pairs[:, 0]].astype(int))\n", " dists2 = np.abs(df[cols[1]].to_numpy()[pairs[:, 1]]-df[cols[1]].to_numpy()[pairs[:, 0]].astype(int))\n", " return pd.DataFrame({'id1':ids1, 'id2':ids2, 'dist1':dists1, 'dist2':dists2}).sort_values(by=['id1', 'id2']).reset_index(drop=True)\n", "\n", "def calculate_dup_dists(df, cols=['pos1', 'pos2'], r=20):\n", " df = df.drop(columns='readID').reset_index().rename(columns={'index': 'readID'}) # Add fake read IDs, according to the order of the pairs\n", " dup_dists = df.groupby(['chrom1', 'chrom2', 'strand1', 'strand2']).apply(dup_dist, r=r, p=np.inf, # p specifies the Minkowski distance parameter, inf means the maximum distance on either side is r\n", " cols=cols, include_groups=False).sort_values(by=['id1', 'id2']).reset_index(drop=True)\n", " return dup_dists" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is a file created by merging the nodups and dups output from the distiller pipeline using pairtools merge. This way it contains all the original duplicates, but not unmapped reads." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "pairs_df = read_pairs('SRR6675327.hg19.pairs.gz')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Remove unnecessary chromosomes and sample 10 mln pairs for faster computation\n", "pairs_df = pairs_df[pairs_df['chrom1'].isin([f'chr{x}' for x in list(range(1, 23))+['X', 'Y']]) & \\\n", " pairs_df['chrom2'].isin([f'chr{x}' for x in list(range(1, 23))+['X', 'Y']])].sample(int(1e7))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we find pairs that are within 50 bp of each other on both sides, and calculate distances between them." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "dup_dists = calculate_dup_dists(pairs_df,\n", " cols=['pos51', 'pos52'], # Use 5-prime positions of alignment (in this case, stored in the pairs file)\n", " r=50, # Consider pairs with distance less than 50 bp\n", " )" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
id1id2dist1dist2
03303330200
13719372000
29587958600
3105071050800
4197411974000
\n", "
" ], "text/plain": [ " id1 id2 dist1 dist2\n", "0 3303 3302 0 0\n", "1 3719 3720 0 0\n", "2 9587 9586 0 0\n", "3 10507 10508 0 0\n", "4 19741 19740 0 0" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# id1/2 correspond to the fake readIDs we created earlier \n", "dup_dists.head()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "# Convert the distances to a matrix of counts\n", "counts = dup_dists[['dist1', 'dist2']].value_counts().sort_index()\n", "counts_2d = counts.reset_index().pivot(index='dist1', columns='dist2', values='count')" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
dist20123456789...41424344454647484950
dist1
054050699774175254622458445417489650754846...3342313727722612264625672879279225942602
118570368439092105259926012270208124072438...1748136111681198124710941434123111971120
211672298017161665174516521529157215831795...15621324112010771025967126310511047998
312716294118781764173118271627159317681814...157313741123114410929951435107710891020
412715307023511997195619692010183517842090...1569142911311256117810831383113211381069
\n", "

5 rows × 51 columns

\n", "
" ], "text/plain": [ "dist2 0 1 2 3 4 5 6 7 8 9 ... 41 \\\n", "dist1 ... \n", "0 54050 6997 7417 5254 6224 5844 5417 4896 5075 4846 ... 3342 \n", "1 18570 3684 3909 2105 2599 2601 2270 2081 2407 2438 ... 1748 \n", "2 11672 2980 1716 1665 1745 1652 1529 1572 1583 1795 ... 1562 \n", "3 12716 2941 1878 1764 1731 1827 1627 1593 1768 1814 ... 1573 \n", "4 12715 3070 2351 1997 1956 1969 2010 1835 1784 2090 ... 1569 \n", "\n", "dist2 42 43 44 45 46 47 48 49 50 \n", "dist1 \n", "0 3137 2772 2612 2646 2567 2879 2792 2594 2602 \n", "1 1361 1168 1198 1247 1094 1434 1231 1197 1120 \n", "2 1324 1120 1077 1025 967 1263 1051 1047 998 \n", "3 1374 1123 1144 1092 995 1435 1077 1089 1020 \n", "4 1429 1131 1256 1178 1083 1383 1132 1138 1069 \n", "\n", "[5 rows x 51 columns]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Rows correspond to the distance between the left ends of the pairs, columns to the distance between the right ends\n", "counts_2d.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we plot the data as a heatmap. We use log scale since the range of values is huge." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "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fft2lZeXZ9/Ky8vtr2nJPjJrT0v30YwZM9SOHTtUTk6O2rt3r5o5c6by8/NT27ZtU0q1/PkjtccT509jzozAaOk+MmtTS/eT2W+gN/QPucZnBhZKKbV06VKVkJCggoKCVL9+/RxC9VrauHHjVFxcnAoMDFTx8fFqzJgx6quvvmqx43/88ccKQINtwoQJSqn6cK/Zs2er2NhYZbPZ1GWXXab27dvnkfaUl5erUaNGqfbt26vAwEDVuXNnNWHCBHXkyJFma09jbQGgXnnlFftrWrKPzNrT0n30hz/8wf5dat++vbr88svtgwqlWv78kdrjifOnMWcOLFq6j8za1NL9ZPYb6A39Q65h2nQiIiKyjE/cY0FEREQtgwMLIiIisgwHFkRERGQZDiyIiIjIMhxYEBERkWU4sCAiIiLLcGBBREREluHAgoiIiCzDgQWRwDAMvPXWW55uhle54447MH/+fPvjLl26YPHixW7VWVBQgPbt2+PHH390s3VE5GkcWJDPmThxIgzDgGEYCAwMRExMDEaOHIm//e1vqKurc3htXl6eQ3pnSWsahKxatQqXXnop2rRpgzZt2uCKK67Av//9b9P99u7di3fffRcPPPCApe3p0KED7rjjDsyePdvSeomo5XFgQT7pqquuQl5eHg4fPoz3338fw4cPx5QpU3DNNdegpqbG/rrY2FjYbDYPtrR5bN++HePHj8fHH3+Mf/3rX+jcuTNGjRplOmOwZMkSjB07FhEREZa36a677sKrr76KwsJCy+smopbDgQX5JJvNhtjYWJx77rno168fZs6cibfffhvvv/8+Vq9ebX/d6bMQ1dXVuP/++xEXF4fg4GB06dIF6enpAOovBwDADTfcAMMw7I+//fZbXHfddYiJiUF4eDgGDhyIDz74wKEtXbp0wfz58/GHP/wBERER6Ny5M1auXOnwmh9++AG33HIL2rZti7CwMAwYMACfffaZvfwf//gH+vfvj+DgYJx33nmYO3euwwDpTK+++iomT56MPn364Pzzz8eqVatQV1eHDz/8ULtPXV0dNmzYgGuvvbZBWUlJCW699VaEh4cjPj4eL774okO5YRhYvnw5UlNTERISgsTERGzYsMHhNb169UJsbCw2bdqkbQMReT8OLIh+NWLECPTu3RsbN25stPyFF17A5s2b8X//9384ePAg/vd//9c+gMjKygIAvPLKK8jLy7M/Li0txe9//3t88MEH2LNnD6688kqMHj0aR44ccaj7ueeew4ABA7Bnzx5MnjwZ9913H77++mt7HUOHDsVPP/2EzZs34z//+Q+mT59uv2yzdetW3H777XjwwQexf/9+rFixAqtXr8ZTTz3V5PdeXl6OkydPom3bttrX7N27FydOnMCAAQMalD3zzDNISUnBF198gRkzZuChhx5CRkaGw2tmzZqFG2+8Ef/5z39w++23Y/z48Thw4IDDay688EJ88sknTW43EXkhT6dXJWppEyZMUNddd12jZePGjVMXXHCB/TEAtWnTJqWUUg888IAaMWKEqqura3Tf018rSUpKUi+++KL9cUJCgrr99tvtj+vq6lSHDh3U8uXLlVJKrVixQkVERKhjx441Wt+ll16q5s+f7/Dc3//+dxUXF2fallMmT56sfve736mKigrtazZt2qT8/f0bvP+EhAR11VVXOTw3btw4lZqaan8MQN17770Orxk0aJC67777HJ576KGH1LBhw5rcbiLyPpyxIDqNUgqGYTRaNnHiRGRnZ6NHjx548MEHsW3bNtP6ysrKMH36dCQlJSE6Ohrh4eH4+uuvG8xYpKSk2P9uGAZiY2NRUFAAAMjOzkbfvn21swm7d+/Gk08+ifDwcPs2adIk5OXloby83LSNCxcuxOuvv46NGzciODhY+7qKigrYbLZG+2fw4MENHp85G9GU14SEhDSpzUTkvQI83QAib3LgwAEkJiY2WtavXz/k5OTg/fffxwcffICbb74ZV1xxBd544w1tfX/+85+xdetWPPvss+jatStCQkJw0003obq62uF1gYGBDo8Nw7Bf6ggJCRHbXFdXh7lz52LMmDENyqSBAgA8++yzmD9/Pj744AOHwU1j2rVrh/LyclRXVyMoKEh8LQDtAE16zfHjx9G+fXvT/YjIe3HGguhXH330Efbt24cbb7xR+5rIyEiMGzcOq1atwvr16/Hmm2/i+PHjAOoHB7W1tQ6v/+STTzBx4kTccMMN9psTDx8+7FS7UlJSkJ2dbT/Omfr164eDBw+ia9euDTY/P/1X/JlnnsFf/vIXbNmypdH7Js7Up08fAMD+/fsblO3atavB4/PPP9/p13z55Zfo27evaVuIyHtxxoJ8UlVVFfLz81FbW4uff/4ZW7ZsQXp6Oq655hrceeedje7z/PPPIy4uDn369IGfnx82bNiA2NhYREdHA6iP7vjwww9x8cUXw2azoU2bNujatSs2btyI0aNHwzAMzJo1q8FaGWbGjx+P+fPn4/rrr0d6ejri4uKwZ88exMfHY/DgwXjiiSdwzTXXoFOnThg7diz8/Pywd+9e7Nu3D/PmzWu0zoULF2LWrFl47bXX0KVLF+Tn5wOA/VJKY9q3b49+/frh008/tQ8yTvnnP/+JhQsX4vrrr0dGRgY2bNiAd9991+E1GzZswIABA3DJJZfg1Vdfxb///W+8/PLL9vLy8nLs3r3bYfEtImqFPH2TB1FLmzBhggKgAKiAgADVvn17dcUVV6i//e1vqra21uG1OO2GzJUrV6o+ffqosLAwFRkZqS6//HL1xRdf2F+7efNm1bVrVxUQEKASEhKUUkrl5OSo4cOHq5CQENWpUye1ZMkSNXToUDVlyhT7fgkJCer55593OG7v3r3V7Nmz7Y8PHz6sbrzxRhUZGalCQ0PVgAED1GeffWYv37JlixoyZIgKCQlRkZGR6sILL1QrV67U9kFCQoK9D07fTj9mY1566SV10UUXNahr7ty56uabb1ahoaEqJiZGLV68uEE/Ll26VI0cOVLZbDaVkJCgXn/9dYfXvPbaa6pHjx7i8YnI+xlKKeWxUQ0RtSqVlZXo0aMH1q1b1+BmTIlhGNi0aROuv/567WsuvPBCTJ06FbfeeqsFLSUiT+E9FkTUZMHBwVi7di2OHj1qab0FBQW46aabMH78eEvrJaKWxxkLImp2TZmxIKKzA2/eJKJmx/+/EPkOXgohIiIiy3BgQURERJbhwIKIiIgsw4EFERERWYYDCyIiIrIMBxZERERkGQ4siIiIyDIcWBAREZFl/j+iapC87uSOUgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Now we plot\n", "f, ax = plt.subplots()\n", "im = ax.imshow(counts_2d,\n", " norm=LogNorm(),\n", " cmap='rocket_r',\n", " )\n", "cb = plt.colorbar(im, ax=ax)\n", "ax.set(xticks=np.arange(0, 51, 5), yticks=np.arange(0, 51, 5), ylabel='Distance 1 (bp)', xlabel='Distance 2 (bp)')\n", "cb.set_label('Number of duplicates')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Interestingly, there is a strong enrichment of the first columns / top row, which almost doesn't get weaker with increasing distance.\n", "\n", "Probably it corresponds to pairs where one end of the final sequenced fragment is at an unligated restriction site used in the procedure. When this analysis is performed with micro-C data, where the enzyme doesn't cut at specific sequences, this is not observed." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's zoom into the top-left corner. That's where one might observe enrichment of nor precisely matching duplicates." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhYAAAGwCAYAAAD16iy9AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABfwklEQVR4nO3deVxU9foH8M8ZlgHZFBWBBNRcccEFc03B3CZzzzUVNSuvmFuZUplLKi65ZLhf16z0Z4rapqIpal0NUFKTXDFRQdKUVQdkzu8PLnMdWWfmCzMwn3ev83o1Z3nmYTjIw/lukizLMoiIiIgEUJg6ASIiIqo4WFgQERGRMCwsiIiISBgWFkRERCQMCwsiIiIShoUFERERCcPCgoiIiISxNnUCpU2j0eDu3btwcnKCJEmmToeIiPQkyzLS0tLg6ekJhaJ0/h5+8uQJsrKyhMSytbWFnZ2dkFjlUYUvLO7evQsvLy9Tp0FEREZKSEhAzZo1hcd98uQJ7O0dAGiExHN3d0d8fLzFFhcVvrBwcnLK/R9FdUiScZVuzIuNBWSUKztbTNXtVj9DSBwAePy3mNvB2i5HSBwAsK4kZmJYhaO4v3LkbEE5KcXlpMkS8w+iwk5cTjmPxNwHVs5WQuIAgCZDUE6VbYTEAXL/GhcS54mYewAActLFxJIEfevSnj6F37Go//17LljukwoNFNY1ABj7ZFtGUlISsrKyWFhUVHnNH5KkMLqwcLQS93Fl54j5iXOyEZeTtaCvz9paXJOTtbWYf3StbAQWFhBUWAjMSSMLKiwE5vRU0H1gbSOusMixEZSTrbifO1kjqLDIEVdYPLUWVFgI/g1T2s3ZEiSjf0/Ign4Wy7MKX1gQERGVhCRJAooX9uVjYUFERAQWFqJwuCkREREJUy4KizVr1qB27dqws7NDq1atcPLkSVOnREREFYwk6D9LZ/aFxa5duzBlyhR89NFHOHfuHF5++WWoVCrcunXL1KkREVEFktcUYuxm6cy+sFi+fDnefPNNjBs3Do0aNcLKlSvh5eWFtWvXFni+Wq1GamqqzkZERFSWWrduDV9fX6xevdrUqZQ5s+68mZWVhZiYGMycOVNnf/fu3fHrr78WeE1oaCjmzp1bFukREVEFohDwxEH+b1NIVFQUnJ2dRaRV7pj1E4v79+8jJycHNWrU0Nlfo0YNJCUlFXhNSEgIUlJStFtCQkJZpEpEROUc+1iIYdZPLPI8X0HKslxoValUKqFUKssiLSIiInqOWRcW1apVg5WVVb6nE8nJyfmeYhARERlDZFOIJTPrphBbW1u0atUKEREROvsjIiLQvn17E2VFREQVEUeFiGHWTywAYNq0aRg5ciT8/f3Rrl07bNiwAbdu3cL48eNNnRoRERE9x+wLiyFDhuDBgweYN28eEhMT0aRJE/z444/w8fExdWpERFSBKAR0vmRTSDkoLABgwoQJmDBhgqnTICKiCoxrhYhRLgoLIiKi0iZJuR04jcFF0y2osHjHswOUChujYngMEHfLyI/VQuJY9xwuJA4A2CffFhZLFMm5iphAlZzExAEgP7ovJpBG4D9BCjH9sCWnykLiAIBSEpOTnPqPkDgAhH3mkp29kDgAgKoeYuKk/C0mDgCoxfz7BGdXIWFyMh4DEf8REotKn8UUFkREREUR0RTCCbJYWBAREQHI7bypMLowYGFh1vNYEBERUfnCJxZERERgU4goLCyIiIgAIYuIsbAoB00hJ06cQO/eveHp6QlJkrBv3z5Tp0RERESFMPvCIiMjA35+fggLCzN1KkREVIEpJEnIZunMvilEpVJBpVKZOg0iIqrg2MdCDLMvLPSlVquhfmZyl9TUVBNmQ0REZFnMvilEX6GhoXBxcdFuXl5epk6JiIjKgbx5LIzdLF2FKyxCQkKQkpKi3RISEkydEhERlQN5TSHGbpauwhUWSqUSzs7OOhsREVFxRD6xaN26NXx9fbF69WoTf1Vlr8L1sSAiIjK1qKgoi/3D1uwLi/T0dFy7dk37Oj4+HrGxsXB1dYW3t7cJMyMioopEggKSkavySrIsKJvyy+wLi+joaAQGBmpfT5s2DQAQFBSErVu3migrIiKqaDjzphhmX1gEBARAZgVIRERULph9YUFERFQWhMycyVEhLCyIiIhyGd8UAjaFWE5h4a+2QiWFlVExFO5VBWUDKDr2EhPISty3UKpWU0wgWzsxcQBISgcxgXKeiokDAII+JjntvphAAGRBX5/kWEVInNxgxv285VHUshUSBwDk9IdC4gj9nKyVQsJohETJpXCvKySOpKwkJI5VWrqQOFQ2LKawICIiKoqIphCZTSEsLIiIiACOChGlws28SURERKbDJxZERERgU4goLCyIiIiQO57D+KYQMuumkNDQULRu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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f, ax = plt.subplots()\n", "im = ax.imshow(counts_2d.iloc[:20, :20],\n", " norm=LogNorm(),\n", " cmap='rocket_r',\n", " )\n", "cb = plt.colorbar(im, ax=ax)\n", "ax.set(xticks=np.arange(20), yticks=np.arange(20), ylabel='Distance 1 (bp)', xlabel='Distance 2 (bp)')\n", "cb.set_label('Number of duplicates')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "normed = counts_2d / np.sqrt(counts_2d.mean(axis=0).to_numpy() * counts_2d.mean(axis=1).to_numpy()[:, np.newaxis])" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f, ax = plt.subplots()\n", "im = ax.imshow(normed,\n", " norm=LogNorm(vmin=0.1, vmax=10),\n", " cmap='coolwarm',\n", " )\n", "cb = plt.colorbar(im, ax=ax)\n", "ax.set(xticks=np.arange(0, 51, 5), yticks=np.arange(0, 51, 5), ylabel='Distance 1 (bp)', xlabel='Distance 2 (bp)')\n", "cb.set_label('number of duplicates / expected (product of marginals)')" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh4AAAG4CAYAAAAKbu4kAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB2F0lEQVR4nO3dd1hTZ/sH8O8hQEAEFBUBRdwDB6JiXXUvat27reJq6ysWFEel1lkVRx21Vq2+zmqrP+ustiJubaviwFGtEytVrNYqyJCRnN8fvqRGZk4eSAjfz3Wd6zIn59y5CQFunynJsiyDiIiIqABYmToBIiIiKjpYeBAREVGBYeFBREREBYaFBxERERUYFh5ERERUYFh4EBERUYFh4UFEREQFhoUHERERFRgWHkRERFRgWHgQERFRjlJSUoTFYuFBREREesLDwzFkyBBUqVIFNjY2KFasGBwdHdGqVSvMnj0bDx48UBybhQcREVEh17NnT5QsWRJ9+vQxKs6uXbtQo0YNBAQEwMrKChMmTMCOHTsQHh6ONWvWoFWrVjh48CAqV66MkSNH4vHjxwa/hsRN4oiIiAq3I0eOICEhARs2bMD333+vOE7jxo0xZcoUdOnSBVZW2bdN3L9/H1988QXKli2LcePGGfQaLDyIiIgswNGjR7Fs2TKjCo+CwK4WIiIiEzp+/Di6du0KDw8PSJKEXbt2Zbpm+fLlqFSpEuzs7NCwYUOcOHGiwPPUaDSIiorC06dPjYpjLSgfs6XVavHgwQM4OjpCkiRTp0NERAaSZRnPnz+Hh4dHjs3/xnjx4gVSU1OFxJJlOdPfG7VaDbVaneX1iYmJ8PHxwdChQ9G7d+9Mz2/duhVjxozB8uXL0bx5c3z99dfw9/fH1atXUaFCBSE5Z2XMmDGoW7cuhg8fDo1Gg1atWuGXX35BsWLFsHfvXrRu3VpZYNnCxcTEyAB48ODBg0chP2JiYvLl70RycrJcEipheRYvXjzTuWnTpuUpFwDyzp079c41btxYHjlypN65mjVrypMmTdI7d+TIEbl3797GvBV6ypUrJ0dGRsqyLMs7d+6UPTw85OvXr8uTJ0+WmzVrpjiuxbd4ODo6AgAOtG4MB2vjvtzKISNEpAQAsIp7IiSOpkQZIXEAwCo5QUwglY2YOABkI79nGbQ2dkLiAIAka4XE0VqLy0kcMV8bAFilJguJI1vbCokDAJJWIySOVmBO4ohrCVC9iBcTSNDPyvOkZFTvF6T7fS5aamoqnkKD9apKKGbk+5gELYYkRCMmJgZOTk6689m1duQlt3PnzmHSpEl65zt27IhffvnFqFxz8/fff8PNzQ0A8OOPP6Jv376oXr06hg8fjqVLlyqOa/GFR0Zzl4O1NYrbGPflOjkUE5ESAMAqLUlIHI3InKzE/FIWW3iIiWWWhYfAnIQR9LUBgJWNmK5NFh55JAksPFTpYgIJ/DwByPfucgcbFYpJKqNiSLIG0ABOTk56hYdSf//9NzQaDcqWLat3vmzZsnj48KHucadOnXD+/HkkJiaifPny2LlzJ/z8/Ix67bJly+Lq1atwd3fH/v37sXz5cgBAUlISVCrl75PFFx5ERER5IVlLsDKyuJHk/CmOXi+65NfGkYSHhwt/zaFDh6Jfv35wd3eHJEno0KEDAOD06dOoWbOm4rgsPIiIiABINlaQjGw5kgSvUFG6dGmoVCq91g0AePToUaZWENGmT5+OOnXqICYmBn379tV1F6lUqkxdP4Zg4UFERGSmbG1t0bBhQ0RERKBnz5668xEREejevXu+v35WK6EGBAQYFbNQFB7Lly/HggULEBsbi9q1a2PJkiV48803TZ0WERFZECuVBCsr47pKrLSG35+QkIBbt27pHkdHRyMqKgouLi6oUKECQkJCMGjQIDRq1AhNmzbFqlWrcO/ePYwcOdKoXLNiyKDRoKAgRa9h9oWHqeYvExFR0SLZSJCMLDwkBYXH2bNn0aZNG93jkJAQAC9bFtavX4/+/fvjyZMnmDlzJmJjY1GnTh38+OOP8PLyMirXrCxevDhP10mSpLjwMPsl09944w00aNAAK1as0J2rVasWevTogbCwsEzXp6Sk6G3fGx8fD09PT/zcvpnRs1qqThpl1P2vsnr2t5A4mpKuQuIAgFXyczGBOKslTyx+Vgun0xYskbNaks1rOm18YhLc334fcXFxQmaKZIofHw9nZ2fscq8FByvjZrUkajXoEXst33K1BGa9ZHrG/OWOHTvqnc9p/nJYWBicnZ11h6enZ0GkSkREhZyVtSTkAAA/Pz94e3vjq6++MvFXZX7Muqslr/OXXxUaGqprpgL+bfEgIiLKiciulsjISIto8fjzzz+xZ88e3Lt3L9OS8osWLVIU06wLjwy5zV9+VU7r4RMREVHeHDp0CN26dUOlSpVw/fp11KlTB3fv3oUsy2jQoIHiuGbd1WLK+ctERFS0WKkEdLWoLGcz0tDQUIwbNw5XrlyBnZ0dtm/fjpiYGLRq1Qp9+/ZVHNesC49X5y+/KiIiAs2aNTNRVkREZIkklSTksBTXrl3TrdlhbW2N5ORkFC9eHDNnzsS8efMUxzX7rpaCnL9MRERELzk4OOhmiXp4eOD27duoXbs2gJdjMJUy+8KjIOcvExFR0WWlMr6rxAqW0+LRpEkT/Pzzz/D29kaXLl0wbtw4XL58GTt27ECTJk0UxzX7wgMARo0ahVGjxK2hQURE9DrJSsCslnzaJM4UFi1ahISEBAAv921JSEjA1q1bUbVq1TwvNJaVQlF4EBER5TdJZQVJZeQmcTDrNTkNUrlyZd2/ixUrhuXLlwuJW2QKjwptfeBkZ9w029TipQRlA9gKWjD2adlaQuIAgH1KnJhAAhfDTbMpJiROukrcSpO2aUlC4shGbr/9Kq2VmBVeNVbifiVoJeNWgMxQLOWZkDiAuK9PFrhKaJKts5A4NpqU3C/KayzHF0LiaAR9Lp//73/dhYmfnx9UKhUCAwMRGBho6nSMkpqaikePHkGr1V+JVum2JUWm8CAiIsqJyDEelrCA2I0bNzB8+PBMK4VnrKWl0SjbgoCFBxEREV4uVmmKTeLM1dChQ2FtbY29e/fC3d0924U7DcXCg4iIiDKJiorCuXPnULNmTaFxWXgQEREBkFQwuqtFspyxpfD29jZqvY7smPXKpURERAWFK5fqmzdvHiZOnIijR4/iyZMniI+P1zuUMvvC4/jx4+jatSs8PDwgSRJ27dpl6pSIiIgsXvv27XHq1Cm0a9cOrq6uKFmyJEqWLIkSJUqgZMmSiuOafVdLYmIifHx8MHToUPTu3dvU6RARkYWSrKwgWRm5joeR95uTI0eO5Etcsy88/P394e/vb+o0iIjIwglZudTI+81Jq1at8iWu2RcehkpJSdFtagPAqH4oIiKiouTSpUuoU6cOrKyscOnSpRyvrVevnqLXsLjCIywsDDNmzDB1GkREVMgIWUCskO/VUr9+fTx8+BCurq6oX78+JEmCnMVq1FxA7BWhoaEICQnRPY6Pj4enp6cJMyIiosJAZFdLYV0yPTo6GmXKlNH9Oz9YXOGhVquhVhu3JwsRERU9kiRgcOn/9vEprEume3l5ZflvkSyu8CAiIiLj7dmzJ8vzkiTBzs4OVatWRaVKlQyOa/aFR0JCAm7duqV7HB0djaioKLi4uCjeGY+IiOh1nNWir0ePHlmO8cg4J0kSWrRogV27dhm0rofZTzg+e/YsfH194evrCwAICQmBr68vpk6dauLMiIjIkmQMLjX2sBQRERHw8/NDREQE4uLiEBcXh4iICDRu3Bh79+7F8ePH8eTJE4wfP96guGbf4tG6dessR9QSERFR/gkODsaqVavQrFkz3bl27drBzs4OH3zwAX777TcsWbIEw4YNMyiu2RceREREBYFdLfpu376d5QBZJycn3LlzBwBQrVo1gzeSM/uuFiIiooKQsWS6sYelaNiwISZMmIDHjx/rzj1+/BgTJ06En58fAODmzZsoX768QXGLTIuHjUc52BSzMypGsspWUDbAg/JvCIljBWULuGQl3V7M16eRxH2sNFAJiaMS+D69UDkIiWOjTcn9ojySJTG/7LSC4gCARtCvl1R7435uX2UtpwmJky7ZCIkDABpZzGfcBuI+T3E2ZYTEkSHmf/8JVkXmT5VZ+e9//4sePXqgfPny8PT0hCRJuHfvHipXrozdu3cDeDkBZMqUKQbF5XeTiIgI7Gp5Xc2aNXH16lUcOHAAN27cgCzLqFmzJjp06ACr/7Xs9OjRw+C4LDyIiIjAwuNV6enpsLOzQ1RUFDp37ozOnTsLi205nVFEREQkhLW1Nby8vBTvx5ITFh5ERET4t8XD2AN4uVeLt7c3vvrqKxN/Vcp9+umnCA0NxT///CM0rll3tYSFhWHHjh34/fffYW9vj2bNmmHevHmoUaOGqVMjIiIL87JwMHKvlv8VHoV1r5ZXLV26FLdu3YKHhwe8vLzg4KA/sP78+fOK4pp14XHs2DEEBgbCz88P6enpmDx5Mjp27IirV69megOIiIiMIVkZv/KopLGMMR6AsoGjeWHWhcf+/fv1Hq9btw6urq44d+4cWrZsaaKsiIiILN+0adPyJa5ZFx6vi4uLAwC4uLhke01KSgpSUv6dzx4fH5/veRERUeHHWS0Fo9AMLpVlGSEhIWjRogXq1KmT7XVhYWFwdnbWHZ6engWYJRERFVZcuVSfRqPB559/jsaNG8PNzQ0uLi56h1KF5h0aPXo0Ll26hO+++y7H60JDQ3W76MXFxSEmJqaAMiQiIrIcM2bMwKJFi9CvXz/ExcUhJCQEvXr1gpWVFaZPn644bqHoavnoo4+wZ88eHD9+PNc14dVqNdRqdQFlRkREloJdLfo2b96M1atXo0uXLpgxYwYGDhyIKlWqoF69ejh16hSCgoIUxTXrFg9ZljF69Gjs2LEDhw8fRqVKlUydEhERWSiR63hYgocPH6Ju3boAgOLFi+vGWb799tvYt2+f4rhmXXgEBgZi06ZN+Pbbb+Ho6IiHDx/i4cOHSE5ONnVqREREFq18+fKIjY0FAFStWhUHDhwA8HKNEmN6Fsy68FixYgXi4uLQunVruLu7646tW7eaOjUiIrIwHFyqr2fPnjh06BAAIDg4GFOmTEG1atUwePBgDBs2THFcsx7jIcuyqVMgIqIigmM89M2dO1f37z59+qB8+fL45ZdfULVqVXTr1k1xXLMuPIiIiMg8NGnSBE2aNDE6DgsPIiIiQEhXiSV1tQDA/fv38fPPP+PRo0fQarV6zymd1VJ0Co/0NCBdZVQIrcpGUDKASk4XEkeCuO4orSTmB8ZamyokDgDIVmKmRssQ1/xpLacJiSMLer8BwC4tQUicJFtxm1qJep/SJFshcQBxnwOtwOFxDloxqytLsjb3i/LIRhLzM5wqF7KlDSTp5WFsDAuxbt06jBw5Era2tihVqhSkV742SZJYeBARERlDkgSM8fjfH2c/Pz+oVCoEBgYiMDBQRHoFburUqZg6dSpCQ0NhJbAlh4UHERGRYJGRkXByEteCaApJSUkYMGCA0KIDMPPptERERAWF02n1DR8+HNu2bRMely0eRERE4HTa14WFheHtt9/G/v37UbduXdjY6I9zXLRokaK4LDyIiIgokzlz5iA8PBw1atQAgEyDS5Uy68JjxYoVWLFiBe7evQsAqF27NqZOnQp/f3/TJkZERBaH02n1LVq0CGvXrsWQIUOExjXrwqN8+fKYO3cuqlatCgDYsGEDunfvjgsXLqB27domzo6IiCyJZGV8V4nAWfImp1ar0bx5c+Fxzfot6tq1K9566y1Ur14d1atXx+zZs1G8eHGcOnXK1KkRERFZtODgYHz55ZfC45p1i8erNBoNtm3bhsTERDRt2jTb61JSUpCSkqJ7HB8vZnEeIiKybBxcqu/MmTM4fPgw9u7di9q1a2caXLpjxw5Fcc2+8Lh8+TKaNm2KFy9eoHjx4ti5cye8vb2zvT4sLAwzZswowAyJiMgiWFm9PIyNYSFKlCiBXr16CY9r9oVHjRo1EBUVhWfPnmH79u0ICAjAsWPHsi0+QkNDERISonscHx8PT0/PgkqXiIjIIqxbty5f4pp94WFra6sbXNqoUSNERkbiiy++wNdff53l9Wq1Gmp1IdsfgIiITE6SJKOmiWbEoJyZfeHxOlmW9cZwEBERicDptAXDrAuPTz75BP7+/vD09MTz58+xZcsWHD16FPv37zd1akREZGE4uLRgmHXh8ddff2HQoEGIjY2Fs7Mz6tWrh/3796NDhw6mTo2IiIgUMOvCY82aNaZOgYiIigpJwKyWQr6CmIuLC27cuIHSpUtj2LBh+OKLL+Do6Cj0NQr3O0RERCTK/7pajDlQyLtaUlNTdetfbdiwAS9evBD+Gmbd4kFEREQFp2nTpujRowcaNmwIWZYRFBQEe3v7LK9du3atotcoOoXHy0X4jQshawUlAxRLfSYkTrpK3NRhraQSEkeCLCQOANiki5nBlG5lKyQOAGgkMT82ak2SkDgiSbK4751KThcSx0rWCIkDiPtsivpZAYA0KzE/w9baVCFxAEClFfO9s5PE/M5Mg/j/dWdFkqwgGft34n/3+/n5QaVSITAwEIGBgSLSKxCbNm3C4sWLcfv2bUiShLi4OOGtHkWn8CAiIsqJiK6S/90fGRkJJycnAUkVrLJly2Lu3LkAgEqVKuGbb75BqVKlhL4GCw8iIiLKJDo6Ol/icnApERER/l1AzNjDkhw7dgxdu3ZF1apVUa1aNXTr1g0nTpwwKqZlvUNEREQKGTujRcQCZOZk06ZNaN++PYoVK4agoCCMHj0a9vb2aNeuHb799lvFcQtV4REWFgZJkjBmzBhTp0JERGTRZs+ejfnz52Pr1q0ICgpCcHAwtm7dirlz5+Kzzz5THLfQFB6RkZFYtWoV6tWrZ+pUiIjIEknSvzMgFR+W0+Jx584ddO3aNdP5bt26GTX+o1AUHgkJCXj33XexevVqlCxZ0tTpEBGRBWJXiz5PT08cOnQo0/lDhw7B09NTcdxCMaslMDAQXbp0Qfv27TFr1qwcr01JSdHbvTZjBTYiIqIcWQlYMt2CBpeOGzcOQUFBiIqKQrNmzSBJEk6ePIn169fjiy++UBzX7AuPLVu24Pz584iMjMzT9WFhYZgxY0Y+Z0VERGTZ/vOf/8DNzQ0LFy7E//3f/wEAatWqha1bt6J79+6K45p14RETE4Pg4GAcOHAAdnZ2ebonNDQUISEhusfx8fFGNQkREVHRIEkSJCPHaBh7v7np2bMnevbsKTSmWRce586dw6NHj9CwYUPdOY1Gg+PHj2PZsmVISUmBSqW/dLFarYZaLW4ZcSIiKiK4O22BMOvCo127drh8+bLeuaFDh6JmzZr4+OOPMxUdREREZN7MuvBwdHREnTp19M45ODigVKlSmc4TEREZQ8SsFEua1ZJfzLrwICIiKjACdjFnV0vuCt07dPToUSxZssTUaRAREVm0mTNnIikpKdP55ORkzJw5U3HcQld4EBER5QsrScxhIWbMmIGEhIRM55OSkoxatoJdLURERAAkyQqSkV0lxt5vTmRZznJ68MWLF+Hi4qI4LgsPA8gCP1ApNsWFxLGSNULiAEC6la2QOGmSmDgAYAWtkDgyxP0vxFpOExJHI4n78Uu3FvOep0s2QuIAgFYSM+tMA3Gz16wh5nuXLov73mkhZvq/vZUsJA4AaAX9rkuTxXwuUwV93yhvSpYsqVvTpHr16nrFh0ajQUJCAkaOHKk4PgsPIiIiQExXiQV0tSxZsgSyLGPYsGGYMWMGnJ2ddc/Z2tqiYsWKaNq0qeL4LDyIiIgASFZWkIxcQMzY+81BQEAAAKBSpUpo3rw5rK3FlgqF/x0iIiISQZLEHBYiMTExy91pw8PD8dNPPymOy8KDiIiIMpk0aRI0mszjCGVZxqRJkxTHZeFBREQE/G+Mh5WRx8sWDz8/P3h7e+Orr74y8Rel3M2bN+Ht7Z3pfM2aNXHr1i3Fcc268Jg+fbpuZG3G4ebmZuq0iIjIEgnsaomMjMTVq1cRGBho4i9KOWdnZ9y5cyfT+Vu3bsHBwUFxXLMuPACgdu3aiI2N1R2vbxpHRERE4nXr1g1jxozB7du3dedu3bqFcePGoVu3borjmv2sFmtra7ZyEBFRvuOsFn0LFixA586dUbNmTZQvXx4A8Oeff+LNN9/E559/rjiu2RceN2/ehIeHB9RqNd544w3MmTMHlStXzvb6lJQUpKSk6B7Hx8cXRJpERFTYcZM4Pc7Ozvjll18QERGBixcvwt7eHvXq1UPLli2NimvWhccbb7yBjRs3onr16vjrr78wa9YsNGvWDL/99htKlSqV5T1hYWFGrSFPREREL0mShI4dO6Jjx47CYpp14eHv76/7d926ddG0aVNUqVIFGzZsQEhISJb3hIaG6j0XHx8PT0/PfM+ViIgKOUnAyqUWtI5HbjvQTp06VVFcsy48Xufg4IC6devi5s2b2V6jVquhVovZ+4CIiIoObhKnb+fOnXqP09LSEB0dDWtra1SpUqVoFB4pKSm4du0a3nzzTVOnQkREZNEuXLiQ6Vx8fDyGDBmCnj17Ko5r1qXZ+PHjcezYMURHR+P06dPo06cP4uPjdevIExERCZOxSZyxhwVzcnLCzJkzMWXKFMUxzLrF488//8TAgQPx999/o0yZMmjSpAlOnToFLy8vU6dGRESWhrNa8uTZs2eIi4tTfL9ZFx5btmwxdQpERFRUiNjkzYIGly5dulTvsSzLiI2NxTfffIPOnTsrjmvWhQcRERGZxuLFi/UeW1lZoUyZMggICEBoaKjiuCw8iIiIgH83ejM2hoWIjo7Ol7gsPAyglVTCYqVY2QuLZW4kyMJivZDthMUSRlBLqqwS1yQryeLec1FSZTOc1i7qeycqEAAJWiFxtALHFmgE/WnQQszvTFFxcsUxHgWChQcREREBAHr16pXna3fs2KHoNVh4EBERAWKmwxby6bTOzs66f8uyjJ07d8LZ2RmNGjUCAJw7dw7Pnj0zqEB5HQsPIiIi4H+zWoztainchce6det0//7444/Rr18/rFy5EirVy+4ujUaDUaNGwcnJSfFrsDOKiIiIMlm7di3Gjx+vKzoAQKVSISQkBGvXrlUc1+wLj/v37+O9995DqVKlUKxYMdSvXx/nzp0zdVpERGRpMtbxMPawEOnp6bh27Vqm89euXYNWq3xQtFl3tTx9+hTNmzdHmzZt8NNPP8HV1RW3b99GiRIlTJ0aERFZGk6n1TN06FAMGzYMt27dQpMmTQAAp06dwty5czF06FDFcc268Jg3bx48PT31+pwqVqxouoSIiIiKiM8//xxubm5YvHgxYmNjAQDu7u6YOHEixo0bpziuWZdme/bsQaNGjdC3b1+4urrC19cXq1evzvGelJQUxMfH6x1ERES5YleLHisrK0ycOBH379/Hs2fP8OzZM9y/fx8TJ07UG/dhcFyBOQp3584drFixAtWqVUN4eDhGjhyJoKAgbNy4Mdt7wsLC4OzsrDs8PT0LMGMiIiq0MhYQM/awMI8fP8alS5dw+fJl/P3330bHM+t3SKvVokGDBpgzZw58fX3x4Ycf4v3338eKFSuyvSc0NBRxcXG6IyYmpgAzJiKiQkuy+nech9LDggqPxMREDBs2DO7u7mjZsiXefPNNuLu7Y/jw4UhKSlIc16zfIXd3d3h7e+udq1WrFu7du5ftPWq1Gk5OTnoHERERGSYkJATHjh3DDz/8oOtq2b17N44dO2bUGA+zHlzavHlzXL9+Xe/cjRs34OXlZaKMiIjIYokYo2FBYzy2b9+O77//Hq1bt9ade+utt2Bvb49+/frl2PuQE7MuPMaOHYtmzZphzpw56NevH86cOYNVq1Zh1apVpk6NiIgsDTeJ05OUlISyZctmOu/q6mq5XS1+fn7YuXMnvvvuO9SpUwefffYZlixZgnfffdfUqREREVm0pk2bYtq0aXjx4oXuXHJyMmbMmIGmTZsqjmvWLR4A8Pbbb+Ptt982dRpERGTp2NWiZ8mSJfD390f58uXh4+MDSZIQFRUFOzs7hIeHK45r9oUHERFRgeDKpXrq1q2LmzdvYtOmTfj9998hyzIGDBiAd999F/b29orjsvAgIiIiPWlpaahRowb27t2L999/X2hsFh4GUGlSxcVCupA4WihfPe51MsQ0EUqQhcQBAHspWUgcrcDhTFZQvjnSq2ShOYn5PIn62gDAVkoREidNthESBwDsNQlC4iSriguJI5Iki/u5E/SrAJKgz5OoOLmRJQmykV0lGff7+flBpVIhMDAQgYGBItIrUDY2NkhJSYGUD11HLDyIiIiA/43xMHZWy8s/1JGRkYV+HamPPvoI8+bNw3//+19YW4srF1h4EBERUSanT5/GoUOHcODAAdStWxcODg56z+/YsUNRXBYeREREANfxeE2JEiXQu3dv4XFZeBAREUHsGA9LsG7dunyJa1DhERcXh507d+LEiRO4e/cukpKSUKZMGfj6+qJTp05o1qxZviRJRESU79jikaVHjx7h+vXrkCQJ1atXh6urq1Hx8vQOxcbG4v3334e7uztmzpyJxMRE1K9fH+3atUP58uVx5MgRdOjQAd7e3ti6datRCb2uYsWKkCQp01EYRwkTEREVFvHx8Rg0aBDKlSuHVq1aoWXLlihXrhzee+89xMXFKY6bpxYPHx8fDB48GGfOnEGdOnWyvCY5ORm7du3CokWLEBMTg/HjxytO6lWRkZHQaDS6x1euXEGHDh3Qt29fIfGJiIgAcOXS14wYMQJRUVHYu3cvmjZtCkmS8MsvvyA4OBjvv/8+/u///k9R3DwVHr/99hvKlCmT4zX29vYYOHAgBg4ciMePHytKJiuvv+7cuXNRpUoVtGrVSthrEBERceVSffv27UN4eDhatGihO9epUyesXr0anTt3Vhw3T4VHbkWHsdfnVWpqKjZt2oSQkJBsFzVJSUlBSsq/CxfFx8fnSy5ERESWrFSpUnB2ds503tnZGSVLllQcV1Fpdv36dYwePRrt2rVD+/btMXr0aFy/fl1xEnm1a9cuPHv2DEOGDMn2mrCwMDg7O+sOT0/PfM+LiIgKv4xZLcYeluLTTz9FSEgIYmNjdecePnyICRMmYMqUKYrjGjyd9vvvv8fAgQPRqFEj3ba4p06dQp06dfDtt9/m69iLNWvWwN/fHx4eHtleExoaipCQEN3j+Ph4Fh9ERJQ7zmrRs2LFCty6dQteXl6oUKECAODevXtQq9V4/Pgxvv76a92158+fz3NcgwuPiRMnIjQ0FDNnztQ7P23aNHz88cf5Vnj88ccfOHjwYK4rpanVaqjV6nzJgYiIqKjo0aNHvsQ1uPB4+PAhBg8enOn8e++9hwULFghJKivr1q2Dq6srunTpkm+vQURERZcsWUE2ssXC2PvNybRp0/IlrsHvUOvWrXHixIlM50+ePIk333xTSFKv02q1WLduHQICAoRuVENERKSTMZ3W2KMIkRXsimzwX/Fu3brh448/xrlz59CkSRMAL8d4bNu2DTNmzMCePXv0rhXh4MGDuHfvHoYNGyYkHhER0etkCGjxUDZnw2zUqlULU6ZMQZ8+fWBra5vtdTdv3sSiRYvg5eWFSZMmGfQakmxguWKVxznKkiTpLfxlKvHx8XB2dsbDNTPgVMzOqFhJ3uKWhI9zcBMSRwuVkDgAIENMpS7B8Ao4v2NpBf4ysIJWWCxRVHK6kDgayfxaFNNkG2GxHLRiptcnq4oLiSOSjZwqLFa6JOY918hifj8lPH8Ovwa1ERcXly9bzWf8nfjz0P/BqXgx42IlJKF8u375lmt+O3z4MD7++GPcunULHTt2RKNGjeDh4QE7Ozs8ffoUV69excmTJ3H16lWMHj0an3zyicFfp8G/ZbRa8/ulS0REZDSuXIq2bdsiMjISv/zyC7Zu3Ypvv/0Wd+/eRXJyMkqXLg1fX18MHjwY7733HkqUKKHoNczvvzdERESmIEkCptMW7sIjQ7NmzfJt41dFhcehQ4ewePFiXLt2DZIkoWbNmhgzZgzat28vOj9xrKSXhxEkWVxrj0orpmk83UpcM7Q10oTESZOz7xc0lJUk5j1Xa5OFxAHEvecagXW/qA43jcCuO1FdUiK77l6oHITEEdndJqqL01orsKtFJeYzLqorWGSXMpmewaXdsmXL0LlzZzg6OiI4OBhBQUFwcnLCW2+9hWXLluVHjkRERPmOK5cWDIP/yxUWFobFixdj9OjRunNBQUFo3rw5Zs+erXeeiIio0ODKpQXC4HcoPj4+y13pOnbsyA3ZiIiIKEcGFx7dunXDzp07M53fvXs3unbtKiQpIiKigiZDEnJQzvLU1bJ06VLdv2vVqoXZs2fj6NGjepvE/fzzzxg3bpzQ5NLT0zF9+nRs3rwZDx8+hLu7O4YMGYJPP/00z+uJEBER5QWXTIdBPRdK1ynJU+GxePFivcclS5bE1atXcfXqVd25EiVKYO3atfj0008VJZKVefPmYeXKldiwYQNq166Ns2fPYujQoXB2dkZwcLCw1yEiIqKXf8ulPA6QVbpIaJ4Kj+joaEXBjfXrr7+ie/fuuo3hKlasiO+++w5nz541ST5ERGTBOLgUR44c0f377t27mDRpEoYMGaLr4fj111+xYcMGhIWFKX4Ns15ArEWLFli5ciVu3LiB6tWr4+LFizh58iSWLFmS7T0pKSlISUnRPeaAVyIiygsR02EL+3TaVq1a6f49c+ZMLFq0CAMHDtSd69atG+rWrYtVq1YhICBA0WvkqTSbO3cuEhMT8xTw9OnT2Ldvn6JkXvfxxx9j4MCBqFmzJmxsbODr64sxY8bovQmvCwsLg7Ozs+7w9PQUkgsREVm2jDEexh6W4tdff0WjRo0ynW/UqBHOnDmjOG6e3qGrV6/Cy8sL//nPf/DTTz/h8ePHuufS09Nx6dIlLF++HM2aNcOAAQOEbYyzdetWbNq0Cd9++y3Onz+PDRs24PPPP8eGDRuyvSc0NBRxcXG6IyYmRkguRERERYmnpydWrlyZ6fzXX39t1H/q89TVsnHjRly6dAlfffUV3n33XcTFxUGlUkGtViMpKQkA4Ovriw8++AABAQFQq9WKE3rVhAkTMGnSJAwYMAAAULduXfzxxx8ICwvLtolHrVYLe30iIipCuEmcnsWLF6N3794IDw9HkyZNALycxXr79m1s375dcdw8j/GoV68evv76a6xcuRKXLl3S262ufv36KF26tOIkspOUlJRp2qxKpeIOuUREJJ6IrhIL6mp56623cOPGDaxYsQK///47ZFlG9+7dMXLkyPxv8XiVJEnw8fGBj4+P4hfNq65du2L27NmoUKECateujQsXLmDRokUYNmxYvr82ERFRUefp6Yk5c+YIjWnWpdmXX36JPn36YNSoUahVqxbGjx+PDz/8EJ999pmpUyMiIgvDlUszO3HiBN577z00a9YM9+/fBwB88803OHnypOKYZl14ODo6YsmSJfjjjz+QnJyM27dvY9asWbC1FbftOhEREcBZLa/bvn07OnXqBHt7e5w/f163VMXz58+NagWxnHeIiIiIhJk1axZWrlyJ1atXw8bGRne+WbNmOH/+vOK4Zr2AGBERUYGRIGBWi5BMzML169fRsmXLTOednJzw7NkzxXFZeBhAq7LJ/aI8stGm5H5RHmgllZA4AJAuifv6RBHVX6qRxH3UtRDzntvIqULiAOLeJ7U2WUgcQNxn00pSth9ElrFkMTPiUmAnJA4AWElicpIgC4kjMpYK6WYVJzcyrCAb2RFg7P3mxN3dHbdu3ULFihX1zp88eRKVK1dWHFfYO3T79m20bdtWVDgiIiIyoQ8//BDBwcE4ffo0JEnCgwcPsHnzZowfPx6jRo1SHFfYfwMTEhJw7NgxUeGIiIgKFPdq0Tdx4kTExcWhTZs2ePHiBVq2bAm1Wo3x48dj9OjRiuPmufBYunRpjs9nTLMhIiIqjETMSrGkWS0AMHv2bEyePBlXr16FVquFt7c3ihcvblTMPBceY8aMgbu7e7ZTWVNTxfVXExERFTQR63BY0joew4YNwxdffAFHR0e9zeISExPx0UcfYe3atYri5rk08/LywuLFixEdHZ3lIWpHWiIiIjK9DRs2IDk584Dz5ORkbNy4UXHcPBceDRs2xLlz57J9XpIkyLK4UdUZnj9/jjFjxsDLywv29vZo1qwZIiMjhb8OEREVbVxA7KX4+HjExcVBlmU8f/4c8fHxuuPp06f48ccf4erqqjh+nrtaZs6cqduJNive3t6Ijo5WnEh2RowYgStXruCbb76Bh4cHNm3ahPbt2+Pq1asoV66c8NcjIqKiiYNLXypRogQkSYIkSahevXqm5yVJwowZMxTHz3Ph4e3tnePzNjY28PLyUpxIVpKTk7F9+3bs3r1bt4jJ9OnTsWvXLqxYsQKzZs0S+npERERF3ZEjRyDLMtq2bYvt27fDxcVF95ytrS28vLzg4eGhOL5ZLyCWnp4OjUYDOzv9xXrs7e2z3aAmJSVFt5488LLJiIiIKDccXPpSq1atAADR0dGoUKECJMGtOGbdGeXo6IimTZvis88+w4MHD6DRaLBp0yacPn0asbGxWd4TFhYGZ2dn3eHp6VnAWRMRUWHEMR76Dh8+jO+//z7T+W3btmHDhg2K45r9O/TNN99AlmWUK1cOarUaS5cuxTvvvAOVKuvlmENDQxEXF6c7YmJiCjhjIiKiwm/u3LkoXbp0pvOurq5G7U5r1l0tAFClShUcO3YMiYmJiI+Ph7u7O/r3749KlSpleb1arYZarS7gLImIqLBjV4u+P/74I8u/tV5eXrh3757iuEa1eLx48cKY2w3i4OAAd3d3PH36FOHh4ejevXuBvTYREVk+GQK6WkzUkbB3717UqFED1apVw3//+18hMV1dXXHp0qVM5y9evIhSpUopjmvwO6TVavHZZ5+hXLlyKF68OO7cuQMAmDJlCtasWaM4keyEh4dj//79iI6ORkREBNq0aYMaNWpg6NChwl+LiIiosElPT0dISAgOHz6M8+fPY968efjnn3+MjjtgwAAEBQXhyJEj0Gg00Gg0OHz4MIKDgzFgwADFcQ0uPGbNmoX169dj/vz5esun161bV1iV9aq4uDgEBgaiZs2aGDx4MFq0aIEDBw7Axsb8tnAnIqLCK6OrxdijoJ05cwa1a9dGuXLl4OjoiLfeegvh4eFGx501axbeeOMNtGvXDvb29rC3t0fHjh3Rtm1bo8Z4GFx4bNy4EatWrcK7776rN8CzXr16+P333xUnkp1+/frh9u3bSElJQWxsLJYtWwZnZ2fhr0NEREXbywXEjO1uMbzwOH78OLp27QoPDw9IkoRdu3Zlumb58uWoVKkS7Ozs0LBhQ5w4cUL33IMHD/QW1CxfvryQjVttbW2xdetW/P7779i8eTN27NiB27dvY+3atdnu25YXBhce9+/fR9WqVTOd12q1SEtLU5wIERGRKZmqxSMxMRE+Pj5YtmxZls9v3boVY8aMweTJk3HhwgW8+eab8Pf31w3wzGq7EpFrb1SsWBH16tVD586dhSwUanDhUbt2bb1KK8O2bdvg6+trdEJERESF3av7m8THx+stbPk6f39/zJo1C7169cry+UWLFmH48OEYMWIEatWqhSVLlsDT0xMrVqwAAJQrV06vhePPP/+Eu7u70V9DUlIShg8fjmLFiqF27dq6QicoKAhz585VHNfg6bTTpk3DoEGDcP/+fWi1WuzYsQPXr1/Hxo0bsXfvXsWJ5DvJ6uVhBI2VuNnHVtp0IXG01lmvZ6KEjZwqJE6apLwJLr9oJHHfO1F9uFayRkgckUT2T6dLYsZhSRC3+aQVtELiSJK4nES956kqu9wvyiNbrZgZiy+sigmJI/L9zonIvVpeX7xy2rRpmD59usHxUlNTce7cOUyaNEnvfMeOHfHLL78AABo3bowrV67g/v37cHJywo8//oipU6cq+wJeERoaiosXL+Lo0aPo3Lmz7nz79u0xbdq0TDnllcG/jbt27YqtW7dizpw5kCQJU6dORYMGDfDDDz+gQ4cOipIgIiIyNVmWIMtGFh7/uz8mJgZOTk6680rXl/r777+h0WhQtmxZvfNly5bFw4cPAQDW1tZYuHAh2rRpA61Wi4kTJxo13TXDrl27sHXrVjRp0kSv68bb2xu3b99WHFfRfwM7deqETp06KX5RIiIiS+bk5KRXeBjr9TEbsizrnevWrRu6desm7PUA4PHjx3B1dc10PjEx0agxJAb3PURGRuL06dOZzp8+fRpnz55VnAgREZFpvVwAzJhD9E4kpUuXhkql0rVuZHj06FGmVhDR/Pz8sG/fPt3jjGJj9erVaNq0qeK4Br9DgYGBWe5/cv/+fQQGBipOhIiIyJTMcR0PW1tbNGzYEBEREXrnIyIi0KxZM6Gv9bqwsDBMnjwZ//nPf5Ceno4vvvgCHTp0wPr16zF79mzFcQ0uPK5evYoGDRpkOu/r64urV68aFCu3ucuyLGP69Onw8PCAvb09Wrdujd9++83QlImIiMxWQkICoqKiEBUVBeDldvRRUVG6WSQhISH473//i7Vr1+LatWsYO3Ys7t27h5EjR+ZrXs2aNcPPP/+MpKQkVKlSBQcOHEDZsmXx66+/omHDhorjGjzGQ61W46+//kLlypX1zsfGxsLa2rBwGXOXhw4dit69e2d6fv78+Vi0aBHWr1+P6tWrY9asWejQoQOuX78OR0dHQ1MnIiLKlqk2iTt79izatGmjexwSEgIACAgIwPr169G/f388efIEM2fORGxsLOrUqYMff/xRyJoaualbty42bNggNKbBhUeHDh0QGhqK3bt361YQffbsGT755BODZ7X4+/vD398/y+dkWcaSJUswefJk3dzmDRs2oGzZsvj222/x4YcfGpo6ERFRtkxVeLRu3TrLRcBeNWrUKIwaNUppWoppNBrs3LkT165dgyRJqFWrFrp3725wQ8OrDL5z4cKFaNmyJby8vHQLhkVFRaFs2bL45ptvFCfyuujoaDx8+BAdO3bUnVOr1WjVqhV++eWXbAuPlJQUvYVa4uPjheVERESUF35+flCpVAgMDCy04x+vXLmC7t274+HDh6hRowYA4MaNGyhTpgz27NmDunXrKoprcOFRrlw5XLp0CZs3b8bFixdhb2+PoUOHYuDAgUI3bssYwZvV3OU//vgj2/vCwsIwY8YMYXkQEVHRILLFIzIyUuh0WlMYMWIEateujbNnz6JkyZIAgKdPn2LIkCH44IMP8OuvvyqKq6itxMHBAR988IGiFzRUbnOXXxcaGqrrHwNetni8voIcERHR60QuIGYJLl68qFd0AEDJkiUxe/Zs+Pn5KY6rqPC4ceMGjh49ikePHkGr1V+CWMQyrQDg5uYG4GXLx6trzuc2d1mtViteIY6IiIouU43xMFc1atTAX3/9hdq1a+udf/ToUZabxeaVwYXH6tWr8Z///AelS5eGm5ubXutDxhLqIlSqVAlubm6IiIjQjSVJTU3FsWPHMG/ePCGvQURERFmbM2cOgoKCMH36dDRp0gQAcOrUKcycORPz5s3TG0NpSLeSwYXHrFmzMHv2bHz88ceG3ppJQkICbt26pXucMXfZxcUFFSpUwJgxYzBnzhxUq1YN1apVw5w5c1CsWDG88847Rr82ERHRq9jioe/tt98GAPTr10/XyJAx+6Zr1666x5IkQaPJ+6aXBhceT58+Rd++fQ29LUu5zV2eOHEikpOTMWrUKDx9+hRvvPEGDhw4wDU8iIhIOBYe+o4cOZIvcQ0uPPr27YsDBw4IWTEtt7nLkiRh+vTpirYSJiIiIuVatWqVL3ENLjyqVq2KKVOm4NSpU6hbt26mKbRBQUHCkiMiIiooMgTMarGgFo8pU6Zg+vTpUKlUeufj4uIwcuRIfPfdd4riGlx4rFq1CsWLF8exY8dw7NgxveckSWLhQUREhZIWErRGFg7G3m9ONm7ciIiICGzevBlVqlQBABw9ehSDBw9GuXLlFMc1uPCIjo5W/GImJUkvDzORYOsiJI7Q6lpSvgSuubNC3gc+5UbKZWnjvBL5vVPJ6ULipKrshMQBAI2syv2iAqaBmJxskCokDgBoReWkScn9ojx6oXIQEkcji/mdIipOQbKElUsvXbqEDz/8EPXr18eiRYtw48YNfPHFF5g0aRKmTZumOG7h+24SERHlA65cqs/Z2RlbtmzB5MmT8eGHH8La2ho//fQT2rVrZ1RcRYXHn3/+iT179uDevXtITdWv/BctWmRUQkRERKbAlUsz+/LLL7F48WIMHDgQ586dQ1BQEL799lv4+Pgojmlw4XHo0CF069YNlSpVwvXr11GnTh3cvXsXsiyjQYMGihMhIiIi8+Hv74/IyEhs3LgRffr0QXJyMkJCQtCkSRPMmDEDEydOVBTXytAbQkNDMW7cOFy5cgV2dnbYvn07YmJi0KpVK2HrexARERU0Gf92tyg/LEd6ejouXbqEPn36AADs7e2xYsUKfP/991i8eLHiuAYXHteuXUNAQAAAwNraGsnJyShevLhuCVUiIqLCKKOrxdjDUkRERMDDwyPT+S5duuDy5cuK4xpceDg4OCAl5eXoaQ8PD9y+fVv33N9//21QrOPHj6Nr167w8PCAJEnYtWuX3vM7duxAp06dULp0aUiShKioKEPTJSIiyhPjWzuMH5xqbk6cOIH33nsPTZs2xf379wEA33zzDX7//XfFMQ0uPJo0aYKff/4ZwMuqZ9y4cZg9ezaGDRum20QmrxITE+Hj44Nly5Zl+3zz5s0xd+5cQ9MkIiIiI2zfvh2dOnWCvb09Lly4oGt0eP78OebMmaM4rsGDSxctWoSEhAQAwPTp05GQkICtW7eiatWqBvf5+Pv7w9/fP9vnBw0aBAC4e/euoWkSEREZhLNa9M2aNQsrV67E4MGDsWXLFt35Zs2aYebMmYrjGlx4VK5cWffvYsWKYfny5YpfPD+kpKToqjIAetv2EhERZUcGoBUQw1Jcv34dLVu2zHTeyckJz549UxzX4K6WypUr48mTJ5nOP3v2TK8oMZWwsDA4OzvrDk9PT1OnREREVOi4u7vj1q1bmc6fPHnSqL/3Bhced+/ehUaTefnplJQU3cATUwoNDUVcXJzuiImJMXVKRERUCIic1eLn5wdvb2989dVXJv6qlPvwww8RHByM06dPQ5IkPHjwAJs3b8b48eMxatQoxXHz3NWyZ88e3b/Dw8Ph7Oyse6zRaHDo0CFUrFhRcSKiqNVqqNVqU6dBRESFDJdM1zdx4kTExcWhTZs2ePHiBVq2bAm1Wo3x48dj9OjRiuPmufDo0aMHgJc70Gas45HBxsYGFStWxMKFCxUnQkREROZl9uzZmDx5Mq5evQqtVgtvb28UL17cqJh5Ljy02pdDbipVqoTIyEiULl3aqBcGgISEBL3+o+joaERFRcHFxQUVKlTAP//8g3v37uHBgwcAXg50AQA3Nze4ubkZ/fpEREQZOKsla8WKFUOjRo2ExTN4jEd0dHSmokPp6NazZ8/C19cXvr6+AICQkBD4+vpi6tSpAF527/j6+qJLly4AgAEDBsDX1xcrV65U9HpERETZ4QJiBcPgwmPevHnYunWr7nHfvn3h4uKCcuXK4eLFiwbFat26NWRZznSsX78eADBkyJAsn58+fbqhaRMREZEZMLjw+Prrr3VTVCMiInDw4EHs378f/v7+mDBhgvAEiYiICoJWFnNQzgxeQCw2NlZXeOzduxf9+vVDx44dUbFiRbzxxhvCEyQiIioIIme1FGaffPIJevTogcaNG+dLfIMLj5IlSyImJgaenp7Yv38/Zs2aBQCQZTnL9T3MRnr6y8MINmnJgpIBJLWYstgK5vieG9yQlq002VZIHBukCokDACmwExLH2sq4z6MeY5db/B+N4b8SsmUjpQmJkybbCIkDAJIk5ucuHeJy0spifl6srcwwJ0GfAVFxcsPBpS/Fxsbi7bffhkqlQteuXdG9e3e0b99e2FIVBn+6evXqhXfeeQcdOnTAkydPdHutREVFoWrVqkKSIiIiItNYt24d/vrrL/zf//0fSpQogXHjxqF06dLo1asX1q9fb/BO9K8zuPBYvHgxRo8eDW9vb0REROjm88bGxhq1khkREZEpybKYwxJIkoQ333wT8+fPx++//44zZ86gSZMmWL16NcqVK4eWLVvi888/V7RiucHtqjY2Nhg/fnym82PGjDH4xYmIiMyFFhK0Ro7RMPZ+c1WrVi3UqlULEydOxOPHj7Fnzx7diuZZ1QQ5yVPhsWfPHvj7+8PGxkZv6fSsdOvWzaAEiIiILI2fnx9UKhUCAwMRGBho6nSEKlOmDIYPH47hw4cruj9PhUePHj3w8OFDuLq66pZOz4okSQYNMD1+/DgWLFiAc+fOITY2Fjt37tTFT0tLw6effooff/wRd+7cgbOzM9q3b4+5c+fCw8Mjz69BRESUFyIHl1rCXi35JU9jPLRaLVxdXXX/zu4wdFZLYmIifHx8sGzZskzPJSUl4fz585gyZQrOnz+PHTt24MaNG2xRISKifMExHgVD3Nw5Bfz9/XWzYl7n7OyMiIgIvXNffvklGjdujHv37qFChQoFkSIREREJZFDhodVqsX79euzYsQN3796FJEmoVKkS+vTpg0GDBkGS8ndQTVxcHCRJQokSJbK9JiUlBSkpKbrH8fHx+ZoTERFZBi4gVjDyPJ1WlmV069YNI0aMwP3791G3bl3Url0bf/zxB4YMGYKePXvmZ5548eIFJk2ahHfeeSfHfrOwsDA4OzvrjoxVVomIiHLCJdP1bdiwAfv27dM9njhxIkqUKIFmzZrhjz/+UBw3z4XH+vXrcfz4cRw6dAgXLlzAd999hy1btuDixYs4ePAgDh8+jI0bNypOJCdpaWkYMGAAtFotli9fnuO1oaGhiIuL0x0xMTH5khMREZElmzNnDuzt7QEAv/76K5YtW4b58+ejdOnSGDt2rOK4ee5q+e677/DJJ5+gTZs2mZ5r27YtJk2ahM2bN2Pw4MGKk8lKWloa+vXrh+joaBw+fDjXUcJqtVrYsq5ERFSECJjVAgtYMj1DTEyMbkXyXbt2oU+fPvjggw/QvHlztG7dWnHcPLd4XLp0CZ07d872eX9/f1y8eFFxIlnJKDpu3ryJgwcPolSpUkLjExERZeCsFn3FixfHkydPAAAHDhxA+/btAQB2dnZITla+d1meWzz++ecflC1bNtvny5Yti6dPnxr04gkJCbh165bucXR0NKKiouDi4gIPDw/06dMH58+fx969e6HRaPDw4UMAgIuLC2xtxWweRkREBHDl0td16NABI0aMgK+vL27cuIEuXboAAH777TdUrFhRcdw8t3hoNBpYW2dfp6hUKqQbuPvr2bNn4evrC19fXwBASEgIfH19MXXqVPz555/Ys2cP/vzzT9SvXx/u7u6645dffjHodYiIiMgwX331FZo2bYrHjx9j+/btul6Hc+fOYeDAgYrj5rnFQ5ZlDBkyJNvxE69OYc2r1q1bQ86hXSqn54iIiEQS0VViSX+2SpQokeUCnzNmzDAqbp4Lj4CAgFyvET2wlIiIqKCIXDLdUpw4cQJff/017ty5g23btqFcuXL45ptvUKlSJbRo0UJRzDwXHuvWrVP0AkRERFT4bN++HYMGDcK7776L8+fP63o2nj9/jjlz5uDHH39UFNekS6YXNlqVjbBYak2SkDjJquJC4gCABPNrI7RHopA4KbATEgcAbKRUIXHkvA+xyj2WJCaWOX4GRLKC1tQpZKKSDNvjKjsagb/OtbJKSJw0WczvzBRZzM9cbkQsAGZJC4jNmjULK1euxODBg7Flyxbd+WbNmmHmzJmK44r7zUdERFSIiZxO6+fnB29vb3z11Vem/aKMcP36dbRs2TLTeScnJzx79kxxXLZ4EBERCRYZGZnrgpfmzt3dHbdu3co0dfbkyZOoXLmy4rhs8SAiIsK/m8QZe1iKDz/8EMHBwTh9+jQkScKDBw+wefNmjB8/HqNGjVIcly0eREREALQQMMZDSCbmYeLEiYiLi0ObNm3w4sULtGzZEmq1GuPHj8fo0aMVx2XhQURERFmaPXs2Jk+ejKtXr0Kr1cLb2xvFixs3qcGkXS3Hjx9H165d4eHhAUmSsGvXLr3np0+fjpo1a8LBwQElS5ZE+/btcfr0adMkS0REFo17tegbNmwYnj9/jmLFiqFRo0Zo3LgxihcvjsTERAwbNkxxXJMWHomJifDx8clyZTQAqF69OpYtW4bLly/j5MmTqFixIjp27IjHjx8XcKZERGTpWHjo27BhQ5abwSUnJ2Pjxo2K45q0q8Xf3x/+/v7ZPv/OO+/oPV60aBHWrFmDS5cuoV27dvmdHhERFSFaWYLWyJVHjb3fHMTHx0OWZciyjOfPn8PO7t91kDQaDX788Ue4uroqjl9oxnikpqZi1apVcHZ2ho+PT7bXpaSk6O0bEx8fXxDpERERWYQSJUpAkiRIkoTq1atnel6SJKP2azH7wmPv3r0YMGAAkpKS4O7ujoiICJQuXTrb68PCwozewIaIiIoebhL30pEjRyDLMtq2bYvt27fDxcVF95ytrS28vLzg4eGhOL7ZFx5t2rRBVFQU/v77b6xevRr9+vXD6dOns23mCQ0NRUhIiO5xfHw8PD09CypdIiIqpFh4vNSqVSsAQHR0NDw9PWFlJXY4qNkXHg4ODqhatSqqVq2KJk2aoFq1alizZg1CQ0OzvF6tVkOtVhdwlkRERJbFy8sLAJCUlIR79+4hNVV/z5x69eopimv2hcfrZFnWG8NBREQkgixgkzhLaPHI8PjxYwwdOhQ//fRTls9rNMo2ODTpdNqEhARERUUhKioKwMtmnaioKNy7dw+JiYn45JNPcOrUKfzxxx84f/48RowYgT///BN9+/Y1ZdpERGSBZFkScliKMWPG4OnTpzh16hTs7e2xf/9+bNiwAdWqVcOePXsUxzVpi8fZs2fRpk0b3eOMsRkBAQFYuXIlfv/9d2zYsAF///03SpUqBT8/P5w4cQK1a9c2VcpERERFwuHDh7F79274+fnBysoKXl5e6NChA5ycnBAWFoYuXbooimvSwqN169aQc2iX2rFjRwFmQ0RERRkHl+pLTEzUTeRwcXHB48ePUb16ddStWxfnz59XHJe70xIREeHl+A4Rh6WoUaMGrl+/DgCoX78+vv76a9y/fx8rV66Eu7u74riFbnApERGRufPz84NKpUJgYCACAwNNnY4iY8aMQWxsLABg2rRp6NSpEzZv3gxbW1usX79ecdyiU3hYSS8PI2isxL1dKapiQuJYy2lC4gCABDGlugxxg6tE5aSSlI2+zoq1Vsx7bqMRNztLK4lpvEy3thESBwAkQRuEi/ze2WpfCImTYmUvJA4gLietpBISBwDskS4kTjIchMRRFdBm8yK7WiIjI+Hk5GR8Uib07rvv6v7t6+uLu3fv4vfff0eFChVyXMgzN0Wn8CAiIsoBx3jkrFixYmjQoIHRcTjGg4iICBzj8bo+ffpg7ty5mc4vWLDAqGUtWHgQERFRJseOHctyymznzp1x/PhxxXHZ1UJERAR2tbwuISEBtra2mc7b2NgYtfO7SVs8jh8/jq5du8LDwwOSJGHXrl3ZXvvhhx9CkiQsWbKkwPIjIqKiQ6sVc1iKOnXqYOvWrZnOb9myBd7e3orjmrTFIzExET4+Phg6dCh69+6d7XW7du3C6dOnjdqGl4iIiPJuypQp6N27N27fvo22bdsCAA4dOoTvvvsO27ZtUxzXpIWHv78//P39c7zm/v37GD16NMLDwxUvz0pERJQbdrXo69atG3bt2oU5c+bg+++/h729PerVq4eDBw+iVatWiuOa9RgPrVaLQYMGYcKECXnenyUlJUVv91pj+qGIiKjoYOGRWZcuXYT/p9+sZ7XMmzcP1tbWCAoKyvM9YWFhcHZ21h2enp75mCEREREZwmxbPM6dO4cvvvgC58+fhyTlfSXM0NBQ3S63wMsWDxYfRESUGy2MX4ejsI8tdXFxwY0bN1C6dGmULFkyx7+///zzj6LXMNvC48SJE3j06BEqVKigO6fRaDBu3DgsWbIEd+/ezfI+tVoNtVpdQFkSEZGlkGU5xx3T8xqjMFu8eDEcHR0BIN9mkZpt4TFo0CC0b99e71ynTp0waNAgDB061ERZERERWa6AgIAs/y2SSQuPhIQE3Lp1S/c4OjoaUVFRcHFxQYUKFVCqVCm9621sbODm5oYaNWoUdKpERGThOLjUsAkZSjfBM2nhcfbsWbRp00b3OGNsRkBAgFFb7hIRERlKFrAAmFzIB3mUKFEi13GVsixDkiRoNMp2jjZp4dG6dWuD+sOyG9dBRERkLLZ4AEeOHMn31zDbMR5ERERUsIxZGCyvWHgQERFBzLb2xt5vbp4+fYo1a9bg2rVrkCQJtWrVwtChQ+Hi4qI4ZtEpPAR8oqzTU3K/KI9UtulC4mgkcd9CK1lZf93rJIj7yUuTMu+MqIRWFrdWnoy8ryuTkyQbZQOzsmKjFfPZFPm9E0Ujq4TF0kriYomSbmUjJI5KK+Z3CgCkWNmLCWR+H6ccsatF37Fjx9CtWzc4OzujUaNGAIClS5di5syZ2LNnj+LWkaJTeBAREVGeBQYGon///lixYgVUqpdFu0ajwahRoxAYGIgrV64oimvWS6YTEREVFFkrCzksxe3btzFu3Dhd0QEAKpUKISEhuH37tuK4LDyIiIjwb4+8sYelaNCgAa5du5bp/LVr11C/fn3FcdnVQkRERJkEBQUhODgYt27dQpMmTQAAp06dwldffYW5c+fi0qVLumvr1auX57gsPIiIiCB2cKmfnx9UKhUCAwMRGBhofHImMHDgQADAxIkTs3xOkiRFi4mZtPA4fvw4FixYgHPnziE2NhY7d+5Ejx49dM8PGTIEGzZs0LvnjTfewKlTpwo4UyIisnRarQytkX0lGfdHRkYqXlLcXERHR+dLXJMWHomJifDx8cHQoUPRu3fvLK/p3Lkz1q1bp3tsaytmeiURERFlz8vLK1/imrTw8Pf3h7+/f47XqNVquLm5FVBGRERUVHEdD30bN27M8fnBgwcrimv2YzyOHj0KV1dXlChRAq1atcLs2bPh6uqa7fUpKSlISfl3MSVDdtojIqKii4WHvuDgYL3HaWlpSEpKgq2tLYoVK6a48DDr6bT+/v7YvHkzDh8+jIULFyIyMhJt27bVKyxeFxYWBmdnZ93h6elZgBkTEVFhpZVlIYelePr0qd6RkJCA69evo0WLFvjuu+8UxzXrwqN///7o0qUL6tSpg65du+Knn37CjRs3sG/fvmzvCQ0NRVxcnO6IiYkpwIyJiIgsV7Vq1TB37txMrSGGMPuulle5u7vDy8sLN2/ezPYatVoNtVpdgFkREZElkLUvD2NjWDqVSoUHDx4ovr9QFR5PnjxBTEwM3N3dTZ0KERFZGBkyZCO7SuTCtjNeDvbs2aP3WJZlxMbGYtmyZWjevLniuCYtPBISEnDr1i3d4+joaERFRcHFxQUuLi6YPn06evfuDXd3d9y9exeffPIJSpcujZ49e5owayIiIsv36rpaACBJEsqUKYO2bdti4cKFiuOatPA4e/Ys2rRpo3scEhICAAgICMCKFStw+fJlbNy4Ec+ePYO7uzvatGmDrVu3wtHR0VQpExGRhZK1gJZdLTpaY9+MbJi08GjdunWOzVrh4eEFmA0RERVlsiygq8WCZrXkl0I1xoOIiIjyT0bPQ14sWrRI0Wuw8CAiIoKYbe2Nvd/ULly4oPf43Llz0Gg0qFGjBgDgxo0bUKlUaNiwoeLXKDqFh5X08jBCmo29oGQArWR+S6ikSzZC4lhBXL+gDOO+ZxmsJHE5vUAxIXFUyPtujrnRSiohcUS93wCgFfTrxUZKExIHADSCctLK4n5+JUHfOxXShcR5GUvQZ1PQx0klifvaciJrZchGVg7G3m9qR44c0f170aJFcHR0xIYNG1CyZEkALxcVGzp0KN58803Fr2F+f/2IiIjI5BYuXIiwsDBd0QEAJUuWxKxZs4ya1cLCg4iICP/u1WLsYSni4+Px119/ZTr/6NEjPH/+XHHcotPVQkRElAOtVobWyK4SY+83Jz179sTQoUOxcOFCNGnSBABw6tQpTJgwAb169VIcl4UHEREROJ32dStXrsT48ePx3nvvIS3t5Vgra2trDB8+HAsWLFAc16RdLcePH0fXrl3h4eEBSZKwa9euTNdcu3YN3bp1g7OzMxwdHdGkSRPcu3ev4JMlIiIqQooVK4bly5fjyZMnuHDhAs6fP49//vkHy5cvh4ODg+K4Ji08EhMT4ePjg2XLlmX5/O3bt9GiRQvUrFkTR48excWLFzFlyhTY2dkVcKZERGTpMjaJM/awNA4ODqhXrx58fHyMKjgymLSrxd/fH/7+/tk+P3nyZLz11luYP3++7lzlypULIjUiIipitLIMrZFdJcbeXxSY7awWrVaLffv2oXr16ujUqRNcXV3xxhtvZNkd86qUlBTEx8frHURERGQezLbwePToERISEjB37lx07twZBw4cQM+ePdGrVy8cO3Ys2/vCwsLg7OysOzw9PQswayIiKqwyBpcae1DOzLbwyNgVr3v37hg7dizq16+PSZMm4e2338bKlSuzvS80NBRxcXG6IyYmpqBSJiKiQixjOq2xR2HWoEEDPH36FAAwc+ZMJCUlCX8Nsy08SpcuDWtra3h7e+udr1WrVo6zWtRqNZycnPQOIiIiyt21a9eQmJgIAJgxYwYSEhKEv4bZruNha2sLPz8/XL9+Xe/8jRs34OXlZaKsiIjIUolYebSw97TUr18fQ4cORYsWLSDLMj7//HMUL148y2unTp2q6DVMWngkJCTg1q1busfR0dGIioqCi4sLKlSogAkTJqB///5o2bIl2rRpg/379+OHH37A0aNHTZc0ERFZJFkWsElcIa881q9fj2nTpmHv3r2QJAk//fQTrK0zlwqSJBXOwuPs2bNo06aN7nFISAgAICAgAOvXr0fPnj2xcuVKhIWFISgoCDVq1MD27dvRokULU6VMRERksWrUqIEtW7YAAKysrHDo0CG4uroKfQ2TFh6tW7fOtTocNmwYhg0bVkAZERFRUSULWMejsLd4vCpjkodoZjvGg4iIqCDJWgFdLYV8Vsvrbt++jSVLluDatWuQJAm1atVCcHAwqlSpojim2c5qISIiKkgZhYexh6UIDw+Ht7c3zpw5g3r16qFOnTo4ffo0ateujYiICMVxi0yLh5zyArKRZZZN+gsxyQCwVamFxElSOQqJI5JKThcWS5LENPVpoRISBwBspFQhcSQzbJK10yQKi6WRxPx6SbGyFxIHAGzlFCFxZEkSEgcQ9/OSZiXmd4pIGlnMZ0BUnILk5+cHlUqFwMBABAYGmjodRSZNmoSxY8di7ty5mc5//PHH6NChg6K4he+7SURElA+08svD2BgAEBkZWejXkbp2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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f, ax = plt.subplots()\n", "im = ax.imshow(normed.iloc[:20, :20],\n", " norm=LogNorm(vmin=0.1, vmax=10),\n", " cmap='coolwarm',\n", " )\n", "cb = plt.colorbar(im, ax=ax)\n", "ax.set(xticks=np.arange(20), yticks=np.arange(20), ylabel='Distance 1 (bp)', xlabel='Distance 2 (bp)')\n", "cb.set_label('Number of duplicates / expected (product of marginals)')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" } }, "nbformat": 4, "nbformat_minor": 2 } pairtools-1.1.3/doc/examples/example_pipeline.sh000066400000000000000000000044211474715105500220010ustar00rootroot00000000000000#!/usr/bin/env bash if [ $# -le 3 ] ; then echo "Usage: bash example_pipeline.sh BWA_INDEX FASTQ_1 FASTQ_2 OUTPUT_PREFIX" echo "" echo "A example of a bash pipeline to align the sequencing data from a " echo "single Hi-C experiment." echo "" echo "positional arguments:" echo "" echo "BWA_INDEX The path to a bwa index of the reference genome." echo "CHROM_SIZES The path to a file with chromosome sizes." echo "FASTQ_1 The path to a fastq file with the sequences of " echo " the first side of Hi-C molecules." echo "FASTQ_2 The path to a fastq file with the sequences of " echo " the second side of Hi-C molecules." echo "OUTPUT_PREFIX The prefix to the paths of generated outputs. " echo "" echo "" exit 0 fi set -o errexit set -o nounset set -o pipefail INDEX=$1 CHROM_SIZES=$2 FASTQ1=$3 FASTQ2=$4 OUTPREFIX=$5 N_THREADS=8 UNMAPPED_SAM_PATH=${OUTPREFIX}.unmapped.bam UNMAPPED_PAIRS_PATH=${OUTPREFIX}.unmapped.pairs.gz NODUPS_SAM_PATH=${OUTPREFIX}.nodups.bam NODUPS_PAIRS_PATH=${OUTPREFIX}.nodups.pairs.gz DUPS_SAM_PATH=${OUTPREFIX}.dups.bam DUPS_PAIRS_PATH=${OUTPREFIX}.dups.pairs.gz bwa mem -SP -t "${N_THREADS}" "${INDEX}" "${FASTQ1}" "${FASTQ2}" | { # Classify Hi-C molecules as unmapped/single-sided/multimapped/chimeric/etc # and output one line per read, containing the following, separated by \\v: # * triu-flipped pairs # * read id # * type of a Hi-C molecule # * corresponding sam entries pairtools parse --chroms-path "{CHROM_SIZES}" } | { # Block-sort pairs together with SAM entries pairtools sort --nproc 4 } | { # Remove duplicates, separate mapped and unmapped reads pairtools dedup \ --output \ >( pairtools split \ --output-pairs ${NODUPS_PAIRS_PATH} \ --output-sam ${NODUPS_SAM_PATH} ) \ --output-dups \ >( pairtools markasdup \ | pairtools split \ --output-pairs ${DUPS_PAIRS_PATH} \ --output-sam ${DUPS_SAM_PATH} ) \ --output-unmapped >( pairtools split \ --output-pairs ${UNMAPPED_PAIRS_PATH} \ --output-sam ${UNMAPPED_SAM_PATH} ) } pairtools-1.1.3/doc/examples/example_singlecell_pipeline.sh000066400000000000000000000055271474715105500242120ustar00rootroot00000000000000#!/usr/bin/env bash if [ $# -le 3 ] ; then echo "Usage: bash example_pipeline.sh BWA_INDEX FASTQ_1 FASTQ_2 OUTPUT_PREFIX" echo "" echo "A example of a bash pipeline to align the sequencing data from a " echo "single Hi-C experiment." echo "" echo "positional arguments:" echo "" echo "BWA_INDEX The path to a bwa index of the reference genome." echo "CHROM_SIZES The path to a file with chromosome sizes." echo "FASTQ_1 The path to a fastq file with the sequences of " echo " the first side of Hi-C molecules." echo "FASTQ_2 The path to a fastq file with the sequences of " echo " the second side of Hi-C molecules." echo "OUTPUT_PREFIX The prefix to the paths of generated outputs. " echo "" echo "" exit 0 fi set -o errexit set -o nounset set -o pipefail INDEX=$1 CHROM_SIZES=$2 FASTQ1=$3 FASTQ2=$4 OUTPREFIX=$5 N_THREADS=8 UNMAPPED_SAM_PATH=${OUTPREFIX}.unmapped.bam UNMAPPED_PAIRS_PATH=${OUTPREFIX}.unmapped.pairs.gz NODUPS_SAM_PATH=${OUTPREFIX}.nodups.bam NODUPS_PAIRS_PATH=${OUTPREFIX}.nodups.pairs.gz DUPS_SAM_PATH=${OUTPREFIX}.dups.bam DUPS_PAIRS_PATH=${OUTPREFIX}.dups.pairs.gz LOWFREQPAIRS_SAM_PATH=${OUTPREFIX}.lowfreq.bam LOWFREQPAIRS_PAIRS_PATH=${OUTPREFIX}.lowfreq.pairs.gz HIGHFREQPAIRS_SAM_PATH=${OUTPREFIX}.highfreq.bam HIGHFREQPAIRS_PAIRS_PATH=${OUTPREFIX}.highfreq.pairs.gz bwa mem -SP -t "${N_THREADS}" "${INDEX}" "${FASTQ1}" "${FASTQ2}" | { # Classify Hi-C molecules as unmapped/single-sided/multimapped/chimeric/etc # and output one line per read, containing the following, separated by \\v: # * triu-flipped pairs # * read id # * type of a Hi-C molecule # * corresponding sam entries pairtools parse "{CHROM_SIZES}" } | { # Block-sort pairs together with SAM entries pairtools sort } | { # Set unmapped and ambiguous reads aside pairtools select '(pair_type == "UU") or (pair_type == "UR") or (pair_type == "RU")' \ --output-rest >( pairtools split \ --output-pairs ${UNMAPPED_PAIRS_PATH} \ --output-sam ${UNMAPPED_SAM_PATH} ) } | { # Remove duplicates pairtools dedup \ --output-dups \ >( pairtools markasdup \ | pairtools split \ --output-pairs ${DUPS_PAIRS_PATH} \ --output-sam ${DUPS_SAM_PATH} ) } | { # Remove high frequency interactors pairtools multifilter \ --output \ >( pairtools split \ --output-pairs ${LOWFREQ_PAIRS_PATH} \ --output-sam ${LOWFREQ_SAM_PATH} ) \ --output-high-frequency-interactors \ >( pairtools markasdup \ | pairtools split \ --output-pairs ${HIGHFREQPAIRS_PAIRS_PATH} \ --output-sam ${HIGHFREQPAIRS_SAM_PATH} ) } pairtools-1.1.3/doc/examples/pairtools_phase_walkthrough.ipynb000066400000000000000000003174421474715105500250150ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "id": "112fe2d5-aaed-4eb1-b3f5-2f5889a9c89f", "metadata": {}, "source": [ "# Pairtools phase walkthrough\n", "\n", "Welcome to the pairtools phase walkthrough! This notebook will guide you through the process of resolving contacts between homologous chromosomes using haplotype-resolved Hi-C analysis.\n", "\n", "## What is haplotype-resolved Hi-C?\n", "\n", "Haplotype-resolved Hi-C distinguishes interactions within individual chromosomes (cis-homolog contacts) from those between homologous chromosomes (trans-homolog contacts). This separation is possible because homologous chromosomes carry variations (e.g. single nucleotide variants, or, SNVs) that can be used to tell them apart.\n", "\n", "The experimental challenge of haplotype-resolved Hi-C is to increase the number of SNVs that are essential to distinguish reads from different chromosomes. This can be done by mating highly diverged homozygous strains and studying their F1 progeny. \n", "\n", "Several studies have successfully leveraged haplotype-resolved Hi-C for novel insights:\n", "1. Erceg et al. (2019) explored chromosome pairing in Drosophila embryos [1].\n", "2. Collombet et al. (2020) studied chromosomal organization during early mammalian embryogenesis [2].\n", "3. Tan et al. 2018 uses available heterozygous positions to infer the 3D structures of single chromosomes by single-cell variant of the protocol Dip-C [3]\n", "4. Duan et al. use dikaryonic nuclei of fungi with 0.7% heterozygosity [4]" ] }, { "attachments": { "62e74fba-c1c1-44b5-a3e2-3699c3cac7ce.png": { "image/png": "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ICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjQzNjwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj44MTQ8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5TY3JlZW5zaG90PC9leGlmOlVzZXJDb21tZW50PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K5t/YPQAAABxpRE9UAAAAAgAAAAAAAADaAAAAKAAAANoAAADaAABR/Kx9IVAAAEAASURBVHgB7J0J3A3V/8e/JPu+JEtky1KSdiVa+aWfpbL+SihFaVG0qkgqSSnSZklFZYmK0GIpUUIpSijJmlA81mzzP5/z+5/5zV2e+9y52zN37ue8XszMmTNnznmfeeaez5zv+Z48lgrCQAIkQAIkQAIkQAIkQAIkQAIeJpCHwsXDrcOikQAJkAAJkAAJkAAJkAAJaAIULnwQSIAESIAESIAESIAESIAEPE+AwsXzTcQCkgAJkAAJkAAJkAAJkAAJULjwGSABEiABEiABEiABEiABEvA8AQoXzzcRC0gCJEACJEACJEACJEACJEDhwmeABEiABEiABEiABEiABEjA8wQoXDzfRCwgCZAACZAACZAACZAACZAAhQufARIgARIgARIgARIgARIgAc8ToHDxfBOxgCRAAiRAAiRAAiRAAiRAAhQufAZIgARIgARIgARIgARIgAQ8T4DCxfNNxAKSAAmQAAmQAAmQAAmQAAlQuPAZIAESIAESIAESIAESIAES8DwBChfPNxELSAIkQAIkQAIkQAIkQAIkQOHCZ4AESIAESIAESIAESIAESMDzBChcPN9ELCAJkAAJkAAJkAAJkAAJkACFC58BEiABEiABEiABEiABEiABzxOgcPF8E7GAJEACJEACJEACJEACJEACFC58BkiABEiABEiABEiABEiABDxPgMLF803EApIACZAACZAACZAACZAACVC48BkgARIgARIgARIgARIgARLwPAEKF883EQtIAiRAAiRAAiRAAiRA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hlmmLKTshjXTpi+BuEzF1B+TDnA3B1MKzE1Q62CYaG4zlABc7L3//vuuaz9mzBhREwBdXxfuArgZHDRokChRHe501HEwF4PZGczenG4Eo86ACX1F4Pbbb5cOHTq4qhNszdUia7Jr1y5X14VLDFt5tW6CdkWvRgTDJWFcLhH47bfftKtVzJFTo7y5VAre1isElKMa3S9yW55+/foJ5n0mIsDkGr+DmJfHQAJ+IZAQ4eIXGKwHCZAACZAACZAACZAACZCANwlQuHizXVgqEiABEiABEiABEiABEiABBwEKFwcM7pIACZAACZAACZAACZAACXiTAIWLN9uFpSIBEiABEiABEiABEiABEnAQoHBxwOAuCZAACZAACZAACZAACZCANwlQuHizXVgqEiABEiABEiABEiABEiABBwEKFwcM7pIACZAACZAACZAACZAACXiTAIWLN9uFpSIBEiABEiABEiABEiABEnAQoHBxwOAuCZAACZAACZAACZAACZCANwlQuHizXVgqEiABEiABEiABEiABEiABBwEKFwcM7pIACZAACZAACZAACZAACXiTAIWLN9uFpSIBEiABEiABm8Cxfftk7w8/2MfOnSL16slxJUo4o7y/f+yYZC1eHLacBatVk/wnnhj2HCNJgAQymwCFS2a3P2tPAiRAAiSQBgQO/fGHLKxQIWxJz1WCpkj9+mHPeTlygRJbR7KyQop42uTJUq5t25B4RpAACZDA/wEAAP//LShvBwAAPlBJREFU7d0J3FTz/sDx71NpX7SnRaKNyFrZkkS6yBJR1rZL1lDk383NpeQWiVCiruKmnZSKilQq2i2JrnYttO97//M9/E4z8zxPM8/MmZlzZj6/16vOMmf5/d5nnuc533N+S8YxKwkJAQQQQAABBDwtMKtECTm0bVtQHjNy55YGe/dKRt68Qev9sLDw0ktlx5w5mbJab+lSKXjmmZnWswIBBBDIIHDhS4AAAggggID3BRbVry/bZ80KymihmjWl7k8/Ba3zy8LP7drJ+kGDgrKb66ST5Io9eyTDmpIQQACBUAECl1ARlhFAAAEEEPCgwC/t28tvb78dlLPSzZrJ2WPGBK3zy8K6V1+V5U8+GZTdQrVqSd0ffghaxwICCCBgBAhcjARTBBBAAAEEPCyw7vXXZXmHDkE5PO3ZZ6XK888HrfPLwrbPP5fF114b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AukuQOCS7t8Ayo8AAggggAACCCCAgA8ECFx8cJHIIgIIIIAAAggggAAC6S5A4JLu3wDKjwACCCCAAAIIIICADwQIXHxwkcgiAggggAACCCCAAALpLkDgku7fAMqPAAIIIIAAAggggIAPBAhcfHCRyCICCCCAAAIIIIAAAukuQOCS7t8Ayo8AAggggAACCCCAgA8ECFx8cJHIIgIIIIAAAggggAAC6S5A4JLu3wDKjwACCCCAAAIIIICADwQIXHxwkcgiAggggAACCCCAAALpLkDgku7fAMqPAAIIIIAAAggggIAPBAhcfHCRyCICCCCAAAIIIIAAAukuQOCS7t8Ayo8AAggggAACCCCAgA8ECFx8cJHIIgIIIIAAAggggAAC6S5A4JLu3wDKjwACCCCAAAIIIICADwQIXHxwkcgiAggggAACCCCAAALpLkDgku7fAMqPAAIIIIAAAggggIAPBAhcfHCRyCICCCCAAAIIIIAAAukuQOCS7t8Ayo8AAggggAACCCCAgA8ECFx8cJHIIgIIIIAAAggggAAC6S5A4JLu3wDKjwACCCCAAAIIIICADwQIXHxwkcgiAggggAACCCCAAALpLpCSgcvmzZvluuuuk4yMDPufuci6rCm7aVafPf7449KsWTN7P/5DAIE/BYYPHy59+vQJ+hkzP1e6hZk308B1gfPm8xo1asiAAQMkd+7c+jEJAQRiFJg7d6489thjEf+Mmp9FPa2Z12muXLnk1VdflfPPPz/GHMV39507d8rVV18dtryh5TO5MmU2n+fJk0f69+8v+ruJhAAC3hFIycBlw4YNUr58eVeU8+XLJxMnTpSrrrrKleNxEARSQeC1114TDerdTK1atZLBgwc7N01uHptjIZBuAp999pk0adLElWKXKVNGvv76a6lataorx4vHQbZu3SolS5Z09dCnnnqqXe6KFSu6elwOhgAC0QsQuERgV6RIEfnyyy/lwgsvjGBrNkEg9QXiEbioWqdOnaR3796pD0gJEYizgJuBi2b1tNNOs2/i3Xoo6Hbx4xG4aB7POussmTlzppQoUcLtLHM8BBCIQiAtApcqVapI3rx5s+Q5duxYlusPHjwoq1atcj4rXbq0zJo1S6pXr+6sYwaBdBUIDFz0Z0t/xk6Usvs5033WrVsne/fudXZ/6aWXpHPnzs4yMwggkHOB0MDlRFWe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DhxoDzhptmGKAALJE0iLwCUWXhrixaLHvqkqEBq4xFpOHQ/pk08+kYYNG8Z6KPZHAAFLIDRwiQWlVatW8u6774pW4/RqCg1c3MjnY489Jn379s3Rg083zssxEEAgewECl+xthIZ4J8Dho7QWcDNw0fGQJk6cKJdccklam1J4BNwUcCtwefjhh6Vfv36ev3l3O3Dp0qWL9OjRw81LwrEQQMAFgZQMXLRB4ccffxwTT65cuUQb49EQLyZGdk5RgV9++cXucc+N4ulYSHQt7oYkx0DguICObD99+vTjK6KY0wb4TZs2jWLPxO+i1U7Hjh3ryon1YUqTJk1cORYHQQABdwVSMnBxl4ijIYAAAggggAACCCCAQLIFCFySfQU4PwIIIIAAAggggAACCIQVIHAJS8QGCCCAAAIIIIAAAgggkGwBApdkXwHOjwACCCCAAAIIIIAAAmEFCFzCErEBAggggAACCCCAAAIIJFuAwCXZV4DzI4AAAggggAACCCCAQFgBApewRGyAAAIIIIAAAggggAACyRYgcEn2FeD8CCCAAAIIIIAAAgggEFaAwCUsERsggAACCCCAAAIIIIBAsgUIXJJ9BTg/AggggAACCCCAAAIIhBUgcAlLxAYIIIAAAggggAACCCCQbAECl2RfAc6PAAIIIIAAAggggAACYQUIXMISsQECCCCAAAIIIIAAAggkW4DAJdlXgPMjgAACCCCAAAIIIIBAWAECl7BEbIAAAggggAACCCCAAALJFiBwSfYV4PwIIIAAAggggAACCCAQVoDAJSwRGyCAAAIIIIAAAggggECyBQhckn0FOD8CCCCAAAIIIIAAAgiEFSBwCUvEBggggAACCCCAAAIIIJBsAQKXZF8Bzo8AAggggAACCCCAAAJhBQhcwhKxAQIIIIAAAggggAACCCRbgMAl2VeA8yOAAAIIIIAAAggggEBYAQKXsERsgAACCCCAAAIIIIAAAskWIHBJ9hXg/AgggAACCCCAAAIIIBBWgMAlLBEbIIAAAggggAACCCCAQLIFCFySfQU4PwIIIIAAAggggAACCIQVIHAJS8QGCCCAAAIIIIAAAgggkGwBApdkXwHOjwACCCCAAAIIIIAAAmEFCFzCErEBAggggAACCCCAAAIIJFuAwCXZV4DzI4AAAggggAACCCCAQFgBApewRGyAAAIIIIAAAggggAACyRYgcEn2FeD8CCCAAAIIIIAAAgggEFaAwCUsERsggAACCCCAAAIIIIBAsgUIXJJ9BTg/AggggAACCCCAAAIIhBUgcAlLxAYIIIAAAggggAACCCCQbAECl2RfAc6PAAIIIIAAAggggAACYQUIXMISsQECCCCAAAIIIIAAAggkW4DAJdlXgPMjgAACCCCAAAIIIIBAWAECl7BEbIAAAggggAACCCCAAALJFiBwSfYV4PwIIIAAAggggAACCCAQVoDAJSwRGyCAAAIIIIAAAggggECyBQhckn0FOD8CCCCAAAIIIIAAAgiEFSBwCUvEBggggAACCCCAAAIIIJBsAQKXZF8Bzo8AAggggAACCCCAAAJhBQhcwhKxAQIIIIAAAggggAACCCRbgMAl2VeA8yOAAAIIIIAAAggggEBYgf8H9H/SxaYCxioAAAAASUVORK5CYII=" } }, "cell_type": "markdown", "id": "c3795661-e308-44e6-9b0f-3f0396541250", "metadata": {}, "source": [ "Several approaches have been developed to process Hi-C data from haplotype-resolved experiments. In `pairtools`, we implement the approach that was used in Erceg et al. Here is its brief outline:\n", "\n", "1. Create the haplotype-resolved genome. First, we will create a \"concatenated\" reference genome that contains sequences of both homologs of each chromosome. \n", "\n", " - Incorporate known SNVs (usually in .vcf format) into the reference genome using [bcftools](https://samtools.github.io/bcftools/bcftools.html) to create FASTA files with the sequences of both homologs.\n", " - Add suffixes to the name of each homolog that identify the type (`_hap1` or `_hap2`).\n", "\n", "2. Map the Hi-C data to the concatenated reference and parse resulting alignment into Hi-C pairs. Compared to the standard Hi-C pipeline, this step would contain a couple of modifications:\n", " - Make the aligner report two suboptimal alignments (aka the second and the third hit).\n", " - Parse allowing multimappers (mapq 0). \n", " \n", " Note that, upon mapping to the homolog-resolved genome, Hi-C reads will report the identity of their homologue as the suffix of the chromosome name.\n", " \n", "3. Phase the resulting pairs based on the reported suboptimal alignments. \n", "\n", " By checking the scores of two suboptimal alignments, we will distinguish the true multi-mappers from unresolved pairs (i.e. cases when the read aligns to the location with no distinguishing SNV). Phasing will remove the haplotype suffixes from chromosome names and add extra fields to the .pairs file with:\n", "\n", " - '.' (non-resolved)\n", " - '0' (first haplotype) \n", " - '1' (second haplotype)\n", " \n", " Phasing schema: \n", " \n", " ![image.png](attachment:62e74fba-c1c1-44b5-a3e2-3699c3cac7ce.png)\n", "\n", "\n", "4. Post-procesing. Sort and [dedup](#pairtools-dedup) Hi-C pairs and calculate [stats](#Stats), similarly to the standard Hi-C pipeline. " ] }, { "cell_type": "markdown", "id": "9dc8a020-7c4b-471d-9dfd-a5e346f10a27", "metadata": {}, "source": [ "[1] Erceg, J., AlHaj Abed, J., Goloborodko, A., Lajoie, B. R., Fudenberg, G., Abdennur, N., Imakaev, M., McCole, R. B., Nguyen, S. C., Saylor, W., Joyce, E. F., Senaratne, T. N., Hannan, M. A., Nir, G., Dekker, J., Mirny, L. A., & Wu, C. T. (2019). The genome-wide multi-layered architecture of chromosome pairing in early Drosophila embryos. Nature communications, 10(1), 4486. https://doi.org/10.1038/s41467-019-12211-8\n", "\n", "[2] Collombet, S., Ranisavljevic, N., Nagano, T., Varnai, C., Shisode, T., Leung, W., Piolot, T., Galupa, R., Borensztein, M., Servant, N., Fraser, P., Ancelin, K., & Heard, E. (2020). Parental-to-embryo switch of chromosome organization in early embryogenesis. Nature, 580(7801), 142–146. https://doi.org/10.1038/s41586-020-2125-z\n", "\n", "[3] Tan, L., Xing, D., Chang, C. H., Li, H., & Xie, X. S. (2018). Three-dimensional genome structures of single diploid human cells. Science (New York, N.Y.), 361(6405), 924–928. https://doi.org/10.1126/science.aat5641\n", "\n", "[4] Duan, H., Jones, A. W., Hewitt, T., Mackenzie, A., Hu, Y., Sharp, A., Lewis, D., Mago, R., Upadhyaya, N. M., Rathjen, J. P., Stone, E. A., Schwessinger, B., Figueroa, M., Dodds, P. N., Periyannan, S., & Sperschneider, J. (2022). Physical separation of haplotypes in dikaryons allows benchmarking of phasing accuracy in Nanopore and HiFi assemblies with Hi-C data. Genome biology, 23(1), 84. https://doi.org/10.1186/s13059-022-02658-2\n" ] }, { "cell_type": "markdown", "id": "a0b4c550-8168-4780-82e0-1e18493135af", "metadata": {}, "source": [ "We will test this pipeline on a sample from Collombet et al. 2019 [2], which is a great example of single-cell Hi-C obtained on mice hybrids of highly heterozygous parents. For the sake of brevity, we will focus on just one cell from the dataset, GSM3691125_2CSE_70. \n", "\n", "Note that, because this is a single-cell sample, the properties of this dataset may differ from what you may obtain on bulk data. " ] }, { "cell_type": "markdown", "id": "5ab026af-fe25-4a70-82ef-52af6fb25371", "metadata": {}, "source": [ "## Create the homolog-resolved genome\n", "\n", "To phase input reads, we need to map the data to the concatenated genome with two haplotypes. \n", "Below, we will generate such genome in several steps. You will need a reference genome, and one or two lists of mutations to instroduce to the reference.\n", "\n", "#### Download reference genome" ] }, { "cell_type": "code", "execution_count": 5, "id": "9ec0743f-a299-43f0-b568-7e963ed95df8", "metadata": { "tags": [ "hide-output" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--2024-03-18 13:18:25-- https://ftp.ensembl.org/pub/release-68/fasta/mus_musculus/dna/Mus_musculus.GRCm38.68.dna_sm.toplevel.fa.gz\n", "Resolving ftp.ensembl.org (ftp.ensembl.org)... 193.62.193.169\n", "Connecting to ftp.ensembl.org (ftp.ensembl.org)|193.62.193.169|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 861993605 (822M) [application/x-gzip]\n", "Saving to: ‘Mus_musculus.GRCm38.68.dna_sm.toplevel.fa.gz’\n", "\n", "Mus_musculus.GRCm38 100%[===================>] 822.06M 2.43MB/s in 5m 35s \n", "\n", "2024-03-18 13:24:01 (2.45 MB/s) - ‘Mus_musculus.GRCm38.68.dna_sm.toplevel.fa.gz’ saved [861993605/861993605]\n", "\n" ] } ], "source": [ "! wget https://ftp.ensembl.org/pub/release-68/fasta/mus_musculus/dna/Mus_musculus.GRCm38.68.dna_sm.toplevel.fa.gz" ] }, { "cell_type": "markdown", "id": "6f31f657", "metadata": {}, "source": [ "The genome must be indexed for subsequent steps. However, indexing requires the genome to be compressed with bgzip." ] }, { "cell_type": "code", "execution_count": 13, "id": "79e6471d", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "zcat Mus_musculus.GRCm38.68.dna_sm.toplevel.fa.gz | bgzip -c > Mus_musculus.GRCm38.68.dna_sm.toplevel.fa.bgz\n", "samtools faidx Mus_musculus.GRCm38.68.dna_sm.toplevel.fa.bgz\n", "rm Mus_musculus.GRCm38.68.dna_sm.toplevel.fa.gz" ] }, { "cell_type": "markdown", "id": "7683d63a-bc2f-4c49-8371-fd57f4111072", "metadata": {}, "source": [ "#### Download .vcf file with variants" ] }, { "cell_type": "code", "execution_count": 4, "id": "4a347a3b-2ee7-4824-a209-8377edddf640", "metadata": { "tags": [ "hide-output" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--2024-03-18 13:18:14-- https://ftp.ebi.ac.uk/pub/databases/mousegenomes/REL-1505-SNPs_Indels/strain_specific_vcfs/CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Resolving ftp.ebi.ac.uk (ftp.ebi.ac.uk)... 193.62.193.165\n", "Connecting to ftp.ebi.ac.uk (ftp.ebi.ac.uk)|193.62.193.165|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 785849127 (749M) [application/x-gzip]\n", "Saving to: ‘CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz.2’\n", "\n", " CAST_EiJ.mgp.v5.sn 0%[ ] 4.82M 2.42MB/s ^C\n" ] } ], "source": [ "! wget https://ftp.ebi.ac.uk/pub/databases/mousegenomes/REL-1505-SNPs_Indels/strain_specific_vcfs/CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz" ] }, { "cell_type": "markdown", "id": "88363fb6-c233-4a07-a208-a5e5a2679038", "metadata": {}, "source": [ "#### Index the variants" ] }, { "cell_type": "code", "execution_count": 6, "id": "84cebce3-29c6-42df-98bf-5388a51fb268", "metadata": {}, "outputs": [], "source": [ "! bcftools index CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz" ] }, { "cell_type": "markdown", "id": "2dd599a0-64f9-4c8b-b78f-8eabf49c052e", "metadata": {}, "source": [ "#### Introduce the variants into the genome" ] }, { "cell_type": "code", "execution_count": 16, "id": "848c9fe5-a632-4139-ba56-60871d8d1eb4", "metadata": { "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Warning: Sequence \"JH584295.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584292.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456368.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456396.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456359.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456382.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456392.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456394.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456390.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456387.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456381.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456370.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456372.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456389.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456378.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456360.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456385.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456383.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456213.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456239.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456367.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456366.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456393.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456216.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456379.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584304.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456212.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584302.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584303.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456210.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456219.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584300.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584298.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584294.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456354.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584296.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584297.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456221.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584293.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456350.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456211.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584301.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456233.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584299.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584295.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584292.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456368.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456396.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456359.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456382.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456392.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456394.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456390.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456387.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456381.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456370.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456372.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456389.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456378.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456360.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456385.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456383.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456213.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456239.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456367.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456366.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456393.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456216.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456379.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584304.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456212.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584302.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584303.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456210.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456219.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584300.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584298.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584294.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456354.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584296.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584297.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456221.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584293.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456350.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456211.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584301.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"GL456233.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n", "Warning: Sequence \"JH584299.1\" not in CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz\n" ] } ], "source": [ "%%bash\n", "bcftools consensus --fasta-ref Mus_musculus.GRCm38.68.dna_sm.toplevel.fa.bgz \\\n", " --haplotype 1 CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz | sed -E 's/(>[^[:space:]]+).*/\\1_hap1/g' | bgzip -c > GRCm38_EiJ_snpsonly_hap1.fa.gz\n", "\n", "bcftools consensus --fasta-ref Mus_musculus.GRCm38.68.dna_sm.toplevel.fa.bgz \\\n", " --haplotype 2 CAST_EiJ.mgp.v5.snps.dbSNP142.vcf.gz | sed -E 's/(>[^[:space:]]+).*/\\1_hap2/g' | bgzip -c > GRCm38_EiJ_snpsonly_hap2.fa.gz\n" ] }, { "cell_type": "markdown", "id": "af1f6027", "metadata": {}, "source": [ "Note that some of these inserted variants may change the total number of nucleotides. This would introduce differences between the coordinate systems of two homologs and complicate downstream analyses. Thus, to make your analyses simpler.you may want insert only single-nuleotide variants and exclude \n", "by using `--include` parameter of `bcftools consensus` (e.g. `--include '(STRLEN(REF)=1) & (STRLEN(ALT[0])=1)'`).\n", "This will make sure that the genomic coorditates correspond between the haplotypes. \n", "Correspondence of coordinates is not a requirement, but might be important for downstream analysis. " ] }, { "cell_type": "markdown", "id": "dfd7c4cb-31dd-43df-8510-95fd0ff9f78f", "metadata": {}, "source": [ "#### Create the bwa index of homolog-resolved genome" ] }, { "cell_type": "markdown", "id": "99d28f6f-b754-4a95-95d5-9e5e51d14571", "metadata": {}, "source": [ "Concatenate the genomes of two homologs and index them together. " ] }, { "cell_type": "code", "execution_count": 17, "id": "92ff8a4f-2115-4131-8c4a-cbd040dcdffb", "metadata": { "tags": [ "hide-output" ] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[bwa_index] Pack FASTA... 62.34 sec\n", "[bwa_index] Construct BWT for the packed sequence...\n", "[BWTIncCreate] textLength=10923487096, availableWord=780616804\n", "[BWTIncConstructFromPacked] 10 iterations done. 99999992 characters processed.\n", "[BWTIncConstructFromPacked] 20 iterations done. 199999992 characters processed.\n", "[BWTIncConstructFromPacked] 30 iterations done. 299999992 characters processed.\n", "[BWTIncConstructFromPacked] 40 iterations done. 399999992 characters processed.\n", "[BWTIncConstructFromPacked] 50 iterations done. 499999992 characters processed.\n", "[BWTIncConstructFromPacked] 60 iterations done. 599999992 characters processed.\n", "[BWTIncConstructFromPacked] 70 iterations done. 699999992 characters processed.\n", "[BWTIncConstructFromPacked] 80 iterations done. 799999992 characters processed.\n", "[BWTIncConstructFromPacked] 90 iterations done. 899999992 characters processed.\n", "[BWTIncConstructFromPacked] 100 iterations done. 999999992 characters processed.\n", "[BWTIncConstructFromPacked] 110 iterations done. 1099999992 characters processed.\n", "[BWTIncConstructFromPacked] 120 iterations done. 1199999992 characters processed.\n", "[BWTIncConstructFromPacked] 130 iterations done. 1299999992 characters processed.\n", "[BWTIncConstructFromPacked] 140 iterations done. 1399999992 characters processed.\n", "[BWTIncConstructFromPacked] 150 iterations done. 1499999992 characters processed.\n", "[BWTIncConstructFromPacked] 160 iterations done. 1599999992 characters processed.\n", "[BWTIncConstructFromPacked] 170 iterations done. 1699999992 characters processed.\n", "[BWTIncConstructFromPacked] 180 iterations done. 1799999992 characters processed.\n", "[BWTIncConstructFromPacked] 190 iterations done. 1899999992 characters processed.\n", "[BWTIncConstructFromPacked] 200 iterations done. 1999999992 characters processed.\n", "[BWTIncConstructFromPacked] 210 iterations done. 2099999992 characters processed.\n", "[BWTIncConstructFromPacked] 220 iterations done. 2199999992 characters processed.\n", "[BWTIncConstructFromPacked] 230 iterations done. 2299999992 characters processed.\n", "[BWTIncConstructFromPacked] 240 iterations done. 2399999992 characters processed.\n", "[BWTIncConstructFromPacked] 250 iterations done. 2499999992 characters processed.\n", "[BWTIncConstructFromPacked] 260 iterations done. 2599999992 characters processed.\n", "[BWTIncConstructFromPacked] 270 iterations done. 2699999992 characters processed.\n", "[BWTIncConstructFromPacked] 280 iterations done. 2799999992 characters processed.\n", "[BWTIncConstructFromPacked] 290 iterations done. 2899999992 characters processed.\n", "[BWTIncConstructFromPacked] 300 iterations done. 2999999992 characters processed.\n", "[BWTIncConstructFromPacked] 310 iterations done. 3099999992 characters processed.\n", "[BWTIncConstructFromPacked] 320 iterations done. 3199999992 characters processed.\n", "[BWTIncConstructFromPacked] 330 iterations done. 3299999992 characters processed.\n", "[BWTIncConstructFromPacked] 340 iterations done. 3399999992 characters processed.\n", "[BWTIncConstructFromPacked] 350 iterations done. 3499999992 characters processed.\n", "[BWTIncConstructFromPacked] 360 iterations done. 3599999992 characters processed.\n", "[BWTIncConstructFromPacked] 370 iterations done. 3699999992 characters processed.\n", "[BWTIncConstructFromPacked] 380 iterations done. 3799999992 characters processed.\n", "[BWTIncConstructFromPacked] 390 iterations done. 3899999992 characters processed.\n", "[BWTIncConstructFromPacked] 400 iterations done. 3999999992 characters processed.\n", "[BWTIncConstructFromPacked] 410 iterations done. 4099999992 characters processed.\n", "[BWTIncConstructFromPacked] 420 iterations done. 4199999992 characters processed.\n", "[BWTIncConstructFromPacked] 430 iterations done. 4299999992 characters processed.\n", "[BWTIncConstructFromPacked] 440 iterations done. 4399999992 characters processed.\n", "[BWTIncConstructFromPacked] 450 iterations done. 4499999992 characters processed.\n", "[BWTIncConstructFromPacked] 460 iterations done. 4599999992 characters processed.\n", "[BWTIncConstructFromPacked] 470 iterations done. 4699999992 characters processed.\n", "[BWTIncConstructFromPacked] 480 iterations done. 4799999992 characters processed.\n", "[BWTIncConstructFromPacked] 490 iterations done. 4899999992 characters processed.\n", "[BWTIncConstructFromPacked] 500 iterations done. 4999999992 characters processed.\n", "[BWTIncConstructFromPacked] 510 iterations done. 5099999992 characters processed.\n", "[BWTIncConstructFromPacked] 520 iterations done. 5199999992 characters processed.\n", "[BWTIncConstructFromPacked] 530 iterations done. 5299999992 characters processed.\n", "[BWTIncConstructFromPacked] 540 iterations done. 5399999992 characters processed.\n", "[BWTIncConstructFromPacked] 550 iterations done. 5499999992 characters processed.\n", "[BWTIncConstructFromPacked] 560 iterations done. 5599999992 characters processed.\n", "[BWTIncConstructFromPacked] 570 iterations done. 5699999992 characters processed.\n", "[BWTIncConstructFromPacked] 580 iterations done. 5799999992 characters processed.\n", "[BWTIncConstructFromPacked] 590 iterations done. 5899999992 characters processed.\n", "[BWTIncConstructFromPacked] 600 iterations done. 5999999992 characters processed.\n", "[BWTIncConstructFromPacked] 610 iterations done. 6099999992 characters processed.\n", "[BWTIncConstructFromPacked] 620 iterations done. 6199999992 characters processed.\n", "[BWTIncConstructFromPacked] 630 iterations done. 6299999992 characters processed.\n", "[BWTIncConstructFromPacked] 640 iterations done. 6399999992 characters processed.\n", "[BWTIncConstructFromPacked] 650 iterations done. 6499999992 characters processed.\n", "[BWTIncConstructFromPacked] 660 iterations done. 6599999992 characters processed.\n", "[BWTIncConstructFromPacked] 670 iterations done. 6699999992 characters processed.\n", "[BWTIncConstructFromPacked] 680 iterations done. 6799999992 characters processed.\n", "[BWTIncConstructFromPacked] 690 iterations done. 6899999992 characters processed.\n", "[BWTIncConstructFromPacked] 700 iterations done. 6999999992 characters processed.\n", "[BWTIncConstructFromPacked] 710 iterations done. 7099999992 characters processed.\n", "[BWTIncConstructFromPacked] 720 iterations done. 7199999992 characters processed.\n", "[BWTIncConstructFromPacked] 730 iterations done. 7299999992 characters processed.\n", "[BWTIncConstructFromPacked] 740 iterations done. 7399999992 characters processed.\n", "[BWTIncConstructFromPacked] 750 iterations done. 7499999992 characters processed.\n", "[BWTIncConstructFromPacked] 760 iterations done. 7599999992 characters processed.\n", "[BWTIncConstructFromPacked] 770 iterations done. 7699999992 characters processed.\n", "[BWTIncConstructFromPacked] 780 iterations done. 7799999992 characters processed.\n", "[BWTIncConstructFromPacked] 790 iterations done. 7899999992 characters processed.\n", "[BWTIncConstructFromPacked] 800 iterations done. 7999999992 characters processed.\n", "[BWTIncConstructFromPacked] 810 iterations done. 8099999992 characters processed.\n", "[BWTIncConstructFromPacked] 820 iterations done. 8199999992 characters processed.\n", "[BWTIncConstructFromPacked] 830 iterations done. 8299999992 characters processed.\n", "[BWTIncConstructFromPacked] 840 iterations done. 8399999992 characters processed.\n", "[BWTIncConstructFromPacked] 850 iterations done. 8499999992 characters processed.\n", "[BWTIncConstructFromPacked] 860 iterations done. 8599999992 characters processed.\n", "[BWTIncConstructFromPacked] 870 iterations done. 8699999992 characters processed.\n", "[BWTIncConstructFromPacked] 880 iterations done. 8799999992 characters processed.\n", "[BWTIncConstructFromPacked] 890 iterations done. 8899999992 characters processed.\n", "[BWTIncConstructFromPacked] 900 iterations done. 8999999992 characters processed.\n", "[BWTIncConstructFromPacked] 910 iterations done. 9099999992 characters processed.\n", "[BWTIncConstructFromPacked] 920 iterations done. 9199999992 characters processed.\n", "[BWTIncConstructFromPacked] 930 iterations done. 9299999992 characters processed.\n", "[BWTIncConstructFromPacked] 940 iterations done. 9399999992 characters processed.\n", "[BWTIncConstructFromPacked] 950 iterations done. 9499999992 characters processed.\n", "[BWTIncConstructFromPacked] 960 iterations done. 9599999992 characters processed.\n", "[BWTIncConstructFromPacked] 970 iterations done. 9699999992 characters processed.\n", "[BWTIncConstructFromPacked] 980 iterations done. 9799999992 characters processed.\n", "[BWTIncConstructFromPacked] 990 iterations done. 9899999992 characters processed.\n", "[BWTIncConstructFromPacked] 1000 iterations done. 9999999992 characters processed.\n", "[BWTIncConstructFromPacked] 1010 iterations done. 10099999992 characters processed.\n", "[BWTIncConstructFromPacked] 1020 iterations done. 10199999992 characters processed.\n", "[BWTIncConstructFromPacked] 1030 iterations done. 10298557624 characters processed.\n", "[BWTIncConstructFromPacked] 1040 iterations done. 10387491112 characters processed.\n", "[BWTIncConstructFromPacked] 1050 iterations done. 10466531432 characters processed.\n", "[BWTIncConstructFromPacked] 1060 iterations done. 10536778632 characters processed.\n", "[BWTIncConstructFromPacked] 1070 iterations done. 10599210536 characters processed.\n", "[BWTIncConstructFromPacked] 1080 iterations done. 10654696152 characters processed.\n", "[BWTIncConstructFromPacked] 1090 iterations done. 10704007912 characters processed.\n", "[BWTIncConstructFromPacked] 1100 iterations done. 10747832296 characters processed.\n", "[BWTIncConstructFromPacked] 1110 iterations done. 10786779480 characters processed.\n", "[BWTIncConstructFromPacked] 1120 iterations done. 10821391832 characters processed.\n", "[BWTIncConstructFromPacked] 1130 iterations done. 10852151336 characters processed.\n", "[BWTIncConstructFromPacked] 1140 iterations done. 10879486440 characters processed.\n", "[BWTIncConstructFromPacked] 1150 iterations done. 10903777896 characters processed.\n", "[BWTIncConstructFromPacked] 1160 iterations done. 10923487096 characters processed.\n", "[bwt_gen] Finished constructing BWT in 1160 iterations.\n", "[bwa_index] 4810.53 seconds elapse.\n", "[bwa_index] Update BWT... 27.18 sec\n", "[bwa_index] Pack forward-only FASTA... 48.19 sec\n", "[bwa_index] Construct SA from BWT and Occ... 1602.31 sec\n", "[main] Version: 0.7.17-r1188\n", "[main] CMD: bwa index GRCm38_EiJ_snpsonly.fa.gz\n", "[main] Real time: 6563.846 sec; CPU: 6550.547 sec\n" ] } ], "source": [ "%%bash\n", "cat GRCm38_EiJ_snpsonly_hap1.fa.gz GRCm38_EiJ_snpsonly_hap2.fa.gz > GRCm38_EiJ_snpsonly.fa.gz\n", "bwa index GRCm38_EiJ_snpsonly.fa.gz" ] }, { "cell_type": "markdown", "id": "22017c7e-71af-4ef3-8237-364402e896fb", "metadata": {}, "source": [ "Generate chromosome sizes file: " ] }, { "cell_type": "code", "execution_count": 18, "id": "69489018-edde-4aa0-b7ac-7c7b4351764c", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "faidx GRCm38_EiJ_snpsonly.fa.gz -i chromsizes > GRCm38_EiJ_snpsonly.chromsizes" ] }, { "cell_type": "markdown", "id": "bd264406-be74-4060-9798-e18040c44889", "metadata": { "tags": [] }, "source": [ "## Download data\n", "\n", "Uncomment the `--minSpotId` and `--maxSpotId` if you want to run the small test instead of full run." ] }, { "cell_type": "code", "execution_count": 2, "id": "f4e310c0-2d16-4e7d-87d7-44feec8e6256", "metadata": {}, "outputs": [], "source": [ "! fastq-dump SRR8811373 --gzip --split-spot --split-3 # --minSpotId 0 --maxSpotId 1000000" ] }, { "cell_type": "code", "execution_count": 3, "id": "571e94fb-3dec-4042-9e21-6c39802ed8df", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SRR8811373_1.fastq.gz SRR8811373_2.fastq.gz\n" ] } ], "source": [ "! ls SRR8811373*.fastq.gz" ] }, { "cell_type": "markdown", "id": "a8a9fd19", "metadata": {}, "source": [ "## Map data with bwa mem to diploid genome\n", "\n", "In homolog-resolved Hi-C experiments, reads are first aligned against the reference genome and then parsed with pairtools, similar to the standard pairtools-based Hi-C pipeline. However, an additional challenge arises in distinguishing between un-phaseable reads (reads that map equally well to two homologous locations on two homologous chromosomes) and multimappers (reads that map to repeats in the genome).\n", "\n", "To differentiate between these cases, we can examine the top three candidate alignments for each read:\n", "- If the top two alignments map to two homologs of the same chromosome with identical scores, and the third-best alignment has a lower score, the read is considered un-phaseable.\n", "- Conversely, if the third-best alignment has the same score as the first two, the read is classified as a multimapper.\n", "\n", "bwa mem provides information on the top three alignments, but the exact usage depends on the version:\n", "\n", "1. Regular bwa binary (using XA alignment tag):\n", "\n", "The latest official bwa release (0.7.17-r1188, as of March 2024) includes the XA tag, which lists alternative (secondary) alignments, their CIGARs, and the number of mismatches relative to the reference. pairtools parse can parse this tag along with other alignment characteristics (AS, XS, and NM tags) to infer the scores of the top three alignments. In this case, no extra mapping flags are required besides the standard Hi-C flags -SP:\n", "\n", "```bash\n", "bwa mem -SP -t 5 mm10_EiJ_snpsonly.fa.gz est.1.fastq.gz test.2.fastq.gz | samtools view -@ 8 -b > mapped.XA.bam\n", "```\n", "\n", "2. Cutting-edge bwa version from GitHub (using XB alignment tag):\n", "\n", "The latest unreleased version of bwa, available on GitHub, can directly report the scores of all secondary alignments using the XB tag, providing more precise results. To use this option, download bwa's source code, compile it manually, and align reads with an additional -u flag:\n", "\n", "```bash\n", "./bwa/bwa mem -SPu -t 5 mm10_EiJ_snpsonly.fa.gz test.1.fastq.gz test.2.fastq.gz | samtools view -@ 8 -b > mapped.XB.bam\n", "```\n", "\n", "In this tutorial, we will use the first, simpler option.\n", "\n", "Note: [bwa-mem2](https://github.com/bwa-mem2/bwa-mem2) produces [very similar results to bwa mem](https://github.com/open2c/pairtools/discussions/118) while being [x2-3 times faster](https://github.com/bwa-mem2/bwa-mem2#performance). pairtools are compatible with bwa-mem2, and its use is highly recommended for improved performance." ] }, { "cell_type": "code", "execution_count": 4, "id": "12f8a13d-fba6-45f7-8112-291fb883d7d0", "metadata": { "tags": [ "hide-output" ] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[M::bwa_idx_load_from_disk] read 0 ALT contigs\n", "[M::process] read 331126 sequences (50000026 bp)...\n", "[M::process] read 127590 sequences (19265939 bp)...\n", "[M::mem_pestat] # candidate unique pairs for (FF, FR, RF, RR): (1, 238, 0, 0)\n", "[M::mem_pestat] skip orientation FF as there are not enough pairs\n", "[M::mem_pestat] analyzing insert size distribution for orientation FR...\n", "[M::mem_pestat] (25, 50, 75) percentile: (70, 98, 141)\n", "[M::mem_pestat] low and high boundaries for computing mean and std.dev: (1, 283)\n", "[M::mem_pestat] mean and std.dev: (109.44, 53.37)\n", "[M::mem_pestat] low and high boundaries for proper pairs: (1, 354)\n", "[M::mem_pestat] skip orientation RF as there are not enough pairs\n", "[M::mem_pestat] skip orientation RR as there are not enough pairs\n", "[M::mem_process_seqs] Processed 331126 reads in 276.310 CPU sec, 55.358 real sec\n", "[W::bseq_read] the 1st file has fewer sequences.\n", "[M::mem_pestat] # candidate unique pairs for (FF, FR, RF, RR): (0, 98, 0, 0)\n", "[M::mem_pestat] skip orientation FF as there are not enough pairs\n", "[M::mem_pestat] analyzing insert size distribution for orientation FR...\n", "[M::mem_pestat] (25, 50, 75) percentile: (73, 107, 164)\n", "[M::mem_pestat] low and high boundaries for computing mean and std.dev: (1, 346)\n", "[M::mem_pestat] mean and std.dev: (118.69, 58.74)\n", "[M::mem_pestat] low and high boundaries for proper pairs: (1, 437)\n", "[M::mem_pestat] skip orientation RF as there are not enough pairs\n", "[M::mem_pestat] skip orientation RR as there are not enough pairs\n", "[mem_sam_pe] paired reads have different names: \"SRR8811373.22935\", \"SRR8811373.229358\"\n", "\n" ] } ], "source": [ "%%bash\n", "bwa mem -SP -t 5 GRCm38_EiJ_snpsonly.fa.gz SRR8811373_1.fastq.gz SRR8811373_2.fastq.gz \\\n", " | samtools view -@ 8 -b > mapped.XA.bam" ] }, { "cell_type": "markdown", "id": "3bce4691-6268-4885-b8e0-1933a561d4b5", "metadata": {}, "source": [ "## pairtools parse\n", "\n", "In order to be phased, parsed Hi-C pairs need to (a) be parsed without mapq filtering and (b) contain a few additional tags (XA,NM,AS,XS). \n", "The former modification (a) is needed, because, the default `--min-mapq` value of 1 removes all multiply mapped sequences. This also removes all un-phaseable reads, as they map equally well to both homologs and thus have mapq of 0. Since we would like to keep un-phaseable reads, we need to set --min-mapq 0." ] }, { "cell_type": "code", "execution_count": 5, "id": "efc63459-aa2f-44f5-804e-a2346d2b7820", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[E::idx_find_and_load] Could not retrieve index file for 'mapped.XA.bam'\n" ] } ], "source": [ "%%bash\n", "pairtools parse --min-mapq 0 --add-columns XA,NM,AS,XS --drop-sam --walks-policy all \\\n", " -c GRCm38_EiJ_snpsonly.chromsizes mapped.XA.bam -o unphased.XA.pairs.gz" ] }, { "cell_type": "markdown", "id": "c39c62f0", "metadata": {}, "source": [ "count the number of pairs in the output file" ] }, { "cell_type": "code", "execution_count": 7, "id": "e1788b32", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "253813\n" ] } ], "source": [ "!zcat unphased.XA.pairs.gz | grep -v ^\\# | wc -l" ] }, { "cell_type": "markdown", "id": "c90ff16b-bb5b-4ceb-8fe3-feeae8ada021", "metadata": {}, "source": [ "## pairtools phase\n", "\n", "Phasing will remove the tags \"\\_hap1\" and \"\\_hap2\" from chromosome names and add a separate field for the phase:" ] }, { "cell_type": "code", "execution_count": 8, "id": "6c8deaee-cb68-4b53-b306-bf223523ab45", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "pairtools phase --phase-suffixes _hap1 _hap2 --tag-mode XA --clean-output unphased.XA.pairs.gz -o phased.XA.pairs.gz" ] }, { "cell_type": "markdown", "id": "c17443ec-b647-4818-aced-bdc686109396", "metadata": {}, "source": [ "## pairtools dedup\n", "\n", "Sort prior to dedup: " ] }, { "cell_type": "code", "execution_count": 9, "id": "6aabbc13-a8d4-43f2-b388-62e7b3b576ab", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "pairtools sort phased.XA.pairs.gz --nproc 10 -o phased.sorted.XA.pairs.gz" ] }, { "cell_type": "markdown", "id": "84d0442c-ba94-4571-8c89-44067acecb47", "metadata": {}, "source": [ "Deduplication now should take additional columns with phases into account: " ] }, { "cell_type": "code", "execution_count": 10, "id": "9fd3b266-4faa-4fc0-974d-b0ca9bbeb961", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "pairtools dedup --mark-dups --extra-col-pair phase1 phase2 \\\n", " --output-dups - --output-unmapped - --output-stats phased.XA.dedup.stats \\\n", " -o phased.sorted.XA.nodup.pairs.gz phased.sorted.XA.pairs.gz" ] }, { "cell_type": "code", "execution_count": 17, "id": "0e485084", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "total\t232761\n", "total_unmapped\t29132\n", "total_single_sided_mapped\t44444\n", "total_mapped\t159185\n", "total_dups\t5219\n", "total_nodups\t153966\n", "cis\t17712\n", "trans\t136254\n", "pair_types/MM\t21281\n", "pair_types/NM\t7241\n", "pair_types/NN\t610\n", "pair_types/NU\t19507\n", "pair_types/MU\t22736\n", "pair_types/UU\t153966\n", "pair_types/UM\t2201\n", "pair_types/DD\t5219\n", "cis_1kb+\t9470\n", "cis_2kb+\t9225\n", "cis_4kb+\t8839\n", "cis_10kb+\t8161\n", "cis_20kb+\t7590\n", "cis_40kb+\t7162\n", "summary/frac_cis\t0.11503838509800865\n", "summary/frac_cis_1kb+\t0.06150708598002156\n", "summary/frac_cis_2kb+\t0.05991582557187951\n", "summary/frac_cis_4kb+\t0.05740877856150059\n", "summary/frac_cis_10kb+\t0.053005208942234\n", "summary/frac_cis_20kb+\t0.049296597950196794\n", "summary/frac_cis_40kb+\t0.046516763441279245\n", "summary/frac_dups\t0.032785752426422086\n", "summary/complexity_naive\t2374298.3333298806\n", "chrom_freq/1/1\t4333\n", "chrom_freq/10/10\t7537\n", "chrom_freq/1/6\t173\n", "chrom_freq/1/7\t121\n" ] } ], "source": [ "!cat phased.XA.dedup.stats | head -35" ] }, { "cell_type": "markdown", "id": "d7ae3575-aef8-4a8b-9707-b37627653ba9", "metadata": {}, "source": [ "Dedup might generate warning that phase columns now contain mixed data types ('.' alongside with 0 and 1). This warning is inherited from reading by reading the pairs file by pandas." ] }, { "cell_type": "markdown", "id": "89f9d829-3f79-49b4-b74d-8bca732b8a44", "metadata": {}, "source": [ "## Stats\n", "\n", "First, filter different types of reads:" ] }, { "cell_type": "code", "execution_count": 30, "id": "727a9d2b-5977-4763-81e5-64589c067688", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "pairtools select '(phase1==\"0\") and (phase2==\"0\")' phased.sorted.XA.nodup.pairs.gz -o phased.XA.phase0.pairs.gz\n", "pairtools select '(phase1==\"1\") and (phase2==\"1\")' phased.sorted.XA.nodup.pairs.gz -o phased.XA.phase1.pairs.gz\n", "pairtools select '(phase1==\".\") or (phase2==\".\")' phased.sorted.XA.nodup.pairs.gz -o phased.XA.unphased.pairs.gz\n", "pairtools select '(phase1!=phase2) and (phase1!=\".\") and (phase2!=\".\") and (phase1!=\"!\") and (phase2!=\"!\")' phased.sorted.XA.nodup.pairs.gz \\\n", " -o phased.XA.trans-phase.pairs.gz" ] }, { "cell_type": "markdown", "id": "916a5ca1-e549-4501-82d2-8a6e0645b864", "metadata": {}, "source": [ "Calculate stats for these different types:" ] }, { "cell_type": "code", "execution_count": 31, "id": "1172f899-41d6-4ca2-ab21-a283340011f8", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:py.warnings:/users/anton.goloborodko/src/pairtools/pairtools/cli/stats.py:192: DtypeWarning: Columns (1) have mixed types. Specify dtype option on import or set low_memory=False.\n", " for chunk in pd.read_table(body_stream, names=cols, chunksize=100_000):\n", "\n", "WARNING:py.warnings:/users/anton.goloborodko/src/pairtools/pairtools/cli/stats.py:192: DtypeWarning: Columns (1) have mixed types. Specify dtype option on import or set low_memory=False.\n", " for chunk in pd.read_table(body_stream, names=cols, chunksize=100_000):\n", "\n", "WARNING:py.warnings:/users/anton.goloborodko/src/pairtools/pairtools/lib/stats.py:880: RuntimeWarning: divide by zero encountered in double_scalars\n", " complexity = float(nseq / seq_to_complexity) # clean np.int64 data type\n", "\n" ] } ], "source": [ "%%bash\n", "pairtools stats phased.XA.phase0.pairs.gz -o phased.XA.phase0.stats\n", "pairtools stats phased.XA.phase1.pairs.gz -o phased.XA.phase1.stats\n", "pairtools stats phased.XA.unphased.pairs.gz -o phased.XA.unphased.stats\n", "pairtools stats phased.XA.trans-phase.pairs.gz -o phased.XA.trans-phase.stats" ] }, { "cell_type": "markdown", "id": "71a53db7", "metadata": {}, "source": [ "These stats show that rather few reads end up being phased, and that the vast majority of reads are unphased. \n", "\n", "Furthermore, the number of phased reads is comparable between the two haplotypes. The minor mismatch rate is likely to be caused by imperfect annotation of SNVs." ] }, { "cell_type": "code", "execution_count": 32, "id": "2567ccea", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "total\t574\n", "total_unmapped\t0\n", "total_single_sided_mapped\t0\n", "total_mapped\t574\n", "total_dups\t13\n", "total_nodups\t561\n", "cis\t535\n", "trans\t26\n", "pair_types/UU\t561\n", "pair_types/DD\t13\n", "cis_1kb+\t68\n", "cis_2kb+\t67\n", "cis_4kb+\t60\n", "cis_10kb+\t56\n", "cis_20kb+\t48\n", "cis_40kb+\t42\n", "summary/frac_cis\t0.9536541889483066\n", "summary/frac_cis_1kb+\t0.12121212121212122\n", "summary/frac_cis_2kb+\t0.11942959001782531\n", "summary/frac_cis_4kb+\t0.10695187165775401\n" ] } ], "source": [ "!cat phased.XA.phase0.stats | head -20" ] }, { "cell_type": "code", "execution_count": 1, "id": "8f521224", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "total\t485\n", "total_unmapped\t0\n", "total_single_sided_mapped\t0\n", "total_mapped\t485\n", "total_dups\t9\n", "total_nodups\t476\n", "cis\t394\n", "trans\t82\n", "pair_types/UU\t476\n", "pair_types/DD\t9\n", "cis_1kb+\t53\n", "cis_2kb+\t51\n", "cis_4kb+\t50\n", "cis_10kb+\t44\n", "cis_20kb+\t41\n", "cis_40kb+\t38\n", "summary/frac_cis\t0.8277310924369747\n", "summary/frac_cis_1kb+\t0.11134453781512606\n", "summary/frac_cis_2kb+\t0.10714285714285714\n", "summary/frac_cis_4kb+\t0.10504201680672269\n" ] } ], "source": [ "!cat phased.XA.phase1.stats | head -20" ] }, { "cell_type": "code", "execution_count": 33, "id": "3bb8d589", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "total\t241\n", "total_unmapped\t0\n", "total_single_sided_mapped\t0\n", "total_mapped\t241\n", "total_dups\t0\n", "total_nodups\t241\n", "cis\t177\n", "trans\t64\n", "pair_types/UU\t241\n", "cis_1kb+\t85\n", "cis_2kb+\t83\n", "cis_4kb+\t81\n", "cis_10kb+\t75\n", "cis_20kb+\t70\n", "cis_40kb+\t64\n", "summary/frac_cis\t0.7344398340248963\n", "summary/frac_cis_1kb+\t0.35269709543568467\n", "summary/frac_cis_2kb+\t0.34439834024896265\n", "summary/frac_cis_4kb+\t0.3360995850622407\n", "summary/frac_cis_10kb+\t0.3112033195020747\n" ] } ], "source": [ "!cat phased.XA.trans-phase.stats | head -20" ] }, { "cell_type": "code", "execution_count": 34, "id": "29e85a23", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "total\t200077\n", "total_unmapped\t0\n", "total_single_sided_mapped\t42192\n", "total_mapped\t157885\n", "total_dups\t5197\n", "total_nodups\t152688\n", "cis\t52294\n", "trans\t100394\n", "pair_types/UU\t152688\n", "pair_types/MU\t21277\n", "pair_types/NU\t18827\n", "pair_types/UM\t2088\n", "pair_types/DD\t5197\n", "cis_1kb+\t29483\n", "cis_2kb+\t28885\n", "cis_4kb+\t27905\n", "cis_10kb+\t26158\n", "cis_20kb+\t24601\n", "cis_40kb+\t23101\n", "summary/frac_cis\t0.3424892591428272\n" ] } ], "source": [ "!cat phased.XA.unphased.stats | head -20" ] }, { "cell_type": "code", "execution_count": null, "id": "2369ced7", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "25fdebb4-24ca-4280-950e-baa9cc92d28e", "metadata": {}, "source": [ "Visualize with multiQC:" ] }, { "cell_type": "code", "execution_count": null, "id": "9039184f-65a1-43bd-9495-85266fc1fed6", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "multiqc phased.XA.*phase*.stats -o multiqc_report_phasing" ] }, { "cell_type": "code", "execution_count": null, "id": "ed403d73-7b5f-432b-9e91-e8c70906d31b", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import IFrame\n", "\n", "IFrame(src='./multiqc_report_phasing/multiqc_report.html', width=1200, height=700)" ] }, { "cell_type": "code", "execution_count": null, "id": "20e713fe-c962-4d6f-af73-17c21b987a5a", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "main", "language": "python", "name": "main" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.4" } }, "nbformat": 4, "nbformat_minor": 5 } pairtools-1.1.3/doc/examples/pairtools_restrict_walkthrough.ipynb000066400000000000000000010367611474715105500255570ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "a26ff7fa-0774-497c-8df8-4686845bf3b6", "metadata": {}, "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2" ] }, { "cell_type": "code", "execution_count": 2, "id": "882425fb-e34a-41c7-8103-270da19ecec2", "metadata": {}, "outputs": [], "source": [ "import warnings\n", "warnings.filterwarnings(\"ignore\")\n", "\n", "import numpy as np\n", "import pandas as pd\n", "\n", "import matplotlib.pyplot as plt\n", "import matplotlib.ticker \n", "import matplotlib.gridspec\n", "import seaborn as sns\n", "\n", "%matplotlib inline\n", "plt.style.use('seaborn-poster')\n", "\n", "import pandas as pd\n", "import pairtools\n", "import bioframe" ] }, { "cell_type": "markdown", "id": "66194c2b-8c1b-4e21-80ef-1d2bf069199c", "metadata": {}, "source": [ "# Pairtools restrict walkthrough\n", "\n", "The common approach to analyse Hi-C data is based to analyse the contacts of the restriction fragments. It is used in *hiclib*, Juicer, HiC-Pro. \n", "\n", "Throughout this notebook, we will work with one of [Rao et al. 2014 datasets for IMR90 cells](https://data.4dnucleome.org/experiment-set-replicates/4DNES1ZEJNRU/) [1]. \n", "\n", "\n", "[1] Rao, S. S., Huntley, M. H., Durand, N. C., Stamenova, E. K., Bochkov, I. D., Robinson, J. T., Sanborn, A. L., Machol, I., Omer, A. D., Lander, E. S., & Aiden, E. L. (2014). A 3D map of the human genome at kilobase resolution reveals principles of chromatin looping. Cell, 159(7), 1665–1680. https://doi.org/10.1016/j.cell.2014.11.021" ] }, { "cell_type": "markdown", "id": "8a77207f-d444-4d5c-ab6c-1f2a1cf4c7b2", "metadata": {}, "source": [ "### Download the data from 4DN portal\n", "\n", "To download the data from 4DN, you may need to [register, get key and secret and write a spceialized curl command for your user](https://data.4dnucleome.org/help/user-guide/downloading-files): " ] }, { "cell_type": "code", "execution_count": 61, "id": "a3d3eafc-5c28-40d4-be2a-8c4ba23e9809", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " % Total % Received % Xferd Average Speed Time Time Time Current\n", " Dload Upload Total Spent Left Speed\n", "100 330 100 330 0 0 931 0 --:--:-- --:--:-- --:--:-- 932\n", "100 3395M 100 3395M 0 0 29.7M 0 0:01:54 0:01:54 --:--:-- 33.1M 0:01:48 0:00:12 0:01:36 32.8M\n" ] } ], "source": [ "!curl -O -L --user RG6CSRMC:xlii3stnkphfygmu https://data.4dnucleome.org/files-processed/4DNFIW2BKSNF/@@download/4DNFIW2BKSNF.pairs.gz" ] }, { "cell_type": "code", "execution_count": null, "id": "22d0732a-9d6a-4957-8081-5cad5b3abf09", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "# Get total number of contacts to assess how many reads you can read in the future:\n", "pairtools stats 4DNFIW2BKSNF.pairs.gz | head -n 1\n", "# This will produce around 173 M pairs" ] }, { "cell_type": "code", "execution_count": null, "id": "ff187814-015c-4f6a-b0e8-082161dfcef7", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "# Sample the fraction of pairs that will produce ~ 1 M of pairs:\n", "pairtools sample 0.007 4DNFIW2BKSNF.pairs.gz -o 4DNFIW2BKSNF.pairs.sampled.gz" ] }, { "cell_type": "markdown", "id": "e8a51837-c1a9-4c83-a140-8be9f8cbbbed", "metadata": {}, "source": [ "#### Annotate restriction fragments" ] }, { "cell_type": "code", "execution_count": null, "id": "61b32154-a8ec-48d1-9370-eaf6bc357e08", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "# Digest the genome into restriction fragments:\n", "cooler digest ../tests_chromap/hg38/hg38.fa.sizes ../tests_chromap/hg38/hg38.fa MboI > hg38/hg38.MboI.restricted.bed" ] }, { "cell_type": "code", "execution_count": null, "id": "e0699dee-a95f-4114-82c5-9758c74b5d27", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "# Annotate restriction fragments in the sampled file: \n", "pairtools restrict -f hg38/hg38.MboI.restricted.bed 4DNFIW2BKSNF.pairs.sampled.gz -o 4DNFIW2BKSNF.pairs.sampled.restricted.gz" ] }, { "cell_type": "markdown", "id": "34c594fe-41df-4f42-a25d-7c050f020fb2", "metadata": {}, "source": [ "#### Read the pairs and analyse them as dataframe" ] }, { "cell_type": "code", "execution_count": 3, "id": "309d3c54-7b2d-4a5e-a750-87eb0b6914d9", "metadata": {}, "outputs": [], "source": [ "from pairtools.lib import headerops, fileio" ] }, { "cell_type": "code", "execution_count": 4, "id": "40daf717-6ffd-4c27-8b68-d553d458a713", "metadata": {}, "outputs": [], "source": [ "pairs_file = '4DNFIW2BKSNF.pairs.sampled.restricted.gz'" ] }, { "cell_type": "code", "execution_count": 5, "id": "6d363f7a-6053-488e-ad59-9df14260a7f6", "metadata": {}, "outputs": [], "source": [ "pairs_stream = fileio.auto_open(pairs_file, 'r')\n", "header, pairs_stream = headerops.get_header(pairs_stream)\n", "columns = headerops.get_colnames(header)" ] }, { "cell_type": "code", "execution_count": 6, "id": "deb04397-579b-4305-9dec-4f58e61e7ad4", "metadata": {}, "outputs": [], "source": [ "df = pd.read_table(pairs_stream, comment=\"#\", header=None)\n", "df.columns = columns" ] }, { "cell_type": "code", "execution_count": null, "id": "7688d530-4860-40e9-b865-affb7c35ccf1", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 7, "id": "44d60718-dd56-4113-a409-57e5c1b882c0", "metadata": {}, "outputs": [], "source": [ "df.loc[:, 'dist_rfrag1_left'] = df.pos1 - df.rfrag_start1\n", "df.loc[:, 'dist_rfrag1_right'] = df.rfrag_end1 - df.pos1\n", "\n", "df.loc[:, 'dist_rfrag2_left'] = df.pos2 - df.rfrag_start2\n", "df.loc[:, 'dist_rfrag2_right'] = df.rfrag_end2 - df.pos2" ] }, { "cell_type": "markdown", "id": "330e034a-e4f2-4deb-ab2c-9103e9083fa2", "metadata": {}, "source": [ "Many of the 5'-ends of reads are mapped to the restriction sites: " ] }, { "cell_type": "code", "execution_count": 8, "id": "1a7ef073-082b-4aa6-972f-85ada84be4d4", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA5IAAAJyCAYAAAC2Qv8kAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAB+DElEQVR4nOzdeZyP9f7/8efLzJjBWIYhFMYSkqJSlpQ9a9QpJSmUflrOOVKnlUIUvu2b6nSKog4pR7ajVJbSKOqkUiRZqiNLI9liZrx/f3yWM5/PfGbmc82Ox/12+9yY9/V+X9f7el/b5/V5X9f7MuecAAAAAACIVpmSrgAAAAAA4NhCIAkAAAAA8IRAEgAAAADgCYEkAAAAAMATAkkAAAAAgCcEkgAAAAAAT2JLugIniuTkZJeSklLS1QAAAABwnPrss892O+eqF8eyCCSLSUpKitasWVPS1QAAAABwnDKzrcW1LG5tBQAAAAB4QiAJAAAAAPCEQBIAAAAA4AmBJAAAAADAEwJJAAAAAIAnjNqKY87Ro0d15MgRHT16tKSrAgAAABSpMmXKqGzZsipTpnT1AZau2gB5SE9P186dO5Wenl7SVQEAAACKXGn9/kuPJI4ZR48e1a+//qqTTjpJZlbS1QEAAACKRWJionbs2KEaNWqUmp7J0lELIApHjhxRhQoVCCIBAABwQjEzVahQoVT1ShJI4phx9OhRxcTElHQ1AAAAgGIXExOjzMzMkq5GEIEkAAAAAMATAkkAAAAAgCcEkgAAAAAATxi1FceF1z/ZVqLLH9i6br7KTZs2TUOHDg3+Xb58eVWvXl1nnXWWrrrqKl1++eUhI3Nt2bJF9evX19SpUzVkyJColrFs2TItW7ZM999/f6kZ5Su/UlNTdeutt+rrr7/WwYMH9Z///EctW7Ys6Wpl88QTT6hu3br605/+FJI+duxYjRs3Tunp6YqNLbrTb04DUmVtr8C+tHTpUnXs2LHI6lJQgbotW7asROsRqEOnTp3ybLNp06bp6NGjuu666wpt2XPnztUPP/yg2267LWKdlixZoq5duxba8k4UObVraXE8nb8LQ6RjMKfzLUqX/Hx/KQlDhgzRsmXLtGXLlpKuyjGBsxJQCsyePVupqalatGiRxo8fr/j4eF111VW66KKLdOjQoWC+WrVqKTU1Vb1794563suWLdO4ceN09OjRoqh6sbr++uuVkZGh+fPnKzU1VY0bNy7pKkX0xBNPaM6cOSVahyFDhig1NTXkU1rb63gzbdo0vfzyy4U6z7lz5+qxxx4r1Hmi9Lfr8XT+Lgxnn322UlNTdfbZZwfTSsP5FjhR0SMJlAItW7ZUo0aNgn9fc8016t+/v/r3768777xTTz/9tCQpPj5ebdq0KalqlqijR49qw4YNGjVqlDp37pxr3sOHDys+Pr6YalY6nXzyyUW2r9C+KCmZmZlyzhVpj/6xKnCnw7H4iqxozymVKlUqVdfAjh07KiUlRdOmTSvpqhzXuOaUXvRIAqXUZZddpn79+unFF1/UwYMHJfluDTGzkIvW6tWr1a1bN1WrVk3ly5dXgwYNdPPNN0v6362UkhQXFyczC/mSMWbMGJ199tmqXLmykpOT1blzZ61atSqkHsuWLZOZad68efrzn/+s5ORkVa9eXYMGDdJvv/0WkjcjI0OTJ09Ws2bNlJCQoOrVq6tHjx5av359MM/u3bt100036eSTT1Z8fLyaNm2qv//977m2xbRp0xQTE6OjR49q/PjxMjOlpKRI8vW8nXLKKUpNTVW7du1Urlw53XnnnZKkDRs26NJLL1WVKlVUrlw5tWnTRosXLw6Z99ixY2VmWr9+vbp3764KFSqobt26mjp1qiRp+vTpatq0qRITE9WpUydt2rQp17qmpKRo69ateu2114LtHX4bz+bNm9W7d28lJiaqXr16euCBB7L1OOSnnYpCbu0bTR137dql4cOHq3Hjxipfvrzq1KmjgQMH6ueff862rJkzZ6pp06aKj4/X6aefrn/9619R1/PgwYO66667VL9+fZUtW1b169fXgw8+GNKuXvblXbt2aeDAgapUqZKqVKmia6+9NlueSDp27Kjly5dr5cqVwe2f9TbYTz/9VF27dlViYqIqVKigLl266NNPP811nkOGDNErr7yin3/+OTjPwP6fdf2jOT4nTpwYbOPatWvr9ttv1x9//JHnepmZRo8eraeeekr169dXxYoV1aFDB61bty5b3jlz5qhNmzYqX768qlSpov79+2vbttDHD2bOnKnOnTurevXqSkxM1FlnnaVXXnkl4nJHjRqlSZMmBbftV199JUlavny5unTpoooVK6pChQrq3r27vv7665Dy77zzjtq1a6fKlSsrMTFRTZo00QMPPBB1u2YV2H/Cb7OeNm2azCzkVriUlBQNGjRIL774oho1aqSEhASdffbZWrp0aUjZ/J6/A9eCKVOm6M4771Tt2rUVHx8f3OaFvQ1Gjx6tRx99VPXq1VOFChXUu3dv7dy5Uzt37tQVV1yhypUrq06dOpo8eXKO7RfejnPmzNENN9yg6tWr66STTpIkfffdd7r00ktVo0YNJSQkqG7duurfv78yMjIiboO8zrdr165V3759lZSUpHLlyun888/Xhx9+mGcdi1rHjh3Vvn17LV68WC1btlS5cuV01lln6ZNPPlFGRobuvfde1apVS1WrVtWQIUN04MCBkPJert1vvfWWhgwZoqSkJFWqVElXX321fv3115C8gePswQcf1CmnnKJy5crpwgsv1BdffJGt7tHsWwcPHtTNN9+satWqKTExUX379tVPP/0UVdsErslff/21unfvrsTERF1xxRXB+eZ1nv/jjz80cuRINW/eXImJiapZs6YuvvjikO8hAe+//77OPvtsJSQkqGHDhnrhhRey5cnIyNB9992nhg0bKiEhQcnJyWrfvr0++uijqNbneMdPekAp1qtXL82dO1dr1qzRhRdemG36/v371b17d5133nmaNm2aKlasqC1btujjjz+WJA0bNkw//fSTXnrpJX300UfZ3sP5888/a+TIkTrllFN04MABzZgxQxdeeKHWrFmjM888MyTviBEj1KdPH73++uvasGGD7rzzTsXExIR88RgwYIDmzp2rW2+9VV27dtUff/yhFStWaPv27WratKl+//13nX/++Tp06JDGjh2r+vXr65133tFNN92kw4cP6y9/+UvEdujdu7c++ugjtW/fXtdff72GDRsW8uvk3r17NWDAAP3tb3/TQw89pHLlyum///2v2rdvr4oVK+qZZ55R5cqV9eyzz6p3795asGCBevbsGbKM/v3764YbbtDf/vY3TZkyRdddd502btyoZcuWadKkSUpPT9eIESM0cOBAffLJJzlus3/961/q1auXWrRoobFjx0qSqlevHpLn0ksv1dChQzVy5EjNnz9fY8aMUZ06dYLPy+a3nbJ67rnn9PDDDysmJkZt2rTRuHHjdMEFFwSnp6SkyDmX53xyat9o65iWlqaEhARNnDhR1atX13//+189+uijOv/887V+/XolJCRIkt577z0NHDhQvXv31qOPPqpdu3ZpxIgRSk9PV5MmTXKtX0ZGhrp3765vvvlG9913n8444wytWrVK48ePV1pamh599NGQ/NHsy3/605+0du1aPfTQQzr11FM1a9asqNp9ypQpGjRokDIzM4NfSipVqiRJ+vLLL9WhQwc1a9YsGHxMmjRJHTp00KpVq9SiRYuI87zvvvu0a9curV69WvPmzZOkbL/OR7NOgwYN0vz583XXXXepXbt2+vbbb3Xfffdpy5Yteuutt/JctxkzZqhJkyZ68skndeTIEd1xxx3q16+f1q9fH+whfP7553XTTTdp6NChuv/++7Vv3z6NHTtWHTp00JdffqmKFStKkn744Qddfvnluvvuu1WmTBmtWLFCw4YN06FDh3TjjTeGLHfatGlq0KCBHnnkEVWoUEG1a9fWwoUL1a9fP/Xu3VszZsyQJE2ePFkXXHCBvvzyS9WpU0c//PCD+vbtq8svv1z333+/ypYtq40bN+qHH36Iul0LYvny5frss8/04IMPKj4+XpMnT1bPnj21du1aNWnSpMDnb0l68MEHde655+rvf/+7MjMzlZCQUCTbYPr06WrevLmmTJmiHTt26NZbb9W1116rffv2qWfPnvp//+//afbs2br77rt1xhlnqFevXnm2z1/+8hf17NlT06dPD/6Y0adPH1WpUkXPPfeckpOT9fPPP2vRokU53tqb2/n2888/1wUXXKCzzjpLL774osqXL6/nn39eXbt21ccff6xzzjknug1ZRL7//nvdcccdGjVqlBITE3XnnXeqb9++6tu3rzIyMjRt2jR9++23uuOOO1SjRg393//9X7Csl2t34Hr8z3/+Uxs3btS9996r//73v9l+1Hj11VdVt25dPfPMMzp8+LDuv/9+denSRRs3blTVqlUlRX98Dx8+XLNmzdKYMWN07rnnasmSJRo4cKCn9unXr5+uv/563XXXXSpTpkzU5/nDhw9r3759Gj16tGrVqqW0tDRNmTJFbdq00fr161WzZk1J0rfffqtevXqpVatWmjlzpg4fPqyxY8dq//79Icfa5MmT9fjjj+vBBx9Uy5Yt9fvvv2vNmjVKS0vztD7HLeccn2L4nHPOOQ4Fc+DAAXfgwIGI015btbVEP/k1depUJ8lt3Lgx4vTFixc7SW7mzJnOOec2b97sJLmpU6c655xbvXq1k+TWrl2b4zLGjBnjJLn09PRc65KRkeHS09Nd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3jzYa3Do0KHgiV7yjX4WExMTcrL+4IMPtG3bNtWvX99zfS+66CJNmjRJ//jHP3IclKRHjx56+umnVbdu3WBPSFHp0KGDnnjiCW3ZsiV4gcnMzNSsWbN01llnhbRFYYuPjw95/6dXhd1Ov//+uxYuXKjWrVsXeF4B0dbx4MGDIbcHSwqOiBsQExOjc889V2+++abGjh0b/IL3ySefaMuWLXkGkj169NBbb72lxMTE4O1hBdG2bVtlZmbqrbfeCrkda+bMmVGVj4+P1759+7Kld+jQQQsXLtS+ffuC+9++ffs0f/78kJFdc5pnQfepyZMna+/everSpUu+55Obdu3aqWLFivr+++81ePDgHPMFRqEO/xL89ttvR7WcJk2aKCUlRevWrdPdd98dVZn4+Hh17txZ+/fvV79+/bR582YlJyd7atfAfvj1118HbwmWpEWLFkXMv2rVKv3444+qU6eOJN+2XrhwYcT3AHs9f+ekuLZBUTMztWzZUo899pheeuklff311zkGkpG2YYUKFXTBBRdo7dq1Ovvssz0HjaWZ12v3G2+8oeuuuy749+zZs3X06FG1bds2JN+iRYt04MCB4K2eW7Zs0apVq4LHWLT7VuvWrVWmTBm98cYbIcdntOfPnER7nj948GC21wNNnz492KMb0LZt22zr/OOPP2rlypU5/rBWs2ZNDRs2TIsWLco2QvSJikASKAW++OIL7d69W0eOHNG2bdu0YMECzZ49W926ddPEiRNzLLdgwQL9/e9/1yWXXKL69evrwIEDeuqpp1SxYsXgRaJZs2aSpEcffVQ9e/ZUTEyMWrVqpR49euiJJ57QkCFDNHToUH333XcaP358tl8po9WpUydddtlluu222/Tjjz+qc+fOSk9P14oVK9S7d2917NhRI0eO1KxZs3TBBRdo5MiRatKkiQ4cOKD169frww8/LNQvMSNHjtS0adPUrVs3jRs3TpUqVdKUKVP03XffaeHChYW2nEiaNWumDz/8UAsWLFDNmjWVnJzsqVesIO30yCOPaMOGDerUqZNq166trVu36pFHHtEvv/yi1157rRDWzlsdAwHMQw89pPPOO08ffPCB3nzzzWzzGzdunC666CJdcsklGj58uHbt2qUxY8YER9jLzdVXX62pU6eqS5cuuv3229WiRQsdOXJEmzZt0rx58zR37tyofowJ6Nat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9FN17dpViYmJqlChgrp06aJPP/0013kOGTJEr7zyin7++efgPAP7f9b1j+b4nDhxYrCNa9eurdtvv11//PFHnutlZho9erSeeuop1a9fXxUrVlSHDh20bt26bHnnzJmjNm3aqHz58qpSpYr69++vbdu2heSZOXOmOnfurOrVqysxMVFnnXWWXnnllYjLHTVqlCZNmhTctl999ZUkafny5erSpYsqVqyoChUqqHv37vr6669Dyr/zzjtq166dKleurMTERDVp0kQPPPBA1O0a7ocfflDv3r1Vvnx5Va9eXSNGjNDhw4ez5UtPT9fo0aOVkpKismXLKiUlRaNHj1Z6enowT/PmzTVs2LDg33v37lVMTIxOOeWUkHmdf/75uuKKK0LaJJptkd91Dxwnc+bM0Q033KDq1avrpJNOCs73xRdfVIsWLZSQkKDk5GRdf/31SktLC1n2M888o7Zt26pq1aqqUqWK2rRpo4ULF4bkCVzPnn/+ed1zzz2qWbOmKlasqEGDBungwYP6/vvv1b17dyUmJqpRo0YR949wgdtTV6xYof79+6tKlSpq3bq1pNyvlVnLBm5tDVwrH3zwwWAbZQ3qotn/SkJKSooGDRqk6dOnq0mTJipXrpwuuOACbdy4UQcOHNDw4cNVrVo1nXTSSbr99ttDHrX4448/NHLkSDVv3lyJiYmqWbOmLr744pBruBTazpdccokSExNVrVo13XLLLSF3UQW28ZQpU3TbbbepRo0aKl++vPr06RPxVvBo9q38npul0nc9279/v/7yl7+obt26io+P10knnaSuXbtma+/SjJ/0gFKsV69emjt3rtasWaMLL7ww2/T9+/ere/fuOu+88zRt2jRVrFhRW7Zs0ccffyxJGjZsmH766Se99NJL+uijjxQTExNS/ueff9bIkSN1yimn6MCBA5oxY4YuvPBCrVmzRmeeeWZI3hEjRqhPnz56/fXXtWHDBt15552KiYkJubgPGDBAc+fO1a233qquXbvqjz/+0IoVK7R9+3Y1bdpUv//+u84//3wdOnRIY8eOVf369fXOO+/opptu0uHDh/WXv/wlYjv07t1bH330kdq3b6/rr79ew4YNC/kFce/evRowYID+9re/6aGHHlK5cuX03//+V+3bt1fFihX1zDPPqHLlynr22WfVu3dvLViwQD179gxZRv/+/XXDDTfob3/7m6ZMmaLrrrtOGzdu1LJlyzRp0iSlp6drxIgRGjhwoD755JMct9m//vUv9erVSy1atAh+6Qj/lfvSSy/V0KFDNXLkSM2fP19jxoxRnTp1NHToUEnKdztl9dxzz+nhhx9WTEyM2rRpo3HjxumCCy4ITk9JSZFzLs/55NS+0dYxLS1NCQkJmjhxoqpXr67//ve/evTRR3X++edr/fr1SkhIkCS99957GjhwoHr37q1HH31Uu3bt0ogRI5Senq4mTZrkWr+MjAx1795d33zzje677z6dccYZWrVqlcaPH6+0tDQ9+uijIfmj2Zf/9Kc/ae3atXrooYd06qmnatasWVG1+5QpUzRo0CBlZmbqhRdekCRVqlRJkvTll1+qQ4cOatasWfCL2KRJk9ShQwetWrVKLVq0iDjP++67T7t27dLq1as1b948Scr2C3o06zRo0CDNnz9fd911l9q1a6dvv/1W9913n7Zs2aK33norz3WbMWOGmjRpoieffFJHjhzRHXfcoX79+mn9+vXBHsLnn39eN910k4YOHar7779f+/bt09ixY9WhQwd9+eWXqlixoiRfQHb55Zfr7rvvVpkyZbRixQoNGzZMhw4d0o033hiy3GnTpqlBgwZ65JFHVKFCBdWuXVsLFy5Uv3791Lt3b82YMUOSNHnyZF1wwQX68ssvVadOHf3www/q27evLr/8ct1///0qW7asNm7cqB9++CHqds3qyJEj6tatmw4dOqRnn31WNWrU0AsvvBDxNvbBgwfrjTfe0L333qv27dsrNTVVEyZM0A8//KDXX39dktS5c2ctWLAgWGbZsmWKj4/Xzz//rO+++06NGzfWgQMHtHr1ag0aNMjTtiiMdf/LX/6inj17avr06cEfG+6++249+uij+utf/6qHH35YP//8s0aPHq2vv/5aH3/8cfAas2XLFg0bNkwpKSnBxxH69OmjRYsWZTv3Tpw4UR07dtQrr7yib775RnfeeafKlCmj//znP8Fz8nPPPaehQ4eqVatWOv3003PcRgFXX321rrrqKr355pvKyMjI81oZSWpqqtq2bashQ4Zo+PDhkhQM8qPZ/0rSihUrtGnTJk2ePFlHjhzRrbfeqssuu0wNGjRQo0aNNHPmTK1YsUITJkxQw4YNgwH14cOHtW/fPo0ePVq1atVSWlqapkyZojZt2mj9+vWqWbNmyHIGDRqkK664QjfffLM+/fRTPfDAAzpw4EC2cRwmTpyoli1baurUqdq5c6fuvfdeXXTRRVq3bp3i4uIkRb9v5ffcHFCarmcjR47UvHnzguvy66+/auXKlVEHxqWCc45PMXzOOa2ec6tfjvxBVA4cOOAOHDgQeWJObVtcn3yaOnWqk+Q2btwYcfrixYudJDdz5kznnHObN292ktzUqVN9q716tZPk1q5dm+MyxowZ4yS59PT0XOuSkZHh0tPTXePGjd1f//rXYPrSpUudJHfttdeG5L/llltcfHy8O3r0qHPOuffff99Jck8++WSOy3jggQdcfHy8++6770LShw0b5qpVq5ZrHdPT050kN2bMmJD0wYMHO0lu7ty5Iem33367i4mJCWnbjIwM17hxY3fWWWcF0wLt88orrwTT0tLSXExMjKtatarbu3dvMP3JJ590ktyWLVtyrKdzztWrV89dffXV2dIDy3r55dB9pnnz5q5bt27BvwvSTs45N2jQIDdz5ky3YsUKN336dHfmmWe62NhYt3Tp0lzLRZJT++a3jhkZGW7btm1OkpszZ04wvV27du60005zmZmZwbRVq1Y5Sa5Dhw651vHVV191ktzy5ctD0idMmODi4uLcjh07nHPR78vvvvuuk+T++c9/huTr0aOHk5RnO3bo0MGdf/752dIvu+wyV7lyZbdnz55g2t69e11SUpK79NJLc53n4MGD3cknn5wtPdp1WrFiRbb93DnnZsyY4SS5//znP7kuX5Jr1KiRO3LkSDBt9uzZTpJbuXKlc865ffv2uUqVKrmhQ4eGlN28ebOLi4tzjz/+eMR5Z2ZmuvT0dDds2DB35plnZlturVq13MGDB0PSGzZs6Dp37hyStnfvXletWjU3YsSIkPplPYbD5dSukfz97393klxqampI3Zs1a+Ykuc2bNzvnnPvqq68inqvGjx8fcr6eM2dOyPlkxIgR7uKLL3aNGjVyzz//vHPOuX//+99Okvv2229D2iSvbVGQdQ/sU5dccklI+ubNm12ZMmXcuHHjQtI/+ugjJ8n961//iricwPbt1q2b69u3b8j8JLlOnTqF5L/00kudJDd9+vRgWuCcPHbs2BzXx7n/XVNvvfXWkPRorpWBsoHt6JyvrUeNGpUtbzT7nxdHjx516enpIZ969eq5++67LyQtIyMjz3nVq1fPJSUlud9++y2YFrh2XX/99SF5zzrrLNexY8cc55WRkeEOHDjgEhMT3WOPPRZMD7TV8OHDQ/JPmDDBlSlTxm3YsME5979tHH5uD+wz//jHP4L5otm3CnpuLm3Xs9NPP92NHDky1zqHy/W7sJ+kNa6Y4htubQVKMd/5QCG3o2Z16qmnqkqVKho+fLhmzJihH3/80dP833vvPXXq1EnVqlVTbGys4uLi9N1332nDhg3Z8oYP8HPGGWfo8OHD2rFjhyTp3XfflZnphhtuyHF5ixcvVuvWrVW/fn1lZGQEP927d9evv/6qb775xlP9A2JjY9WnT5+QtBUrVqhNmzYhz57GxMToqquu0hdffKHff/89JH/WX8mTkpJUo0YNtWnTJtibJElNmzaVJM/tHC68LZs3bx5y619B22n69Om68sordcEFF2jQoEH66KOPVLt2bY0ePTpf9Y3Uvl7q+Nxzz6lFixZKTExUbGys6tatK0nB/SwzM1OrV6/W5ZdfrjJl/ndZat26dZ63GgbqUq9ePbVr1y6kLhdddJHS09Oz3a6d176cmpqqmJgYXXbZZSH5BgwYkGddcrNixQr16dNHVapUCaZVqlRJffv21fLlyws077zWafHixSpbtqwuu+yybG0UqFteunXrFuw9CCxDUnDfTU1N1e+//66rr746ZBmnnHKKmjZtGrKMjRs36qqrrtLJJ5+suLg4xcXF6R//+EfEc0+PHj1Urly5kLKbNm3Ktpzy5curbdu2weW0bNlScXFxGjBggN58803t3LkzqrbMSWpqqurUqRPy7HGZMmVCbjuV/teW4b2Igb8D27pDhw4qU6ZMcDCXDz74QJ07d1bnzp1D0mrVqhU89wTktS0KY90vvfTSkL+XLFmio0ePZmv31q1bq1KlSiHb97PPPlOfPn100kknBa8tS5Ysibh9w3soA+vavXv3YFrgnBztuTe87gW9VmYV7f7nxfLly4PHQeCzdetWjR8/PiStS5cuUc2vbdu2qly5cvDvSG0aSA9vizfeeEOtW7dWlSpVFBsbqwoVKmj//v0Rt134vj9gwAAdPXo02+364ef2888/P3iLqRT9vlUY5+bSdD0799xzNW3aND300ENas2aNMjMzo16P0oJAEijFAif4rKPIZVW5cmUtXbpUtWvX1s0336y6deuqefPmUd2m9vnnn6tXr15KTEzUSy+9pFWrVmn16tVq0aJFxGemqlatGvJ34DaoQN5ff/1VVatWDfnCF27nzp1asWJFtgtm//79g/PIjxo1amS7bTctLS1iu9WsWVPOOe3ZsyckPSkpKeTvsmXLRkyTFNUzZbmJ1JZZ51nY7VSxYkX17t1bq1evzld9I7VvtHV8+umndfPNN6tr166aM2eOPv3002BgF1jn3bt3Kz09PeQ5rIBIaeF27typrVu3ZqvLeeedF1KXgLz25e3btyspKSnki3q0dclNbvtk+P7oVV7rtHPnTh05ckSJiYkhbVSjRg1J0e1T0SxDkrp27ZptW3z11VfBZezfv1/dunXT2rVrNWnSJH344YdavXq1rrvuuojPG4a3WWA5119/fbblLFiwILicRo0a6Z133tHRo0d1zTXXqGbNmmrdunW+g/bt27dHtY8GnukKr3fgtsDA9KpVq6pFixZaunSpdu/era+//lqdOnVSp06dgq8xWLp0qTp16pRtmXlti8JY95zavVGjRtna/ffffw+2+48//qguXbooLS1NTz/9tD7++GOtXr1aPXr0iHjuzOk8Gyk92nNveN0Lcq0MF+3+58U555yj1atXh3xq1aqlG264ISQtcLt8XvLbpvPnz9eVV16p0047Ta+//ro++eQTrV69WtWrV4/Y9uH7fuDv8GcGczpuAvmi3bcK49xcmq5nTz/9tIYPH66XX35Z5557rmrUqKGRI0cGx8U4FvCMJFCKLVy4UAkJCTrnnHNyzNOyZUu99dZbysjI0Jo1azRx4kRdccUVWrt2rZo3b55jubfeekuxsbGaM2dOyEl5z549IT0m0UpOTlZaWpoOHTqUYzBZrVo11ahRQ08++WTE6Xk9C5eTSD22VatW1S+//JIt/ZdffpGZZfsiVpoURTs553Ls2c5LpHLR1nHmzJnq0qVLyHOKmzdvDsmbnJysuLi4YO9ZVjt27FC9evVyrV+1atVUv359vfHGGxGnR9OrmVWtWrW0Z88epaenhxwbkernRW77ZFHvj9WqVVNCQoI+/PDDiNNr165dKMuQfM80RnqOLfB8ZGpqqrZu3aoPP/xQ7du3D07P6f2q4ftfYDkTJ05U165ds+UPfGmWFAzMDh8+rJUrV+r+++9X7969tWXLFiUnJ3tav1q1akUcXCh8vwhsy19++UUNGzYMpge2faD+gfrNmjVLS5cuVbVq1XTmmWeqVq1a2rlzp1auXKn//Oc/wefzvCrouufU7u+++262gCTr9MWLF2vv3r164403QgYOKs4vx5HOWfm9Vobzsv9Fq2LFimrVqlW2+dSuXTtbelGaOXOmGjVqFPKMY3p6erYBbwJ27NgRcqwHjoWTTz45W75IZVu2bCkp+n2rMM7Npel6lpiYqIkTJ2rixInaunWr3nzzTd19990qW7asJk+eHPU6lSQCSaCUmjNnjubNm6cRI0aofPnyeeaPjY1VmzZtNH78eM2bN0/ffvutmjdvHvyl+tChQ8EvcpLvoh4TExNyUv3ggw+0bds21a9f33N9L7roIk2aNEn/+Mc/cnzwvUePHnr66adVt27dYE9IUenQoYOeeOIJbdmyJRhIZGZmatasWTrrrLNC2qKwxcfHh4xc51Vht9Pvv/+uhQsXBkcvLAzR1vHgwYMhtwdLCo6IGxATE6Nzzz1Xb775psaOHRu8HeiTTz7Rli1b8gwke/ToobfeekuJiYnZbgHMj7Zt2yozM1NvvfVWyC1TM2fOjKp8fHy89u3bly29Q4cOWrhwofbt2xfc//bt26f58+fn+ZLqwtinJk+erL1790Z9e5xX7dq1U8WKFfX9999r8ODBOeYLBBThP2C9/fbbUS2nSZMmSklJ0bp163T33XdHVSY+Pl6dO3fW/v371a9fP23evFnJycme2rVt27aaOnWqVq1aFby99ejRo9l+wOjQoYMk3/4yatSoYPprr70mSSEDp3Xq1EmPPfaYXnjhBXXs2FFmpho1auj000/XmDFjlJmZmefrjopj3SXf7bRlypTRtm3b1K1btxzzRdq+3333nVauXJltRNqSkNO1MpKyZctma6P87H/HioMHD2Z7tc706dNzvOXyjTfeCNk/Z86cqTJlygTvBgkIP7evXLlSP/30k9q2bSsp+n2roOfmnJSG61m9evV0++2367XXXisVo/9Gi0ASKAW++OIL7d69W0eOHNG2bdu0YMECzZ49W926ddPEiRNzLLdgwQL9/e9/1yWXXKL69evrwIEDeuqpp1SxYsXgCbpZs2aSpEcffVQ9e/ZUTEyMWrVqpR49euiJJ57QkCFDNHToUH333XcaP358tl8So9WpUydddtlluu222/Tjjz+qc+fOSk9P14oVK9S7d2917NhRI0eO1KxZs3TBBRdo5MiRatKkiQ4cOKD169frww8/jPqLZDRGjhypadOmqVu3bho3bpwqVaqkKVOm6Lvvvss2DH1ha9asmT788EMtWLBANWvWVHJysqdesYK00yOPPKINGzaoU6dOql27trZu3apHHnlEv/zyS/CLbGGIto6BAOahhx7Seeedpw8++EBvvvlmtvmNGzdOF110kS655BINHz5cu3bt0pgxY7KNEhjJ1VdfralTp6pLly66/fbb1aJFCx05ckSbNm3SvHnzNHfu3Kh+jAno1q2b2rdvr+HDh2v37t3BkQGjvbg3a9ZMU6ZM0axZs9SwYUNVrFhRTZo00X333acFCxaoS5cuuuuuu2Rmmjx5sg4ePKj7778/z3mmpaXpueeeU6tWrZSQkBB8Li4aHTt21FVXXaXLL79ct912m8477zyVKVNGW7Zs0aJFizR58mQ1btw46vlFUqlSJT388MO65ZZbtGvXLvXs2VOVK1fWzz//rOXLl6tjx44aOHCg2rVrp0qVKumWW27RuHHjdODAAU2YMEHJycnau3dvnssxMz377LPq16+fjhw5oiuuuELJycnasWOHPv74Y9WtW1e33Xabnn/+ea1YsUK9evVSnTp1tHv3bk2cOFG1a9cOBg5e2nXw4MGaNGmS/vSnP+mhhx5SjRo19Pzzz2d73vr000/XVVddpbFjxyojI0Pt2rVTamqqxo8fr6uuuipkROwLL7xQMTExev/99/Xss88G0zt16qRnnnlGdevWVYMGDTxvi8Jed0lq2LCh7rrrLv35z3/Whg0b1KFDByUkJOjHH3/UkiVLNGzYMHXq1Eldu3ZVbGysrr32Wt1+++3avn27xowZo7p162Z7zVFxieZaGUmzZs20cOFC9ejRQ0lJSapdu7Zq164d1f4n+Xrnhw4dqqVLl+b5Y1Fp0KNHD82dO1cjR45Unz599Nlnn+mpp57K8S6lRYsW6Y477tBFF12kTz/9VOPGjdO1116b7Vyyb9++kHP7Pffco1NPPVXXXnutpOj3rYKem3NSUteztm3bqm/fvjrjjDOUmJio5cuXa+3atbn+EFfqFNeoPif6h1FbCy6akaqONYGRzwKfhIQEV7duXXfJJZe4N954IzjiYkD4qK3r1693V1xxhUtJSXHx8fEuOTnZ9ezZ061atSpYJiMjw918882uevXqzsyc77D3eeqpp1xKSopLSEhwrVq1ckuWLHEdOnQIGVUsMILfkiVLItY96wh36enpbsKECe7UU091cXFxwfqsX78+mCctLc3deuutLiUlxcXFxbnq1au79u3b5ziiY9Z5K4dRW3MadXH9+vWuX79+rlKlSi4+Pt61bt3a/fvf/w7Jk9OotpFGXs2pLcJ9++23rn379q5cuXJOkhs8eHCuyxo8eLCrV69eSFp+22nevHmuXbt2rlq1ai42NtZVrVrVXXzxxe6TTz7JtVxOcmvfaOp48OBBd+ONN7rk5GSXmJjoevfu7X744YeI2/L11193jRs3dmXLlnXNmjVzc+bMybY/5uTQoUNuzJgxrkmTJq5s2bIuKSnJtWrVyo0ZMybY3l725Z07d7oBAwa4xMREV7lyZXfNNde4uXPnRjUy4Pbt213Pnj1dYmJitlH6Vq1a5bp06eIqVKjgypcv7zp37hzVttm/f78bMGCAq1KlipMU3F+8rFNmZqZ74okn3Jlnnuni4+NdpUqV3JlnnunuuOOOkBEeI1GE0SvDz0cBCxcudB07dnQVK1Z0CQkJrmHDhm7o0KFu3bp1wTzvv/++a9mypUtISHANGjRwTz75ZPD4yGu5AR9//LHr3bu3q1KliouPj3f16tVzV155pfv444+D0/v27etOOeUUV7ZsWVezZk13+eWXh5yPcmrXnGzatMn17NnTlStXziUnJ7u//vWv7vnnn8/W1keOHHGjRo1ydevWdbGxsa5u3bpu1KhRISOtBpx33nnZRmYNjOgaOHfk1Sbh26Ig657Xee7VV191rVu3duXLl3cVKlRwTZs2dbfccov78ccfg3lmzZrlmjRp4uLj412zZs3cP//5z2znuUCdX3zxxZD5ezknh8tpJPRorpWRjpmPPvrInX322S4+Pj7bOSuv/c8555555hknyX3zzTe51juSevXqZTtHRlsu2mtX+Pk9MzPTjRo1ytWqVcuVK1fOXXjhhe7zzz939erVC9kXA221fPly17dvX1ehQgWXlJTkbr755pARlgPb+Nlnn3UjR450ycnJrly5cq5Xr17uhx9+yFb3aPatgpybS9v17M4773QtW7Z0lSpVcuXLl3fNmzfPdeR750rfqK3mWx6KWqtmKW7Nq2NymDi0eCtzjArcLuOlZwEAAKAkDBw4UL/99psWLVpU0lUpVIGe1o0bN4aMjB5uy5Ytql+/vl588UUNGzas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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "xmin = 0\n", "xmax = 2000\n", "step = 20\n", "\n", "sns.distplot(df.query('strand1==\"+\"').dist_rfrag1_left, bins=np.arange(xmin, xmax, step), label='Distance from the 5\\' read end to the nearest upstream rsite, + mapped reads')\n", "sns.distplot(df.query('strand1==\"+\"').dist_rfrag1_right, bins=np.arange(xmin, xmax, step), label='Distance from the 5\\' read end to the nearest downstream rsite, + mapped reads')\n", "\n", "plt.xlim(xmin, xmax)\n", "plt.legend()\n", "plt.tight_layout()" ] }, { "cell_type": "code", "execution_count": 9, "id": "8fb2a16b-a921-4451-9250-4c0e381ac516", "metadata": {}, "outputs": [ { "data": { "image/png": "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ySe5jnP48OF64YUX9NNPPwXHGdj+s85/NPvnlClTgsu4Vq1auu222/Tbb7/lOV9mpnHjxunxxx9XvXr1VL58eXXo0EHr1q3LVnfevHlq3bq1ypYtq0qVKmnAgAHati309oM5c+aoc+fOqlatmpKTk3XuuefqhRdeiDjdsWPHaurUqcF1+5///EeStHz5cnXp0kXly5dXuXLl1KNHD3311Vchw7/99ttq27atKlasqOTkZDVu3Fj3339/1Ms1q8D2E36Z9cyZM2VmIZfCpaamasiQIXruuefUsGFDJSUl6bzzztPSpUtDhs3v8TvwWTB9+nTdcccdqlWrlhITE4PrvLDXwbhx4/Twww+rbt26KleunPr06aOdO3dq586duvLKK1WxYkXVrl1b06ZNy3H5hS/HefPm6frrr1e1atV02mmnSZI2btyoyy67TNWrV1dSUpLq1KmjAQMGKCMjI+I6yOt4u3btWvXr10+VK1dWmTJl1K5dO33wwQd5trGodezYUe3bt9fixYvVokULlSlTRueee64+/vhjZWRk6J577lHNmjVVpUoVDR8+XIcOHQoZ3stn9+uvv67hw4ercuXKqlChgq6++mr98ssvIXUD+9kDDzygM844Q2XKlNHFF1+sL774Ilvbo9m2Dh8+rJtuuklVq1ZVcnKy+vXrpx9//DGqZRP4TP7qq6/Uo0cPJScn68orrwyON6/j/G+//aYxY8aoWbNmSk5OVo0aNXTJJZeEfA8JeO+993TeeecpKSlJDRo00N/+9rdsdTIyMnTvvfeqQYMGSkpKUkpKitq3b68PP/wwqvk5mcTy57uzJL0RoXydpAFFNVEzqyKpmaQZ+Rz+08D/zz+fq2NR/Hr37q358+drzZo1uvjii7O9f/DgQfXo0UMXXnihZs6cqfLly2vLli366KOPJEkjR47Ujz/+qOeff14ffvhhtudw/vTTTxozZozOOOMMHTp0SLNnz9bFF1+sNWvW6JxzzgmpO3r0aPXt21cvv/yyNmzYoDvuuENxcXEhXzwGDhyo+fPn65ZbblHXrl3122+/acWKFdq+fbuaNGmi/fv3q127djpy5IgmTJigevXq6e2339aNN96oo0eP6o9//GPE5dCnTx99+OGHat++va677jqNHDky5NfJffv2aeDAgfrzn/+sBx98UGXKlNF///tftW/fXuXLl9eTTz6pihUr6qmnnlKfPn20cOFC9erVK2QaAwYM0PXXX68///nPmj59uq699lpt2rRJy5Yt09SpU5Wenq7Ro0dr8ODB+vjjj3NcZ//617/Uu3dvNW/eXBMmTJAkVatWLaTOZZddphEjRmjMmDF68803NX78eNWuXTt4v2x+l1NWTz/9tP7yl78oLi5OrVu31sSJE3XRRRcF309NTVXYb285irR8o23jnj17lJSUpClTpqhatWr673//q4cffljt2rXT+vXrlZSUJEl69913NXjwYPXp00cPP/ywdu3apdGjRys9PV2NGzfOtX0ZGRnq0aOHvv76a9177706++yztWrVKk2aNEl79uzRww8/HFI/mm3597//vdauXasHH3xQZ555pubOnRvVcp8+fbqGDBmizMzM4JeSChUqSJK+/PJLdejQQU2bNg2Gj6lTp6pDhw5atWqVmjdvHnGc9957r3bt2qXVq1drwYIFkpTt1/lo5mnIkCF68803deedd6pt27b65ptvdO+992rLli16/fXX85y32bNnq3Hjxnrsscd07Ngx3X777erfv7/Wr18fPEP4zDPP6MYbb9SIESN033336cCBA5owYYI6dOigL7/8UuXLl5ckff/997riiit01113qVSpUlqxYoVGjhypI0eO6IYbbgiZ7syZM1W/fn099NBDKleunGrVqqVFixapf//+6tOnj2bPni1JmjZtmi666CJ9+eWXql27tr7//nv169dPV1xxhe677z6VLl1amzZt0vfffx/1ci2I5cuX69NPP9UDDzygxMRETZs2Tb169dLatWvVuHHjAh+/JemBBx7QBRdcoGeffVaZmZlKSkoqknUwa9YsNWvWTNOnT9eOHTt0yy23aOjQoTpw4IB69eql//f//p9effVV3XXXXTr77LPVu3fvPJfPH//4R/Xq1UuzZs0K/pjRt29fVapUSU8//bRSUlL0008/6a233srx0t7cjrefffaZLrroIp177rl67rnnVLZsWT3zzDPq2rWrPvroo5h/r/v22291++23a+zYsUpOTtYdd9yhfv36qV+/fsrIyNDMmTP1zTff6Pbbb1f16tX1f//3f8FhvXx2Bz6P//nPf2rTpk2655579N///jfbjxovvvii6tSpoyeffFJHjx7Vfffdpy5dumjTpk2qUqWKpOj371GjRmnu3LkaP368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aOTIkXrrrbey9RB9KohlkHxO0h8kvWFm4+S7X3KSpB8kBfvaNbO6kr6TdL9z7v4s5R0kVZNUw1/U0swOSpJz7jV/nYsl/VPSl5JmmlnWBw0ddc59XkTzBhTYF198od27d+vYsWPatm2bFi5cqFdffVXdunXTlClTchxu4cKFevbZZ3XppZeqXr16OnTokB5//HGVL18++CHRtGlTSdLDDz+sXr16KS4uTi1btlTPnj316KOPavjw4RoxYoQ2btyoSZMmZfuVMlqdOnXS5ZdfrltvvVU//PCDOnfurPT0dK1YsUJ9+vRRx44dNWbMGM2dO1cXXXSRxowZo8aNG+vQoUNav369Pvjgg0L9EjNmzBjNnDlT3bp108SJE1WhQgVNnz5dGzdu1KJFiwptOpE0bdpUH3zwgRYuXKgaNWooJSXF01mxgiynhx56SBs2bFCnTp1Uq1Ytbd26VQ899JB+/vlnvfTSS4Uwd97aGAgwDz74oC688EK9//77eu2117KNb+LEierevbsuvfRSjRo1Srt27dL48eODPezl5uqrr9aMGTPUpUsX3XbbbWrevLmOHTum7777TgsWLND8+fOj+jEmoFu3bmrfvr1GjRql3bt3B3ttjfaLQ9OmTTV9+nTNnTtXDRo0UPny5dW4cWPde++9Wrhwobp06aI777xTZqZp06bp8OHDuu+++/Ic5549e/T000+rZcuWSkpKCt6jGI2OHTtq0KBBuuKKK3TrrbfqwgsvVKlSpbRlyxa99dZbmjZtmho1ahT1+CKpUKGC/vKXv+jmm2/Wrl271KtXL1WsWFE//fSTli9fro4dO2rw4MFq27atKlSooJtvvlkTJ07UoUOHNHnyZKWkpGjfvn15TsfM9NRTT6l///46duyYrrzySqWkpGjHjh366KOPVKdOHd1666165plntGLFCvXu3Vu1a9fW7t27NWXKFNWqVSt4ts/Lcq1Zs6Y6dOigKVOmKCUlRdWrV9fs2bNzfCTQaaedpu7du2vChAnBXlsPHTqke++9V1LBjt+xXgdF4csvv9To0aN11VVXqWHDhsrMzNTMmTMVHx+f67ODczrePvLII7r44ovVo0cPXXfddapZs6Z2796tzz77TJmZmZo6daok32MyOnXqpBkzZmR7VFNJ5PWze926dRoxYoQGDhyojRs3auzYserQoUO2H5TKlCmj7t276/bbb9fRo0c1fvx4VahQQWPGjJEU/bbVuHFjDR48WPfdd5+OHz8e7LU1px9cohXtcb5nz56aP3++xowZo759++rTTz/V448/nu1s7bhx4/Tqq68G5/nYsWMaP358tktb+/fvr+bNm+u8885T5cqV9fnnn2vx4sUaNWpUgebnhFQUPfhE+5JUR9LrkvZLOiBpvqTUsDqp8oXMCWHly/zl2V5Z6kzIqY6kLQVtf1S9tq7+R+gLhSqanqpONIHe/gKvpKQkV6dOHXfppZe6V155JaQ3Puey99q6fv16d+WVV7rU1FSXmJjoUlJSXK9evdyqVauCw2RkZLibbrrJVatWzZlZYL9xzjn3+OOPu9TUVJeUlORatmzplixZ4jp06BDSS2ag57clS5ZEbHvWngrT09Pd5MmT3ZlnnukSEhKC7Vm/fn2wzp49e9wtt9ziUlNTXUJCgqtWrZpr3759jr0JZh23cui1NadeF9evX+/69+/vKlSo4BITE12rVq3cv//975A6OfWKGKknwJyWRbhvvvnGtW/f3pUpU8ZJcsOGDct1WsOGDQvpJc65/C+nBQsWuLZt27qqVau6+Ph4V6VKFXfJJZe4jz/+ONfhcpLb8o2mjYcPH3Y33HCDS0lJccnJya5Pnz7u+++/j7guX375ZdeoUSNXunRp17RpUzdv3rxs22NOjhw54saPH+8aN27sSpcu7SpXruxatmzpxo8fH1zeXrblnTt3uoEDB7rk5GRXsWJFd80117j58+dH1Wvr9u3bXa9evVxycnK2XmdXrVrlunTp4sqVK+fKli3rOnfuHNW6OXjwoBs4cKCrVKmSkxTcXrzMU2Zmpnv00UfdOeec4xITE12FChXcOeec426//Xb366+/5jp9SW7s2LEhZeHHo4BFixa5jh07uvLly7ukpCTXoEEDN2LECLdu3bpgnffee8+1aNHCJSUlufr167vHHnssuH/kNd2Ajz76yPXp08dVqlTJJSYmurp167qrrrrKffTRR8H3+/Xr58444wxXunRpV6NGDXfFFVeEHI9yWq45+eGHH1zfvn1dxYoV3Wmnnebuvvtu99xzz0XstfXqq692zz33nKtfv74rXbq0a9GihXvvvfeCdQpy/A4s++eeey5iO4t6HeTU43hOPRZnldM2u2PHDjd06FB35plnujJlyrjKlSu7iy++2C1evDjbsFn3wZyOt8459/XXX7urrrrKVatWzZUuXdqdfvrp7pJLLnGLFi0K1lm4cKGTlO2zIRodOnQImZ6X4cKXU07rNNLnhpfP7tdff90NGzbMVaxY0SUnJ7tBgwa5Xbt2hUxDkrvnnnvcAw884E4//XSXmJjo2rdvH7E352i2rUOHDrkbbrjBVa5c2ZUrV85dcskl7sMPP/TUa2uknr+jOc5nZma6sWPHupo1a7oyZcq4iy++2H322Weubt262dbVkiVLXIsWLVzp0qVdvXr13DPPPJPt8/ihhx5yrVq1clWqVHFJSUmuUaNGbvz48SE9WBenWPbaai5Lj0/wpmXLlm7NmjW5V1oTermWWo4ougadggKX4ng5swAAQHFLTU1V+/btg8+4RMl1zz33aMGCBfrPf/6T7/vIS6LAmdYlS5ZEvJc4KzPT2LFjNXny5GJqHfIrmu/CZvapc67Qb9w9eS4QBwAAAApo+fLluueee06qEAkUhVjeIwkAAACUKCtXrox1E4ATAkESAACgiG3ZsiXWTcAprmPHjor2ljZufUM0uLQVAAAAAOAJQRIAAAAA4AlBEgAAAADgCUESAAAAAOAJQRIAAAAA4AlBEgAAAADgCUESAAAAAOAJQRInrzUzYvvKp5kzZ8rMgq9y5copNTVVl112mV555RUdP348pP6WLVtkZpo5c2bU01i2bJkmTJiQbVwnorS0NLVq1UrlypWTmemLL76IdZMievTRRzVv3rxs5RMmTJCZKSMjo0inn3WbyvrKurwC29KyZcuKtC0F1bFjR3Xs2DHWzZDk25eiWWYzZ87UP/7xj0Kd9vz58/XII4/k2KZ33323UKd3qshpuXoROI6faM+OLIx5P5lEWo8TJkzQ+++/H7tGISrRHptjrSR9nuUHQRIooV599VWlpaXprbfe0qRJk5SYmKhBgwape/fuOnLkSLBezZo1lZaWpj59+kQ97mXLlmnixIknRZC87rrrlJGRoTfffFNpaWlq1KhRrJsUUU5BsjgNHz5caWlpIa+SurxONsUZJFEwp/JyPZXnPZI+ffooLS1NNWvWDJZNnDiRIAn4xce6AQAia9GihRo2bBj8+5prrtGAAQM0YMAA3XHHHXriiSckSYmJiWrdunWsmhlTx48f14YNGzR27Fh17tw517pHjx5VYmJiMbWsZDr99NOLbFth+SJWMjMz5ZxTfDxfaYrTibzPR9v2atWqqVq1asXQouikpqZq+PDhmjBhQqybclI7kbft4sYZSeAEcvnll6t///567rnndPjwYUmRL21dvXq1unXrpqpVq6ps2bKqX7++brrpJkm+y3ImTpwoSUpISAhe4hgwfvx4nXfeeapYsaJSUlLUuXNnrVq1KqQdgUtGFixYoD/84Q9KSUlRtWrVNGTIEP36668hdTMyMjRt2jQ1bdpUSUlJqlatmnr27Kn169cH6+zevVs33nijTj/9dCUmJqpJkyZ69tlnc10WM2fOVFxcnI4fP65JkybJzJSamirJd+btjDPOUFpamtq2basyZcrojjvukCRt2LBBl112mSpVqqQyZcqodevWWrx4cci4A5ebrl+/Xj169FC5cuVUp04dzZjhu2R51qxZatKkiZKTk9WpUyd99913ubY1NTVVW7du1UsvvRRc3sOHDw+ps3nzZvXp00fJycmqW7eu7r///mxnjPOznIpCbss3mjbu2rVLo0aNUqNGjVS2bFnVrl1bgwcP1k8//ZRtWnPmzFGTJk2UmJios846S//617+ibufhw4d15513ql69eipdurTq1aunBx54IGS5etmWd+3apcGDB6tChQqqVKmShg4dmq1OJB07dtTy5cu1cuXK4PrPeinTJ598oq5duyo5OVnlypVTly5d9Mknn+Q6zuHDh+uFF17QTz/9FBxnYPvPOv/R7J9TpkwJLuNatWrptttu02+//ZbnfJmZxo0bp8cff1z16tVT+fLl1aFDB61bty5b3Xnz5ql169YqW7asKlWqpAEDBmjbtm0hdebMmaPOnTurWrVqSk5O1rnnnqsXXngh4nTHjh2rqVOnBtftf/7zH0nS8uXL1aVLF5UvX17lypVTjx499NVXX4UM//bbb6tt27aqWLGikpOT1bhxY91///1RL9dw33//vfr06aOyZcuqWrVqGj16tI4ePZqtXnp6usaNG6fU1FSVLl1aqampGjdunNLT04N1mjVrppEjRwb/3rdvn+Li4nTGGWeEjKtdu3a68sorQ5ZJNOsiv/Me2E/mzZun66+/XtWqVdNpp50WHO9zzz2n5s2bKykpSSkpKbruuuu0Z8+ekGk/+eSTatOmjapUqaJKlSqpdevWWrRoUUidwOfZM888o7vvvls1atRQ+fLlNWTIEB0+fFjffvutevTooeTkZDVs2DDi9hEucHnqihUrNGDAAFWqVEmtWrWSlPtnZdZhA5e2Bj4rH3jggeAyyhrqotn+YiE1NVVDhgzRrFmz1LhxY5UpU0YXXXSRNm3apEOHDmnUqFGqWrWqTjvtNN12220ht1r89ttvGjNmjJo1a6bk5GTVqFFDl1xySchnuBS6nC+99FIlJyeratWquvnmm0Ouogqs4+nTp+vWW29V9erVVbZsWfXt2zfipeDRbFv5PTZLJe/z7ODBg/rjH/+oOnXqKDExUaeddpq6du2abXmXFPx8B5xgevfurfnz52vNmjW6+OKLs71/8OBB9ejRQxdeeKFmzpyp8uXLa8uWLfroo48kSSNHjtSPP/6o559/Xh9++KHi4uJChv/pp580ZswYnXHGGTp06JBmz56tiy++WGvWrNE555wTUnf06NHq27evXn75ZW3YsEF33HGH4uLiQj7cBw4cqPnz5+uWW25R165d9dtvv2nFihXavn27mjRpov3796tdu3Y6cuSIJkyYoHr16untt9/WjTfeqKNHj+qPf/xjxOXQp08fffjhh2rfvr2uu+46jRw5MuQXxH379mngwIH685//rAcffFBlypTRf//7X7Vv317ly5fXk08+qYoVK+qpp55Snz59tHDhQvXq1StkGgMGDND111+vP//5z5o+fbquvfZabdq0ScuWLdPUqVOVnp6u0aNHa/Dgwfr4449zXGf/+te/1Lt3bzVv3jz4pSP8V+7LLrtMI0aM0JgxY/Tmm29q/Pjxql27tkaMGCFJ+V5OWT399NP6y1/+ori4OLVu3VoTJ07URRddFHw/NTVVzrk8x5PT8o22jXv27FFSUpKmTJmiatWq6b///a8efvhhtWvXTuvXr1dSUpIk6d1339XgwYPVp08fPfzww9q1a5dGjx6t9PR0NW7cONf2ZWRkqEePHvr6669177336uyzz9aqVas0adIk7dmzRw8//HBI/Wi25d///vdau3atHnzwQZ155pmaO3duVMt9+vTpGjJkiDIzM/W3v/1NklShQgVJ0pdffqkOHTqoadOmwS9iU6dOVYcOHbRq1So1b9484jjvvfde7dq1S6tXr9aCBQskKdsv6NHM05AhQ/Tmm2/qzjvvVNu2bfXNN9/o3nvv1ZYtW/T666/nOW+zZ89W48aN9dhjj+nYsWO6/fbb1b9/f61fvz54hvCZZ57RjTfeqBEjRui+++7TgQMHNGHCBHXo0EFffvmlypcvL8kXyK644grdddddKlWqlFasWKGRI0fqyJEjuuGGG0KmO3PmTNWvX18PPfSQypUrp1q1amnRokXq37+/+vTpo9mzZ0uSpk2bposuukhffvmlateure+//179+vXTFVdcofvuu0+lS5fWpk2b9P3330e9XLM6duyYunXrpiNHjuipp55S9erV9be//S3iZezDhg3TK6+8onvuuUft27dXWlqaJk+erO+//14vv/yyJKlz585auHBhcJhly5YpMTFRP/30kzZu3KhGjRrp0KFDWr16tYYMGeJpXRTGvP/xj39Ur169NGvWrOCPDXfddZcefvhh/elPf9Jf/vIX/fTTTxo3bpy++uorffTRR8HPmC1btmjkyJFKTU0N3o7Qt29fvfXWW9mOvVOmTFHHjh31wgsv6Ouvv9Ydd9yhUqVK6fPPPw8ek59++mmNGDFCLVu21FlnnZXjOgq4+uqrNWjQIL322mvKyMjI87MykrS0NLVp00bDhw/XqFGjJCkY8qPZ/mJpxYoV+u677zRt2jQdO3ZMt9xyiy6//HLVr19fDRs21Jw5c7RixQpNnjxZDRo0CAbqo0eP6sCBAxo3bpxq1qypPXv2aPr06WrdurXWr1+vGjVqhExnyJAhuvLKK3XTTTfpk08+0f33369Dhw5l68dhypQpatGihWbMmKGdO3fqnnvuUffu3bVu3TolJCRIin7byu+xOaAkfZ6NGTNGCxYsCM7LL7/8opUrV0YdjIudc45XPl/nn3++y9Pqf4S+UKgOHTrkDh06FPnN8GVf3K98mjFjhpPkNm3aFPH9xYsXO0luzpw5zjnnNm/e7CS5GTNm+GZ79Wonya1duzbHaYwfP95Jcunp6bm2JSMjw6Wnp7tGjRq5P/3pT8HypUuXOklu6NChIfVvvvlml5iY6I4fP+6cc+69995zktxjjz2W4zTuv/9+l5iY6DZu3BhSPnLkSFe1atVc25ienu4kufHjx4eUDxs2zEly8+fPDym/7bbbXFxcXMiyzcjIcI0aNXLnnntusCywfF544YVg2Z49e1xcXJyrUqWK27dvX7D8sccec5Lcli1bcmync87VrVvXXX311dnKA9P6xz9Ct5lmzZq5bt26Bf8uyHJyzrkhQ4a4OXPmuBUrVrhZs2a5c845x8XHx7ulS5fmOlwkOS3f/LYxIyPDbdu2zUly8+bNC5a3bdvW/e53v3OZmZnBslWrVjlJrkOHDrm28cUXX3SS3PLly0PKJ0+e7BISEtyOHTucc9Fvy++8846T5P75z3+G1OvZs6eTlOdy7NChg2vXrl228ssvv9xVrFjR7d27N1i2b98+V7lyZXfZZZflOs5hw4a5008/PVt5tPO0YsWKbNu5c87Nnj3bSXKff/55rtOX5Bo2bOiOHTsWLHv11VedJLdy5UrnnHMHDhxwFSpUcCNGjAgZdvPmzS4hIcH99a9/jTjuzMxMl56e7kaOHOnOOeecbNOtWbOmO3z4cEh5gwYNXOfOnUPK9u3b56pWrepGjx4d0r6s+3C4nJZrJM8++6yT5NLS0kLa3rRpUyfJbd682Tnn3H/+85+Ix6pJkyaFHK/nzZsXcjwZPXq0u+SSS1zDhg3dM88845xz7t///reT5L755puQZZLXuijIvAe2qUsvvTSkfPPmza5UqVJu4sSJIeUffvihk+T+9a9/RZxOYP1269bN9evXL2R8klynTp1C6l922WVOkps1a1awLHBMnjBhQo7z49z/PlNvueWWkPJoPisDwwbWo3O+ZT127NhsdaPZ/rw4fvy4S09PD3nVrVvX3XvvvSFlGRkZeY6rbt26rnLlyu7XX38NlgU+u6677rqQuueee67r2LFjjuPKyMhwhw4dcsnJye6RRx4JlgeW1ahRo0LqT5482ZUqVcpt2LDBOfe/dRx+bA9sM3//+9+D9aLZtgp6bC5pn2dnnXWWGzNmTK5tDpfrd2E/SWtcEWQhLm0FTjDOf8Yo6+WoWZ155pmqVKmSRo0apdmzZ+uHH37wNP53331XnTp1UtWqVRUfH6+EhARt3LhRGzZsyFY3vIOfs88+W0ePHtWOHTskSe+8847MTNdff32O01u8eLFatWqlevXqKSMjI/jq0aOHfvnlF3399dee2h8QHx+vvn37hpStWLFCrVu3Drn3NC4uToMGDdIXX3yh/fv3h9TP+it55cqVVb16dbVu3Tp4NkmSmjRpIkmel3O48GXZrFmzkEv/CrqcZs2apauuukoXXXSRhgwZog8//FC1atXSuHHj8tXeSMvXSxuffvppNW/eXMnJyYqPj1edOnUkKbidZWZmavXq1briiitUqtT/PqpatWqV56WGgbbUrVtXbdu2DWlL9+7dlZ6enu1y7by25bS0NMXFxenyyy8PqTdw4MA825KbFStWqG/fvqpUqVKwrEKFCurXr5+WL19eoHHnNU+LFy9W6dKldfnll2dbRoG25aVbt27BsweBaUgKbrtpaWnav3+/rr766pBpnHHGGWrSpEnINDZt2qRBgwbp9NNPV0JCghISEvT3v/894rGnZ8+eKlOmTMiw3333XbbplC1bVm3atAlOp0WLFkpISNDAgQP12muvaefOnVEty5ykpaWpdu3aIfcelypVKuSyU+l/yzL8LGLg78C67tChg0qVKhXszOX9999X586d1blz55CymjVrBo89AXmti8KY98suuyzk7yVLluj48ePZlnurVq1UoUKFkPX76aefqm/fvjrttNOCny1LliyJuH7Dz1AG5rVHjx7BssAxOdpjb3jbC/pZmVW0258Xy5cvD+4HgdfWrVs1adKkkLIuXbpENb42bdqoYsWKwb8jLdNAefiyeOWVV9SqVStVqlRJ8fHxKleunA4ePBhx3YVv+wMHDtTx48ezXa4ffmxv165d8BJTKfptqzCOzSXp8+yCCy7QzJkz9eCDD2rNmjXKzMyMej5igSAJnGACB/isvchlVbFiRS1dulS1atXSTTfdpDp16qhZs2ZRXab22WefqXfv3kpOTtbzzz+vVatWafXq1WrevHnEe6aqVKkS8nfgMqhA3V9++UVVqlQJ+cIXbufOnVqxYkW2D8wBAwYEx5Ef1atXz3bZ7p49eyIutxo1asg5p71794aUV65cOeTv0qVLRyyTFNU9ZbmJtCyzjrOwl1P58uXVp08frV69Ol/tjbR8o23jE088oZtuukldu3bVvHnz9MknnwSDXWCed+/erfT09JD7sAIilYXbuXOntm7dmq0tF154YUhbAvLalrdv367KlSuHfFGPti25yW2bDN8evcprnnbu3Kljx44pOTk5ZBlVr15dUnTbVDTTkKSuXbtmWxf/+c9/gtM4ePCgunXrprVr12rq1Kn64IMPtHr1al177bUR7zcMX2aB6Vx33XXZprNw4cLgdBo2bKi3335bx48f1zXXXKMaNWqoVatW+Q7t27dvj2obDdzTFd7uwGWBgferVKmi5s2ba+nSpdq9e7e++uorderUSZ06dQo+xmDp0qXq1KlTtmnmtS4KY95zWu4NGzbMttz3798fXO4//PCDunTpoj179uiJJ57QRx99pNWrV6tnz54Rj505HWcjlUd77A1ve0E+K8NFu/15cf7552v16tUhr5o1a+r6668PKQtcLp+X/C7TN998U1dddZV+97vf6eWXX9bHH3+s1atXq1q1ahGXffi2H/g7/J7BnPabQL1ot63CODaXpM+zJ554QqNGjdI//vEPXXDBBapevbrGjBkT7BejpOEeSeAEs2jRIiUlJen888/PsU6LFi30+uuvKyMjQ2vWrNGUKVN05ZVXau3atWrWrFmOw73++uuKj4/XvHnzQg7Ke/fuDTljEq2UlBTt2bNHR44cyTFMVq1aVdWrV9djjz0W8f287oXLSaQztlWqVNHPP/+crfznn3+WmWX7IlaSFMVycs7leGY7L5GGi7aNc+bMUZcuXULuU9y8eXNI3ZSUFCUkJATPnmW1Y8cO1a1bN9f2Va1aVfXq1dMrr7wS8f1ozmpmVbNmTe3du1fp6ekh+0ak9nmR2zZZ1Ntj1apVlZSUpA8++CDi+7Vq1SqUaUi+exoj3ccWuD8yLS1NW7du1QcffKD27dsH38/p+arh219gOlOmTFHXrl2z1Q98aZYUDGZHjx7VypUrdd9996lPnz7asmWLUlJSPM1fzZo1I3YuFL5dBNblzz//rAYNGgTLA+s+0P5A++bOnaulS5eqatWqOuecc1SzZk3t3LlTK1eu1Oeffx68P8+rgs57Tsv9nXfeyRZIsr6/ePFi7du3T6+88kpIx0HF+eU40jErv5+V4bxsf9EqX768WrZsmW08tWrVylZelObMmaOGDRuG3OOYnp6ercObgB07doTs64F94fTTT89WL9KwLVq0kBT9tlUYx+aS9HmWnJysKVOmaMqUKdq6datee+013XXXXSpdurSmTZsW9TwVF4IkcAKZN2+eFixYoNGjR6ts2bJ51o+Pj1fr1q01adIkLViwQN98842aNWsW/KX6yJEjwS9yku9DPS4uLuSg+v7772vbtm2qV6+e5/Z2795dU6dO1d///vccb3zv2bOnnnjiCdWpUyd4JqSodOjQQY8++qi2bNkSDBKZmZmaO3euzj333JBlUdgSExNDeq7zqrCX0/79+7Vo0aJg74WFIdo2Hj58OOTyYEnBHnED4uLidMEFF+i1117ThAkTgpcDffzxx9qyZUueQbJnz556/fXXlZycnO0SwPxo06aNMjMz9frrr4dcMjVnzpyohk9MTNSBAweylXfo0EGLFi3SgQMHgtvfgQMH9Oabb+b5kOrC2KamTZumffv2RX15nFdt27ZV+fLl9e2332rYsGE51gsEivAfsN54442optO4cWOlpqZq3bp1uuuuu6IaJjExUZ07d9bBgwfVv39/bd68WSkpKZ6Wa5s2bTRjxgytWrUqeHnr8ePHs/2A0aFDB0m+7WXs2LHB8pdeekmSQjpO69Spkx555BH97W9/U8eOHWVmql69us466yyNHz9emZmZeT7uqDjmXfJdTluqVClt27ZN3bp1y7FepPW7ceNGrVy5MluPtLGQ02dlJKVLl862jPKz/Z0oDh8+nO3ROrNmzcrxkstXXnklZPucM2eOSpUqFbwaJCD82L5y5Ur9+OOPatOmjaTot62CHptzUhI+z+rWravbbrtNL730Uono/TcSgiRQQn3xxRfavXu3jh07pm3btmnhwoV69dVX1a1bN02ZMiXH4RYuXKhnn31Wl156qerVq6dDhw7p8ccfV/ny5YMH6KZNm0qSHn74YfXq1UtxcXFq2bKlevbsqUcffVTDhw/XiBEjtHHjRk2aNCnbL4nR6tSpky6//HLdeuut+uGHH9S5c2elp6drxYoV6tOnjzp27KgxY8Zo7ty5uuiiizRmzBg1btxYhw4d0vr16/XBBx9E/UUyGmPGjNHMmTPVrVs3TZw4URUqVND06dO1cePGbN3QF7amTZvqgw8+0MKFC1WjRg2lpKR4OitWkOX00EMPacOGDerUqZNq1aqlrVu36qGHHtLPP/8c/CJbGKJtYyDAPPjgg7rwwgv1/vvv67XXXss2vokTJ6p79+669NJLNWrUKO3atUvjx4/P1ktgJFdffbVmzJihLl266LbbblPz5s117Ngxfffdd1qwYIHmz58f1Y8xAd26dVP79u01atQo7d69O9gzYLQf7k2bNtX06dM1d+5cNWjQQOXLl1fjxo117733auHCherSpYvuvPNOmZmmTZumw4cP67777stznHv27NHTTz+tli1bKikpKXhfXDQ6duyoQYMG6YorrtCtt96qCy+8UKVKldKWLVv01ltvadq0aWrUqFHU44ukQoUK+stf/qKbb75Zu3btUq9evVSxYkX99NNPWr58uTp27KjBgwerbdu2qlChgm6++WZNnDhRhw4d0uTJk5WSkqJ9+/blOR0z01NPPaX+/fvr2LFjuvLKK5WSkqIdO3boo48+Up06dXTrrbfqmWee0YoVK9S7d2/Vrl1bu3fv1pQpU1SrVq1gcPCyXIcNG6apU6fq97//vR588EFVr15dzzzzTLb7rc866ywNGjRIEyZMUEZGhtq2bau0tDRNmjRJgwYNCukR++KLL1ZcXJzee+89PfXUU8HyTp066cknn1SdOnVUv359z+uisOddkho0aKA777xTf/jDH7RhwwZ16NBBSUlJ+uGHH7RkyRKNHDlSnTp1UteuXRUfH6+hQ4fqtttu0/bt2zV+/HjVqVMn22OOiks0n5WRNG3aVIsWLVLPnj1VuXJl1apVS7Vq1Ypq+5N8Z+dHjBihpUuX5vljUUnQs2dPzZ8/X2PGjFHfvn316aef6vHHH8/xKqW33npLt99+u7p3765PPvlEEydO1NChQ7MdSw4cOBBybL/77rt15plnaujQoZKi37YKemzOSaw+z9q0aaN+/frp7LPPVnJyspYvX661a9fm+kNcTBVFDz6nyoteW2Mvmp6qTjSBns8Cr6SkJFenTh136aWXuldeeSXY42JAeK+t69evd1deeaVLTU11iYmJLiUlxfXq1cutWrUqOExGRoa76aabXLVq1ZyZOd+hwOfxxx93qampLikpybVs2dItWbLEdejQIaRXsUAPfkuWLInY9qw93KWnp7vJkye7M8880yUkJATbs379+mCdPXv2uFtuucWlpqa6hIQEV61aNde+ffsce3TMOm7l0GtrTr0url+/3vXv399VqFDBJSYmulatWrl///vfIXVy6tU2Us+rOS2LcN98841r3769K1OmjJPkhg0bluu0hg0b5urWrRtSlt/ltGDBAte2bVtXtWpVFx8f76pUqeIuueQS9/HHH+c6XE5yW77RtPHw4cPuhhtucCkpKS45Odn16dPHff/99xHX5csvv+waNWrkSpcu7Zo2bermzZuXbXvMyZEjR9z48eNd48aNXenSpV3lypVdy5Yt3fjx44PL28u2vHPnTjdw4ECXnJzsKlas6K655ho3f/78qHoG3L59u+vVq5dLTk7O1kvfqlWrXJcuXVy5cuVc2bJlXefOnaNaNwcPHnQDBw50lSpVcpKC24uXecrMzHSPPvqoO+ecc1xiYqKrUKGCO+ecc9ztt98e0sNj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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "xmin = 0\n", "xmax = 200\n", "step = 1\n", "\n", "sns.distplot(df.query('strand1==\"+\"').dist_rfrag1_left, bins=np.arange(xmin, xmax, step), label='Distance from the 5\\' read end to the nearest upstream rsite, + mapped reads')\n", "sns.distplot(df.query('strand1==\"+\"').dist_rfrag1_right, bins=np.arange(xmin, xmax, step), label='Distance from the 5\\' read end to the nearest downstream rsite, + mapped reads')\n", "\n", "plt.xlim(xmin, xmax)\n", "plt.legend()\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "id": "2cfd8a30-79d4-4926-b0e9-809ac185228c", "metadata": {}, "source": [ "However, if we select only the pairs that map to the restriction sites, there is no significant skew in scaling:" ] }, { "cell_type": "code", "execution_count": 10, "id": "97eac9b5-2b51-4529-9056-48d061c30d6b", "metadata": {}, "outputs": [], "source": [ "hg38_chromsizes = bioframe.fetch_chromsizes('hg38', \n", " as_bed=True)\n", "hg38_cens = bioframe.fetch_centromeres('hg38')\n", "hg38_arms = bioframe.make_chromarms(hg38_chromsizes, \n", " dict(hg38_cens.set_index('chrom').mid), \n", " cols_chroms=('chrom', 'start', 'end') )\n", "\n", "# To fix pandas bug in some versions: \n", "hg38_arms['start'] = hg38_arms['start'].astype(int)\n", "hg38_arms['end'] = hg38_arms['end'].astype(int)" ] }, { "cell_type": "code", "execution_count": 11, "id": "28358a56-a6fe-4ec7-9ca6-52822a6224b9", "metadata": {}, "outputs": [], "source": [ "import pairtools.lib.scaling as scaling" ] }, { "cell_type": "code", "execution_count": 12, "id": "3769c57b-78c7-48e4-85bf-710f7f459e1e", "metadata": {}, "outputs": [], "source": [ "def plot(cis_scalings, n, xlim=(1e1,1e9), label='' ):\n", " strand_gb = cis_scalings.groupby(['strand1', 'strand2'])\n", " for strands in ['+-', '-+', '++', '--']:\n", " sc_strand = strand_gb.get_group(tuple(strands))\n", " sc_agg = (sc_strand\n", " .groupby(['min_dist','max_dist'])\n", " .agg({'n_pairs':'sum', 'n_bp2':'sum'})\n", " .reset_index())\n", "\n", " dist_bin_mids = np.sqrt(sc_agg.min_dist * sc_agg.max_dist)\n", " pair_frequencies = sc_agg.n_pairs / sc_agg.n_bp2\n", " pair_frequencies = pair_frequencies/cis_scalings.n_pairs.sum()\n", " mask = pair_frequencies>0\n", " label_long = f'{strands[0]}{strands[1]} {label}'\n", "\n", " if np.sum(mask)>0:\n", " plt.loglog(\n", " dist_bin_mids[mask],\n", " pair_frequencies[mask],\n", " label=label_long,\n", " lw=2\n", " )\n", "\n", " plt.gca().xaxis.set_major_locator(matplotlib.ticker.LogLocator(base=10.0,numticks=20))\n", " plt.gca().yaxis.set_major_locator(matplotlib.ticker.LogLocator(base=10.0,numticks=20))\n", " plt.gca().set_aspect(1.0)\n", " plt.xlim(xlim)\n", "\n", " plt.grid(lw=0.5,color='gray')\n", " plt.legend(loc=(1.1,0.4))\n", " plt.ylabel('contact frequency, \\nHi-C molecule per bp pair normalized by total')\n", " plt.xlabel('distance, bp')\n", "\n", " plt.tight_layout()" ] }, { "cell_type": "code", "execution_count": 13, "id": "bf07b649-d184-4ded-827b-d8ff3f9f4284", "metadata": {}, "outputs": [ { "data": { "image/png": "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T7kvvfRSxB133JE0ZsyYyhEjRlS19hpdc801vc4777yim266aY/D4VClpaWGc845p9+QIUMqFyxYsDcwMNCVkZFh+f7775veX7G236eeemr/hlPD66anv/fee0GXX355n4kTJ5a88sorewGefvrp6ClTpvTfuHHj1j59+nT6FGhPT/F9EKgATgZKgDzgDq3110qpy4F5wAWea55oj+/2FAAwpnf4UY1uOl1OlmYsBeD24bdTvr17p8IbTWa8/QOoqiinqrycGpt7hNHXYGfvsgicVUYM/v5E/+1+AqdPP6KvMX37U5qXS/audMITerD562UADJky9bBygyfG88v/9pPxcx5lhTYCw36bspyxyf37LbxHMjk7Mzm4fUsTAepvI6gAfUaNISQ2nuKsg2z++n8MO/0sAKptNg5s/RVlMHDbhfdxV0AgP2UWsea1t/DPqUQbInACLsdBqq0OVr34GeecU40K7QlxaWDusg/IhBBCiDZxuVzUjYo1Pm63//b3sVIKk6njf976+fk5v/rqq91GozufTkpKStUZZ5zRf8GCBWFz5swpAHjsscdy6so7nU6mTZtWnpOTY/7Xv/4V0ZYA9cYbb8y7//778+qev/rqqyF2u1299tpr+0JDQ+umMnX4j59zzz23aNq0aSUJCQn2jIwMy3PPPRd99tln91uyZMmus88+u831Op1OHn/88djx48eXffjhh5l1xyMiIhw33nhjr5auXbt2rV9AQIBz8eLF9QNNF1xwQf2UsbS0tCp/f3+X0+k8Yir00KFDq1999dX66xwOB6ecckpF3759h3z44YdBV155ZUnD8rfddlvOHXfcUQhw3nnnla9duzbggw8+CL3jjjsKY2NjHb17964GGDlypHXQoEEtrsOdMmVK5fPPP++wWCy6qSnSQ4cOrXz//ff31T1fv36999KlS0PnzJmTXTfV/IILLigzGo08+eSTsT/88EPOSSedZKsrn5iYWP3xxx9nAsyYMaNs7dq1AUuWLAl78cUX995yyy1FAOPHj6+MiYkZ9u6774aMGDEiu6X2AkybNq345ZdfPlj3fM2aNb5lZWXGp5566mDDe99+++3NTlmu62tTU8PvvvvuhJEjR5avWLGiflbrWWedVda7d+/BjzzySHTD17izeDpAHQs8r7XerZSq27/DAKC1fkspdTLwBDC1uQrEsWPt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b74ZsWjRopDk5OTqoKAg59ChQ6tPOeWU0pdeein6L3/5S/To0aMrly9fHrh06dIOb+cwZMgQG8Czzz4bce211xZaLBY9atQom7e391GP/o0YMaLq7LPPLnr66adjHQ6HGj9+fOXatWv9nn322Zizzz67qKsCuJa8++67QYsWLYo455xzinv37l1TUVFheOGFFyL9/PxcEydObDZg7t27d9Xy5cuD/vOf/5SFhYU5EhMT7UlJSfZnnnlm/2WXXdZ72rRp6sILLyyKiIhwZGdnm7/77jv/xMTEmgceeCC3s/vQmVN8DwB+wGtKqdla6+GtXaC1/hH4scHzHKXUEGAw4AR2aK3bvKBadI+KagcurQn0ds+CqXG4WL/Xvf50TAsJknIq65Pe8Y/v/8GSc5fgb/ltumxWRRY/5vyIxWDh9KTTu6j1LXNVVVHx9dfULPsfACVbt1Btdv++CRg4qc311K1DDQiLIGlYy/8UDAbFSef8lgwvs+jwDyXD4hPrt67J3rWTuOSUBhl845usUxkMnH7jH3nzz3fgcjro20qA6hccUp8B+O175jD+khs4mO5dHzTH8iM/rfOh0ieK07YMYtT+n3n4XPjrV3/gtTM/54MHN+Byamb+OY2Q6HYtcRFCCCGOGbNnz87evXu3180335xUVVVlOOmkk8pffvnl/XWjcLGxsY633357z5///OeEq6++undERETNTTfdlFdUVGSaN29eh/YtHT58uHXZsmWB//znP+OLiopMQUFBjhEjRlS8/fbbGf7+/hqgvLzcABAdHd3iKHD//v2rli5dGrJs2bLg8vJyo7+/v2v48OEVr7zySubkyZObnArdkjlz5hRUVFQYXnrppahPP/00tG/fvrY33ngj49prr+3Z0nWjR4+ufOGFFyLvvffehNLSUlNoaKhjwoQJpU888UR9cP33v/89e/fu3V6zZ89OslqthroEV48//nhWSUmJ8ZVXXomaP3++YdSoUeVffvnlzpSUlMHtbT/AmDFjbHPnzs168803I95///0Il8vFjh07NicnJ9d0pL7GPvzww8y77rqr+t133w1/7rnnYiIjI+233HJLzpNPPtlqBt6uMGDAgCofHx/Xk08+GVtQUGD29fV1DhkypPKTTz7Z2bt372bfP88999y+OXPmJM6aNatPTU2Nqvsw5OKLLy4NCwtLf/jhh2Nu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3vdshv+0mC1XXszA19/D6H/EUiIhhBCiW6xcuTLopptuip86dWrZunXrfJ955pnY888/v7Bu/elZZ51Vunjx4siZM2f2vPbaawt27Njh/fTTT8c0NXW3rS655JIe/v7+zrFjx1ZGR0fbt2/f7v3RRx+FjR8/vj6xzfPPPx92xx13JLW2lvacc87pmZSUVJ2WlmYNCQlxbtiwwff555+PjoyMrLn77rvzmruuKUOHDq2ePn160ZNPPhnrcrmoy+K7cuXKoNaunTJlSu/Bgwfb0tLSrKGhoY4NGzb4fvPNN4GXXnppfVbb3r17Vy1fvjzoP//5T1lYWJgjMTHRnpSUZB86dGjlSy+9FBUTE2OPiIhwvPrqq2G5ubkdXguUkpJie/fdd8Mff/zxiNGjR1f6+PjohutCj8att95a+Morr0RdcsklfRpm8f3uu+8Cn3zyyX0dyXB7tGbPnh2bl5dnnjRpUllCQoJ93759loULF0b279/f1tz07EGDBlUZjUb96quvhoeHhzu8vb314MGDqwYOHFh9880359xzzz2J6enp3pMmTSr38fFx7du3z7J8+fLAG264oWD69Omtru1uzNN/lc9s8H3/2kdjbVow3UjjpEsLar+uxp3MCa11pVLqFNz7kr6JOznSCmC21rrFjFgnohyrO9B02YMJ8//tQ8Aze57JUz89xY85P7KnZA+9g3sffl0XBai2XzfjqqjAkpSEOc49omvu0YPq7dupKbTiEx8CfhFU7XCPpoZdfz0l77+P9aefKHhxAdaffgKXi9CrrsJnsKw/7SoGgyI8PoCcDPea/0mX9ie6V/O/t/qMHE1ITBzF2YdIO306+76wUxKaxrY+B0jZupyfLj6b4W//B3NwuxJtCyGEEJ1i8eLFe5966qmoyy67rLfZbNazZs0qeOmll+qzoc6YMaPsoYceOrBgwYKoZcuWhfTp08e2cOHCvY888khsR+85duzYijfffDP8o48+CquoqDBGRETYL7jggqInn3zyUF2ZyspKAxy5RraxgQMH2j766KPQV199NdJmsxnCw8MdU6dOLXnssceyWlv72ZQ333xz3x/+8AfnSy+9FP3888+r0aNHl7/22msZZ5xxRlN/09cbP358xZIlS0Jee+21yKqqKkN0dHTNzTffnPvoo4/WZ4J97rnn9s2ZMydx1qxZfWpqatScOXOy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oYTQQwi9NynSFFBRsVw76EVAUa+iqIgFQQUUC5/YCyqKiigiTVApgiIIhB5KKOm9zcz+/pgEA4SQQWAo632e85A558zea88EmDW7GZRLFzMXQghRA3a7nap6bux2O2VlZcceK6UwmZz5eHs8Ly8v2+LFi3dWfFhv1KhRcZ8+fRrOmjUraOzYsekAzz///OGK+202G/379887fPiw+e233w6pSYJ61113HX388cePTZV75513AsrKytS7776bEhgYWJGw5Z1pGwYPHpzZv3//7Fq1apXt3r3bMn369PABAwY0mD9//o4BAwbUuNykpKRib29vu81mO2m48sSJEyPMZrN9xYoV24ODg20AgwYNyq1Tp07ziRMnRv7444+7rFYrzz33XFSbNm3yFixYcCzpatKkSXHfvn3jZ86cGTxhwoQTpwwCjqGoc+fOLYWTh0rPnTs3peJnq9XKsGHDcuLi4pq+8cYbwW3btt1f+d6EhISCyvdXpV69emVFRUWF5T+XnFhfdna2acGCBVs6dOhwLOns27dv3dO1v+LegoICw6uvvppSMXS4Vq1aZe3atWu8ePFi/507d26u+H3dvHmzx7vvvhtqtVpP+zucl5dn/P3337fExMQcGxK2du1a706dOuVW/t264YYbcqprd1RUVBlA9+7dC8zmf/oZ33rrrcANGzZ4L1y4MLki7sGDB+cBvPTSS5FPPvnk4aioqHM2HM2Zv8FzgbFKqU9xzEGF8qG+Sqk7gCHAI07W7w0scPI54jwK9QzlurDZTF+STEgP57aYqWCJjaVwzRpK9+yB0HzY+RO4+UGPJ0ApGDQT0pLhyCb4+l4Y/tEpy7KmOkZ8m9ztkHgT/PEBfPEfsJWBwQSBdc8oRnHxq58USmlxQ5Z9uI3fvtpFabGVTcsPOq61bMP21T9gK9vNwdB4GiUrbO/8wiPufXjquvl4WLxOU7oQQlz8LuSey9NZuHChz8CBA0/aLWL69OkR06dPPzYUtnXr1vlr165NBkfyovU/s9IMBgOnm8s4cODArMr39O7duyAsLKxs9erVXkA6wKZNm9weffTRyDVr1vhkZGSY7XZHTmmxWGo0L3H48OHZlR+3bt260GQy6auvvrrurbfemtG7d++8f/Phf/78+cdNj7v++uuzmzRp0mTixImRAwYMSD7Tcitbu3atT48ePXIqkjOAwMBAe69evbKXLFniD7Bx40b3zMxM03XXXXfcCMk+ffrkR0ZGlq5cudKHk9e0Oa358+f7PPfccxHJycmeOTk5x96snTt3up947+DBg7OdLf9EkZGRpZWTU6hZ+yt4eHjYK89rTUhIKAbo3LlzbuVEtGHDhsU2m02lpKSY69WrV0Y1EhISCionpwAtW7YsePXVVyP++9//Rg0YMCCna9euBTWZl1qVRYsW+UVGRpb26tUrv/IXQFdeeWXulClTopYvX+514403njL5/becSVCfA3oCK4G/cCSnLyilgoBYYBXwipP1rwPO6ZLR4t9Lzy8BDAT7nNlIk2Mr+e7ZBdkvOU52exi8yxddsnjC8A/htXawbQHkpoJv1auy2zY5FsIxRdZxJLYWr/LhwjiSU9OZJdHi0tC4o+P3ZtmH21j/veML01qNAkjs3c2RoJZsxGhpyMGgAKIysug++wBj07sy6Y5vCPE57zsBCCGEqKGOHTsWrFixYmvlc8OGDavfs2fPnMqr1fr5+R1LGDp06BC/bt26Y/Pvxo4de+h0CyqFhYWdlBgEBweXHTp0yAKQk5Nj6Nu3bwN3d3f7xIkTDzRo0KDEzc1Nv/rqqyGff/558MklniwmJua4Opo2bVry5Zdf7pgyZUr4yJEj65SWlqqmTZsWPPfccwf69+9f7YI9NREQEGDv0aNHzmeffVaj+GoiNzfXFB4eftJrFRYWVpabm2sESE9PNwFERkZW+ZpmZ2c7vfLRqlWrPK+55pq4zp07586cOXNvVFRUmclk0nfddVdsSUnJSUOiKnoI/43Q0NCTyqhJ+yv4+Pgc1/VfkTQGBAQcl2BWfMFxqqHIp4vp2WefPezu7q4///zzwFdffTXc09PT3q9fv6yZM2ceiIiIcOoLj/T0dFNqaqrFYrFUOS2g4r09V2pcuNa6SCnVDcec0eFAMdAMx7Dex4CXtNbO/hKMBxYopb7VWq9y8rniPMnId6yQHuR1pglq+UJJG3+B5rsdc03b3HX8TQGxFPu0gz0rcd++CFr95+SCrCVYd/wOGDE27uLofe3zHJTkw58fQkSLM4pPXFoqJ6kAHYbWJyjKm2Y9+7BpySJK878h++Yncf+/R4k9WsBd7xTwQmpvrrpnNp3qtXdl6EIIIU4hICDA3qVLl8LK58xms46IiCg78XyF2bNn763cw3ZiYliVI0eOnLSeSnp6urlJkyaFAEuXLvVOTU21/PDDD8l9+vQ5ljy+8sorJ+1CcSoGg+GkXq2BAwfmDRw4MK+oqEgtXrzY+6mnnoq85ppr4nbt2rXJ2eSiKlprlKpxiKfl6+trreq1OnLkiNnPz88KEBwcbAU4dOhQla9ps2bNnF5leO7cuQEmk0l///33uyrmBAPk5uYafX19TxoDrpT616vtVlVGTdp/LlX1Xrq5uenJkycfnjx58uF9+/aZvvjiC/8nnnii1h133GH47rvvTjuvtbLAwEBbVFRU6ccff7yrqutxcXHndPskp7Lf8gT0xfLjbBiPo2t/hVLqTxyLMJ34y6W11tedpfrEGXD0oEKw95n1TlZsNVOSsg+aA32fA+Pxf6eLNm1m71s7wBaK7/63CJl+hWNBpco2f4ktvxTwwBTXynHOYIBBM6Bhf4hujRDgSFIDwr2wW+0ERzv2IO/xn3vY++d28jL2kLX5OzrN/44to+8h4u9t3P6tjSX7b2frNZ25qfszLJ17iNBYX1r1i3VtQ4QQQpyxhIQEp/f9/PbbbwOmTZt2bE/IH3/80evIkSPmdu3aFYBjPiE4kuOK56SlpRkXL17sfzZi9vDw0IMGDcrLy8s7PGLEiPrbt2+3/NsENTMz07B06VK/5s2bO50QWiwWe1ZW1kn5Qtu2bfOWLVvml5WVZQgICLADZGVlGZYsWeLftm3bPHAMZQ0KCrJ+/vnnARXzdwEWL17slZqaahk1atQRZ+MpLCw0GAyG45L8b775xufQoUOW6Ojo87bnbE3a70oxMTHWcePGpf/www9+ycnJHqe6z83NzQ6Qn59/rB0AvXv3zvnhhx/8fXx87ImJicXnI+bKzmn3bA0Mq/RzYvlxogtmn6HLVUZBeQ+q95n1oJqjosCgsBYYsNfpjaF+r+Ou2wsKSH3wQbA5/l7k/p1NXr8rCbjpJkLuHeW4SWtY8zrWYseoB1NwpVEqBiM0vPKMYhOXroh6fsc9NpnNdLphNN+/OoHco7v4e9GXdP/sC3a9+hIlb86h55+a/Qd+5uVfX8O3oAt7/0onrlUYfiGn/HddCCHEJaagoMB4xRVX1L/rrrvSjh49apo0aVJU7dq1S0aNGpUB0KNHj3xvb2/b6NGjYyZMmJCan59vmDJlSkRAQIA1Pz//jDbrnDJlSsjKlSu9+/Xrl1O7du3StLQ009SpUyNCQkLKkpKSisCxDU7Dhg2bnW6Y8hNPPBG2fft2927duuVFR0eX7dmzxzJz5syw9PR08zvvvOP01o3x8fHFH3zwQcjs2bMD4uPjS/z8/GwJCQklTz755KGuXbv6d+nSJf6BBx44pJRi2rRp4cXFxYYnn3wyFcBkMvHII48cHD9+fO3BgwfXuemmmzL2799vmTx5clTt2rVL7rvvvvTT1X+iK6+8MmfOnDmhw4YNq3Pbbbelb9u2zX3atGkRVQ15PZdq0v7zrWfPnvWaNWtWlJSUVBgYGGhdv36958qVK31vuOGGU77OTZo0KQaYNGlS+IABA3JMJpPu0qVL4d133535wQcfBPfp06fBqFGjjiQmJhaWlJSonTt3un333Xf+P/zwwy4fH58qV2A+G2qcoCqlbq7JfVrr92taptZals88Q1Y7pGZXvddudSM4FKe+eKrnpec5voAMOcMEVR35C4tXGaV5Jkob3cOJM9gPT36W0pQU3OLjiWp/lPRlB8lN8SRzzhx0WRl07AD7VsOhjVhLwwEwBp203ZgQpxXbvDYW70GU5n3Gn4u+488fF+Lu5Y2lS2tMBw5SP8MH34IugOM7kT+/20rXW1u6OGohhBDny5gxYw7t3LnTbeTIkbHFxcWGtm3b5r3xxhv7KoaTRkZGWj/66KNdDz/8cK1bb721XkhISOndd999NDMz01Sxp6SzWrZsWbho0SLfp59+OjozM9Pk5+dnbdWqVf5HH32029vbW4NjT0qAquY9VtawYcPiBQsWBCxatMg/Ly/P6O3tbW/ZsmX+m2++ubd79+5VDoWuzsSJEw/t3LnTbcyYMbGFhYWGikWo2rZtW7Rw4cLkCRMmRI0aNaqO1poWLVoUfP/999sqb7Hy4IMPpnt6etqnT58efsMNN9T39PS0d+vWLWf69OkHTrXFTHWGDh2a+8wzz+yfNWtW2KJFiwLq169f9NZbb+159tlnz+tCEjVt//nUqVOn/Pnz5we8++67ocXFxYbw8PDSkSNHHnnuuecOneo5w4cPz160aFHau+++G/LKK69EaK3RWq93c3PTK1as2D5hwoSI9957L/jZZ5918/DwsNeqVaukd+/eOe7u7ucsOQVQlVc3q/ZGpcr39TgpwzmuAK31GX17JJzjFhGnI2555bzVZzIodkzu5/z8Bbsd3r6C/Z/sJj/VnahXXsG3b59jl3MXLuTguAdQbm7UmfcFbvs/gxUvkOc+gAPvbsCtUSP23T+abodnw7YFbP+2DraCEuJWrTy+F/USsnz5crp16+bqMM4LV7T1g8d/I+vgn5gMv1CUl33cNZNbF0yerYg49BuHItoDZdz6XBe8Av59L6q8r5euy6m9l1NblVLrtdatXB3HmVi/fn1ifHz8h97e3i75oHwxquihnDZtWsq4ceOc7tk716ZOnRo8efLkqH379m06lz1XQpwv+fn5HsnJySOSkpL+OPGaM0N8u1dxzohjFd6RQAmOxZLEeWBUEOF30mraVPd9g65mtHT1z4P+zSLObHL9ps/g4O9YgsIhFUr37j12qfTAQQ5NfBKAsP89glv9+uDRB1a8gCd/Ou7ZvRuf7GTYtgBtcMdWUAJKYQwIcD4WIYCIun7kpsXT6bqBNO0SQXFBPsm/rWTpnDewlW2myBpP65QvKDN5kB7SggX3P8/gx27EPf6k3Q2EEEKI8+Lnn3/2ufvuu49IciouB86s4rviFJeWKqXeA1YDrYGlZyMwUb1aPgZ++19PV4dRvZI8WDwRAEvbgbDpu2MJqrZaSX3oIex5eXj37In/deXrYEUkglcoxoIDmEKaYU3LIGbjewBYG98CfIsxIAB1mn3MhDiV8Hp+JK85zOHdOTTvHo2nrx9+oa1A+aDtmSQHH+WDHo/xv8yFQAuyLG3YPvQ6wu68ldDRo8/qKohCCCFETXzzzTdOzx8V4mJ1VuaAaq1LgQ+Be85GeeISsXIa5B+GqCQsna8B/ulBTX/jTYo2bMAUGkrEM5P++dBvMECD3gC4hTh6iN337wJ3P2z1hwJgkvmn4l8Ir+tYPOnw7hzsds2GRSksensrJnfHVl+d2EqphycTwoeizbuxmTw4ENmZzNffYM/Y0dhLnF4UUgghxAUuPj6+VGu9/kIc3ivE5eZsL1J0RpPDxSUoYxf89prj535TsJRvNVO6Zw+F69eTPmsWKEXklBcwnThct0FfANw8cgAoyTFBxzFY8xzrAhiDJUEVZy4w0guzu5G8jGK+eP53fvtqF3arpmn3K3Dz8iJ7z3be6R9Kr0ahfG8JBGB7vR7ku5sp+eEnNg+/CmtmJgB2m51F/7eZFR8nu7JJQgghhBCXjLOSoCqlEoExgHxKEw4/Pg62Uki4HqJbYQoJweDpiS0nh4NjxoLdTtAdd+DVrt3Jz63bDQxm3AwHACjK94S292DLzADAFCgJqjhzBoMivI4vAGn78vDyd2PAfxPoeUsCLXr3ByDj10X83y2teeb+7tjcizFrXxb1aUu6D5i37uWP/p3J3bSGbasPs/P3o2z++SD5Wed9mzAhhBBCiEtOjRNUpdTuUxxZwO9AOE4skqSU8lBKzVFKXXMGcYsL2a6lkPwdWLyh15MAKKWO9aJa09Jwb9aMkNH/rfr5bj4Q2wmLn6PHNL8wECyeWNPLE1TpQRX/Ut0WIQDEtwvn+ifaULuJ43cqse9AjCYTO39fTWbqQRJjAhhwS2sA/POGsezKMHaHgXeWneSb7uCXLzYfK3P/1szz3xAhhBBCiEuMMz2o+4CUE469OBZFehFoqLVeUNPCtNZFwHWArxMxiAudrQy+f8Txc5cHwSf82CVLbCwAytOTqKkvoszmU5fToC9uvlYAdGYR2mbDmuFIUI1Bl+b2MuL8ado1mjtf7kKvWxvj5vnP76GXfwCNu/YErVk8eybbV68ivL4btRoFoOxmonyn8kbvm/m7HmQFd6a0yAQ4FlTcv0USVCGEEEKIf8uZVXy7nYP6/wRk74ZLybr/g/RkCKgD7UYdd8m7Wzfyli4l4umnsdSuXX05LW/GmLMf08rlWNMyKTtwAFuGY90CWSRJnA0Wj6r/+Ws1YAhbVy7nwJbNHNiyGZQiuFZdtD2B4h2xTLvvDj6xuBO6oy4A9XfOZ2f9IaRszUDbNcogq/wKIYQQQpyps71IkrMmAHcopbq5OA5xNhRmwrLnHD/3eRZMbsdd9hs4gPjf1+E3oP/py7J4Qp/JuMU3BqBk506sGY4eKmNQ4FkNW4jKAiOjuOmF6XQafjO1mjTHaDSSvm8XJTlfUVb0C7/P20nP+gOxG3zwtSZjzv0NU+F2SgtsbE2WXQCEEEIIIf6NGvegKqVizqQCrfW+ai6PBI4CS5RSycAuoOjkIvR1Z1K3OM/c/eHKKbB7BcT3q/IWZ/cvdatXj4JVqyjZsfPYEF+TDPEV51hgZDRtr76WtldfS1lJMeu/+5pfP/sIW/Eajmw/TMaBrthLd5JtXc3ROhFQ/B0WSwCrpnyP/yv3E+kX7eomCCGEEEJclJzpQd0L7DmDozrDgHhAAQ2B/uXnTjzExcBggIThcPXroM7OMEe3uPoAlOzahS29fIivLJIkziOzmzvthlzH0Meexs3TB7s1hdLc97EW/0qp1Y7ZYAOlKSv4Ds/C2iy9azAHslNcHbYQQogL2IIFC3yUUkkLFizwcUW9Jx4+Pj4tKt83Y8aMIKVU0unKGzduXOQ333xzXttQYd++faYePXrU9/Pza6GUSnr66adDz2V9jzzySHhEREQzk8mU1LBhw8bnsi5XSE5OtiilkmbMmHHsg/aMGTOCXnnllfP+wbvGPajA08AgoDmwGNiKI7FsBPQCNgLfOFO51trVQ4zFBc6tfnmCumMH1qwsAIyBMsRXnH+1m7Xglqkz+fDRiRRm76NW0yTaDr6K8HA/3ntwFHklmaRbDtBrvZUN1w9Gz5hDWK3mHNqZQ0wT+Z0VQgjxjw4dOhT89NNP2xITE08cOXhePPPMM/vbtWtXUPHYbDbrMynn5ZdfjrBarQwaNCjv7EVXM48++mjkunXrvF977bW9UVFRZXFxcSXnqq5ly5Z5vvDCC1F33333kaFDh2b5+fnZz1VdrhITE1P2008/bWvUqNGx1/HDDz8MttlsjBkzJuN8xuJMgroTiAEStdabKl9QSiUAS4CdWuuPzmJ84jJnqUhQt28Hux2Djw8GN7fTPEuIc8MnKJi7Z82kOL8AT79/vjAe/NgLfPjEBGylm9kaU4eme5JJG3YzK/tMISvXnR43N3Rh1EIIcWmKiopqdt1112W89NJLqTV9zowZM4Luv//+WK31+nMZ2+kEBgbae/bsWXC6+4qKipSHh8cZJY/VadKkSVFN6r+Q7dixwz0+Pr7o5ptvzj4b5VX3Wm/evNkDYPTo0UcbN25ceqoyrFYrWmvM1e1UcZ6VlJQos9msDYbq+wU9PDz0hfI74UwP5sPAzBOTUwCt9UbgNeB/ZyswIQCM3t7YAgLA7viiSlbwFa5mMBqOS04BwuKbU7flYAAO+tvZFGfkUERfsnLdAdi0tLqp+EIIIS50FUNev//+e+9evXrV8/T0TPT3929x0003xeTn5x83r2ns2LGRjRs3buTj49MiICAgoV27dg2WLFniVfmeqob4tmnTJj4pKSn+448/9mvUqFFji8XScsqUKSEAkyZNCq1bt24Td3f3lr6+vi2aNm3a6P333/c/L40/hYohwDNnzoyoGCo8bty4yIrrs2bNCoyPj2/s5ubWMiAgIOGqq66qk5KSclzmVlJSokaPHh0ZFRXVzGw2t4yKimo2evToyJKSklPOFasYirp27Vqf9evXe1fUnZycbElNTTXdcMMNtWNjY5t6eHgkhoeHNx84cGCdPXv2HFfvuHHjIpVSSevWrXPv1KlTnKenZ+KAAQPqVlVfmzZt4kePHh0L0KRJk2aV26mUSvrvf/8b9eijj4ZHRUU1c3NzS1q7dq1HTdsfFRXVbPDgwXVee+21wNjY2Kbu7u4tk5KS4jdt2uSWm5truOGGG2r7+/u3CAoKSrjzzjujy8rKqn1PKl6b559/PuSee+6JDg0Nbe7h4dEyIyPDuG/fPtOQIUNiQ0NDm1sslpYhISHNu3fvXv/gwYOmys+tGOLbpk2b+HXr1nlv2LDh2Gvcpk2b+Iq6tm3bZhk0aFCdgICABIvF0rJhw4aNz9bvpDM9qPWBrGquZwD1qitAKbUU0EAfrbW1/PHpaK11z5qHKS411ogIjBXDeyVBFReoNldfzd5Nf2Er28Vh79po9xiMdhtGbSXtALhv3M2PyX9h8fCg6013oM7SPG0hhKiprQ0bnXZO4fnQaNtWl/Ze/hu33XZbnYEDB2aNGjVq1+rVq71efvnliMLCQsO8efP2VtyTmppqvvfee4/ExMSU5efnGz766KOgvn37xq9atWpr27Ztqx3Su2fPHvfx48fHjB8/PrV+/fqlISEh1tdffz3wqaeeqjVmzJjUrl275hcWFho2btzokZGR4czn+OPcfvvtdYcOHWry8fGxde7cOeell146GBcXd6xncPTo0RmjR4+udljnTz/9tK1Xr14Nhw4dmjFy5Mg0gNjY2FKAqVOnBo8fP752//79s55++umDBw8eND/zzDNRXbt2jd+4ceOWiiGyw4YNi/3+++8D77vvvkNdunTJ/+WXX7ymT58esWfPHrdvv/22yrVsKoaijho1qrbRaNQzZ87cV3F++/btFjc3N/uTTz55ICwszLp//37zjBkzwjt16tRwx44dmz09PY/rIR0yZEj9G2+8Mf2hhx46fKoextdffz3lnXfeCXrttdfC33vvvV1RUVFlFe0EmDt3blCtWrVKJk+evN/b29seExNTVtP2A6xdu9Y7JSXFbdKkSQdKSkrUo48+Wmvo0KH1YmJiSurWrVvyzjvv7F6+fLn3jBkzIurVq1fyyCOPpJ3m7eWll16KaN68ecH06dNTbDab8vDwsA8ePLh+amqq21NPPXUgNja29NChQ+affvrJJz8/v8qGv/766yk33XRTHZvNpmbNmpUC4O/vbwPYuXOnuUOHDo2CgoKskydP3h8WFmb99NNPA2+99dZ6RqNx54033phzuhir48wv9n5guFLqda31cem7UsoM3FB+T3Xq4tjVXlV6fNaHLYhLizUyArctWwDpQRUXrvC6/ngG9KMw82vKrPuh8EeK3VcSWBRJvkWx49edx+5t0u0KQmJiXResEEJcZOx2OzabrcrzlXuVlFKYTP98vK0Ycln5foATe6KMRiOnGwIJ0L1795y33nrrAMCQIUNylVJ66tSpUX/99deh5s2blwDMnTv32Ep5VquVYcOG5cTFxTV94403gtu2bVvtZ+Xs7GzTggULtnTo0OFYIvvaa6+FNGjQoHDq1KmHKs5dd911Z5QABAQEWO+8884j3bp1y/Pz87OtX7/e85VXXono2LGjzx9//LElKirKWtOyKoaDRkZGllYeGmq1Wnnuueei2rRpk7dgwYLdFeebNGlS3Ldv3/iZM2cGT5gw4ei6devcFyxYEDh27NhDFcO0hwwZkms0GnnxxRcj16xZc7iqhL5iKKq3t7fNaDRSue6EhISSd95559hrbLVa6dGjR35cXFzzL774wu/E4cB33XXX0ccff/xode1MSkoqXrFiRQlA27ZtC+Pj408a4rtixYrt3t7e2pn2V5wvLCw0LlmyZEtQUJAN4PDhw+bHH3+8VmJiYkHF79rVV1+du3jxYr+vvvoqoCYJanBwcNmPP/64q/Lv9J9//un96KOPHhw5cmRmxbnbbrvtlJ2PSUlJxd7e3nabzcaJQ38fffTRSK01K1eu3BYeHm4DGDp0aG6HDh3MkyZNijqfCeorwKvAr0qpV4Hk8vMNgfuAROC/1RWgtY6t7rEQVbFGRBz7WVbwFRcqo8lAdMMI9vw1DHvpVmylP2MqLiRX7YIyACPupSUUW0wc2LoZ/7BarPl6N9GNAohtJlsnCSHOvYu553LhwoU+AwcObHDi+enTp0dMnz792AeF1q1b569du7biMyodOnSIX7dunfeJz7NYLMf1Jn/77bfbBwwYcNqFfoYPH37cB/qbb745a8qUKVGrVq3yqkhQ58+f7/Pcc89FJCcne+bk5BzbX2/nzp3upys/MjKytHJyWt6mgg8//DDklltuqXX11Vdn9+zZs8DHx+eMFunp2LFjUceOHQ9UPO7fv39+jx498rt169bohRdeCJ0xY0aN5/OeysaNG90zMzNN1113XWbl83369MmPjIwsXblypQ9wdMmSJT4At91223E9tbfffnvGiy++GPnTTz/5nK7HuSovvPBCyJw5c0L279/vVlRUdCxD27Zt20mv//Dhw7OdLf9EXbt2za1ITqHm7a84n5iYmF+RnAI0bty4uPz+3MrPr1evXvHGjRuPGyp+KldeeWX2iV+4NGvWrODVV18N11rTp0+fvFatWhXV5EuZqixfvtyve/fuOUFBQbbKX/b06tUrd9KkSdGZmZmGwMDAM15IqsYJqtZ6llLKE3gKmFPpkgKKgf9prWedaSBCnIqtUoIqQ3zFhaxW40D2bsrAM6A5g8dcx4aFn7B19S8oFYXR3I3QlA/ZZynk98/f5ej+2uz8PY0dvx/hluc6YDDKouZCCHEqHTt2LFixYsXWyueGDRtWv2fPnjkVw0sB/Pz8jutmnT179t7KSeL8+fP9X3755YgTy2rWrFlxTeKIjIw8rus1Ojq6DODgwYMWgFWrVnlec801cZ07d86dOXPm3qioqDKTyaTvuuuu2JKSktP+Qx8aGnrSJMN77703o7i4WL3//vshH374YajJZNJdu3bNmTlz5v6qevOc1alTp8LatWsXb9iwoUbJz+mkp6eb4OTXChw9e9nZ2UaAzMxMEziG5la+p1atWmXl140nPv90Jk+eHDphwoRad9xxx5F+/frlBgUFWW02m+rZs2fD4uLik17/E+s+E+Hh4ceVUdP2Vzjxd9ZisWiAwMBA64nna/I7BBAREXFS3V9++eXuRx55JHLmzJnhTzzxRK2QkJCym2++Oe2FF144ZDQ691JnZmaavvrqqyCLxVLlB/OjR4+aAgMDz/h306mx61rrqUqp/wP6ALE4ktPdwGKtdXXzU4U4Y8f1oEqCKi5gDdtHkJFaQHybcEJi/Olzz2j63DOa777cxt4fUzka0xpyV1CYU8qOdUdRSlGYW8qBbVnENJHfbSGEOJWAgAB7ly5dCiufM5vNOiIiouzE85UlJCQct/XIn3/+6QFQ3XOqk5qaasbRMQPAgQMHzABRUVGlAHPnzg0wmUz6+++/3+Xm5nasVy03N9fo6+t78hjlEyilTpr6ZjAYGD9+fPr48ePT09LSjPPnz/edMGFCrWuuuabuX3/9te1M2nEirfVZWxshODjYCnDo0KGTlrJNT083N2vWrAD+ScD2799vbtKkybH3af/+/WaAoKCgGg83rjBv3rzA9u3b582ePftYL/G2bdssp7rfYDD866mGJ75nNW3/uVTVexkVFWX94IMP9gH7Nm7c6DZ79uzgadOmRYaEhFgffvjh0w4brszf39/WunXrvP/973+Hq7peu3btf5X4O/2VvdY6W2s9V2v9gtb6ea31Z/8mOVVKxSmlXlNKrVNK7VRK7T7h2HWmZYtLg/bwwFSepEoPqriQWdxNdL+xIZFx/sedv6JffZQRtKElBqWwGuxoezaUOealbltd5b/vQgghLjCffvppQOXH77//foDBYKBTp04FAIWFhQaDwXBc4vPNN9/4HDp06JRJkjNCQkJsd955Z9bAgQMzd+zY4XE2yvz55589U1JS3Fu1auV04mQ2m3XlYbQACQkJxUFBQdbPP//8uNdq8eLFXqmpqZbOnTvnA/Tq1SsPHK9h5fvmzJkTCNCzZ898Z+MpKioymEym4xLGN95447zOo6lp+10pISGh5NVXXz3o6+trq9hCpyoWi8VeVc9z165dc7Zu3erZsmXLoi5duhSeePzbrZGcXv1LKdUNuAIIBaZprbcppbyB5sDfWusaT4pVSiUCPwNmHHNa6wJ/AwFAJI7e2dMtvCQuA56tW5H77QLc4+JcHYoQTrN4mPCLgew9Ckz1oWwHfmmLabp3E7+1m8SO9al0uyEei8c//yTv/jONtH15tB5QB4NBVvwVQogLwbJly/zuvvvu6L59++auXr3a86WXXoq8+uqrMyrmn1555ZU5c+bMCR02bFid2267LX3btm3u06ZNi6hq6G5NXX/99bW9vb1tHTp0KAgPDy/bunWr+7x584I6dep0bI5ixf6up5tLO2jQoDqxsbElSUlJhQEBAbb169d7zpgxIzw0NLT0oYceqnaxoKrUq1ev+KeffvL76quvcoOCgqwxMTFlsbGxZY888sjB8ePH1x48eHCdm266KWP//v2WyZMnR9WuXbvkvvvuSwdo1apV8YABAzKnTZsWabVaVadOnQp++eUXr1deeSViwIABmWcy/7RHjx45r7/+evgjjzwS3q5du4KffvrJd8GCBQGnf+bZYzKZqEn7z6eMjAxj165dG1x77bUZjRs3Ljabzfqrr77yz83NNZ4417Wy+Pj44g8++CBk9uzZAfHx8SV+fn62hISEkueffz61ffv2jdq1a9fw7rvvPlq3bt2SzMxM06ZNmzz27Nnj9vnnn+/9N/HWOEEtX6n3M2AQjqG9GvgE2AZYgW+BacCzTtQ/CcgHOgPZOCYM36+1XqqUGgG8DAxxojyXUEo9CtwCxAFDtNbzT7huAaYA/YFSIEVrfeX5jvNiFvnMM4Q+8ADmsDBXhyLEGQmop8jeozGYorGX7UBF5GDem45/9nay/Rvw5X0TGPrcOMyhoeSkFfHj239jK7MTEuND3RYhrg5fCCEEMGfOnD1Tp04Nu/HGG+uZzWY9fPjw9Ndff/1YZ8rQoUNzn3nmmf2zZs0KW7RoUUD9+vWL3nrrrT3PPvtsZHXlVqdDhw75H3zwQfC8efOC8vPzjSEhIWVDhgzJfPHFFw9W3FNQUGCAquc9VtakSZOiefPmBb7zzjuhRUVFhuDgYGvfvn2zn3/++dSIiAinh9ROnz49ZezYsTHDhw+vX1paqipW5H3wwQfTPT097dOnTw+/4YYb6nt6etq7deuWM3369AOVt1j54osv9o4fP77kk08+CZ4+fXpEaGho2ahRow6/+OKLh6qr91ReeOGF1OzsbOObb74ZNnPmTEObNm3yfvjhh+2NGjVqdiblnamatv988fT0tDdv3rzw/fffD0lNTbUYDAZiY2OLX3/99T0jRozIPtXzJk6ceGjnzp1uY8aMiS0sLDRULEIWFxdXumbNmi2PPvpo5KRJk6KysrJM/v7+1ri4uKIRI0ZUuz1RTajKS29Xe6NSTwOPlR+LgPVAL6310vLrbwHNtNbta1y5UpnADK31k0qpQCAd6K21/qn8+ptAba11XyfadN4ppdriiP1t4JUqEtSpgCdwn9barpSK0Fqf0V+8CvHx8To5Ofn0N14Cli9fTrdu3VwdxnlzObX3cmrrsmXLyPnTn8zUvWTtexvfkFCG3DSYVTO/5ID3Lfhnbafp1leJfWUmK7cEkrLZ8e97vZah9L2rqYujd87l9L7C5dXey6mtSqn1WutWro7jTKxfvz4xPj7+Q29vb6d7oETVKnooN23atLlp06Ylp3/G+TVw4MA6ubm5xhUrVuw8/d1CuF5+fr5HcnLyiKSkpD9OvObMHNQbgXe01s8D+6q4vg3HEF1nuPPPEN6Kv+w+la7/DtQ44QVQSkUrpWYqpX5TShUqpbRSKvYU99ZSSn2hlMpRSuUqpb5USsU42Qa01mu01lXOlS1f+fgu4BGttb38/n+VnAohLj5KKa4am8gtzw3EzcuL3LSjmOu2p9czDwKlZAc0oMTgx7qn3yJlcwZmdyMo2PtXOiVFTn+pLYQQ4jKydu1anwkTJsjnS3FJcCZBjQZWV3M9H/Bzsv6D5eWitS4AsnDsp1qhHuU7CDqhPnBteVkrT3VTeeK4FMc+rrcAN+EYortMKXVWltmuFE8W8Ej5QlC/KqUGn8XyhRAXEaPJRFR8YwAObPsbr9hmxLUIxlq8gZXxASRHO67FdvAnqoE/Nqud3X84PS1ICCHEZeTIkSN/XXHFFed8dVghzgdnEtQMHAsXnUozHAmnM34FelZ6vAB4QCn1uFJqIvBfYJWTZf6stQ4rn+P5eTX33Ymjx/cqrfV8rfXXOObX1gburrhJKbVBKZV+iqNWDeIxAzHALq11a+A24P+UUvWcbJcQ4hIR3cgxZPfA1s0ARDS0YC1yfJ9WXLYO99w/yHznZrJDHD2nyWuOuCZQIYQQAIwePTpDa73+QhzeK8SlxpkE9QfgDqWU/4kXlFJNcCRe3zlZ/2vAKqWUe/njh3Gs3PsUMBFIAcY6U2DFMNoaGASs1lofG6uvtd4D/AIMrnSupdY6+BRHTVYYTsGxoNQH5eVtA/7k+J7iGlFKra84nH2uEOLCcSxB3bIZu83GXz++C9hAeQF2CkqW0miflYzF94ERDm7PIj9LPhMJIYQQ4tLnzDYzE3GsQrsRmI8j6bpeKXUjcD2OYayTnalca70WWFvp8WGlVHMcvbE2YJvW+rSbGp+hJsDXVZz/G7jmbFWitU5XSi0C+gLfKKUigKbApn9TbllZGcuXLz8LEV749u7de9m0FS6v9l6ubdU2GwaTmaxDB/no+ac5ums7Ros3Jo+bsFu/oqzgMBtjQum35jBrW/5BgW8iP3yyiuDGRtc2ooYup/cVLq/2Xk5tFUII4Ro1TlC11vuVUu2BmcC9OLaauR1HoroYGKm1/tfj0LRjWeG//m05NRCII6k+USaOfVhrTCk1AbgHCAGaKqVeBVpprQ+X3zISeFspNRmwAw9qrZ1egldrnVTxc3x8vL5cVlK8nFaNhMurvZdzWzNWLyflrz84+pdjQMTAMQ+gjLEEhCfx0aP3kwYkR/pRd99aNjVNpGDtYXoGGPC/5hqUyektrM+ry+l9hcurvZdTW4UQQriGM0N80Vrv1lr3B4KAtjhW2A3TWvctHx57RpRSVyilXlVKfVd+vKqUuuJMy3NCVXvsKKcL0foZrXW01tqtfOhvdKXkFK31Xq11T611M611gtb6o38VtRDiohfdsMmxn5t27029pNbUbRFCQHg4fUeNA2BPaAjr43dhsBaS7x7Bzhdns2fIUApWr3FV2EIIIYQQ51SNElSllIdSyqaUehxAa52jtV5Xvr1K+plWXl7ufBzzW0fhWDCpZ/nPPyilvlVKeZxp+aeRhaMX9UQBVN2zKoQQZ01MsxYAeAcF0+3m24+7Vr9VW9oNuQ6tNboggizPxQBsib+ajSTx1SsbmXPPN2xfLtvdCSGEEOLSUqNxYlrrIqVUJnDGyegpPIdjsaJZwLSKXlilVB3gQRxDY58DxpzlesEx17RJFecbA1vOQX1CCHFMZIOGDHrwMUJi6uDmefLOVh2uHYHNZmPd11/gdnQ3Ns/t5Ps1Ib/SZl6/vvcbcR1iUBbLeYxcCCGEEOLccWaI73c4Fvo5m64H5mqt76s8RFhrvUdrfS+ObWKuP8t1VvgGaKeUqltxQikVC3QsvyaEEOdUXOv2+IeFV3lNKUXn62+hzeBhoDVlBd8RzBeEBb3L0YhZGGwlFLhFsfCR/57nqIUQQgghzh1nEtSJQKxS6l2lVBulVJBSyvPEw8n6vYAV1VxfBjhbJkqpYUqpYUDFokL9ys91rXTbbGAv8LVSarBSahCOVX33A286W6cQQpxtSik6VSSpaA5k7cN6dB//sy7Dw+1PAEybzHw+52GXximEEOJkSqmkcePGRbqi3qqOX3/99di0ueTkZItSKmnBggU+/7a+qKioZkOHDo39t+WcTQsWLPAZN25cpM12rjYDcc6CBQt8Tny9n3766dD33nvP34VhXbCcWQpyD45FhZoBN53iHu1kmb8DLaq53qL8Hmd9fsLjWeV/rgC6AWitC5RSPYCXcexRqoAlwBitdf4Z1CmEEGddRZLqFRDIyo/e5WCuN28UtKdV8Ao20pYjIS1pOONF3okN4T89HnR1uEIIIcr99NNP22JjY0tdUffQoUMzRo4cmVb5XLNmzS6bDbWXLl3q8/LLL0e88MILqUaj67do69ChQ8FPP/20LTExsaji3JtvvhnWqlWr/FtuuSXbhaFdkJxJJt+n6lVv/40xwGKl1HZglta6GEAp5Q7cBwwBejtbqNa6Rivxaq33AUOdLV8IIc4npRQt+w2iToskfnh9OqnJW1hzxITR/CU5Xl0wEYjfs2/zcXAoNzS/2dXhCiHEeREVFdXsuuuuy3jppZdSXR1LVXr27FlwunuKioqUh4fH2f58TWRkZGlN6hf/Tk3fv8DAQLu8HzV3yiG+SqmYyivoaq1v1Vr/53SHk/W/BeQDLwKZSqltSqltQAbwAlAAvKWUWlvpkP0VhBCXpYCIKK578jm633InJosbtrK9lOa+z/q60dQ+asJrzPMs/f3EASRCCCFOp2LI6/PPPx9yxx13RAcGBiZ4eHgkdu/evX5ycvJxK9G99dZbAe3atWsQEBCQ4OnpmdioUaPGM2fODDqxzBOH+I4bNy5SKZW0bt06906dOsV5enomDhgwoC7AvHnzfBMTExv6+Pi08PT0TIyNjW364IMPRpz7lp/ed999592hQ4c4Hx+fFh4eHonx8fGNX3755eDqnrNs2TLPDh06NPD09Ez08PBIbN++fYNly5YdN21vxYoVnh06dIjz9/dv4eHhkRgdHd1sxIgRMZXv2bZtm2XQoEF1AgICEiwWS8uGDRs2fv/99/2rq3vcuHGRL7/8cgSAxWI5NsS54npKSor56quvjq0os0GDBo1nzZpV1c4ex6kYpvvee+/5Dx8+vHZAQEBCaGhoAsBff/3ldsUVV9QLDAxMcHNzaxkREdGsX79+dcvKyo57bsUQ36ioqGapqamWb775JrAivsrDpH/77TePHj161Pf19W3h7u7esmXLlg1/+OEH79PFeKmorgd1D46hvB8DKKWWApO11kvOYv2hOHpl95U/div/82ile0LOYn1CCHFRMxiMtLxyMPEdurDozXfYs2E5ueYCfo6vRYcdB+GuJ9g4uYSEfiNcHaoQ4gLz2j1Lk05/17l37xs91rs6hlN55ZVXIho3blw4a9asvUeOHDE988wzUX369GmQnJz8t5ubmwbYvXu321VXXZXVoEGDwwaDQS9fvtxn7NixtYuKigwPPfRQ2unqGDJkSP0bb7wx/aGHHjpsMBjYsmWL5frrr6/ft2/frMceeyzVYrHo5ORkt927d7udrqxTef/990PfeOONcKPRqBMSEgqefPLJ1L59+x6bwhYfH1+qtT7t+/Dhhx/633rrrfUSExPzp02blhIaGmrdtGmTR0pKyimXj1+zZo1Hv379GtarV6/otdde26uU0lOnTo3o169fw2XLlm1t3759UU5OjmHQoEENmjdvXjBr1qw9vr6+9t27d1t+++23Y0nYzp07zR06dGgUFBRknTx58v6wsDDrp59+GnjrrbfWMxqNO2+88cacquq/99570w4ePGj+7LPPghctWrSt8hDf3NxcQ9euXeNzcnKMjz322MGYmJjSDz/8MOjee++tU1hYaHjwwQdPu2PJ+PHjY7p3754ze/bsPUVFRQaAQYMGxfn4+NheeumllJCQEOv+/fst33//vZ/NZlNms/mkHtbPPvts51VXXRXXsGHDoieffDIVIDw83AqwatUqzyuuuCK+cePGhdOnT0/x9PS0v/nmmyGDBg1qsGTJkm2dO3cuPF2MF7vqEtQyoPIvXzfg/85m5Vrr2LNZnhBCXC68/AMYNPZ+Zo+tS3H2T9ite9lUJ4COW49gHzeZHbsPE3evzEkVQlwa7HY7VS14Y7fbqeilAseUCJPJmRlsx/Py8rItXrx4Z0VS06hRo+I+ffo0nDVrVtDYsWPTAZ5//vnDFffbbDb69++fd/jwYfPbb78dUpME9a677jr6+OOPH+uMeeeddwLKysrUu+++mxIYGGgvP513pm0YPHhwZv/+/bNr1apVtnv3bsv06dPDBwwY0GD+/Pk7BgwYUONy7XY7Dz/8cK2GDRsWrl69OrniNbnqqquqLWPixIkRZrPZvmLFiu3BwcE2gEGDBuXWqVOn+cSJEyN//PHHXRs3bnTPzc01Tp069UDbtm2PzcscPXp0RsXPjz76aKTWmpUrV24LDw+3AQwdOjS3Q4cO5kmTJkWdKkGtV69eWVRUVBlA9+7dC8xm87Frr776alBKSorbt99+u73itbj22mtzO3ToYH722WejxowZk36635+EhISCuXPnplQ8PnTokCklJcXtww8/PC5pvueeezJPVUbHjh2LLBaLDgwMtJ449Hf8+PHRERERpb/88st2d3d3Xd7unAYNGjR56qmnIn766add1QZ4CajuHdgJ3KSU2gBUvNhBSqmYap5TMa9TCCHEOWayGKmXWJ/taw2U5s4mx+LFylYWOv9einXm22wpyKPxQ0+5OkwhxAXiQu65PJ2FCxf6DBw4sMGJ56dPnx4x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Bg4cmDVq1Khdq1ev9nr55ZcjCgsLDfPmzdtbcU9qaqr53nvvPRITE1OWn59v+Oijj4L69u0bv2rVqq1t27atdkjvnj173MePHx8zfvz41Pr165eGhIRYX3/99cCnnnqq1pgxY1K7du2aX1hYaNi4caNHRkaGM5/jj3P77bfXHTp0qMnHx8fWuXPnnJdeeulgXFxcacX10aNHZ4wePfq0w1/vuuuu6NmzZ4dde+216RMmTEg1GAz89ttvXnv27LEAVfYITp06NXj8+PG1+/fvn/X0008fPHjwoPmZZ56J6tq1a/zGjRu3+Pn52RctWuQ9atSoOrfeeuvR5557br/dbldbtmxxz87OPtbmTz/91G/EiBH1u3btmv3mm2/uAZg2bVp4z549G27YsOHv+vXrl1VV/+uvv55y00031bHZbGrWrFkpAP7+/jaANWvWePTr169hvXr1il577bW9Sik9derUiH79+jVctmzZ1vbt2592SPaQIUPq33jjjekPPfTQYYPBwJYtWyzXX399/b59+2Y99thjqRaLRScnJ7vt3r3brarnx8TElL333nu7brnllnr33nvv4auvvjoboFGjRiUAU6ZMCXn44Ydjhg0blvHoo48eys3NNTz33HOR3bp1i9+8efPfAQEBzuZjFxxnfrHXAzcqpV7UWh/35iilPIAbyu9xRjDwbTXXvwY6O1mmEEIIJ0U2aMiGhV+Tun0r7Yddz7Z2FnYvXUqJzmJT7do0X7mS3IUL8evf39WhCiEuQ3a7HZvNVuX5srJ/8hClFCbTPx9vrVYrWuvj7geOew6A0WjEYDj9wMLu3bvnvPXWWwcAhgwZkluewET99ddfh5o3b14CMHfu3JTK9Q8bNiwnLi6u6RtvvBHctm3b/dWVn52dbVqwYMGWDh06HPus/dprr4U0aNCgcOrUqYcqzl133XU5VZdQvYCAAOudd955pFu3bnl+fn629evXe77yyisRHTt29Pnjjz+2REVFWWta1ubNm93efvvtsNtvv/3I//3f/x2oOD98+PBTxma1Wnnuueei2rRpk7dgwYLdFeebNGlS3Ldv3/iZM2cGT5gw4egvv/zi5ePjY5szZ86x12vIkCG5lct66KGHarVu3TpvyZIluyrOXXnllbn16tVr9uyzz4ZXfm5lSUlJxd7e3nabzcaJw2onTpwYYTab7StWrNge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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Get the pairs where R1 is far enough from site of restriction, but not too far\n", "df_subset = df.query(\"(strand1=='+' and dist_rfrag1_left>5 and dist_rfrag1_left<=250)\")\n", "n_distant = len(df_subset)\n", "cis_scalings_distant, trans_levels_distant = scaling.compute_scaling(\n", " df_subset,\n", " regions=hg38_arms,\n", " chromsizes=hg38_arms,\n", " dist_range=(10, 1e9), \n", " n_dist_bins=128,\n", " chunksize=int(1e7),\n", " )\n", "plot(cis_scalings_distant, n_distant, label=\"pairs, 5' distant from rsite\")\n", "\n", "\n", "# Get the pairs where R1 is too far enough from site of restriction\n", "df_subset = df.query(\"(strand1=='+' and dist_rfrag1_left>550)\")\n", "n_toodistant = len(df_subset)\n", "cis_scalings_toodistant, trans_levels_toodistant = scaling.compute_scaling(\n", " df_subset,\n", " regions=hg38_arms,\n", " chromsizes=hg38_arms,\n", " dist_range=(10, 1e9), \n", " n_dist_bins=128,\n", " chunksize=int(1e7),\n", " )\n", "plot(cis_scalings_toodistant, n_toodistant, label=\"pairs, 5' too far from rsite\")\n", "\n", "\n", "# Get the pairs where R1 is very close to the site of restriction\n", "df_subset = df.query(\"(strand1=='+' and dist_rfrag1_left<5)\")\n", "n_tooclose = len(df_subset)\n", "cis_scalings_tooclose, trans_levels_tooclose = scaling.compute_scaling(\n", " df_subset,\n", " regions=hg38_arms,\n", " chromsizes=hg38_arms,\n", " dist_range=(10, 1e9), \n", " n_dist_bins=128,\n", " chunksize=int(1e7),\n", " )\n", "plot(cis_scalings_tooclose, n_tooclose, label=\"pairs, 5' close to rsite\")\n", "# Try another replicate of replicate, maybe the last one " ] }, { "cell_type": "markdown", "id": "60967f0b-7f50-429f-8865-046d3fd0d878", "metadata": {}, "source": [ "#### How many pairs we take if not strictly filtering by dangling ends and self-circles? " ] }, { "cell_type": "code", "execution_count": 14, "id": "bfb77fa0-85ee-4573-b745-57353b74f646", "metadata": {}, "outputs": [], "source": [ "df.loc[:, \"type_rfrag\"] = \"Regular pair\"\n", "\n", "mask_neighboring_rfrags = (np.abs(df.rfrag1-df.rfrag2)<=1)\n", "\n", "mask_DE = (df.strand1==\"+\") & (df.strand2==\"-\") & mask_neighboring_rfrags\n", "df.loc[mask_DE, \"type_rfrag\"] = \"DanglingEnd\"\n", "\n", "mask_SS = (df.strand1==\"-\") & (df.strand2==\"+\") & mask_neighboring_rfrags\n", "df.loc[mask_SS, \"type_rfrag\"] = \"SelfCircle\"\n", "\n", "mask_Err = (df.strand1==df.strand2) & mask_neighboring_rfrags\n", "df.loc[mask_Err, \"type_rfrag\"] = \"Mirror\"" ] }, { "cell_type": "code", "execution_count": 15, "id": "c6913bb4-f861-4098-a193-94a134df4ea5", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "type_rfrag\n", "DanglingEnd 76902\n", "Mirror 3214\n", "Regular pair 1132002\n", "SelfCircle 3036\n", "Name: readID, dtype: int64" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values(\"type_rfrag\").groupby(\"type_rfrag\").count()['readID']" ] }, { "cell_type": "code", "execution_count": 16, "id": "c2e77360-e8ee-43c6-8322-b9990aef19bc", "metadata": {}, "outputs": [ { "data": { "image/png": "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RM9Je/bsYffu3ezZs8fpUKQOie7an/Yf/sbirq0JdsNZX+Tw+s3DWLt9odOhiYhIA+BLEL/55pvok046qUNkZGTvRo0a9br44otbZ2Vl7ZeMjRs3Lrlbt25dY2JiesXHx/ccMGBA56lTp0aVPqesqZv9+/dP6du3b8q7774b17Vr126hoaF9Hn300USABx54oGn79u27h4eH94mNje2VmpradeLEiY0O9fP40zBdagFr7XhgfEpKSqCb19cYX8XNMkf0mviappeaurnkU3AXQocTIabZwe8pq/Jm6ambUuNee+01srKyiI6O5pZbbnE6HKlDkpvE0vX5D/nhrps58Y/fOP3nIr656TwG/Otx+qac6nR4IiLSAFxxxRXtRowYsee6665bM3PmzKinnnqqeU5OjmvSpElpvnO2bNkScv31129v3bp1YVZWluudd95pPHz48JQZM2YsO+qooyqcqrlu3brw2267rfVtt922pWPHjgWJiYlF//vf/xLuv//+VjfddNOW448/PisnJ8e1YMGCiF27dh1yvqZET2pchSN6MckQHOEprJK7FyIalZq2eV7ZFyxdedNHUzdF6qzUFnG0Hf8yHz3wMP0+fYcT51nm3HoL629dzVnH3+h0eCIitdoRbx7h+JRFgEWXLvK7jLLb7aa4uLjM/YWFhSWvjTEEB/+VxhQVFWFLVV93uz0zJUu/ByAoKAiXq/IJjSeccELG+PHjNwGcddZZ+4wx9vHHH2+xcOHCrT169MgH+OCDD0rWDBUVFTF69OiMTp06pb700ktNjjrqqIP7fpWyd+/e4C+//HLpwIEDSxLCF154IbFz5845jz/+eMmahXPPPfewpvBVeepmdTHGBBljrjbGfGmMWeLdvvTuUyJaD8WFxdEkosn+rRV8XK6/1untXgO718HGmRASCV1OK+eCvhG9DX/t27fJe0yJnkhdFB0WzOUP3sPeux8gLwz6rQLzwP/4/JN7nQ5NRESqyddffx0TGhrat/S2ZcuW0GeeeaZ56X0DBw5MKf2+gQMHppQ+Pm7cuLYAB17r66+/rlL1y/POO2+/tSeXXHLJHrfbzYwZM0qmZk6ePDnmqKOO6tyoUaNeISEhfUNDQ/uuX78+bPXq1eGVXT85ObmgdJIHcOSRR2YvX7488tJLL201efLkmMzMzMPO0xxNpIwxCcB3QB+gAPBl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2v3CtDT7s83sFsZr2xYz9M1xZOU4NSuVIzHBdndIEYljKvREREREYkCraq2om1SXjTs3MnfrAg5o/yMJyVt5tVdTEqtXh8REVrYsx7LkJGrveI0mNSpy47Ftgo4tIgFJCjqAiMSf2rVrU7FiRSpVqhR0FBGRuGFmdKrUic82fca7C97lp+1TAVi8/p/sfPxoWiZl0GX1W/yw5iPW1viJh45uR8Vy+lVPpKzSd7+IFLtzzz036AgiInGpU8VQoTd28VgA6iS3Y+HWVjz1yw4ePaMjH05YRcVqHzK3QiKVNrwHXBxsYBEJjG7dFBEREYkR9ZPr06xqsz9f33bo1ZRLTOSzeau4dvT3/Lomh322NQXglXkvB5RSRKKBCr0YownTRUREyi4z45jmxwBweMPD6dH8YPoe2Ah3+PiHlSQYDDzidhLd+a9vZtXy6QEnFpGgqNCLMZowXUREpGw7v/35XH/g9Qw9bCgAFx/Rgl0Da154RAv+sf8h/CO5FllmvDH1/gCTikiQ9IyeiBS7MWPGsH37dipUqECfPn2CjiMiElcqJFXg3Hb/exa6ac1K3HLcvsxfuYWr/9EagHM7XMLYmfcwK30xnpODJehv+yJljQo9ESl2CxcuJD09ncqVKwcdRUSkTLjg8BZ/eb1/uzN4OSeTju3PUpEnUkap0BMRERGJN2YcsP85QacQkQDpTzwiIiIiIiJxRoWeiIiIiIhInFGhJyIiIiIiEmdU6ImIiIiIiMQZFXoiIiIiIiJxRoWeiIiIiIhInFGhJyIiIiIiEmc0j56IFLu0tDR27NhB+fLlg44iIiIiUiap0IsxZnYRcFHdunWDjiKyWyeccELQEURERETKNN26GWPcfYS7H5iamhp0FBERERERiVIq9EREREREROKMCj0REREREZE4o2f0RKTYPf/882zdupVKlSoxaNCgoOOIiIiIlDkq9ESk2G3cuJH09HQyMzODjiIiIiJSJunWTRERERERkTijQk9ERERERCTOqNATERERERGJMyr0RERERERE4owKPRERERERkTijQk9ERERERCTOqNATERERERGJMyr0RERERERE4oy5e9AZJEJmNhPYH/i+BA5fC/ijBPYpqM3utuW3Pu+63b3eN/x6fiG59kS89BFEVz8VtX2k/bQn66K1j4q6T3F8LamPirZeP5MKX68+Kny9+qjw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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Full scaling\n", "\n", "n = len(df)\n", "cis_scalings, trans_levels = scaling.compute_scaling(\n", " df,\n", " regions=hg38_arms,\n", " chromsizes=hg38_arms,\n", " dist_range=(10, 1e9), \n", " n_dist_bins=128,\n", " chunksize=int(1e7),\n", " )\n", "plot(cis_scalings, n, label=\"pairs\")\n", "\n", "# The point where the scalings by distance become balanced:\n", "plt.axvline(2e3, ls='--', c='gray', label='Balancing point')\n", "\n", "plt.savefig(\"./oriented_scalings.pdf\")" ] }, { "cell_type": "code", "execution_count": 17, "id": "a506a74c-230f-4219-9273-99b6f04e211d", "metadata": {}, "outputs": [], "source": [ "df.loc[:, \"type_bydist\"] = \"Regular pair\"\n", "\n", "mask_ondiagonal = (np.abs(df.pos2-df.pos1)<=2e3)\n", "\n", "mask_DE = (df.strand1==\"+\") & (df.strand2==\"-\") & mask_ondiagonal\n", "df.loc[mask_DE, \"type_bydist\"] = \"DanglingEnd\"\n", "\n", "mask_SS = (df.strand1==\"-\") & (df.strand2==\"+\") & mask_ondiagonal\n", "df.loc[mask_SS, \"type_bydist\"] = \"SelfCircle\"\n", "\n", "mask_Err = (df.strand1==df.strand2) & mask_ondiagonal\n", "df.loc[mask_Err, \"type_bydist\"] = \"Mirror\"" ] }, { "cell_type": "code", "execution_count": 18, "id": "255bda45-6a64-4795-a964-546e55d67145", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "type_bydist\n", "DanglingEnd 135381\n", "Mirror 18383\n", "Regular pair 1053213\n", "SelfCircle 8177\n", "Name: readID, dtype: int64" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values(\"type_bydist\").groupby(\"type_bydist\").count()['readID']" ] }, { "cell_type": "code", "execution_count": 19, "id": "b628bdfb-abbf-45df-8f33-2056dc96f19f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
readID
type_bydistDanglingEndMirrorRegular pairSelfCircle
type_rfrag
DanglingEnd76898040
Mirror03176380
Regular pair584831520710529945318
SelfCircle001772859
\n", "
" ], "text/plain": [ " readID \n", "type_bydist DanglingEnd Mirror Regular pair SelfCircle\n", "type_rfrag \n", "DanglingEnd 76898 0 4 0\n", "Mirror 0 3176 38 0\n", "Regular pair 58483 15207 1052994 5318\n", "SelfCircle 0 0 177 2859" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values([\"type_rfrag\", \"type_bydist\"])\\\n", " .groupby([\"type_rfrag\", \"type_bydist\"])\\\n", " .count()[['readID']]\\\n", " .reset_index()\\\n", " .pivot(columns=\"type_bydist\", index=\"type_rfrag\")\\\n", " .fillna(0).astype(int)" ] }, { "cell_type": "markdown", "id": "23a56c6f-c2d1-48e4-9b2e-860622af5a3f", "metadata": {}, "source": [ "False Positives are in 3rd row, False Negatives are in 3rd column. Filtering by distance is, thus, nearly as effective as filtering by restriction fragment, but removes additional pairs that can be potential undercut by restriction enzyme.\n", "\n", "Removing all contacts closer than 2 Kb will remove Hi-C artifacts." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.10", "language": "python", "name": "python310" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.4" } }, "nbformat": 4, "nbformat_minor": 5 } pairtools-1.1.3/doc/examples/pairtools_walkthrough.ipynb000066400000000000000000004632711474715105500236370ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "id": "112fe2d5-aaed-4eb1-b3f5-2f5889a9c89f", "metadata": { "tags": [] }, "source": [ "# Pairtools walkthrough\n", "\n", "Welcome to the pairtools walkthrough. \n", "\n", "Pairtools is a tool for extraction of pairwise contacts out of sequencing chromosomes conformation capture data, such as Hi-C, Micro-C or MC-3C.\n", "Pairtools is used for obtaining .cool files by [distiller](https://github.com/open2c/distiller-nf/blob/master/distiller.nf), and has many more applications (see single-cell walkthrough or phasing walkthrough). \n", "\n", "Here, we will cover the basic steps from raw reads to .cool file with binned contacts.\n", "\n", "Outline:\n", "\n", "- [Download raw data](#Download-raw-data)\n", "\n", "- [Install reference genome](#Install-reference-genome)\n", "\n", "- [Map data with bwa mem](#Map-data-with-bwa-mem)\n", "\n", "- [Extract contacts](#Contacts-extraction)\n", "\n", "- [MultiQC]( #MultiQC )\n", "\n", "- [Load pairs to cooler](#Load-pairs-to-cooler)\n", "\n", "- [Visualize cooler](#Visualize-cooler)" ] }, { "cell_type": "markdown", "id": "bd264406-be74-4060-9798-e18040c44889", "metadata": {}, "source": [ "### Download raw data\n", "\n", "\"Raw\" data, or .fastq files are generated by sequencing facilities or can be taken from public databases, such as SRA. We will take a sample from Rao et at al. 2017, human datasets.\n", "To reduce computateion time, take 5 mln reads instead of full sample:" ] }, { "cell_type": "code", "execution_count": null, "id": "f4e310c0-2d16-4e7d-87d7-44feec8e6256", "metadata": {}, "outputs": [], "source": [ "! fastq-dump SRR13849430 --gzip --split-spot --split-3 --minSpotId 0 --maxSpotId 5000000" ] }, { "cell_type": "code", "execution_count": null, "id": "571e94fb-3dec-4042-9e21-6c39802ed8df", "metadata": {}, "outputs": [], "source": [ "! ls SRR13849430*.fastq.gz" ] }, { "cell_type": "code", "execution_count": 1, "id": "e9fb044d-1ba0-48c7-b40a-99d033518e43", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "@SRR13849430.1 1 length=150\n", "NTCTCAGCCTTTATAAGATAGAAGAGAGTTGGGACCTTGCTCTAAATTCTGCTTTAGCAAGGGACTTTTGTACCTGCTTTCTTCCTTTATCCAGATCTAAAAATAGTTTATATGCTGACAACTCCCTGATGTTATTCTTTGTAGTATTTG\n", "+SRR13849430.1 1 length=150\n", "#AAFFJJJJJJJJJJJAJAJJJJFJJJAFFFFFFA7A-FJ7JJJ-AJAJJF-<-JJFFJ7FJJF7FJJFJJ test.bam" ] }, { "cell_type": "markdown", "id": "89f9d829-3f79-49b4-b74d-8bca732b8a44", "metadata": {}, "source": [ "After mapping, you have .sam/.bam alignment file, which cannot be interpreted as pairs directly. You need to extract contacts from it:" ] }, { "cell_type": "code", "execution_count": 3, "id": "955bcafa-e521-4627-8c8b-94e05e46e6b8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SRR13849430.1\t121\tchr12\t78795720\t60\t53S97M\t=\t78795720\t0\tCAAATACTACAAAGAATAACATCAGGGAGTTGTCAGCATATAAACTATTTTTAGATCTGGATAAAGGAAGAAAGCAGGTACAAAAGTCCCTTGCTAAAGCAGAATTTAGAGCAAGGTCCCAACTCTCTTCTATCTTATAAAGGCTGAGAN\t-7-7---A------7--77--))))7--F-A)7F( pairtools split \\\n", " --output-pairs test.nodups.pairs.gz \\\n", " --output-sam test.nodups.bam \\\n", " ) \\\n", " --output-unmapped \\\n", " >( pairtools split \\\n", " --output-pairs test.unmapped.pairs.gz \\\n", " --output-sam test.unmapped.bam \\\n", " ) \\\n", " --output-dups \\\n", " >( pairtools split \\\n", " --output-pairs test.dups.pairs.gz \\\n", " --output-sam test.dups.bam \\\n", " ) \\\n", " --output-stats test.dedup.stats \\\n", " test.pairs.gz" ] }, { "cell_type": "code", "execution_count": 7, "id": "d9aaceeb-1a88-4c24-9fc2-3f44069715a1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SRR13849430.513\tchr20\t23502312\tchr20\t23063544\t+\t+\tRU\t60\t60\n", "SRR13849430.1442\tchr7\t57224960\tchrX\t82818236\t+\t+\tUU\t60\t30\n", "SRR13849430.2378\tchr5\t115925933\tchr21\t24124840\t+\t+\tUU\t60\t50\n", "SRR13849430.2547\tchr1\t52097837\tchr12\t1888807\t-\t-\tUU\t60\t60\n", "SRR13849430.3015\tchr17\t74750879\tchr11\t117356318\t+\t-\tUR\t60\t60\n", "SRR13849430.3027\tchr15\t34977762\tchr15\t31897447\t-\t+\tUR\t11\t60\n", "SRR13849430.3406\tchr11\t1171960\tchr9\t121265592\t+\t-\tUU\t60\t60\n", "SRR13849430.3988\tchr16\t86824176\tchr13\t104521019\t-\t+\tUU\t60\t17\n", "SRR13849430.4030\tchr17\t73189645\tchr4\t49092470\t-\t+\tUU\t60\t31\n", "SRR13849430.4316\tchr8\t124329308\tchr8\t124336541\t-\t-\tUU\t60\t60\n" ] } ], "source": [ "%%bash\n", "# Unique pairs:\n", "gzip -dc test.nodups.pairs.gz | grep -v \"#\" | head -n 10" ] }, { "cell_type": "code", "execution_count": 8, "id": "ca3e27a7-7905-46b2-8ad4-245c28f01102", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SRR13849430.60371\tchr2\t44507613\tchr7\t116276932\t-\t+\tDD\t60\t57\n", "SRR13849430.67567\tchr5\t62425895\tchr5\t62425612\t-\t+\tDD\t60\t60\n", "SRR13849430.97623\tchr3\t162233323\tchr3\t162154449\t-\t+\tDD\t60\t52\n", "SRR13849430.108366\tchr8\t48691403\tchr8\t48872239\t-\t-\tDD\t60\t60\n", "SRR13849430.138622\tchr16\t8435050\tchr16\t6032751\t+\t-\tDD\t60\t60\n", "SRR13849430.146482\tchr14\t86385083\tchr2\t119648648\t+\t+\tDD\t60\t60\n", "SRR13849430.148232\tchrX\t21885792\tchrX\t21887418\t+\t-\tDD\t60\t60\n", "SRR13849430.149771\tchr16\t6646543\tchr16\t6648097\t-\t-\tDD\t60\t60\n", "SRR13849430.156983\tchr4\t55704089\tchr4\t76039070\t+\t+\tDD\t60\t13\n", "SRR13849430.157962\tchr6\t47656758\tchr6\t47748395\t+\t-\tDD\t60\t35\n" ] } ], "source": [ "%%bash\n", "# Only duplicated pairs:\n", "gzip -dc test.dups.pairs.gz | grep -v \"#\" | head -n 10" ] }, { "cell_type": "markdown", "id": "7441b723-5c5d-4502-8330-c8b7b4a24e30", "metadata": {}, "source": [ "#### pairtools select\n", "\n", "Sometimes you may need certain types of pairs based on their properties, such as mapq, pair type, distance or orientation. \n", "For all these manipulations, there is `pairtools select` which requires a file and pythonic condition as an input:" ] }, { "cell_type": "code", "execution_count": null, "id": "3a2de712-b4ef-4ee3-af68-d19f2fa8fb8f", "metadata": {}, "outputs": [], "source": [ "%%bash \n", "pairtools select \"mapq1>0 and mapq2>0\" test.nodups.pairs.gz -o test.nodups.UU.pairs.gz" ] }, { "cell_type": "markdown", "id": "1e6445fa-551b-4583-aa61-587a27370fa4", "metadata": { "tags": [] }, "source": [ "#### pairtools stats\n", "\n", "Describe the types fo distance properties of pairs: " ] }, { "cell_type": "code", "execution_count": null, "id": "3aca9ac8-668b-46c4-a1c2-6172303f284a", "metadata": {}, "outputs": [], "source": [ "%%bash\n", "pairtools stats test.pairs.gz -o test.stats" ] }, { "cell_type": "markdown", "id": "ca2c1c56-9024-4fa0-abb9-ed1f9ab313f1", "metadata": {}, "source": [ "### MultiQC" ] }, { "cell_type": "code", "execution_count": null, "id": "0967edf9-fdf6-4294-98fc-a2c069917de6", "metadata": { "tags": [ "hide-output" ] }, "outputs": [], "source": [ "%%bash\n", "multiqc test.stats" ] }, { "cell_type": "code", "execution_count": 9, "id": "d76bd76c-f0f5-4921-b873-9390e715eab9", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import IFrame\n", "\n", "IFrame(src='./multiqc_report.html', width=1200, height=700)" ] }, { "cell_type": "markdown", "id": "e0dc157d-a8c6-4319-b83c-d450f2a822f3", "metadata": {}, "source": [ "### Load pairs to cooler\n", "Finally, when you obtained a list of appropriate pairs, you may create coolers with it: " ] }, { "cell_type": "code", "execution_count": null, "id": "3d9df0e2-f8d3-487b-8369-cddf8bdd54df", "metadata": { "tags": [ "hide-output" ] }, "outputs": [], "source": [ "%%bash\n", "cooler cload pairs \\\n", " -c1 2 -p1 3 -c2 4 -p2 5 \\\n", " --assembly hg38 \\\n", " ~/.local/share/genomes/hg38/hg38.fa.sizes:1000000 \\\n", " test.nodups.UU.pairs.gz \\\n", " test.hg38.1000000.cool" ] }, { "cell_type": "code", "execution_count": null, "id": "083da222-8d15-408b-ad8c-7fa35881597f", "metadata": { "tags": [ "hide-output" ] }, "outputs": [], "source": [ "%%bash\n", "cooler zoomify \\\n", " --nproc 5 \\\n", " --out test.hg38.1000000.mcool \\\n", " --resolutions 1000000,2000000 \\\n", " --balance \\\n", " test.hg38.1000000.cool" ] }, { "cell_type": "markdown", "id": "9a17fb3c-d5f8-472e-b80a-e7708798ea72", "metadata": {}, "source": [ "### Visualize cooler\n", "\n", "Based on [open2c vis example](https://github.com/open2c/open2c_examples/blob/master/viz.ipynb)" ] }, { "cell_type": "code", "execution_count": 36, "id": "1839183d-4d5c-4b29-926c-0d56e00c8b8a", "metadata": {}, "outputs": [], "source": [ "import cooler\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "import cooltools.lib.plotting\n", "from matplotlib.colors import LogNorm\n", "import seaborn as sns\n", "import bioframe\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 11, "id": "7bae233c-36f2-483c-8957-766e200739a4", "metadata": {}, "outputs": [], "source": [ "file = \"test.hg38.1000000.mcool::/resolutions/1000000\"" ] }, { "cell_type": "code", "execution_count": 12, "id": "2b4cc40b-5aaf-4db8-b870-ba190fdb5d01", "metadata": {}, "outputs": [], "source": [ "clr = cooler.Cooler(file)" ] }, { "cell_type": "code", "execution_count": 19, "id": "4350d8c1-b50c-43f7-92e5-43802122320b", "metadata": {}, "outputs": [], "source": [ "# Define chromosome starts\n", "chromstarts = []\n", "for i in clr.chromnames:\n", " chromstarts.append(clr.extent(i)[0])" ] }, { "cell_type": "code", "execution_count": 20, "id": "cd823dec-49c8-46e0-96b6-dcb0344f9d9c", "metadata": {}, "outputs": [], "source": [ "from matplotlib.ticker import EngFormatter\n", "bp_formatter = EngFormatter('b')\n", "\n", "def format_ticks(ax, x=True, y=True, rotate=True):\n", " if y:\n", " ax.yaxis.set_major_formatter(bp_formatter)\n", " if x:\n", " ax.xaxis.set_major_formatter(bp_formatter)\n", " ax.xaxis.tick_bottom()\n", " if rotate:\n", " ax.tick_params(axis='x',rotation=45)" ] }, { "cell_type": "code", "execution_count": 40, "id": "896235bb-749b-4c2e-95ae-352c91452b24", "metadata": {}, "outputs": [], "source": [ "# Define the bounds of the continuous fragment of whole-genome interaction map\n", "chrom_start, chrom_end = clr.chromnames.index('chr3'), clr.chromnames.index('chr6')\n", "start, end = chromstarts[chrom_start], chromstarts[chrom_end]" ] }, { "cell_type": "code", "execution_count": 43, "id": "a0d99510-d5e6-4de5-861b-8eeddcb6c25b", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "vmax = 15\n", "norm = LogNorm(vmin=1, vmax=vmax)\n", "\n", "f, axs = plt.subplots(\n", " figsize=(13, 10),\n", " nrows=2, \n", " ncols=1,\n", " sharex=False, sharey=False)\n", "\n", "ax = axs[0]\n", "ax.set_title('Interaction maps (chr1)')\n", "im = ax.matshow(clr.matrix(balance=False).fetch('chr1'), vmax=vmax, cmap='fall'); \n", "plt.colorbar(im, ax=ax ,fraction=0.046, pad=0.04, label='chr1');\n", "\n", "ax = axs[1]\n", "ax.set_title('Chromosomes 3-5')\n", "im = ax.matshow(clr.matrix(balance=False)[start:end, start:end], norm=norm, cmap='fall'); \n", "plt.colorbar(im, ax=ax ,fraction=0.046, pad=0.04, label='Whole-genome');\n", "ax.set_xticks(np.array(chromstarts[chrom_start:chrom_end])-start, clr.chromnames[chrom_start:chrom_end], rotation=90);\n", "ax.set_yticks(np.array(chromstarts[chrom_start:chrom_end])-start, clr.chromnames[chrom_start:chrom_end], rotation=90);\n", "\n", "format_ticks(axs[0], rotate=False)\n", "\n", "plt.tight_layout()" ] }, { "cell_type": "code", "execution_count": null, "id": "e07ca165-15ed-459c-af7b-3156de81f935", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "test", "language": "python", "name": "test" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" } }, "nbformat": 4, "nbformat_minor": 5 } pairtools-1.1.3/doc/examples/scalings_example.ipynb000066400000000000000000003753671474715105500225320ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "vscode": { "languageId": "python" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--2023-12-18 23:04:28-- https://osf.io/download/crgu8/\n", "Resolving osf.io (osf.io)... 35.190.84.173\n", "Connecting to osf.io (osf.io)|35.190.84.173|:443... connected.\n", "HTTP request sent, awaiting response... 302 FOUND\n", "Location: https://files.de-1.osf.io/v1/resources/638ue/providers/osfstorage/623993788d53ef082867e2b9 [following]\n", "--2023-12-18 23:04:28-- https://files.de-1.osf.io/v1/resources/638ue/providers/osfstorage/623993788d53ef082867e2b9\n", "Resolving files.de-1.osf.io (files.de-1.osf.io)... 35.186.249.111\n", "Connecting to files.de-1.osf.io (files.de-1.osf.io)|35.186.249.111|:443... connected.\n", "HTTP request sent, awaiting response... " ] }, { "name": "stdout", "output_type": "stream", "text": [ "302 Found\n", "Location: https://storage.googleapis.com/cos-osf-prod-files-de-1/b72f21bb7e21d00541fb3cbc50ef77d67b75970f7d255912ca527fb4c8e5cc0a?response-content-disposition=attachment%3B%20filename%3D%22test_pairs.wp-all.pairs%22%3B%20filename%2A%3DUTF-8%27%27test_pairs.wp-all.pairs&GoogleAccessId=files-de-1%40cos-osf-prod.iam.gserviceaccount.com&Expires=1702937129&Signature=0tM4rWv5RPZjFTYCKzHNbOZoInW3EOidpN5eHp1mlQv%2BWxUbUQ%2BqHDqVmJB4afWQ9CeQpovADOp%2BHNDVxr4GhotEENmyAd7GGdoGRkS%2FeSXM3G1hLxR5H3S5kBWfTVk57pRUXu%2FNj%2FZXOTJo5zKizIdmYlpPZ%2BDZZJvfXuExR3G6OWXcM3P7ufpFe6d53ZxiqpyhxIKVOU4uYo7zwFyxxofGrd5DONsz53sEH15S%2Fc84emZrxaFiQW5%2FEaupoEtLJQHcFc5au3fh8wApS4gtTU%2FDkINvnkyEDXyxND7%2FJDfQ0xJRRjelDXuFVHHDxbIqIfVhQnFK0QMEmlyoBLax1g%3D%3D [following]\n", "--2023-12-18 23:04:29-- https://storage.googleapis.com/cos-osf-prod-files-de-1/b72f21bb7e21d00541fb3cbc50ef77d67b75970f7d255912ca527fb4c8e5cc0a?response-content-disposition=attachment%3B%20filename%3D%22test_pairs.wp-all.pairs%22%3B%20filename%2A%3DUTF-8%27%27test_pairs.wp-all.pairs&GoogleAccessId=files-de-1%40cos-osf-prod.iam.gserviceaccount.com&Expires=1702937129&Signature=0tM4rWv5RPZjFTYCKzHNbOZoInW3EOidpN5eHp1mlQv%2BWxUbUQ%2BqHDqVmJB4afWQ9CeQpovADOp%2BHNDVxr4GhotEENmyAd7GGdoGRkS%2FeSXM3G1hLxR5H3S5kBWfTVk57pRUXu%2FNj%2FZXOTJo5zKizIdmYlpPZ%2BDZZJvfXuExR3G6OWXcM3P7ufpFe6d53ZxiqpyhxIKVOU4uYo7zwFyxxofGrd5DONsz53sEH15S%2Fc84emZrxaFiQW5%2FEaupoEtLJQHcFc5au3fh8wApS4gtTU%2FDkINvnkyEDXyxND7%2FJDfQ0xJRRjelDXuFVHHDxbIqIfVhQnFK0QMEmlyoBLax1g%3D%3D\n", "Resolving storage.googleapis.com (storage.googleapis.com)... 142.251.37.123, 142.251.36.91, 142.251.36.123, ...\n", "Connecting to storage.googleapis.com (storage.googleapis.com)|142.251.37.123|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 564902846 (539M) [application/octet-stream]\n", "Saving to: ‘./tmp/test.pairs’\n", "\n", "./tmp/test.pairs 100%[===================>] 538.73M 163MB/s in 3.5s \n", "\n", "2023-12-18 23:04:33 (156 MB/s) - ‘./tmp/test.pairs’ saved [564902846/564902846]\n", "\n" ] } ], "source": [ "!wget https://osf.io/download/crgu8/ -O ./tmp/test.pairs" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "vscode": { "languageId": "python" } }, "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "vscode": { "languageId": "python" } }, "outputs": [], "source": [ "import warnings\n", "warnings.filterwarnings(\"ignore\")\n", "\n", "import numpy as np\n", "import pandas as pd\n", "\n", "import matplotlib.pyplot as plt\n", "import matplotlib.ticker \n", "import matplotlib.gridspec \n", "\n", "%matplotlib inline\n", "plt.style.use('seaborn-poster')\n", "\n", "import pairtools\n", "import pairtools.lib.scaling as scaling\n", "import bioframe" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "vscode": { "languageId": "python" } }, "outputs": [], "source": [ "pairs_path = './tmp/test.pairs'" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "vscode": { "languageId": "python" } }, "outputs": [], "source": [ "mm10_chromsizes = bioframe.fetch_chromsizes('mm10', as_bed=True)\n", "mm10_arms = mm10_chromsizes\n", "\n", "# hg38_chromsizes = bioframe.fetch_chromsizes('hg38', as_bed=True)\n", "# hg38_cens = bioframe.fetch_centromeres('hg38')\n", "# hg38_arms = bioframe.split(hg38_chromsizes, hg38_cens, cols_points=['chrom', 'mid'])" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "vscode": { "languageId": "python" } }, "outputs": [], "source": [ "cis_scalings, trans_levels = scaling.compute_scaling(\n", " pairs_path,\n", " regions=mm10_arms,\n", " chromsizes=mm10_chromsizes,\n", " dist_range=(10, 1000000000), \n", " n_dist_bins_decade=8,\n", " chunksize=int(1e7),\n", " #cmd_in=\"gzip -dc \"\n", " )\n", "\n", "# calculate average trans contact frequency _per directionality pair_\n", "# convert from int to float64 to avoid overflow\n", "avg_trans = (\n", " trans_levels.n_pairs.astype('float64').sum() \n", " / trans_levels.n_bp2.astype('float64').sum()\n", ")\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "vscode": { "languageId": "python" } }, "outputs": [ { "data": { "image/png": "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3bvEx8dTunRp2rZty/jx4ylRokSasYaEhDB16lQ2btzIgwcPKFasGF27dmXKlCl89tln+rEHDBiQ6t69e/cyf/58jhw5QkhICE5OTjRt2pQvvvgi0yc0HDhwgFatWunfP/8a0I99+/ZtypYti7u7O7du3cLLy4sVK1Zw48YNoqKi9KseL1++zOrVq9mzZw+3b9/m0aNHODg4UKdOHQYPHkzPnj3TjaFly5b8888//Pjjjyxfvpz//vsPW1tbWrZsybfffkvVqlVT3Xvq1Cm+++47Dh8+zMOHD7G2tsbFxYU6derQr18//TnsxpJvksX8IHn5pZ2dXbpt7O3tAQgPD8/WWA8fPqRHjx4priW/f/4vmJOTE/v27WPEiBF0794da2trevTowQ8//JCt8Z8XEBCQ4n1ERATVqlWjR48eub4UOLetWrUqV2aITU2e89WT1581rmNHjnVqjktIEkVDoeqW3bj80JEG9dtkqZ+8/pzGIs/56ggPD09VN+FVMnPmTIPua9++PbVr1051/ezZswafqz1hwoQ0ry9fvpygoKAM2xlq4sSJ7N+/n9dee4169ephZ2fHrVu32Lp1K1u3buXnn39m5MiR+vYDBw5k1qxZrF69mp9//hlra+tUfS5duhSAPn36pEgUDx06RJcuXXjy5AllypThzTffRKvVcvz4cT799FO2bNnC1q1b0zzWzdfXl6FDh1K8eHFatGhBTEwMDg4OADx48IC+ffvi6OhI1apVqVmzJlFRUZw9e5ZffvmFv/76C19fXypUqJCiz3v37tG8eXNu3bqFs7Mzb731FklJSSxfvpydO3emmRwlGzt2LHPmzMHMzIz69evTvHlz/P392bRpE1u2bGHRokUMHDgww1//YsWK0b9/f3bu3MmDBw9o27YtxYoV03/+YsyKotCtWzd27txJ8+bNqVq1KpcuXdJ//uOPP7JkyRKqVKlCjRo1cHJywt/fn/3797N3716OHj3Kjz/+mGYs8fHxdOjQAV9fX1q0aEHVqlU5fvw4GzZsYP/+/Zw5c4YyZcro2+/du5f27dsTHx9PrVq1aNy4MYmJiQQFBbFt2zYSExMLbrIYFxfH1atXsbKyokqVKi9te/XqVeLi4qhatWqunmmYm8qUKZPpfZyVKlVi586dORZLqVKlANBqtWi12hwbRwhRcFg5O1NjxQau9uyMYySU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fsmva5ZyYNAzPH7HUAK93Z0crYiIVGVlWuCmXbt2/PPPP7z88su0adMGFxcXTNPENE1cXFxo27YtU6dOZceOHbRr185BIUtlpQVuREQqhmEYtL/3Ubr9up3EEVdz1j/nvAvQfm8aN7wxha9GXM03a//CNE2nxioiIlVXmVdDDQgIYOLEiWzbto2UlBSOHTvGsWPHSElJYevWrYwfP15z2C4SWuBGRKRiGW5udB4/j6hHxnBsYDhJXjnn3bPgiu2xhD9xOx+NHMreqFjnBioiIlWSQ7fOcHd3p3bt2tSuXRt3dw19udhogRsREefI8vSj9+srueTLD9hzhQ/prjnnfVOh6287OXNLdxa9MI6k1AznBioiIlVKhe2zaI/ly5czZswYXn755RKVN02TKVOmMGbMGFauXFnO0YmIiFQugZd0Y8iCP3Gf+wTbW+T9ig+Kh1ZffMu2fu3Z8Nn/nBihiIhUJXYniytWrCAkJIQ77rij2LI33XQTISEhrF69usT1p6SkcO+99zJ79mzat29fonsMw6Bdu3a8+eab3H///aSlpZX4eSIiItVFi6tHMXTRdvaO783uBoblfOiJLAKmTGHZA7dwLk29jCIiUjS7k8WFCxcSHx/P8OHDiy17++23c/bsWRYuXFji+hctWsTJkye59tprue6660p836BBg7j22muJiYnhq6++KvF9IiIi1Ymrqxs3jnibHl+vYeWdDYiukXPexTRo/NtONgzsxO5t/zg3SBERqdTsThb/+OMPDMOgV69exZYdOHAghmGwYcOGEtf/7bffYhgGDz30UKljGzVqFKZp8s0335T6XhERkeok1K82Tzy3gqD/vcOKK93JPn++bkwayfcM5atZ07RiqoiIFMjuZDEqKoqgoCB8fX2LLevr60twcDAxMTElrn/btm0A9O7du9SxXXPNNQBs3bq11PeK/XL3WNQ+iyIilU+niF48+H+bWHP/JcSe32rDNxVavP8JX9x+Ladj9bNbRESs2Z0sGobBuXPnSlz+3LlzpKenl7j8yZMn8ff3x9/fv9Sx5d534sSJUt8r9tM+iyIilZu3mzePPrUUl9nP8HfTvPNt/4ph+w1XsvLH5c4LTkREKh27k8Xw8HBSU1P5+++/iy27fft2zp07R1hYWInrz87OLvOwGA2rqVjaZ1FEpGq48sp7uO6zVWy61s+yzUa9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dPeHeW5JNtujzvLa0Lbl1QQRkWpB+yyKw+Rum6GtM0REpKz8vdxpXsffkijawzAM6r74In69egHgk5nGlA0fUCv5DB0aBjsoUhGR6kvJojjMtGnTCAwM1EqoIiJSaRhubtR/43W82+b0IoakJfLWtgXc0sTXyZGJiFR+ShbFYSZMmEB8fDxRUVHODkVERMTCxdubsHffwaNxYwACTh/j6FNPYZqmkyMTEanclCyKw3h6ehIQEEBAQICzQxEREbHiFhxMg/f/D7datXANCaHWmLFa4EZEpBha4EZEREQuCu716xP+wfu4eHri0bChs8MREan0lCyKiIjIRcPrkkucHYKISJWhYagiIiIiIiJiQ8miiIiIiIiI2FCyKCIiIiIiIjaULIqIiIiIiIgNLXAjDpOWlkZaWhoJCQnODkVERERERMpIPYviMNOmTSMwMJDw8HBnhyIiIiIiImWkZFEcZsKECcTHxxMVFeXsUEREREREpIw0DFUcxtPTE09PT2eHISIiIiIiDqCeRREREREREbGhZFFERERERERsKFkUERERERERG0oWRURERERExIaSRREREREREbGhZLEK279/P6NGjaJDhw64u7sTERFRYLmvv/6a7t27ExoaiqenJ40bN2bMmDHExcVVbMAiIiIiIlJlaOuMKmznzp18//33dO7cGdM0C03+zpw5Q69evXj66acJDAxkx44dTJ48me3bt7Nq1aoKjlpERERERKoCJYtV2KBBg7jhhhsAGDVqFD/++GOB5e6//36r4169euHl5cXIkSM5cuQIDRo0KPdYRURERESkatEw1CrMxcX+ly8kJASAjIwMR4UjIiIiIiLViJLFIuzdu5e33nqLESNG0Lp1a9zc3DAMg5dffrlE9y9atIhevXoRHByMr68vbdu2ZcaMGU5L0LKyskhNTWXLli1MnjyZgQMH0qRJE6fEIiIiIiIilZuGoRbhnXfeYfbs2XbdO3r0aGbPno2bmxu9e/fGz8+P1atXM27cOL777jtWrlyJt7e3gyMuWo0aNYiPjwegb9++fPnllxX6fBERERERqTrUs1iEVq1a8dRTT/G///2P3bt385///KdE9y1ZsoTZs2fj5+fHpk2bWLFiBV999RX79u2jdevWrFu3jkmTJlnd89FHH2EYRrEfixcvtrs9v/zyC7///jvvvvsuu3btYtCg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ImWkYajiMFoNVURERESk+lDPooiIiIiIiNhQsigiIiIiIiI2lCyKiIiIiIiIDc1ZFIfR1hkiIiIiItWHehbFYbR1hoiIiIhI9aFkURxGW2eIiIiIiFQfGoYqDqOtM0REREREqg/1LIqIiIiIiIgNJYsiIiIiIiJiQ8miiIiIiIiI2FCyKCIiIiIiIja0wI04nGmaABfFfospKSlqZzVysbQTLp62qp3Vy8XQztz25f4uFRFxJsPUTyNxoOjoaO2zKCIiUkZ//PEHnTp1cnYYInKRU8+ilJudO3cSFhbm7DDKRUxMDC1atABg165d1K9f38kRlQ+1s/q5WNqqdlYvF2M7a9eu7eRoRESULEo5CggIICAgwNlhlIv8w6D8/f3VziruYmknXDxtVTurl4uxnS4uWlZCRJxPP4lERERERETEhpJFERERERERsaEFbkRERERERMSGehZFRERERETEhpJFERERERERsaFkUURERERERGwoWRQREREREREbShZFRERERETEhpJFERERERERsaFkUURERERERGwoWRQREREREREbShZFRERERETEhpJFERERERERsaFkUURERERERGwoWRQREREREREbShZFRERERETEhpJFERERERERsaFkUURERERERGwoWRSn279/P6NGjaJDhw64u7sTERHh7JDKxeLFixkyZAgNGjTAx8eHli1bMmvWLDIyMpwdmkN9/fXXdO/endDQUDw9PWncuDFjxowhLi7O2aGVm8zMTNq0aYNhGHz++efODsehfvnlFwzDsPlo1aqVs0MrF1988QWdO3fGx8eHkJAQ+vTpw7Fjx5wdlsP06tWrwNfTMAymT5/u7PAcaunSpXTt2pWAgABq1arFddddx19//eXssBzu559/pmvXrnh5eVGrVi1GjRpFfHy8s8MSkWrCzdkBiOzcuZPvv/+ezp07Y5pmtU0qZs6cSUREBDNmzKB27dqsX7+e5557jr///puPP/7Y2eE5zJkzZ+jVqxdPP/00gYGB7Nixg8mTJ7N9+3ZWrVrl7PDKxezZszl16pSzwyhXH3zwAS1btrQc+/j4ODGa8jFr1iwmTJjAU089xauvvkpycjK//vorqampzg7NYebNm0dCQoLVuf/+97/MmzePgQMHOikqx/vpp58YMmQId9xxBy+99BLJyclMnTqVPn368M8//1C3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vBiATp060bBhw/IK2S72tvORRx5hyZIlTJkyhaysLDZu3Gi51qJFi0r37r697ezXrx99+vShZcuWeHp6sm3bNl577TXatGnDjTfeWK4x28OedgYFBdGrVy+rMocOHQJyXsurrrrK8YGWkb2v55133kmjRo24/PLL8ff3Z9OmTbz66qu0a9eO2267rXyDtoO97Rw8eDBXXHEF999/P9OmTaNOnTq89dZbxMXF8cwzz5Rv0Hawt525Pv30U2rUqMGAAQPKJ0AHsbedjz76KI888ggPPvggN998M0lJScyaNYu0tDQeeOCB8g3aDva2848//mDNmjW0a9eOzMxMfv75Z+bMmcMbb7xRKd+cE5GqR8miOExiYiIAvr6+hZbx8/MDct7hzXXy5EmGDh1qVS73eMGCBYwYMcLBkZaNve388ccfgZyep0mTJlmVX7NmjU3y4Wz2trNz5858+umnlj9oIiIiePjhhxkzZozNEu+Vgb3trGrsbWfLli357LPPmD17NufOnSMsLIz77ruPF154oVq9ni4uLnz//fc89dRTjB07lnPnztGpUydWr15d6BBVZyrL121SUhLffvstd999N+7u7uUXpAPY286HHnoILy8v5s6dy2effYa3tzcdOnRgzZo1lXJUh73t9PDwYOnSpbzyyitkZmbSpk0bFi1aVO7bg4jIxUPJojhdREQEpmk6O4xyl9vzVN1NmTKFKVOmODuMClddv44nTJjAhAkTnB1GhQgJCeHDDz/kww8/dHYo5crPz4/k5GRnh1GuDMPg3nvv5d5773V2KOWqXbt2rF+/3tlhiEg1pjmL4jD+/v4ARf4RkpSUBFDphlyWhtqZR+2sOtTOPGpn1aF25qkO7RSRqkfJojhMREQEAFFRUYWWyb2WW7YqUjvzqJ1Vh9qZR+2sOtTOPNWhnSJS9ShZFIdp3749ALGxsQUuqABYVqfr0KFDhcXlaGpnHrWz6lA786idVYfamac6tFNEqh4li+IwYWFhdOrUCYDPPvvM5vq6deuIiorC09OTgQMHVnR4DqN25lA7qxa1M4faWbWonTmqSztFpOpRsigONXHiRACmT5/O1q1bLedjY2N5+OGHgZwlzQMDA50Sn6OonWpnVaR2qp1VkdpZvdopIlWLYVbH5fukzLZu3Wr55QRw4MABTp8+TVhYGPXr17ec/+abb6hbt67VvU888QRz5szB3d2dPn364Ovry6pVqzh79izdunXjp59+wtvbu8LaUhS1U+3MpXaqnc6idqqduapSO0XkImGKFGDNmjUmUOxHZGRkgfd/8cUXZo8ePcyAgADT29vbbNWqlTl9+nQzLS2tYhtSDLVT7cxP7VQ7nUHtVDvzqyrtFJGLg3oWRURERERExIbmLIqIiIiIiIgNJYsiIiIiIiJiQ8miiIiIiIiI2FCyKCIiIiIiIjaULIqIiIiIiIgNJYsiIiIiIiJiQ8miiIiIiIiI2FCyKCIiIiIiIjaULIqIiIiIiIgNJYsiIiIiIiJiQ8miiFx0IiIiMAyDjz76yOr8oUOHMAwDwzA4dOiQU2KTwv3yyy+W10dERETKn5uzAxARqa5++eUXfvnlFyIiIhgxYoSzwxEREREpFfUsioic5+7uTvPmzWnevDnu7u5lru+XX35h8uTJNj2YIiIiIlWBehZFRM6rX78+e/bscXYYIiIiIpWCehZFRERERETEhpJFEal2TNPkvffeo2PHjvj6+lKjRg2uueYafvzxxyLvK26Bmx07dnDPPffQuHFjvLy88PX1pVGjRvTp04dXX32V2NhYq3omT54MwNq1ay315n788ssvlnqPHTvGm2++yfXXX0/z5s3x8/PDz8+Pli1b8tRTT3Hs2LFCY86/WE9aWhovv/wyLVq0wNvbm9DQUG688Ub++uuvItudlZXFxx9/zIABA6hduzaenp7Uq1ePq666itdee43jx48XeN++fft46KGHuOSSS/Dx8cHf35927doxefJk4uPji3ymI6xfv55BgwZRs2ZNvL29adOmDW+88QZZWVkFlu/VqxeGYfDiiy+SmprK5MmTueyyy/D29qZmzZoMGzaMXbt2lXvcIiIiVYYpIlKNZGZmmkOHDjUBEzBdXV3NoKAg0zAM0zAMc86cOWbDhg1NwFywYIHVvZGRkZb7IiMjra798MMPpoeHh+W6p6enGRgYaDkGzJ9++sk0TdM8cuSIWbt2bdPX19cETHd3d7N27dpWH7///rul7rvvvttSh4eHhxkSEmK6uLhYztWsWdPcvn17ge3NbcucOXPMjh07WmLz9va23O/j42Nu2rSpwPuPHz9udunSxVLWMAwzODjY9PLyspx74403bO774IMPTHd3d6tn5D9u1KiRuX///pK/cCWwZs0aS/1fffWV6ebmZgJmUFCQ5f+A2a9fPzMtLc3m/p49e5qAOX78ePOKK66wfL4DAgKsXtcVK1Y4NG4REZGqSj2LIlKtvPbaayxatMjSs3fmzBni4uKIiYnhtttuY+zYsZw6darU9T7yyCOkp6czcOBAdu/eTWpqKmfPniUxMZFNmzbx+OOPExAQAEB4eDjHjx/nqaeeAuDKK6/k+PHjVh9XXnmlpe5mzZrx+uuvs2fPHs6dO0dsbCypqan8+uuvdOnShVOnTjF8+HBM0yw0vhdeeIHTp0/z448/kpycTFJSEr/++ithYWGkpKTw+OOP29yTnp7O4MGD2bRpE4GBgbz77rvExcVx5swZUlJS2L17Ny+99BI1a9a0um/58uU88MADuLu7M2XKFI4dO0ZycjIpKSn8/vvvdOzYkcjISG666Says7NL/bkuiXvvvZdrrrmGgwcPEhcXR3x8PLNmzcLV1ZUVK1bwwgsvFHrvO++8w/bt2/n4449JSkoiPj6e7du307FjR9LS0rj11lsL7U0VERG5qDg7WxURcZTk5GRLL9FTTz1lcz0rK8vs3bu3pReppD2LJ06csJw/duxYieN54YUXTMDs2bOnnS0yzTNnzpg1a9Y0AfOXX36xuZ7bs+jt7W3u27fP5vrixYstsR8+fNjq2rvvvmvp+dy4cWOJ4snMzDQbN25sAubXX39dYJnY2Fizbt26lh5AR8nfs9iyZUszNTXVpsyUKVNMwPTy8jJjY2OtruX2LALmp59+WmDcuZ/rp59+2mFxi4iIVFXqWRSRamPlypUkJCTg5ubGM888Y3PdxcWFiRMnlrpePz8/XFxyflxWdI9TcHCwpRfy999/L7TcLbfcQtOmTW3ODx482LKJ/T///GN1LXdLj9tvv50uXbqUKJ61a9dy8OBBmjRpwpAhQwosExISwoABA4Cc16Q8jB07Fk9PT5vzo0ePxsfHh9TUVL777rsC723YsCHDhw+3OR8SEsJDDz0EwKJFixwbsIiISBWkZFFEqo0///wTgBYtWtgMnczVvXt33NxKt2uQj48PPXv2BKBfv3689NJL/Pnnn4UupGKPP/74g3vvvZdLL70UPz8/q8Vwli5dCsDRo0cLvb9Tp04Fnnd3d6dWrVoAxMXFWc5nZGSwZcsWAK677roSx7l+/XoAoqOjqVOnTqEfX3zxBQBHjhwpcd2l0atXrwLP+/n5cfnllwOwdevWAsv07NnTkkAXdA1yFik6c+ZM2QMVERGpwrTPoohUG7lzEevXr19oGU9PT0JDQ0vdQ/jBBx8waNAgdu3axQsvvMALL7yAj48P3bt355ZbbuGuu+4qsKerJGbOnMkzzzxjmZPo4uJCcHAwHh4eAMTHx5OamkpycnKhdfj7+xd6zcvLC8hJEHOdOXOGzMxMIKenraRyV2ZNS0vjxIkTxZZPSUkpcd2lUdRrnHvt5MmTdt8LOV9PISEhdkYoIiJS9alnUUSkBBo3bszff//Nt99+y0MPPUTr1q05d+4cK1euZOTIkbRq1arInr/C7Ny5k3HjxmGaJkOGDGHr1q2kpaVx5swZy2I4t9xyC0CRC9xUlNze1H79+mGaZrEf+bcIERERkapFyaKIVBu5Q0+LStrS09M5ffq0XfW7uroyaNAg5s2bx99//83JkyeZO3cuAQEB7N+/n9GjR5e6zq+++ors7GyaNGnCl19+Sfv27W2GyZakB6+0atSogbu7OwCHDx8u8X21a9cGym94aUkV9RrnXssdfmvPvUChQ5lFREQuFkoWRaTayJ2rtnPnzkITwnXr1lmGX5ZVaGgojzzyCM8//zyATS9a7qI4RfUIRkdHA9CuXbsC51KmpKSwadMmh8Sbn5ubGx07dgRg2bJlJb4vd7GdPXv2cODAAYfHVVJr164t8HxycrJlLmaHDh1KdW/+axERERqCKiIiFz0liyJSbfTt25fAwEAyMzN57bXXbK6bpsm0adNKXW96enqR1729vYGceXz55e67ePbs2ULvDQwMBODff/8tMKl87bXXSEhIKE24JTZixAgAFi5cWOKEtHfv3jRs2BDTNHnyySeL3EcxIyODpKQkR4RqY9asWQW+LnPmzCElJQUvLy8GDRpU4L2HDh1i4cKFNufj4uJ49913ARg6dKhjAxYREamClCyKSLXh4+PD+PHjgZwk6+WXXyYxMRHIWZjlrrvuYu3atfj4+JSq3vXr19OuXTveeust9u3bZ0nqMjMzWb58OS+99BKAZbuIXK1atQJg165dhSZj1157LQA7duzgySeftCSGZ86cYdKkSUyePJkaNWqUKt6SGjFiBJ06dSIjI4N+/frxf//3f5bnm6bJ7t27GTduHP/9738t97i7uzNv3jxcXFz47rvv6NevHxs3brQkjdnZ2ezatYvp06dzySWX8Ndff1k989ChQ5ZVXnO37rDHkSNHGDJkCIcOHQLg3LlzvPnmm0yaNAnI2UKjsJ7BwMBAHnjgAT799FPLoj87duygf//+nDhxgqCgIMaMGWN3bCIiItVGRW/sKCJSnjIzM81bbrnFsvm6q6urGRwcbBqGYRqGYc6ZM8eykf2CBQus7o2MjLTcFxkZaTmffzN4wPTw8DBDQkJMFxcXy7lLLrnEjImJsaovIyPDbNasmaVMSEiI2bBhQ7Nhw4bmhg0bLOVuuukmSxnDMMzg4GBL3ffdd5959913m4B5991327S3sLaUtMzRo0fNDh06WJ7v4uJihoSEmN7e3pZzb7zxhs19n332mVUZT09Ps0aNGqa7u7vV52rdunWFfo6Lirkg+V+Hr776ynRzczMBMygoyPJ/wOzXr5+Zmppqc3/Pnj1NwBw/frzZtWtXS9yBgYFW7fjxxx9LFZeIiEh1pZ5FEalWXF1d+fLLL3n33Xfp0KGDZfuJ3r17s2zZMh577LFS19mpUye++OILRo4cSfv27QkODiYhIYGAgACuuOIKZsyYwbZt26hXr57VfW5ubqxatYoRI0bQoEEDEhMTOXz4MIcPHyY1NdVS7osvvmD69OlcdtlluLu7Y5omV155JR9//DEffPBB2T4hxahbty4bN27kvffe4+qrryY4OJikpCRCQkK46qqrmDlzZoEb2N9+++3s27eP8ePH065dOzw9PTl79iz+/v507dqVMWPGsG7dOrp162Z1X+4CMoZhWOaY2uOmm25i7dq1XH/99bi6uuLm5kbr1q15/fXXWbZsWZHbmHh6erJmzRpefPFFIiIiSEtLIzQ0lKFDh/Lnn3/Sr18/u+MSERGpTgzTrARrsYuIyEVh6tSpPPvss9x8880sXry4Qp/dq1cv1q5dywsvvMCLL75Yoc8WERGpitSzKCIiFWbt2rUYhmFZQVZEREQqLyWLIiJSITIzM1m/fj033HADbdq0cXY4IiIiUgzbTb1ERETKgZubm2V1WhEREan81LMoIiIiIiIiNrTAjYiIiIiIiNhQz6KIiIiIiIjYULIoIiIiIiIiNpQsioiIiIiIiA0liyIiIiIiImJDyaKIiIiIiIjYULIoIiIiIiIiNpQsioiIiIiIiA0liyIiIiIiImJDyaKIiIiIiIjYULIoIiIiIiIiNpQsioiIiIiIiA0liyIiIiIiImJDyaKIiIiIiIjYULIoIiIiIiIiNpQsioiIiIiIiA0liyIiIiIiImJDyaKIiIiIiIjYULIoIiIiIiIiNpQsioiIiIiIiA0liyIiIiIiImJDyaKIiIiIiIjYULIoIiIiIiIiNpQsioiIiIiIiA0liyIiIiIiImJDyaKIiIiIiIjYULIoIiIiIiIiNpQsioiIiIiIiA0liyIiIiIiImJDyaKIiIiIiIjYULIoIiIiIiIiNtycHYDY5+TJkxw5coSUlBR69Ojh7HBERERERKSaUc9iFfP111/Trl076tatS5cuXejdu7fV9bNnz9K/f3/69+9PfHy8k6IUEREREZGqTsliFTJ58mSGDh3K33//jWmalo/8goKCCAwM5KeffmLRokVOilRERERERKo6JYtVxNq1a5k8eTJubm5Mnz6dI0eOULt27QLL3nXXXZimyYoVKyo4ShERERERqS40Z7GKmDNnDoZh8MILL/DMM88UWbZbt24A/PXXXxUQmYiIiIiIVEeGeeE4RqmU6tWrx4kTJ4iNjSUoKAiAunXrcvLkSbKysmzKBwYGkpmZSXJycgVHKiIiIiIi1YGGoVYRsbGxBAQEWBLF4ri6upKdnV2+QYmIiIiISLWlZLGKCAwMJDExkYyMjGLLnjlzhvj4eEJDQysgMhERERERqY6ULFYRbdq0wTRNNm7cWGzZ//3vf5imSefOnSsgMhERERERqY6ULFYRt99+O6ZpMmnSpCJ7Fzdu3Mizzz6LYRj85z//qcAIRURERESkOtECN1VEdnY2V155JZs3b6ZLly48+uijPPHEE5w5c4aNGzdy+PBhvv/+ez7//HPS09Pp06cPP/30k7PDFhERERGRKkrJYhVy6tQpbrzxRjZs2IBhGAWWMU2T7t278+2335Z4MRwREREREZELaRhqFVKzZk1+/fVXPvzwQ7p164aHhwemaWKaJi4uLnTp0oX/+7//Y82aNUoURURERESkTNSzWIVlZ2dz5swZsrKyqFGjBm5ubs4OSUREREREqgn1LFZhLi4uhIaGUrt27UqfKC5atIhevXoRHByMr68vbdu2ZcaMGSXaCiS/jz76CMMwivz48ccfy6kVIiIiIiIXj8qdYUiRzp49y6lTp4CcIaqVdejp6NGjmT17Nm5ubvTu3Rs/Pz9Wr17NuHHj+O6771i5ciXe3t6lqrNJkyZ07969wGv169d3RNgiIiIiIhc1JYtVzMmTJ3n99ddZtGgRhw4dsroWERHBsGHDePLJJ6lVq5ZzArzAkiVLmD17Nn5+fqxdu5YOHToAcPr0aXr37s26deuYNGkSM2fOLFW93bt356OPPiqHiEVEREREBDQMtUr5+eefueyyy3jttdeIjIy0LG6T+xEZGcmMGTO47LLL+Pnnn50dLgBTp04FYPz48ZZEESA0NJR58+YBMHfuXOLj450Sn4iIiIiIFEzJYhWxe/duBg0aRFxcHKGhoTz//POsWrWKPXv2sGfPHlavXs0LL7xArVq1iIuLY/DgwezevdupMcfExLB582YAhg8fbnO9e/fuhIeHk5aWxvLlyys6PBERERERKYKGoVYRL774ImlpaXTq1Ikff/yR4OBgq+uXXHIJvXr14vHHH6d///5s3ryZl156iYULFzopYti2bRsAISEhNGrUqMAyHTt2JCoqim3btnH77beXuO79+/fz3HPPcfLkSfz8/GjVqhWDBw8mNDTUIbHnFx0dbXMuLCzM4c8REREREalMlCxWEWvWrMEwDObPn2+TKOYXHBzMBx98QNu2bVm9enUFRmgrMjISgAYNGhRaJjw83KpsSf3+++/8/vvvVue8vLx48cUXGTduXCkjLVpujPlFRUXh7++PYRgOfZaIiBTNNE0SExOpV68eLi4aICUiUp6ULFYRSUlJBAQE0KpVq2LLtm7dmsDAQJKSkiogssIlJiYC4OvrW2gZPz8/ABISEkpUZ506dXj22WcZPHgwjRs3xtPTk7179/LWW2/x3//+l/Hjx5OVlcXEiRPL3oAiFJRAiohIxYmKitIoDxGRcqZksYqIiIggMjKSrKwsXF1diyybmZlJampqoUM/q7L+/fvTv39/q3MdO3bk448/pm3btowdO5aXXnqJ++67j9q1azvkmVFRUVbHCQkJtGzZkqioKAICAgBI/fdfDt+eNy/z3/rwym05316Lr19MWEAxf9D8uxK+ujfvuN1wum3vR/y5TMup3pfWZM7t5xcJOrYdPrrOcm1tVmseyRhtU22Qtxu/PNQSt3kd+cvDg1F181bJnfy1JxGRyZbjT27M5pXrxnD047UkrttmOV/vjlZ8eXkbuo/5zHIuNSiLttfkbNuyMutyxpmPsm3StYU27/tPX6LZG99ajk9eVpur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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(6,10))\n", "gs = matplotlib.gridspec.GridSpec(2,1, height_ratios=[8, 1.5])\n", "ax1 = fig.add_subplot(gs[0,0])\n", "ax2 = fig.add_subplot(gs[1,0])\n", "\n", "strand_gb = cis_scalings.groupby(['strand1', 'strand2'])\n", "for strands in ['+-', '-+', '++', '--']:\n", " sc_strand = strand_gb.get_group(tuple(strands))\n", " sc_agg = (sc_strand\n", " .groupby(['min_dist','max_dist'])\n", " .agg({'n_pairs':'sum', 'n_bp2':'sum'})\n", " .reset_index())\n", "\n", " dist_bin_mids = np.sqrt(sc_agg.min_dist * sc_agg.max_dist)\n", " pair_frequencies = sc_agg.n_pairs / sc_agg.n_bp2\n", " mask = pair_frequencies>0\n", " label = f'{strands[0]}{strands[1]}'\n", "\n", " ax1.loglog(\n", " dist_bin_mids[mask],\n", " pair_frequencies[mask],\n", " label=label,\n", " lw=2\n", " )\n", "\n", " ax2.semilogx(\n", " np.sqrt(dist_bin_mids.values[1:]*dist_bin_mids.values[:-1]),\n", " np.diff(np.log10(pair_frequencies.values)) / np.diff(np.log10(dist_bin_mids.values)),\n", " label=label\n", " )\n", " \n", "ax1.axhline(avg_trans, ls='--', c='gray', label='average trans')\n", "\n", "plt.sca(ax1)\n", "plt.gca().set_aspect(1.0)\n", "plt.gca().xaxis.set_major_locator(matplotlib.ticker.LogLocator(base=10.0,numticks=20))\n", "plt.gca().yaxis.set_major_locator(matplotlib.ticker.LogLocator(base=10.0,numticks=20))\n", "plt.xlim(1e1,1e9)\n", "# plt.ylim(avg_trans / 3, plt.ylim()[1])\n", "\n", "plt.grid(lw=0.5,color='gray')\n", "plt.legend(loc=(1.1,0.4))\n", "plt.ylabel('contact frequency, \\nHi-C molecule per bp pair')\n", "plt.xlabel('distance, bp')\n", "\n", "plt.sca(ax2)\n", "plt.xlim(1e1,1e9)\n", "plt.ylim(-2,0.5)\n", "plt.gca().set_aspect(1.0)\n", "plt.ylabel('log-log slope') \n", "plt.xlabel('distance, bp')\n", "\n", "plt.yticks(np.arange(-2,0.6,0.5))\n", "plt.gca().xaxis.set_major_locator(matplotlib.ticker.LogLocator(base=10.0,numticks=20))\n", "plt.grid(lw=0.5,color='gray')\n", "\n", "# fig.tight_layout()\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "python" } }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "main", "language": "python", "name": "main" }, "language_info": { "name": "", "version": "" } }, "nbformat": 4, "nbformat_minor": 4 } pairtools-1.1.3/doc/formats.rst000066400000000000000000000336201474715105500165170ustar00rootroot00000000000000Formats for storing Hi-C pairs ============================== .pairs ------ `.pairs` is a simple tabular format for storing DNA contacts detected in a Hi-C experiment. The detailed `.pairs specification `_ is defined by the 4DN Consortium. The body of a .pairs contains a table with a variable number of fields separated by a "\\t" character (a horizontal tab). The .pairs specification fixes the content and the order of the first seven columns: ======== =========== =============================================================================== index name description ======== =========== =============================================================================== 1 read_id the ID of the read as defined in fastq files 2 chrom1 the chromosome of the alignment on side 1 3 pos1 the 1-based genomic position of the outer-most (5') mapped bp on side 1 4 chrom2 the chromosome of the alignment on side 2 5 pos2 the 1-based genomic position of the outer-most (5') mapped bp on side 2 6 strand1 the strand of the alignment on side 1 7 strand2 the strand of the alignment on side 2 ======== =========== =============================================================================== A .pairs file starts with a header, an arbitrary number of lines starting with a "#" character. By convention, the header lines have a format of "#field_name: field_value". The `.pairs specification `_ mandates a few standard header lines (e.g., column names, chromosome order, sorting order, etc), all of which are automatically filled in by `pairtools`. The entries of a .pairs file can be flipped and sorted. "Flipping" means that *the sides 1 and 2 do not correspond to side1 and side2 in sequencing data.* Instead, side1 is defined as the side with the alignment with a lower sorting index (using the lexographic order for chromosome names, followed by the numeric order for positions and the lexicographic order for pair types). This particular order of "flipping" is defined as "upper-triangular flipping", or "triu-flipping". Finally, pairs are *typically* block-sorted: i.e. first lexicographically by chrom1 and chrom2, then numerically by pos1 and pos2. Pairtools' flavor of .pairs --------------------------- .pairs files produced by `pairtools` extend .pairs format in a few ways. 1. `pairtools` store null, unmapped, ambiguous (multiply mapped) and chimeric (if not parsed by `parse2` or `--walks-policy all` of `parse`) alignments as chrom='!', pos=0, strand='-'. #. `pairtools` store the header of the source .sam files in the '#samheader:' fields of the pairs header. When multiple .pairs files are merged, the respective '#samheader:' fields are checked for consistency and merged. #. Each pairtool applied to .pairs leaves a record in the '#samheader' fields (using a @PG sam tag), thus preserving the full history of data processing. #. `pairtools` append an extra column describing the type of a Hi-C pair: ======== =========== =============================================================================== index name description ======== =========== =============================================================================== 8 pair_type the type of a Hi-C pair ======== =========== =============================================================================== .. _section-pair-types: Pair types ---------- `pairtools` use a simple two-character notation to define all possible pair types, according to the quality of alignment of the two sides. The type of a pair can be defined unambiguously using the table below. To use this table, identify which side has an alignment of a "poorer" quality (unmapped < multimapped < unique alignment) and which side has a "better" alignment and find the corresponding row in the table. ======================== ====== =============== ========= ================== ========= ================== =========== . . . Less informative alignment More informative alignment . ------------------------ ------ --------------- ---------------------------- ---------------------------- ----------- Pair type Code >2 alignments Mapped Unique Mapped Unique Sidedness walk-walk WW |check| |cross| |cross| |cross| |cross| 0 [1]_ null NN |cross| |cross| |cross| 0 corrupt XX |cross| |cross| |cross| 0 [2]_ null-multi NM |cross| |cross| |check| |cross| 0 null-rescued NR |check| |cross| |check| |check| 1 [3]_ null-unique NU |cross| |cross| |check| |check| 1 multi-multi MM |cross| |check| |cross| |check| |cross| 0 multi-rescued MR |check| |check| |cross| |check| |check| 1 [3]_ multi-unique MU |cross| |check| |cross| |check| |check| 1 rescued-unique RU |check| |check| |check| |check| |check| 2 [3]_ unique-rescued UR |check| |check| |check| |check| |check| 2 [3]_ unique-unique UU |cross| |check| |check| |check| |check| 2 duplicate DD |cross| |check| |check| |check| |check| 2 [4]_ ======================== ====== =============== ========= ================== ========= ================== =========== .. [1] "walks", or, `C-walks `_ are Hi-C molecules formed via multiple ligation events which cannot be reported as a single pair. .. [2] "corrupt" pairs are those with technical issues - e.g. missing a FASTQ sequence/SAM entry from one side of the molecule. .. [2] "rescued" pairs have two non-overlapping alignments on one of the sides (referred below as the chimeric side/read), but the inner (3'-) one extends the only alignment on the other side (referred as the non-chimeric side/read). Such pairs form when one of the two ligated DNA fragments is shorter than the read length. In this case, one of the reads contains this short fragment entirely, together with the ligation junction and a chunk of the other DNA fragment (thus, this read ends up having two non-overlapping alignments). Following the procedure introduced in `HiC-Pro `_ and `Juicer `_, `pairtools parse` rescues such Hi-C molecules, reports the position of the 5' alignment on the chimeric side, and tags them as "NU", "MU", "UR" or "RU" pair type, depending on the type of the 5' alignment on the chimeric side. Such molecules can and should be used in downstream analysis. Read more on the rescue procedure in :doc:`the section on parsing `. .. [3] `pairtools dedup` detects molecules that could be formed via PCR duplication and tags them as "DD" pair type. These pairs should be excluded from downstream analyses. .pairsam -------- `pairtools` also define .pairsam, a valid extension of the .pairs format. On top of the pairtools' flavor of .pairs, .pairsam format adds two extra columns containing the alignments from which the Hi-C pair was extracted: ======== =========== =============================================================================== index name description ======== =========== =============================================================================== 9 sam1 the sam alignment(s) on side 1; separate supplemental alignments by NEXT_SAM 10 sam2 the sam alignment(s) on side 2; separate supplemental alignments by NEXT_SAM ======== =========== =============================================================================== Note that, normally, the fields of a sam alignment are separated by a horizontal tab character (\\t), which we already use to separate .pairs columns. To avoid confusion, we replace the tab character in sam entries stored in sam1 and sam2 columns with a UNIT SEPARATOR character (\\031). Finally, sam1 and sam2 can store multiple .sam alignments, separated by a string '\\031NEXT_SAM\\031' .. |check| unicode:: U+2714 .. check .. |cross| unicode:: U+274C .. cross Extra columns ---------------- `pairtools` can operate on `.pairs/.pairsam` with extra columns. Extra columns are specified in the order defined by the order their addition by various tools. Column names can be checked in the header of `.pairs/.pairsam` file. We provide `pairtools header` utilities for manipulating and verifying compatibility of headers and their columns. The list of additional columns used throughout `pairtools` modules: =================================== =================== ====================== ================================================== ================= extra column generating module format how to add it description =================================== =================== ====================== ================================================== ================= mapq1, mapq2 `parse/parse2` number from 0 to 255 `pairtools parse --add-columns mapq` `Mapping quality `_, as reported in .sam/.bam, $-10 log_{10}(P_{error})$ pos51, pos52 `parse/parse2` genomic coordinate `pairtools parse --add-columns pos5` 5' position of alignment (closer to read start) pos31, pos32 `parse/parse2` genomic coordinate `pairtools parse --add-columns pos3` 3' position of alignment (further from read start) cigar1, cigar2 `parse/parse2` string `pairtools parse --add-columns cigar` `CIGAR, or Compact Idiosyncratic Gapped Alignment Report `_ of alignment, as reported in .sam/.bam read_len1, read_len2 `parse/parse2` number `pairtools parse --add-columns read_len` read length matched_bp1, matched_bp2 `parse/parse2` number `pairtools parse --add-columns matched_bp` number of matched alignment basepairs to the reference algn_ref_span1, algn_ref_span2 `parse/parse2` number `pairtools parse --add-columns algn_ref_span` basepairs of reference covered by alignment algn_read_span1, algn_read_span2 `parse/parse2` number `pairtools parse --add-columns algn_read_span` basepairs of read covered by alignment dist_to_51, dist_to_52 `parse/parse2` number `pairtools parse --add-columns dist_to_5` distance to 5'-end of read dist_to_31, dist_to_32 `parse/parse2` number `pairtools parse --add-columns dist_to_3` distance to 3'-end of read seq1, seq2 `parse/parse2` string `pairtools parse --add-columns seq` sequence of alignment mismatches1, mismatches2 `parse/parse2` string `pairtools parse --add-columns mismatches` comma-separated list of mismatches relative to the reference, "{ref_letter}:{mut_letter}:{phred}:{ref_position}:{read_position}" XB1/2,AS1/2,XS1/2 or any sam tag `parse/parse2` `pairtools parse --add-columns XA,XB,NM` format depends on `tag specification `_ walk_pair_type `parse/parse2` string `pairtools parse2 --add-pair-index` Type of the pair relative to R1 and R2 reads of paired-end sequencing, see `pasring docs `_ walk_pair_index `parse/parse2` number `pairtools parse2 --add-pair-index` Order of the pair in the complex walk, starting from 5'-end of left read, see `pasring docs `_ phase `phase` 0, 1 or "." `pairtools phase` Phase of alignment (haplotype 1, 2, on unphased), see `phasing walkthrough `_ rfrag1, rfrag2 `restrict` number `pairtools restrict` Unique index of the restriction fragment after annotating pairs positions, see `restriction walkthrough `_ rfrag_start1, rfrag_start2 `restrict` number `pairtools restrict` Coordinate of the start of restriction fragment rfrag_end1, rfrag_end2 `restrict` number `pairtools restrict` Coordinate of the end of restriction fragment =================================== =================== ====================== ================================================== ================= pairtools-1.1.3/doc/index.rst000066400000000000000000000054641474715105500161600ustar00rootroot00000000000000.. pairtools documentation master file, created by sphinx-quickstart on Wed Dec 6 12:32:49 2017. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Overview ======== `pairtools` is a simple and fast command-line framework to process sequencing data from a Hi-C experiment. `pairtools` perform various operations on Hi-C pairs and occupy the middle position in a typical Hi-C data processing pipeline: .. figure:: _static/hic-processing-pipeline.png :width: 100% :alt: The diagram of a typical processing pipeline for Hi-C data :align: center In a typical Hi-C pipeline, DNA sequences (reads) are aligned to the reference genome, converted into ligation junctions and binned, thus producing a Hi-C contact map. `pairtools` aim to be an all-in-one tool for processing Hi-C pairs, and can perform following operations: - detect ligation junctions (a.k.a. Hi-C pairs) in aligned paired-end sequences of Hi-C DNA molecules - sort .pairs files for downstream analyses - detect, tag and remove PCR/optical duplicates - generate extensive statistics of Hi-C datasets - select Hi-C pairs given flexibly defined criteria - restore .sam alignments from Hi-C pairs `pairtools` produce .pairs files compliant with the `4DN standard `_. `pairtools` uses a two-character notation to define pair types (see table :ref:`_section-pair-types`) The full list of available pairtools: ============ ============================================== Pairtool Description ============ ============================================== dedup Find and remove PCR/optical duplicates. filterbycov Remove pairs from regions of high coverage. flip Flip pairs to get an upper-triangular matrix. markasdup Tag pairs as duplicates. merge Merge sorted .pairs/.pairsam files. parse Find ligation junctions in .sam, make .pairs. phase Phase pairs mapped to a diploid genome. restrict Assign restriction fragments to pairs. select Select pairs according to some condition. sort Sort a .pairs/.pairsam file. split Split a .pairsam file into .pairs and .sam. stats Calculate pairs statistics. ============ ============================================== Contents: .. toctree:: :hidden: self .. toctree:: :maxdepth: 3 quickstart installation parsing sorting formats stats protocols_pipelines designnotes cli_tools .. toctree:: :maxdepth: 3 :caption: Tutorials :titlesonly: ./examples/pairtools_walkthrough.ipynb ./examples/scaling_example.ipynb ./examples/pairtools_restrict_walkthrough.ipynb ./examples/pairtools_phase_walkthrough.ipynb ./examples/benchmark/benchmark.ipynb * :ref:`genindex` pairtools-1.1.3/doc/installation.rst000066400000000000000000000053111474715105500175410ustar00rootroot00000000000000Installation ============ Requirements ------------ - Python 3.x - Python packages `numpy` and `click` - Command-line utilities `sort` (the Unix version), `bgzip` (shipped with `samtools`) and `samtools`. If available, `pairtools` can compress outputs with `bgzip`, `pbgzip` and `lz4`. Install using conda ------------------- We highly recommend using the `conda` package manager to install pre-compiled `pairtools` together with all its dependencies. To get it, you can either install the full `Anaconda `_ Python distribution or just the standalone `conda `_ package manager. With `conda`, you can install pre-compiled `pairtools` and all of its dependencies from the `bioconda `_ channel: .. code-block:: bash $ conda install -c conda-forge -c bioconda pairtools Install using pip ----------------- Alternatively, compile and install `pairtools` and its Python dependencies from PyPI using pip: .. code-block:: bash $ pip install pairtools Install the development version ------------------------------- Finally, you can install the latest development version of `pairtools` from github. First, make a local clone of the github repository: .. code-block:: bash $ git clone https://github.com/open2c/pairtools Then, you can compile and install `pairtools` in `the development mode `_, which installs the package without moving it to a system folder and thus allows immediate live-testing any changes in the python code. Please, make sure that you have `cython` and `pysam` installed! .. code-block:: bash $ pip install cython pysam numpy $ cd pairtools $ pip install -e ./ --no-build-isolation A few notes on the installation: - `pairtools` have to use `--no-build-isolation`, because it extends `pysam` via Cython and re-compiles it during the build process. When build isolation is enabled, these `pysam` objects get lost after the build. - Because of the `--no-build-isolation` flag, build does not install build-requires, so you have to install `cython`, `pysam` and `numpy` manually before the build. Building on MacOS is not fully supported yet, but this tentative solution seems to work: .. code-block:: bash $ pip install build cython pysam numpy delocate $ cd pairtools $ python -m build -n $ DYLD_LIBRARY_PATH=$(python -c 'import pysam, os; print(os.path.dirname(pysam.get_libraries()[0]))') delocate-wheel -v dist/{wheel_name}.whl $ pip install dist/{wheel_name}.whl Note that you need to change the `{wheel_name}` to the actual name of the wheel file. pairtools-1.1.3/doc/parsing.rst000066400000000000000000000367651474715105500165240ustar00rootroot00000000000000Parsing sequence alignments into Hi-C pairs =========================================== Overview -------- Hi-C experiments aim to measure the frequencies of contacts between all pairs of loci in the genome. In these experiments, the spacial structure of chromosomes is first fixed with formaldehyde crosslinks, after which DNA is partially digested with restriction enzymes and then re-ligated back. Then, DNA is shredded into smaller pieces, released from the nucleus, sequenced and aligned to the reference genome. The resulting sequence alignments reveal if DNA molecules were formed through ligations between DNA from different locations in the genome. These ligation events imply that ligated loci were close to each other when the ligation enzyme was active, i.e. they formed "a contact". ``pairtools parse`` detects ligation events in the aligned sequences of DNA molecules formed in Hi-C experiments and reports them in the .pairs/.pairsam format. Terminology ----------- Throughout this document we will be using the same visual language to describe how DNA sequences (in the .fastq format) are transformed into sequence alignments (.sam/.bam) and into ligation events (.pairs). .. figure:: _static/terminology.png :scale: 50 % :alt: The visual language to describe transformation of Hi-C data :align: center DNA sequences (reads) are aligned to the reference genome and converted into ligation events Short-read sequencing determines the sequences of the both ends (or, **sides**) of DNA molecules (typically 50-300 bp), producing **read pairs** in .fastq format (shown in the first row on the figure above). In such reads, base pairs are reported from the tips inwards, which is also defined as the **5'->3'** direction (in accordance of the 5'->3' direction of the DNA strand that sequence of the corresponding side of the read). Alignment software maps both reads of a pair to the reference genome, producing **alignments**, i.e. segments of the reference genome with matching sequences. Typically, if the read length is not very large (< 150 bp), there will be only two alignments per read pair, one on each side. But, sometimes, the parts of one or both sides may map to different locations on the genome, producing more than two alignments per DNA molecule (see :ref:`section-walks`). ``pairtools parse`` converts alignments into **ligation events** (aka **Hi-C pairs** aka **pairs**). In the simplest case, when each side has only one unique alignment (i.e. the whole side maps to a single unique segment of the genome), for each side, we report the chromosome, the genomic position of the outer-most (5') aligned base pair and the strand of the reference genome that the read aligns to. ``pairtools parse`` assigns to such pairs the type ``UU`` (unique-unique). Unmapped/multimapped reads -------------------------- Sometimes, one side or both sides of a read pair may not align to the reference genome: .. figure:: _static/read_pair_NU_NN.png :scale: 50 % :alt: Read pairs missing an alignment on one or both sides :align: center Read pairs missing an alignment on one or both sides In this case, ``pairtools parse`` fills in the chromosome of the corresponding side of Hi-C pair with ``!``, the position with ``0`` and the strand with ``-``. Such pairs are reported as type ``NU`` (null-unique, when the other side has a unique alignment) or ``NN`` (null-null, when both sides lack any alignment). Similarly, when one or both sides map to many genome locations equally well (i.e. have non-unique, or, multi-mapping alignments), ``pairtools parse`` reports the corresponding sides as (chromosome= ``!``, position= ``0``, strand= ``-``) and type ``MU`` (multi-unique) or ``MM`` (multi-multi) or ``NM`` (null-multi), depending on the type of the alignment on the other side. .. figure:: _static/read_pair_MU_MM_NM.png :scale: 50 % :alt: Read pairs with a non-unique alignment on one or both sides :align: center Read pairs with a non-unique (multi-) alignment on one side ``pairtools parse`` calls an alignment to be multi-mapping when its `MAPQ score `_ (which depends on the scoring gap between the two best candidate alignments for a segment) is equal or greater than the value specied with the ``--min-mapq`` flag (by default, 1). .. _section-walks: Multiple ligations (walks) -------------------------- If the read is long enough (e.g. larger than 150 bp), it may contain more than two alignments: .. figure:: _static/read_pair_WW.png :scale: 50 % :alt: A sequenced Hi-C molecule that was formed via multiple ligations :align: center A sequenced Hi-C molecule that was formed via multiple ligations Molecules like these typically form via multiple ligation events and we call them walks [1]_. The mode of walks reporting is controlled by ``--walks-policy`` parameter of ``pairtools parse``. You can report all the alignments in the reads by using ``pairtools parse2`` (see :ref:`parse2`). A pair of sequential alignments on a single read is **ligation junction**. Ligation junctions are the Hi-C contacts that have been directly observed in the experiment. However, traditional Hi-C pairs do not have direct evidence of ligation because they arise from read pairs that do not necessarily contain ligation junction. To filter out the molecules with complex walks, ``--walks-policy`` can be set to: - ``mask`` to tag these molecules as type ``WW`` (single ligations are rescued, see :ref:`Rescuing single ligations`), - ``5any`` to report the 5'-most alignment on each side, - ``5unique`` to report the 5'-most unique alignment on each side, - ``3any`` to report the 3'-most alignment on each side, - ``3unique`` to report the 3'-most unique alignment on each side, - ``all`` to report all sequential alignments (complex ligations are rescued, see :ref:`Rescuing complex walks`). Parse modes for walks: .. figure:: _static/rescue_modes.svg :width: 60 % :alt: Parse modes for walks :align: center Rescuing single ligations ------------------------- Importantly, some of DNA molecules containing only one ligation junction may still end up with three alignments: .. figure:: _static/read_pair_UR.png :scale: 50 % :alt: Not all read pairs with three alignments come from "walks" :align: center Not all read pairs with three alignments come from "walks" A molecule formed via a single ligation gets three alignments when one of the two ligated DNA pieces is shorter than the read length, such that that read on the corresponding side sequences through the ligation junction and into the other piece [2]_. The amount of such molecules depends on the type of the restriction enzyme, the typical size of DNA molecules in the Hi-C library and the read length, and sometimes can be considerable. ``pairtools parse`` detects such molecules and **rescues** them (i.e. changes their type from a *walk* to a single-ligation molecule). It tests walks with three aligments using three criteria: .. figure:: _static/read_pair_UR_criteria.png :scale: 50 % :alt: The three criteria used for "rescue" :align: center The three criteria used to "rescue" three-alignment walks: cis, point towards each other, short distance 1. On the side with two alignments (the **chimeric** side), the "inner" (or, 3') alignment must be on the same chromosome as the alignment on the non-chimeric side. 2. The "inner" alignment on the chimeric side and the alignment on the non-chimeric side must point toward each other. 3. These two alignments must be within the distance specified with the ``--max-molecule-size`` flag (by default, 2000bp). Sometimes, the "inner" alignment on the chimeric side can be non-unique or "null" (i.e. when the unmapped segment is longer than ``--max-inter-align-gap``, as described in :ref:`Interpreting gaps between alignments`). ``pairtools parse`` ignores such alignments altogether and thus rescues such *walks* as well. .. figure:: _static/read_pair_UR_MorN.png :scale: 50 % :alt: A walk with three alignments get rescued, when the middle alignment is multi- or null :align: center A walk with three alignments get rescued, when the middle alignment is multi- or null. Interpreting gaps between alignments ------------------------------------ Reads that are only partially aligned to the genome can be interpreted in two different ways. One possibility is to assume that this molecule was formed via at least two ligations (i.e. it's a *walk*) but the non-aligned part (a **gap**) was missing from the reference genome for one reason or another. Another possibility is to simply ignore this gap (for example, because it could be an insertion or a technical artifact), thus assuming that our molecule was formed via a single ligation and has to be reported: .. figure:: _static/read_pair_gaps_vs_null_alignment.png :scale: 50 % :alt: A gap between alignments can be ignored or interpeted as a "null" alignment :align: center A gap between alignments can interpeted as a legitimate segment without an alignment or simply ignored Both options have their merits, depending on a dataset, quality of the reference genome and sequencing. ``pairtools parse`` ignores shorter *gaps* and keeps longer ones as "null" alignments. The maximal size of ignored *gaps* is set by the ``--max-inter-align-gap`` flag (by default, 20bp). Rescuing complex walks ------------------------- We call the multi-fragment DNA molecule that is formed during Hi-C (or any other chromosome capture with sequencing) a walk. If the reads are long enough, the right (reverse) read might read through the left (forward) read. Thus, left read might span multiple ligation junctions of the right read. The pairs of contacts that overlap between left and right reads are intermolecular duplicates that should be removed. If the walk has no more than two different fragments at one side of the read, this can be rescued with simple ``pairtools parse --walks-policy mask``. However, in complex walks (two fragments on both reads or more than two fragments on any side) you need specialized functionality that will report all the deduplicated pairs in the complex walks. This is especially relevant if you have the reads length > 100 bp, since more than 20% or all restriction fragments in the genome are then shorter than the read length. We put together some statistics about number of short restriction fragments for DpnII enzyme: ======== ================= ================== ================== ================== ================== Genome #rfrags <50 bp <100 bp <150 bp <175 bp <200 bp -------- ----------------- ------------------ ------------------ ------------------ ------------------ hg38 828538 (11.5%) 1452918 (20.2%) 2121479 (29.5%) 2587250 (35.9%) 2992757 (41.6%) mm10 863614 (12.9%) 1554461 (23.3%) 2236609 (33.5%) 2526150 (37.9%) 2780769 (41.7%) dm3 65327 (19.6%) 108370 (32.5%) 142662 (42.8%) 156886 (47.1%) 169339 (50.9%) ======== ================= ================== ================== ================== ================== Consider the read with overlapping left and right sides: .. figure:: _static/rescue_modes_readthrough.svg :width: 60 % :alt: Complex walk with overlap :align: center ``pairtools`` can detect such molecules and parse them. Briefly, we detects all the unique ligation junctions, and do not report the same junction as a pair multiple times. To parse complex walks, you may use ``pairtools parse --walks-policy all`` and ``parse2``, which have slightly different functionalities. ``pairtools parse --walks-policy all`` is used with regular paired-end Hi-C, when you want all pairs in the walk to be reported as if they appeared in the sequencing data independently. ``parse2`` is used with single-end data or when you want to customize your reporting (orientation, position of alignments, or perform combinatorial expansion). For example, ``parse2`` defaults to reporting ligation junctions instead of outer ends of the alignments. The complete guide through the reporting options of ``parse2``, orientation: .. figure:: _static/report-orientation.svg :width: 60 % :alt: parse2 --report-orientation :align: center position: .. figure:: _static/report-positions.svg :width: 60 % :alt: parse2 --report-position :align: center Sometimes it is important to restore the sequence of ligation events (e.g., for MC-3C data). For that, you can add special columns ``walk_pair_index`` and ``walk_pair_type`` by setting ``--add-pair-index`` option of ``parse2``, that will keep the order and type of pair in the whole walk in the output .pairs file. - ``walk_pair_index`` contains information on the order of the pair in the complex walk, starting from 5'-end of left read - ``walk_pair_type`` describes the type of the pair relative to R1 and R2 reads of paired-end sequencing: - "R1-2" - unconfirmed pair, right and left alignments in the pair originate from different reads (left or right). This might be indirect ligation (mediated by other DNA fragments). - "R1" - pair originates from the left read. This is direct ligation. - "R2" - pair originated from the right read. Direct ligation. - "R1&2" - pair was sequenced at both left and right read. Direct ligation. With this information, the whole sequence of ligation events can be restored from the .pair file. Combinatorial expansion is a way to increase the number of contacts in you data, which assumes that all DNA fragments in the same molecule (read) are in contact. Use ``--expand`` parameter for combinatorial expansion. Note that expanded pairs have modified pair type, "E{separation}_{pair type}", e.g.: - "E1_R1" is a pair obtained by combining left alignment of some pair in R1 read and right alignment of the next pair in R1 sequence of the same read. - "E2_R1" is a pair obtained by combining left alignment of some pair in R1 read and right alignment of the pair separated by 2 alignments in R1 sequence of the same read. - "E2_R1&2" as above, both source pairs were sequenced on both R1 and R2. - "E4_R1-2" is a pair obtained by combining left alignment of some pair in R1 read and right alignment of some pair in R1 sequence, separated by at least 4 alignments in between. Note that "-" in the pair type means that pair is separated by unsequenced gap, which may contain other pairs. Aligner settings ----------------- We recommended using local DNA sequence aligners, such as `BWA-MEM `_ and `Bowtie2 `_ (in the local alignment mode), as opposed to global aligners (e.g. Bowtie2 in the end-to-end mode). Local aligners assume that DNA molecules may contain fragments aligning to different locations in the genome and thus are better suited for mapping chimeric Hi-C molecules. Aligning Hi-C reads may further require adjusting aligner settings. Some aligners assume DNA libraries contain only contiguous fragments, leading to 'mate rescue' where one read's alignment is modified or even forced based on its pair's alignment. This behavior is incompatible with Hi-C, which produces chimeric molecules with unrelated alignments on each side. To avoid erroneous results, disable mate rescue/pairing and align reads pairs independently. In `bwa mem`, use the '-SP' flags to achieve this. .. [1] Following the lead of `C-walks `_ .. [2] This procedure was first introduced in `HiC-Pro `_ and the in `Juicer `_ . pairtools-1.1.3/doc/protocols_pipelines.rst000066400000000000000000000147311474715105500211420ustar00rootroot00000000000000Workflows and Parameters ======================== This page provides guidance on using pairtools for the most common Hi-C protocols and helps users fine-tune the pipeline for different variations of the Hi-C protocol. It covers recommended parameters and best practices for processing Hi-C data using pairtools. Typical Hi-C Workflow ---------------------- A typical pairtools workflow for processing standard Hi-C data is outlined below. Please, note that this is a shorter version. For a detailed reproducible example, please, check the Jupyter notebook "Pairtools Walkthrough". 1. Align sequences to the reference genome with ``bwa mem``: .. code-block:: console bwa mem -SP index_file input.R1.fastq input.R2.fastq > input.sam 2. Parse alignments into Hi-C pairs using ``pairtools parse``: .. code-block:: console pairtools parse -c /path/to/chrom_sizes -o output.pairs.gz input.sam 3. Sort pairs using ``pairtools sort``: .. code-block:: console pairtools sort --nproc 8 -o output.sorted.pairs.gz output.pairs.gz 4. Detect and remove duplicates using ``pairtools dedup`` and generate statistics: .. code-block:: console pairtools dedup \ --output output.nodups.pairs.gz \ --output-dups output.dups.pairs.gz \ --output-unmapped output.unmapped.pairs.gz --output-stats output.dedup.stats \ output.sorted.pairs.gz 5. Aggregate into a cooler file: .. code-block:: console cooler cload pairs -c1 2 -p1 3 -c2 4 -p2 5 /path/to/chrom_sizes:1000 output.nodups.pairs.gz output.1000.cool Recommended pairtools parameters for standard Hi-C protocols ------------------------------------------------------------ To adapt the standard workflow for common variations of the Hi-C protocol, consider adjusting the following parameters: 1. ``pairtools parse --walks-policy``: This parameter determines how pairtools parse handles reads with multiple alignments (walks). We recommend specifying the value explicitly, as the default has changed between versions of ``pairtools parse``. Our current recommendation is to use ``--walks-policy 5unique``, which is the default setting in the latest version of pairtools. With this option, pairtools parse reports the two 5'-most unique alignments on each side of a paired read as a pair. This option increases the number of reported pairs compared to the most conservative ``--walks-policy mask``. However, it's important to note that ``5unique`` can potentially report pairs of non-directly ligated fragments (i.e., two fragments separated by one or more other DNA fragments). Such non-direct (also known as "higher-order" or "nonadjacent") ligations have slightly different statistical properties than direct ligations, as illustrated in several Pore-C papers [`1 `_ , `2 `_]. An alternative is the ``--walks-policy 3unique`` policy, which reports the two 3'-most unique alignments on each side of a paired read as a pair, thus decreasing the chance of reporting non-direct ligations. However, ``3unique`` may not work well in situations where the combined length of a read pair is longer than the length of a DNA fragment (e.g. long read experiments). In this case, the 3' sides of the two reads will cover the same locations in the DNA molecule, and the 3' alignments may end up identical. Finally, the experimental ``--walks-policy all`` option reports all alignments of a read pair as separate pairs. This option maximizes the number of reported pairs. The downside is that it breaks the assumption that there is only one pair per read, which is not compatible with retrieval of .sam records from .pairsam output and may also complicate the interpretation of pair statistics. 2. ``pairtools select "(mapq1>=30) and (mapq2>=30)"``: This filtering command selects only pairs with high-quality alignments, where both reads in a pair have a mapping quality (MAPQ) score of 30 or higher. Applying this filter helps remove false alignments between partially homologous sequences, which often cause artificial high-frequency interactions in Hi-C maps. This step is essential for generating maps for high-quality dot calls. Note that we recommend storing the most comprehensive, unfiltered list of pairs and applying the filter on the fly prior to contact aggregation: .. code-block:: console pairtools select "(mapq1>=30) and (mapq2>=30)" output.nodups.pairs.gz | \ cooler cload pairs -c1 2 -p1 3 -c2 4 -p2 5 chromsizes.txt:1000 - output.mapq_30.1000.cool Technical tips -------------- - **Pipe between commands to save space and I/O throughput** Use Unix pipes to connect the output of one command directly to the input of the next command in the pipeline. This eliminates the need to store intermediate files on disk, saving storage space and reducing I/O overhead. Specifically, mapping, parsing, sorting and deduplication can all be connected into a single pipeline: .. code-block:: console bwa mem -SP index input.R1.fastq input.R2.fastq | \ pairtools parse -c chromsizes.txt | \ pairtools sort | \ pairtools dedup | \ --output output.nodups.pairs.gz \ --output-dups output.dups.pairs.gz \ --output-unmapped output.unmapped.pairs.gz --output-stats output.dedup.stats - **Use recommended compression for efficient storage and processing.** .sam, .pairs and .pairsam files are text-based format that are rather inefficient and slow to process. Pairtools recognize .bam, .gz and .lz4 file extensions and automatically compress and decompress files on the fly. Compression saves space, and reduces I/O overhead at a relatively minor CPU cost. - **Parallelize tasks and manage resources effectively for faster execution.** Each pairtool has the CLI flags --nproc-in and --nproc-out to control the number of cores dedicated to input decompression and output compression. Additionally, `pairtools sort` parallelizes sorting with `--nproc`.ß Advanced Workflows ------------------ For more advanced workflows, please check the following projects: - `Distiller-nf `_ is a feature-rich Open2C Hi-C processing pipeline for the Nextflow workflow manager. - `Distiller-sm `_ is a similarly feature-rich and optimized pipeline implemented in Snakemake. pairtools-1.1.3/doc/quickstart.rst000066400000000000000000000024131474715105500172320ustar00rootroot00000000000000Quickstart ========== Install `pairtools` and all of its dependencies using the `conda `_ package manager and the `bioconda `_ channel for bioinformatics software. .. code-block:: bash $ conda install -c conda-forge -c bioconda pairtools Setup a new test folder and download a small Hi-C dataset mapped to sacCer3 genome: .. code-block:: bash $ mkdir /tmp/test-pairtools $ cd /tmp/test-pairtools $ wget https://github.com/open2c/distiller-test-data/raw/master/bam/MATalpha_R1.bam Additionally, we will need a .chromsizes file, a TAB-separated plain text table describing the names, sizes and the order of chromosomes in the genome assembly used during mapping: .. code-block:: bash $ wget https://raw.githubusercontent.com/open2c/distiller-test-data/master/genome/sacCer3.reduced.chrom.sizes With `pairtools parse`, we can convert paired-end sequence alignments stored in .sam/.bam format into .pairs, a TAB-separated table of Hi-C ligation junctions: .. code-block:: bash $ pairtools parse -c sacCer3.reduced.chrom.sizes -o MATalpha_R1.pairs.gz --drop-sam MATalpha_R1.bam Inspect the resulting table: .. code-block:: bash $ less MATalpha_R1.pairs.gz pairtools-1.1.3/doc/sorting.rst000066400000000000000000000076131474715105500165340ustar00rootroot00000000000000Sorting pairs ============= In order to enable efficient random access to Hi-C pairs, we **flip** and **sort** pairs. After sorting, interactions become arranged in the order of their genomic position, such that, for any given pair of regions, we easily find and extract all of their interactions. And, after flipping, all artificially duplicated molecules (either during PCR or in optical sequencing) end up in adjacent rows in sorted lists of interactions, such that we can easily identify and remove them. Sorting ------- ``pairtools sort`` arrange pairs in the order of (chrom1, chrom2, pos1, pos2). This order is also known as *block sorting*, because all pairs between any given pair of chromosomes become grouped into one continuous block. Additionally, ``pairtools sort`` also sorts pairs with identical positions by `pair_type`. This does not really do much for mapped reads, but it nicely splits unmapped reads into blocks of null-mapped and multi-mapped reads. We note that there is an alternative to block sorting, called *row sorting*, where pairs are sorted by (chrom1, pos1, chrom2, pos2). In `pairtools sort`, we prefer block-sorting since it cleanly separates cis interactions from trans ones and thus is a more optimal solution for typical use cases. Flipping -------- In a typical paired-end experiment, *side1* and *side2* of a DNA molecule are defined by the order in which they got sequenced. Since this order is essentially random, any given Hi-C pair, e.g. (chr1, 1.1Mb; chr2, 2.1Mb), may appear in a reversed orientation, i.e. (chr2, 2.1Mb; chr1, 1.1Mb). If we were to preserve this order of sides, interactions between same loci would appear in two different locations of the sorted pair list, which would complicate finding PCR/optical duplicates. To ensure that Hi-C pairs with similar coordinates end up in the same location of the sorted list, we **flip** pairs, i.e. we choose *side1* as the side with the lowest genomic coordinate. Thus, after flipping, for *trans* pairs (chrom1!=chrom2), order(chrom1)`_), - number of contacts between all chromosome pairs - **Summary statistics** include: - fraction of duplicates - fraction of cis interactions (at different minimal distance cutoffs) out of total - estimation of library complexity Summary statistics can inform you about the quality of the data. For example, more trans interactions can be a sign of problems with the 3C+ procedure and lower signal-to-noise ratio. Substantial mapping to mitochondrial chromosome (chrM) might be a sign of random ligation. - **P(s), or scaling.** The dependence of contact frequency on the genomic distance referred to as the P(s) curve or scaling, which is a rich source of both biologically relevant information and technical quality of 3C+ experiments. The shape of P(s) is often used to characterize mechanisms of genome folding and reveal issues with QC. Interactive visualization of stats with MultiQC --------- Install `multiqc`: .. code-block:: bash pip install --upgrade --force-reinstall git+https://github.com/open2c/MultiQC.git Note that (for now) the pairtools module for MultiQC is only available in the open2C fork and not in the main MultiQC repository. Run MultiQC in a folder with one or multiple .stats files: .. code-block:: bash multiqc . This will produce a nice .html file with interactive graphical summaries of the stats. Estimating library complexity ---------------------------- Pairtools assumes that each sequencing read is randomly chosen with replacement from a finite pool of fragments in DNA library [1]_ [2]_. With each new sequenced molecule, the expected number of observed unique molecules increases according to a simple equation: .. math:: U(N+1) = U(N) + \left(1 - \frac{U(N)}{C} \right), where :math:`N` is the number of sequenced molecules, :math:`U(N)` is the expected number of observed unique molecules after sequencing :math:`N` molecules, and :math:`C` is the library complexity. This differential equation yields [1, 2]: .. math:: {U(N) \over C} = 1 - exp\left( - \frac{N}{C} \right), which can be solved as .. math:: C = \Re \left( W_{Lambert} \left( - \frac{ \exp\left( - \frac{1}{U} \right) } {U} \right) \right) + \frac{1}{U} Library complexity can guide in the choice of sequencing depth of the library and provide an estimate of library quality. Illumina sequencing duplicates ----------------- Importantly, you can estimate the complexity of Hi-C libraries using only small QC samples to decide if their quality permits deeper sequencing [3]_. These estimates, however, can be significantly biased by the presence of “optical” or “clustering” duplicates. Such duplicates occur as artefacts of the sequencing procedure. Optical duplicates appear in data generated on sequencers with non-patterned flowcells in cases the instrument either erroneously splits a signal from a single sequenced molecule into two. On the other hand, clustering duplicates appear on patterned flowcells, when during cluster generation a cluster occupies adjacent nanowells. [4]_. The rate of optical and clustering duplication depends on the technology and the operating conditions (e.g. molarity of the library loaded onto the flowcell), but not on the library complexity or sequencing depth. Thus, in small sequencing samples in particular the clustering duplication on recent Illumina instruments can severely inflate the observed levels of duplication [5]_, resulting in underestimation of the library complexity. While the frequency of PCR duplicates increases with sequencing depth, optical or clustering duplication levels may stay constant for a particular sequencer, provided the library is loaded at the same molarity. This means that the high frequency of clustering duplicates on the NovaSeq leads to severe underestimation of library complexity in the pilot runs. In particular, the recent models of Illumina sequencers with patterned flowcells (such as NovaSeq) suffer from increased clustering duplication rate, which may far exceed the level of PCR duplication. Luckily, optical and clustering duplicates can be distinguished from the PCR ones, as the former are located next to each other on the sequencing flow cell. In case of Illumina sequencers, pairtools dedup can infer the positions of sequencing reads from their IDs and focuses on geometrically distant duplicates to produce unbiased estimates of PCR duplication and library complexity. Although SRA does not store original read IDs from the sequencer, this analysis is possible when pairtools is run on a dataset with original Illumina-generated read IDs. Note that in our experience even when accounting for optical/clustering duplicates, the complexity can be greatly underestimated, but is still a useful measurement to choose the most complex libraries. .. [1] Picard. http://broadinstitute.github.io/picard/ .. [2] Thread: [Samtools-help] Pickard estimate for the size of a library - wrong or non-transparent? https://sourceforge.net/p/samtools/mailman/samtools-help/thread/DUB405-EAS154589A1ACEF2BE4C573D4592180@phx.gbl/ .. [3] Rao, S. S. P. et al. A 3D map of the human genome at kilobase resolution reveals principles of chromatin looping. Cell 159, 1665–1680 (2014). .. [4] Duplicates on Illumina. BioStars. https://www.biostars.org/p/229842/ .. [5] Illumina Patterned Flow Cells Generate Duplicated Sequences. https://sequencing.qcfail.com/articles/illumina-patterned-flow-cells-generate-duplicated-sequences/pairtools-1.1.3/pairtools/000077500000000000000000000000001474715105500155555ustar00rootroot00000000000000pairtools-1.1.3/pairtools/__init__.py000066400000000000000000000002601474715105500176640ustar00rootroot00000000000000""" pairtools ~~~~~~~~~ CLI tools to process mapped Hi-C data :copyright: (c) 2017-2024 Open2C :author: Open2C :license: MIT """ __version__ = "1.1.3" # from . import lib pairtools-1.1.3/pairtools/__main__.py000066400000000000000000000000731474715105500176470ustar00rootroot00000000000000from .cli import cli if __name__ == "__main__": cli() pairtools-1.1.3/pairtools/_logging.py000066400000000000000000000006221474715105500177140ustar00rootroot00000000000000import logging _loggers = {} def get_logger(name="pairtools"): # Based on ipython traitlets global _loggers if name not in _loggers: _loggers[name] = logging.getLogger(name) # Add a NullHandler to silence warnings about not being # initialized, per best practice for libraries. _loggers[name].addHandler(logging.NullHandler()) return _loggers[name] pairtools-1.1.3/pairtools/cli/000077500000000000000000000000001474715105500163245ustar00rootroot00000000000000pairtools-1.1.3/pairtools/cli/__init__.py000066400000000000000000000125201474715105500204350ustar00rootroot00000000000000# -*- coding: utf-8 -*- import click import functools import sys from .. import __version__ import logging from .._logging import get_logger CONTEXT_SETTINGS = { "help_option_names": ["-h", "--help"], } @click.version_option(version=__version__) @click.group(context_settings=CONTEXT_SETTINGS) @click.option( "--post-mortem", help="Post mortem debugging", is_flag=True, default=False ) @click.option( "--output-profile", help="Profile performance with Python cProfile and dump the statistics " "into a binary file", type=str, default="", ) @click.option("-v", "--verbose", help="Verbose logging.", count=True) @click.option( "-d", "--debug", help="On error, drop into the post-mortem debugger shell.", is_flag=True, default=False, ) def cli(post_mortem, output_profile, verbose, debug): """Flexible tools for Hi-C data processing. All pairtools have a few common options, which should be typed _before_ the command name. """ if post_mortem: import traceback try: import ipdb as pdb except ImportError: import pdb def _excepthook(exc_type, value, tb): traceback.print_exception(exc_type, value, tb) print() pdb.pm() sys.excepthook = _excepthook if output_profile: import cProfile import atexit pr = cProfile.Profile() pr.enable() def _atexit_profile_hook(): pr.disable() pr.dump_stats(output_profile) atexit.register(_atexit_profile_hook) # Initialize logging to stderr logging.basicConfig(stream=sys.stderr) logging.captureWarnings(True) root_logger = get_logger() # Set verbosity level if verbose > 0: root_logger.setLevel(logging.DEBUG) if verbose > 1: # pragma: no cover try: import psutil import atexit @atexit.register def process_dump_at_exit(): process_attrs = [ "cmdline", # 'connections', "cpu_affinity", "cpu_num", "cpu_percent", "cpu_times", "create_time", "cwd", # 'environ', "exe", # 'gids', "io_counters", "ionice", "memory_full_info", # 'memory_info', # 'memory_maps', "memory_percent", "name", "nice", "num_ctx_switches", "num_fds", "num_threads", "open_files", "pid", "ppid", "status", "terminal", "threads", # 'uids', "username", ] p = psutil.Process() info_ = p.as_dict(process_attrs, ad_value="") for key in process_attrs: root_logger.debug("PSINFO:'{}': {}".format(key, info_[key])) except ImportError: root_logger.warning("Install psutil to see process information.") else: root_logger.setLevel(logging.INFO) # Set hook for postmortem debugging if debug: # pragma: no cover import traceback try: import ipdb as pdb except ImportError: import pdb def _excepthook(exc_type, value, tb): traceback.print_exception(exc_type, value, tb) print() pdb.pm() sys.excepthook = _excepthook def common_io_options(func): @click.option( "--nproc-in", type=int, default=3, show_default=True, help="Number of processes used by the auto-guessed input decompressing command.", ) @click.option( "--nproc-out", type=int, default=8, show_default=True, help="Number of processes used by the auto-guessed output compressing command.", ) @click.option( "--cmd-in", type=str, default=None, help="A command to decompress the input file. " "If provided, fully overrides the auto-guessed command. " "Does not work with stdin and pairtools parse. " "Must read input from stdin and print output into stdout. " "EXAMPLE: pbgzip -dc -n 3", ) @click.option( "--cmd-out", type=str, default=None, help="A command to compress the output file. " "If provided, fully overrides the auto-guessed command. " "Does not work with stdout. " "Must read input from stdin and print output into stdout. " "EXAMPLE: pbgzip -c -n 8", ) @functools.wraps(func) def wrapper(*args, **kwargs): return func(*args, **kwargs) return wrapper from . import ( dedup, sort, flip, merge, markasdup, select, split, restrict, phase, parse, parse2, stats, sample, filterbycov, header, scaling, ) pairtools-1.1.3/pairtools/cli/dedup.py000066400000000000000000000446421474715105500200110ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import ast import pathlib from .._logging import get_logger logger = get_logger() import click from ..lib import fileio, headerops, pairsam_format from ..lib.dedup import streaming_dedup, streaming_dedup_cython from ..lib.stats import PairCounter from . import cli, common_io_options UTIL_NAME = "pairtools_dedup" @cli.command() @click.argument("pairs_path", type=str, required=False) ### Output files: @click.option( "-o", "--output", type=str, default="", help="output file for pairs after duplicate removal." " If the path ends with .gz or .lz4, the output is bgzip-/lz4c-compressed." " By default, the output is printed into stdout.", ) @click.option( "--output-dups", type=str, default="", help="output file for duplicated pairs. " " If the path ends with .gz or .lz4, the output is bgzip-/lz4c-compressed." " If the path is the same as in --output or -, output duplicates together " " with deduped pairs. By default, duplicates are dropped.", ) @click.option( "--output-unmapped", type=str, default="", help="output file for unmapped pairs. " "If the path ends with .gz or .lz4, the output is bgzip-/lz4c-compressed. " "If the path is the same as in --output or -, output unmapped pairs together " "with deduped pairs. If the path is the same as --output-dups, output " "unmapped reads together with dups. By default, unmapped pairs are dropped.", ) @click.option( "--output-stats", type=str, default="", help="output file for duplicate statistics." " If file exists, it will be open in the append mode." " If the path ends with .gz or .lz4, the output is bgzip-/lz4c-compressed." " By default, statistics are not printed.", ) @click.option( "--output-bytile-stats", type=str, default="", help="output file for duplicate statistics." " Note that the readID should be provided and contain tile information for this option. " " This analysis is possible when pairtools is run on a dataset with original Illumina-generated read IDs, " " because SRA does not store original read IDs from the sequencer. " " By default, by-tile duplicate statistics are not printed. " " If file exists, it will be open in the append mode. " " If the path ends with .gz or .lz4, the output is bgzip-/lz4c-compressed.", ) ### Set the dedup method: @click.option( "--max-mismatch", type=int, default=3, show_default=True, help="Pairs with both sides mapped within this distance (bp) from each " "other are considered duplicates. [dedup option]", ) @click.option( "--method", type=click.Choice(["max", "sum"]), default="max", help="define the mismatch as either the max or the sum of the mismatches of" "the genomic locations of the both sides of the two compared molecules. [dedup option]", show_default=True, ) @click.option( "--backend", type=click.Choice(["scipy", "sklearn", "cython"]), default="scipy", help="What backend to use: scipy and sklearn are based on KD-trees," " cython is online indexed list-based algorithm." " With cython backend, duplication is not transitive with non-zero max mismatch " " (e.g. pairs A and B are duplicates, and B and C are duplicates, then A and C are " " not necessary duplicates of each other), while with scipy and sklearn it's " " transitive (i.e. A and C are necessarily duplicates)." " Cython is the original version used in pairtools since its beginning." " It is available for backwards compatibility and to allow specification of the" " column order." " Now the default scipy backend is generally the fastest, and with chunksize below" " 1 mln has the lowest memory requirements. [dedup option]", # " 'cython' is deprecated and provided for backwards compatibility", ) ### Scipy and sklearn-specific options: @click.option( "--chunksize", type=int, default=10_000, show_default=True, help="Number of pairs in each chunk. Reduce for lower memory footprint." " Below 10,000 performance starts suffering significantly and the algorithm might" " miss a few duplicates with non-zero --max-mismatch." " Only works with '--backend scipy or sklearn'. [dedup option]", ) @click.option( "--carryover", type=int, default=100, show_default=True, help="Number of deduped pairs to carry over from previous chunk to the new chunk" " to avoid breaking duplicate clusters." " Only works with '--backend scipy or sklearn'. [dedup option]", ) @click.option( "-p", "--n-proc", type=int, default=1, help="Number of cores to use. Only applies with sklearn backend." "Still needs testing whether it is ever useful. [dedup option]", ) ### Output options: @click.option( "--mark-dups/--no-mark-dups", default=True, is_flag=True, help='Specify if duplicate pairs should be marked as DD in "pair_type" and ' "as a duplicate in the sam entries. True by default. [output format option]", ) @click.option( "--keep-parent-id", is_flag=True, help="If specified, duplicate pairs are marked with the readID of the retained" " deduped read in the 'parent_readID' field. [output format option]", ) @click.option( "--extra-col-pair", nargs=2, # type=click.Tuple([str, str]), multiple=True, help="Extra columns that also must match for two pairs to be marked as " "duplicates. Can be either provided as 0-based column indices or as column " 'names (requires the "#columns" header field). The option can be provided ' "multiple times if multiple column pairs must match. " 'Example: --extra-col-pair "phase1" "phase2". [output format option]', ) ### Input options: @click.option( "--sep", type=str, default=pairsam_format.PAIRSAM_SEP_ESCAPE, help=r"Separator (\t, \v, etc. characters are " "supported, pass them in quotes). [input format option]", ) @click.option( "--send-header-to", type=click.Choice(["dups", "dedup", "both", "none"]), default="both", help="Which of the outputs should receive header and comment lines. [input format option]", ) @click.option( "--c1", type=str, default=pairsam_format.COLUMNS_PAIRS[1], help=f"Chrom 1 column; default {pairsam_format.COLUMNS_PAIRS[1]}" "[input format option]", ) @click.option( "--c2", type=str, default=pairsam_format.COLUMNS_PAIRS[3], help=f"Chrom 2 column; default {pairsam_format.COLUMNS_PAIRS[3]}" "[input format option]", ) @click.option( "--p1", type=str, default=pairsam_format.COLUMNS_PAIRS[2], help=f"Position 1 column; default {pairsam_format.COLUMNS_PAIRS[2]}" "[input format option]", ) @click.option( "--p2", type=str, default=pairsam_format.COLUMNS_PAIRS[4], help=f"Position 2 column; default {pairsam_format.COLUMNS_PAIRS[4]}" "[input format option]", ) @click.option( "--s1", type=str, default=pairsam_format.COLUMNS_PAIRS[5], help=f"Strand 1 column; default {pairsam_format.COLUMNS_PAIRS[5]}" "[input format option]", ) @click.option( "--s2", type=str, default=pairsam_format.COLUMNS_PAIRS[6], help=f"Strand 2 column; default {pairsam_format.COLUMNS_PAIRS[6]}" "[input format option]", ) @click.option( "--unmapped-chrom", type=str, default=pairsam_format.UNMAPPED_CHROM, help="Placeholder for a chromosome on an unmapped side; default {}".format( pairsam_format.UNMAPPED_CHROM ), ) # Output stats option @click.option( "--yaml/--no-yaml", is_flag=True, default=False, help="Output stats in yaml format instead of table. [output stats format option]", ) # Filtering options for reporting stats: @click.option( "--filter", default=None, required=False, multiple=True, help="Filter stats with condition to apply to the data (similar to `pairtools select` or `pairtools stats`). " "For non-YAML output only the first filter will be reported. [output stats filtering option] " "Note that this will not change the deduplicated output pairs. " """Example: pairtools dedup --yaml --filter 'unique:(pair_type=="UU")' --filter 'close:(pair_type=="UU") and (abs(pos1-pos2)<10)' --output-stats - test.pairs """, ) @click.option( "--engine", default="pandas", required=False, help="Engine for regular expression parsing for stats filtering. " "Python will provide you regex functionality, while pandas does not accept " "custom funtctions and works faster. [output stats filtering option]", ) @click.option( "--chrom-subset", type=str, default=None, required=False, help="A path to a chromosomes file (tab-separated, 1st column contains " "chromosome names) containing a chromosome subset of interest for stats filter. " "If provided, additionally filter pairs with both sides originating from " "the provided subset of chromosomes. This operation modifies the #chromosomes: " "and #chromsize: header fields accordingly. " "Note that this will not change the deduplicated output pairs. [output stats filtering option]", ) @click.option( "--startup-code", type=str, default=None, required=False, help="An auxiliary code to execute before filteringfor stats. " "Use to define functions that can be evaluated in the CONDITION statement. [output stats filtering option]", ) @click.option( "-t", "--type-cast", type=(str, str), default=(), multiple=True, help="Cast a given column to a given type for stats filtering. By default, only pos and mapq " "are cast to int, other columns are kept as str. Provide as " "-t , e.g. -t read_len1 int. Multiple entries are allowed. [output stats filtering option]", ) @common_io_options def dedup( pairs_path, output, output_dups, output_unmapped, output_stats, output_bytile_stats, chunksize, carryover, max_mismatch, method, sep, send_header_to, c1, c2, p1, p2, s1, s2, unmapped_chrom, mark_dups, extra_col_pair, keep_parent_id, backend, n_proc, **kwargs, ): """Find and remove PCR/optical duplicates. Find PCR/optical duplicates in an upper-triangular flipped sorted pairs/pairsam file. Allow for a +/-N bp mismatch at each side of duplicated molecules. PAIRS_PATH : input triu-flipped sorted .pairs or .pairsam file. If the path ends with .gz/.lz4, the input is decompressed by bgzip/lz4c. By default, the input is read from stdin. """ dedup_py( pairs_path, output, output_dups, output_unmapped, output_stats, output_bytile_stats, chunksize, carryover, max_mismatch, method, sep, send_header_to, c1, c2, p1, p2, s1, s2, unmapped_chrom, mark_dups, extra_col_pair, keep_parent_id, backend, n_proc, **kwargs, ) if __name__ == "__main__": dedup() def dedup_py( pairs_path, output, output_dups, output_unmapped, output_stats, output_bytile_stats, chunksize, carryover, max_mismatch, method, sep, send_header_to, c1, c2, p1, p2, s1, s2, unmapped_chrom, mark_dups, extra_col_pair, keep_parent_id, backend, n_proc, **kwargs, ): sep = ast.literal_eval('"""' + sep + '"""') send_header_to_dedup = send_header_to in ["both", "dedup"] send_header_to_dup = send_header_to in ["both", "dups"] instream = fileio.auto_open( pairs_path, mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) outstream = fileio.auto_open( output, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) out_stats_stream = fileio.auto_open( output_stats, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) bytile_dups = False if output_bytile_stats: out_bytile_stats_stream = fileio.auto_open( output_bytile_stats, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) bytile_dups = True if not keep_parent_id: logger.warning( "Force output --parent-readID because --output-bytile-stats provided." ) keep_parent_id = True # generate empty PairCounter if stats output is requested: if output_stats: filter = kwargs.get("filter", None) # Define filters and their properties first_filter_name = "no_filter" # default filter name for full output if filter is not None and len(filter) > 0: first_filter_name = filter[0].split(":", 1)[0] if len(filter) > 1 and not kwargs.get("yaml", False): logger.warn( f"Output the first filter only in non-YAML output: {first_filter_name}" ) filter = dict([f.split(":", 1) for f in filter]) else: filter = None out_stat = PairCounter( bytile_dups=bytile_dups, filters=filter, startup_code=kwargs.get("startup_code", ""), # for evaluation of filters type_cast=kwargs.get("type_cast", ()), # for evaluation of filters engine=kwargs.get("engine", "pandas"), ) else: out_stat = None if not output_dups: outstream_dups = None elif output_dups == "-" or ( pathlib.Path(output_dups).absolute() == pathlib.Path(output).absolute() ): outstream_dups = outstream else: outstream_dups = fileio.auto_open( output_dups, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) if not output_unmapped: outstream_unmapped = None elif output_unmapped == "-" or ( pathlib.Path(output_unmapped).absolute() == pathlib.Path(output).absolute() ): outstream_unmapped = outstream elif ( pathlib.Path(output_unmapped).absolute() == pathlib.Path(output_dups).absolute() ): outstream_unmapped = outstream_dups else: outstream_unmapped = fileio.auto_open( output_unmapped, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) header, body_stream = headerops.get_header(instream) if not any([l.startswith("#sorted") for l in header]): logger.warning( "Pairs file appears not to be sorted, dedup might produce wrong results." ) header = headerops.append_new_pg(header, ID=UTIL_NAME, PN=UTIL_NAME) dups_header = header.copy() if keep_parent_id and len(dups_header) > 0: dups_header = headerops.append_columns(dups_header, ["parent_readID"]) if outstream == outstream_dups: header = dups_header if send_header_to_dedup: outstream.writelines((l + "\n" for l in header)) if send_header_to_dup and outstream_dups and (outstream_dups != outstream): outstream_dups.writelines((l + "\n" for l in dups_header)) if ( outstream_unmapped and (outstream_unmapped != outstream) and (outstream_unmapped != outstream_dups) ): outstream_unmapped.writelines((l + "\n" for l in header)) column_names = headerops.extract_column_names(header) extra_cols1 = [] extra_cols2 = [] if extra_col_pair is not None: for col1, col2 in extra_col_pair: extra_cols1.append(column_names[col1] if col1.isnumeric() else col1) extra_cols2.append(column_names[col2] if col2.isnumeric() else col2) if backend == "cython": # warnings.warn( # "'cython' backend is deprecated and provided only" # " for backwards compatibility", # DeprecationWarning, # ) extra_cols1 = [column_names.index(col) for col in extra_cols1] extra_cols2 = [column_names.index(col) for col in extra_cols2] c1 = column_names.index(c1) c2 = column_names.index(c2) p1 = column_names.index(p1) p2 = column_names.index(p2) s1 = column_names.index(s1) s2 = column_names.index(s2) streaming_dedup_cython( method, max_mismatch, sep, c1, c2, p1, p2, s1, s2, extra_cols1, extra_cols2, unmapped_chrom, body_stream, outstream, outstream_dups, outstream_unmapped, out_stat, mark_dups, keep_parent_id, ) elif backend in ("scipy", "sklearn"): streaming_dedup( in_stream=body_stream, colnames=column_names, chunksize=chunksize, carryover=carryover, method=method, mark_dups=mark_dups, max_mismatch=max_mismatch, extra_col_pairs=list(extra_col_pair), keep_parent_id=keep_parent_id, unmapped_chrom=unmapped_chrom, outstream=outstream, outstream_dups=outstream_dups, outstream_unmapped=outstream_unmapped, out_stat=out_stat, backend=backend, n_proc=n_proc, c1=c1, c2=c2, p1=p1, p2=p2, s1=s1, s2=s2, ) else: raise ValueError("Unknown backend") # save statistics to a file if it was requested: if out_stat: out_stat.save( out_stats_stream, yaml=kwargs.get("yaml", False), # format as yaml filter=( first_filter_name if not kwargs.get("yaml", False) else None ), # output only the first filter if non-YAML output ) if bytile_dups: out_stat.save_bytile_dups(out_bytile_stats_stream) if instream != sys.stdin: instream.close() if outstream != sys.stdout: outstream.close() if outstream_dups and (outstream_dups != outstream): outstream_dups.close() if ( outstream_unmapped and (outstream_unmapped != outstream) and (outstream_unmapped != outstream_dups) ): outstream_unmapped.close() if out_stats_stream: out_stats_stream.close() pairtools-1.1.3/pairtools/cli/filterbycov.py000066400000000000000000000231021474715105500212240ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import ast import warnings import pathlib import click from ..lib import fileio, pairsam_format, headerops, dedup from . import cli, common_io_options from ..lib.filterbycov import streaming_filterbycov from ..lib.stats import PairCounter UTIL_NAME = "pairtools_filterbycov" ###################################### ## TODO: - output stats after filtering ## edit/update mark as dup to mark as multi ################################### @cli.command() @click.argument("pairs_path", type=str, required=False) @click.option( "-o", "--output", type=str, default="", help="output file for pairs from low coverage regions." " If the path ends with .gz or .lz4, the output is bgzip-/lz4c-compressed." " By default, the output is printed into stdout.", ) @click.option( "--output-highcov", type=str, default="", help="output file for pairs from high coverage regions." " If the path ends with .gz or .lz4, the output is bgzip-/lz4c-compressed." " If the path is the same as in --output or -, output duplicates together " " with deduped pairs. By default, duplicates are dropped.", ) @click.option( "--output-unmapped", type=str, default="", help="output file for unmapped pairs. " "If the path ends with .gz or .lz4, the output is bgzip-/lz4c-compressed. " "If the path is the same as in --output or -, output unmapped pairs together " "with deduped pairs. If the path is the same as --output-highcov, " "output unmapped reads together. By default, unmapped pairs are dropped.", ) @click.option( "--output-stats", type=str, default="", help="output file for statistics of multiple interactors. " " If file exists, it will be open in the append mode." " If the path ends with .gz or .lz4, the output is bgzip-/lz4c-compressed." " By default, statistics are not printed.", ) @click.option( "--max-cov", type=int, default=8, help="The maximum allowed coverage per region." ) @click.option( "--max-dist", type=int, default=500, help="The resolution for calculating coverage. For each pair, the local " "coverage around each end is calculated as (1 + the number of neighbouring " "pairs within +/- max_dist bp) ", ) @click.option( "--method", type=click.Choice(["max", "sum"]), default="max", help="calculate the number of neighbouring pairs as either the sum or the max" " of the number of neighbours on the two sides", show_default=True, ) @click.option( "--sep", type=str, default=pairsam_format.PAIRSAM_SEP_ESCAPE, help=r"Separator (\t, \v, etc. characters are " "supported, pass them in quotes) ", ) @click.option( "--comment-char", type=str, default="#", help="The first character of comment lines" ) @click.option( "--send-header-to", type=click.Choice(["lowcov", "highcov", "both", "none"]), default="both", help="Which of the outputs should receive header and comment lines", ) @click.option( "--c1", type=int, default=pairsam_format.COL_C1, help="Chrom 1 column; default {}".format(pairsam_format.COL_C1), ) @click.option( "--c2", type=int, default=pairsam_format.COL_C2, help="Chrom 2 column; default {}".format(pairsam_format.COL_C2), ) @click.option( "--p1", type=int, default=pairsam_format.COL_P1, help="Position 1 column; default {}".format(pairsam_format.COL_P1), ) @click.option( "--p2", type=int, default=pairsam_format.COL_P2, help="Position 2 column; default {}".format(pairsam_format.COL_P2), ) @click.option( "--s1", type=int, default=pairsam_format.COL_S1, help="Strand 1 column; default {}".format(pairsam_format.COL_S1), ) @click.option( "--s2", type=int, default=pairsam_format.COL_S2, help="Strand 2 column; default {}".format(pairsam_format.COL_S2), ) @click.option( "--unmapped-chrom", type=str, default=pairsam_format.UNMAPPED_CHROM, help="Placeholder for a chromosome on an unmapped side; default {}".format( pairsam_format.UNMAPPED_CHROM ), ) @click.option( "--mark-multi", is_flag=True, help='If specified, duplicate pairs are marked as FF in "pair_type" and ' "as a duplicate in the sam entries.", ) @common_io_options def filterbycov( pairs_path, output, output_highcov, output_unmapped, output_stats, max_dist, max_cov, method, sep, comment_char, send_header_to, c1, c2, p1, p2, s1, s2, unmapped_chrom, mark_multi, **kwargs ): """Remove pairs from regions of high coverage. Find and remove pairs with >(MAX_COV-1) neighbouring pairs within a +/- MAX_DIST bp window around either side. Useful for single-cell Hi-C experiments, where coverage is naturally limited by the chromosome copy number. PAIRS_PATH : input triu-flipped sorted .pairs or .pairsam file. If the path ends with .gz/.lz4, the input is decompressed by bgzip/lz4c. By default, the input is read from stdin. """ filterbycov_py( pairs_path, output, output_highcov, output_unmapped, output_stats, max_dist, max_cov, method, sep, comment_char, send_header_to, c1, c2, p1, p2, s1, s2, unmapped_chrom, mark_multi, **kwargs ) def filterbycov_py( pairs_path, output, output_highcov, output_unmapped, output_stats, max_dist, max_cov, method, sep, comment_char, send_header_to, c1, c2, p1, p2, s1, s2, unmapped_chrom, mark_multi, **kwargs ): ## Prepare input, output streams based on selected outputs ## Default ouput stream is low-frequency interactors sep = ast.literal_eval('"""' + sep + '"""') send_header_to_lowcov = send_header_to in ["both", "lowcov"] send_header_to_highcov = send_header_to in ["both", "highcov"] instream = ( fileio.auto_open( pairs_path, mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) if pairs_path else sys.stdin ) outstream = ( fileio.auto_open( output, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) if output else sys.stdout ) out_stats_stream = ( fileio.auto_open( output_stats, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) if output_stats else None ) # generate empty PairCounter if stats output is requested: out_stat = PairCounter() if output_stats else None # output the high-frequency interacting pairs if not output_highcov: outstream_high = None elif output_highcov == "-" or ( pathlib.Path(output_highcov).absolute() == pathlib.Path(output).absolute() ): outstream_high = outstream else: outstream_high = fileio.auto_open( output_highcov, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) # output unmapped pairs if not output_unmapped: outstream_unmapped = None elif output_unmapped == "-" or ( pathlib.Path(output_unmapped).absolute() == pathlib.Path(output).absolute() ): outstream_unmapped = outstream elif ( pathlib.Path(output_unmapped).absolute() == pathlib.Path(output_highcov).absolute() ): outstream_unmapped = outstream_high else: outstream_unmapped = fileio.auto_open( output_unmapped, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) # prepare file headers header, body_stream = headerops.get_header(instream) header = headerops.append_new_pg(header, ID=UTIL_NAME, PN=UTIL_NAME) # header for low-frequency interactors if send_header_to_lowcov: outstream.writelines((l + "\n" for l in header)) # header for high-frequency interactors if send_header_to_highcov and outstream_high and (outstream_high != outstream): outstream_high.writelines((l + "\n" for l in header)) # header for unmapped pairs if ( outstream_unmapped and (outstream_unmapped != outstream) and (outstream_unmapped != outstream_high) ): outstream_unmapped.writelines((l + "\n" for l in header)) # perform filtering of pairs based on low/high-frequency of interaction streaming_filterbycov( method, max_dist, max_cov, sep, c1, c2, p1, p2, s1, s2, unmapped_chrom, body_stream, outstream, outstream_high, outstream_unmapped, out_stat, mark_multi, ) ## FINISHED! # save statistics to a file if it was requested: TO BE TESTED if out_stat: out_stat.save(out_stats_stream) if instream != sys.stdin: instream.close() if outstream != sys.stdout: outstream.close() if outstream_high and (outstream_high != outstream): outstream_high.close() if ( outstream_unmapped and (outstream_unmapped != outstream) and (outstream_unmapped != outstream_high) ): outstream_unmapped.close() if out_stats_stream: out_stats_stream.close() if __name__ == "__main__": filterbycov() pairtools-1.1.3/pairtools/cli/flip.py000066400000000000000000000110601474715105500176260ustar00rootroot00000000000000import sys import click from ..lib import fileio, pairsam_format, headerops from . import cli, common_io_options import warnings UTIL_NAME = "pairtools_flip" @cli.command() @click.argument("pairs_path", type=str, required=False) @click.option( "-c", "--chroms-path", type=str, required=True, help="Chromosome order used to flip interchromosomal mates: " "path to a chromosomes file (e.g. UCSC chrom.sizes or similar) whose " "first column lists scaffold names. Any scaffolds not listed will be " "ordered lexicographically following the names provided.", ) @click.option( "-o", "--output", type=str, default="", help="output file." " If the path ends with .gz or .lz4, the output is bgzip-/lz4c-compressed." " By default, the output is printed into stdout.", ) @common_io_options def flip(pairs_path, chroms_path, output, **kwargs): """Flip pairs to get an upper-triangular matrix. Change the order of side1 and side2 in pairs, such that (order(chrom1) < order(chrom2) or (order(chrom1) == order(chrom2)) and (pos1 <=pos2)) Equivalent to reflecting the lower triangle of a Hi-C matrix onto its upper triangle, resulting in an upper triangular matrix. The order of chromosomes must be provided via a .chromsizes file. PAIRS_PATH : input .pairs/.pairsam file. If the path ends with .gz or .lz4, the input is decompressed by bgzip/lz4c. By default, the input is read from stdin. """ flip_py(pairs_path, chroms_path, output, **kwargs) def flip_py(pairs_path, chroms_path, output, **kwargs): instream = ( fileio.auto_open( pairs_path, mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) if pairs_path else sys.stdin ) outstream = ( fileio.auto_open( output, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) if output else sys.stdout ) chromosomes = headerops.get_chrom_order(chroms_path) chrom_enum = dict( zip( [pairsam_format.UNMAPPED_CHROM] + list(chromosomes), range(len(chromosomes) + 1), ) ) header, body_stream = headerops.get_header(instream) header = headerops.append_new_pg(header, ID=UTIL_NAME, PN=UTIL_NAME) outstream.writelines((l + "\n" for l in header)) column_names = headerops.extract_column_names(header) if len(column_names) == 0: column_names = pairsam_format.COLUMNS chrom1_col = column_names.index("chrom1") chrom2_col = column_names.index("chrom2") pos1_col = column_names.index("pos1") pos2_col = column_names.index("pos2") pair_type_col = ( column_names.index("pair_type") if "pair_type" in column_names else -1 ) col_pairs_to_flip = [ (column_names.index(col), column_names.index(col[:-1] + "2")) for col in column_names if col.endswith("1") and (col[:-1] + "2") in column_names ] for line in body_stream: cols = line.rstrip('\n').split(pairsam_format.PAIRSAM_SEP) is_annotated1 = cols[chrom1_col] in chrom_enum.keys() is_annotated2 = cols[chrom2_col] in chrom_enum.keys() if not is_annotated1 or not is_annotated2: warnings.warn(f"Unannotated chromosomes in the pairs file!") # Flip so that annotated chromosome stands first: if is_annotated1 and not is_annotated2: has_correct_order = True elif is_annotated2 and not is_annotated1: has_correct_order = False elif not is_annotated1 and not is_annotated2: has_correct_order = cols[chrom1_col] < cols[chrom2_col] else: # both are annotated: has_correct_order = (chrom_enum[cols[chrom1_col]], int(cols[pos1_col])) <= ( chrom_enum[cols[chrom2_col]], int(cols[pos2_col]), ) # flipping: if not has_correct_order: for col1, col2 in col_pairs_to_flip: if (col1 < len(cols)) and (col2 < len(cols)): cols[col1], cols[col2] = cols[col2], cols[col1] if pair_type_col != -1 and pair_type_col < len(cols): cols[pair_type_col] = cols[pair_type_col][1] + cols[pair_type_col][0] outstream.write(pairsam_format.PAIRSAM_SEP.join(cols)) outstream.write("\n") if instream != sys.stdin: instream.close() if outstream != sys.stdout: outstream.close() if __name__ == "__main__": flip() pairtools-1.1.3/pairtools/cli/header.py000066400000000000000000000437421474715105500201400ustar00rootroot00000000000000import sys import click import warnings import subprocess from ..lib import fileio, pairsam_format, headerops from ..lib.parse_pysam import AlignmentFilePairtoolized from . import cli, common_io_options UTIL_NAME = "pairtools_header" @cli.group() def header(): """ Manipulate the .pairs/.pairsam header """ pass # Common options for all header tools: def register_subcommand(func): return header.command()( click.argument("pairs_path", type=str, required=False)( click.option( "-o", "--output", type=str, default="", help="output file." " If the path ends with .gz or .lz4, the output is bgzip-/lz4c-compressed." " By default, the output is printed into stdout.", )( click.option( "--nproc-in", type=int, default=1, show_default=True, help="Number of processes used by the auto-guessed input decompressing command.", )( click.option( "--nproc-out", type=int, default=8, show_default=True, help="Number of processes used by the auto-guessed output compressing command.", )( click.option( "--cmd-in", type=str, default=None, help="A command to decompress the input. " "If provided, fully overrides the auto-guessed command. " "Does not work with stdin. " "Must read input from stdin and print output into stdout. " "EXAMPLE: pbgzip -dc -n 3", )( click.option( "--cmd-out", type=str, default=None, help="A command to compress the output. " "If provided, fully overrides the auto-guessed command. " "Does not work with stdout. " "Must read input from stdin and print output into stdout. " "EXAMPLE: pbgzip -c -n 8", )(func) ) ) ) ) ) ) def add_arg_help(func): func.__doc__ = func.__doc__.format( """ PAIRS_PATH : input .pairs/.pairsam file. If the path ends with .gz or .lz4, the input is decompressed by bgzip/lz4c. By default, the input is read from stdin. """ ) return func @register_subcommand @add_arg_help @click.option( "--chroms-path", type=str, default=None, required=False, help="Chromosome order used to flip interchromosomal mates: " "path to a chromosomes file (e.g. UCSC chrom.sizes or similar) whose " "first column lists scaffold names. Any scaffolds not listed will be " "ordered lexicographically following the names provided.", ) @click.option( "--sam-path", type=str, default=None, required=False, help="Input sam file to inherit the header." " Either --sam or --chroms-path should be provided to store the chromosome sizes in the header.", ) @click.option( "--columns", type=click.STRING, default="", help="Report columns describing alignments " "Can take multiple values as a comma-separated list." f"By default, assign standard .pairs columns: {','.join(pairsam_format.COLUMNS)}", ) @click.option( "--extra-columns", type=click.STRING, default="", help="Report extra columns describing alignments " "Can take multiple values as a comma-separated list.", ) @click.option( "--assembly", type=str, default="", help="Name of genome assembly (e.g. hg19, mm10) to store in the pairs header.", ) @click.option( "--no-flip", is_flag=True, help="If specified, assume that the pairs are not filpped in genomic order and instead preserve " "the order in which they were sequenced.", ) @click.option( "--pairs/--pairsam", is_flag=True, default=True, help=f"If pairs, then the defult columns will be set to: {','.join(pairsam_format.COLUMNS_PAIRS)}" f"\nif pairsam, then to: {','.join(pairsam_format.COLUMNS_PAIRSAM)}", ) def generate(pairs_path, output, chroms_path, sam_path, columns, assembly, **kwargs): """ Generate the header """ generate_py(pairs_path, output, chroms_path, sam_path, columns, assembly, **kwargs) def generate_py(pairs_path, output, chroms_path, sam_path, columns, assembly, **kwargs): instream = fileio.auto_open( pairs_path, mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) header, body_stream = headerops.get_header(instream, ignore_warning=True) # Parse chromosome sizes present in the input chromosomes: if chroms_path and not sam_path: chromsizes = headerops.get_chromsizes_from_file(chroms_path) # chromosomes = headerops.get_chromsizes_from_file(chroms_path) # Parse chromosome sizes present in sam input: if sam_path: # open input sam file with pysam input_sam = AlignmentFilePairtoolized( sam_path, "r", threads=kwargs.get("nproc_in") ) samheader = input_sam.header chromsizes = headerops.get_chromsizes_from_pysam_header(samheader) # if chroms_path: # chromosomes = headerops.get_chrom_order(chroms_path, list(chromsizes.keys())) # else: # chromosomes = chromsizes.keys() # Read the input columns: if columns: columns = columns.split(",") else: if kwargs.get("pairs", True): columns = pairsam_format.COLUMNS_PAIRS else: columns = pairsam_format.COLUMNS_PAIRSAM extra_columns = kwargs.get("extra_columns", "") if extra_columns: columns += extra_columns.split(",") # Write new header to the pairsam file new_header = headerops.make_standard_pairsheader( assembly=assembly, chromsizes=chromsizes, columns=columns, shape="whole matrix" if kwargs["no_flip"] else "upper triangle", ) if sam_path: new_header = headerops.insert_samheader_pysam(new_header, samheader) new_header = headerops.append_new_pg(new_header, ID=UTIL_NAME, PN=UTIL_NAME) # Check that the number of columns in the body corresponds to the header: if not headerops.validate_cols(instream, columns): raise ValueError( f"Number of columns mismatch:\n\t#columns: {headerops.SEP_COLS.join(columns)}\n\t{body_stream.readline()}" ) ######## # Write the output after successful checks: outstream = ( fileio.auto_open( output, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) if output else sys.stdout ) outstream.writelines((l + "\n" for l in new_header)) outstream.flush() if body_stream == sys.stdin: for line in body_stream: outstream.write(line) else: command = r""" /bin/bash -c 'export LC_COLLATE=C; export LANG=C; cat """ if kwargs.get("cmd_in", None): command += r""" <(cat {} | {} | sed -n -e '\''/^[^#]/,$p'\'')""".format( pairs_path, kwargs["cmd_in"] ) elif pairs_path.endswith(".gz"): command += ( r""" <(bgzip -dc -@ {} {} | sed -n -e '\''/^[^#]/,$p'\'')""".format( kwargs["nproc_in"], pairs_path ) ) elif pairs_path.endswith(".lz4"): command += r""" <(lz4c -dc {} | sed -n -e '\''/^[^#]/,$p'\'')""".format( pairs_path ) else: command += r""" <(sed -n -e '\''/^[^#]/,$p'\'' {})""".format(pairs_path) command += "'" subprocess.check_call(command, shell=True, stdout=outstream) if instream != sys.stdin: instream.close() if outstream != sys.stdout: outstream.close() @register_subcommand @add_arg_help @click.option( "--reference-file", "-r", help="Header file for transfer", type=str, required=True ) def transfer(pairs_path, output, reference_file, **kwargs): """ Transfer the header from one pairs file to another """ transfer_py(pairs_path, output, reference_file, **kwargs) def transfer_py(pairs_path, output, reference_file, **kwargs): instream = fileio.auto_open( pairs_path, mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) header, body_stream = headerops.get_header(instream, ignore_warning=True) # Read the header from reference file instream_header = fileio.auto_open( reference_file, mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) reference_header, _ = headerops.get_header(instream_header) # Close the reference stream after extraction of the header: if instream_header != sys.stdin: instream_header.close() reference_columns = headerops.extract_column_names(reference_header) # Check that the number of columns in the body corresponds to the header: if not headerops.validate_cols(instream, reference_columns): raise ValueError( f"Number of columns mismatch:\n\t#columns: {headerops.SEP_COLS.join(reference_columns)}\n\t{body_stream.readline()}" ) ######## # Write the output after successful checks: outstream = ( fileio.auto_open( output, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) if output else sys.stdout ) reference_header = headerops.append_new_pg( reference_header, ID=UTIL_NAME, PN=UTIL_NAME ) outstream.writelines((l + "\n" for l in reference_header)) outstream.flush() if body_stream == sys.stdin: for line in body_stream: outstream.write(line) else: command = r""" /bin/bash -c 'export LC_COLLATE=C; export LANG=C; cat """ if kwargs.get("cmd_in", None): command += r""" <(cat {} | {} | sed -n -e '\''/^[^#]/,$p'\'')""".format( pairs_path, kwargs["cmd_in"] ) elif pairs_path.endswith(".gz"): command += ( r""" <(bgzip -dc -@ {} {} | sed -n -e '\''/^[^#]/,$p'\'')""".format( kwargs["nproc_in"], pairs_path ) ) elif pairs_path.endswith(".lz4"): command += r""" <(lz4c -dc {} | sed -n -e '\''/^[^#]/,$p'\'')""".format( pairs_path ) else: command += r""" <(sed -n -e '\''/^[^#]/,$p'\'' {})""".format(pairs_path) command += "'" subprocess.check_call(command, shell=True, stdout=outstream) if instream != sys.stdin: instream.close() if outstream != sys.stdout: outstream.close() @register_subcommand @add_arg_help @click.option( "--columns", "-c", help=f"Comma-separated list of columns to be added, e.g.: {','.join(pairsam_format.COLUMNS)}", type=str, required=True, ) def set_columns(pairs_path, output, columns, **kwargs): """ Add the columns to the .pairs/pairsam file """ set_columns_py(pairs_path, output, columns, **kwargs) def set_columns_py(pairs_path, output, columns, **kwargs): instream = ( fileio.auto_open( pairs_path, mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) if pairs_path else sys.stdin ) outstream = ( fileio.auto_open( output, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) if output else sys.stdout ) header, body_stream = headerops.get_header(instream) header = headerops.set_columns(header, columns.split(",")) outstream.writelines((l + "\n" for l in header)) outstream.flush() if body_stream == sys.stdin: for line in body_stream: outstream.write(line) else: command = r""" /bin/bash -c 'export LC_COLLATE=C; export LANG=C; cat """ if kwargs.get("cmd_in", None): command += r""" <(cat {} | {} | sed -n -e '\''/^[^#]/,$p'\'')""".format( pairs_path, kwargs["cmd_in"] ) elif pairs_path.endswith(".gz"): command += ( r""" <(bgzip -dc -@ {} {} | sed -n -e '\''/^[^#]/,$p'\'')""".format( kwargs["nproc_in"], pairs_path ) ) elif pairs_path.endswith(".lz4"): command += r""" <(lz4c -dc {} | sed -n -e '\''/^[^#]/,$p'\'')""".format( pairs_path ) else: command += r""" <(sed -n -e '\''/^[^#]/,$p'\'' {})""".format(pairs_path) command += "'" subprocess.check_call(command, shell=True, stdout=outstream) if instream != sys.stdin: instream.close() if outstream != sys.stdout: outstream.close() @register_subcommand @add_arg_help @click.option( "--reference-file", "-r", help="Header file for comparison (optional)", type=str, required=False, default="", ) @click.option( "--reference-columns", "-c", help=f"Comma-separated list of columns fro check (optional), e.g.: {','.join(pairsam_format.COLUMNS)}", type=str, required=False, default="", ) def validate_columns(pairs_path, output, reference_file, reference_columns, **kwargs): """ Validate the columns of the .pairs/pairsam file against reference or within file. If the checks pass, then returns full pairs file. Otherwise throws an exception. If reference_file is provided, check: 1) columns are the same between pairs and reference_file 2) number of columns in the pairs body is the same as the number of columns If reference_columns are provided, check: 1) pairs columns are the same as provided 2) number of columns in the pairs body is the same as the number of columns If no reference_file or columns, then check only the number of columns in the pairs body. Checks only the first line in the pairs stream! """ validate_columns_py(pairs_path, output, reference_file, reference_columns, **kwargs) def validate_columns_py( pairs_path, output, reference_file, reference_columns, **kwargs ): instream = fileio.auto_open( pairs_path, mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) header, body_stream = headerops.get_header(instream) pairs_columns = headerops.extract_column_names(header) # Convert reference columns string into list, if provided if reference_columns: reference_columns = reference_columns.split(",") # Read the header from reference file if reference_file: instream_header = fileio.auto_open( reference_file, mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) reference_header, _ = headerops.get_header(instream_header) # Close the reference stream after extraction of the header: if instream_header != sys.stdin: instream_header.close() if reference_columns: warnings.warn( "--reference-columns are ignored, as --reference-file is provided" ) reference_columns = headerops.extract_column_names(reference_header) if reference_columns: if pairs_columns != reference_columns: raise ValueError( f"Pairs columns differ from reference columns:\n\t{pairs_columns}\n\t{reference_columns}" ) # Check that the number of columns in the body corresponds to the header: if not headerops.validate_cols(instream, pairs_columns): raise ValueError( f"Number of columns mismatch:\n\t#columns: {headerops.SEP_COLS.join(pairs_columns)}\n\t{body_stream.readline()}" ) ######## # Write the output after successful checks: outstream = ( fileio.auto_open( output, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) if output else sys.stdout ) header = headerops.append_new_pg(header, ID=UTIL_NAME, PN=UTIL_NAME) outstream.writelines((l + "\n" for l in header)) outstream.flush() if body_stream == sys.stdin: for line in body_stream: outstream.write(line) else: command = r""" /bin/bash -c 'export LC_COLLATE=C; export LANG=C; cat """ if kwargs.get("cmd_in", None): command += r""" <(cat {} | {} | sed -n -e '\''/^[^#]/,$p'\'')""".format( pairs_path, kwargs["cmd_in"] ) elif pairs_path.endswith(".gz"): command += ( r""" <(bgzip -dc -@ {} {} | sed -n -e '\''/^[^#]/,$p'\'')""".format( kwargs["nproc_in"], pairs_path ) ) elif pairs_path.endswith(".lz4"): command += r""" <(lz4c -dc {} | sed -n -e '\''/^[^#]/,$p'\'')""".format( pairs_path ) else: command += r""" <(sed -n -e '\''/^[^#]/,$p'\'' {})""".format(pairs_path) command += "'" subprocess.check_call(command, shell=True, stdout=outstream) if instream != sys.stdin: instream.close() if outstream != sys.stdout: outstream.close() if __name__ == "__main__": header() pairtools-1.1.3/pairtools/cli/markasdup.py000066400000000000000000000037041474715105500206710ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import click from ..lib import fileio, pairsam_format, headerops from . import cli, common_io_options from ..lib.dedup import mark_split_pair_as_dup UTIL_NAME = "pairtools_markasdup" @cli.command() @click.argument("pairsam_path", type=str, required=False) @click.option( "-o", "--output", type=str, default="", help="output .pairsam file." " If the path ends with .gz or .lz4, the output is bgzip-/lz4c-compressed." " By default, the output is printed into stdout.", ) @common_io_options def markasdup(pairsam_path, output, **kwargs): """Tag all pairs in the input file as duplicates. Change the type of all pairs inside a .pairs/.pairsam file to DD. If sam entries are present, change the pair type in the Yt SAM tag to 'Yt:Z:DD'. PAIRSAM_PATH : input .pairs/.pairsam file. If the path ends with .gz, the input is gzip-decompressed. By default, the input is read from stdin. """ markasdup_py(pairsam_path, output, **kwargs) def markasdup_py(pairsam_path, output, **kwargs): instream = fileio.auto_open( pairsam_path, mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) outstream = fileio.auto_open( output, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) header, body_stream = headerops.get_header(instream) header = headerops.append_new_pg(header, ID=UTIL_NAME, PN=UTIL_NAME) outstream.writelines((l + "\n" for l in header)) for line in body_stream: cols = line.rstrip('\n').split(pairsam_format.PAIRSAM_SEP) mark_split_pair_as_dup(cols) outstream.write(pairsam_format.PAIRSAM_SEP.join(cols)) outstream.write("\n") if instream != sys.stdin: instream.close() if outstream != sys.stdout: outstream.close() if __name__ == "__main__": markasdup() pairtools-1.1.3/pairtools/cli/merge.py000066400000000000000000000166431474715105500200070ustar00rootroot00000000000000#!/usr/bin/env python import sys import glob import math import subprocess import click from ..lib import fileio, pairsam_format, headerops from . import cli, common_io_options UTIL_NAME = "pairtools_merge" @cli.command() @click.argument( "pairs_path", nargs=-1, type=str, ) @click.option( "-o", "--output", type=str, default="", help="output file." " If the path ends with .gz/.lz4, the output is compressed by bgzip/lz4c." " By default, the output is printed into stdout.", ) @click.option( "--max-nmerge", type=int, default=8, show_default=True, help="The maximal number of inputs merged at once. For more, store " "merged intermediates in temporary files.", ) @click.option( "--tmpdir", type=str, default="", help="Custom temporary folder for merged intermediates.", ) @click.option( "--memory", type=str, default="2G", show_default=True, help="The amount of memory used by default.", ) @click.option( "--compress-program", type=str, default="", show_default=True, help="A binary to compress temporary merged chunks. " "Must decompress input when the flag -d is provided. " "Suggested alternatives: lz4c, gzip, lzop, snzip. " "NOTE: fails silently if the command syntax is wrong. ", ) @click.option( "--nproc", type=int, default=8, help="Number of threads for merging.", show_default=True, ) @click.option( "--nproc-in", type=int, default=1, show_default=True, help="Number of processes used by the auto-guessed input decompressing command.", ) @click.option( "--nproc-out", type=int, default=8, show_default=True, help="Number of processes used by the auto-guessed output compressing command.", ) @click.option( "--cmd-in", type=str, default=None, help="A command to decompress the input. " "If provided, fully overrides the auto-guessed command. " "Does not work with stdin. " "Must read input from stdin and print output into stdout. " "EXAMPLE: pbgzip -dc -n 3", ) @click.option( "--cmd-out", type=str, default=None, help="A command to compress the output. " "If provided, fully overrides the auto-guessed command. " "Does not work with stdout. " "Must read input from stdin and print output into stdout. " "EXAMPLE: pbgzip -c -n 8", ) @click.option( "--keep-first-header/--no-keep-first-header", default=False, show_default=True, help="Keep the first header or merge the headers together. Default: merge headers.", ) @click.option( "--concatenate/--no-concatenate", default=False, show_default=True, help="Simple concatenate instead of merging sorted files.", ) # Using custom IO options def merge( pairs_path, output, max_nmerge, tmpdir, memory, compress_program, nproc, **kwargs ): """Merge .pairs/.pairsam files. By default, assumes that the files are sorted and maintains the sorting. Merge triu-flipped sorted pairs/pairsam files. If present, the @SQ records of the SAM header must be identical; the sorting order of these lines is taken from the first file in the list. The ID fields of the @PG records of the SAM header are modified with a numeric suffix to produce unique records. The other unique SAM and non-SAM header lines are copied into the output header. PAIRS_PATH : upper-triangular flipped sorted .pairs/.pairsam files to merge or a group/groups of .pairs/.pairsam files specified by a wildcard. For paths ending in .gz/.lz4, the files are decompressed by bgzip/lz4c. """ merge_py( pairs_path, output, max_nmerge, tmpdir, memory, compress_program, nproc, **kwargs, ) def merge_py( pairs_path, output, max_nmerge, tmpdir, memory, compress_program, nproc, **kwargs ): paths = sum([glob.glob(mask) for mask in pairs_path], []) if len(paths) == 0: raise ValueError(f"No input paths: {pairs_path}") outstream = fileio.auto_open( output, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) # if there is only one input, bypass merging and do not modify the header if len(paths) == 1: instream = fileio.auto_open( paths[0], mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) for line in instream: outstream.write(line) if outstream != sys.stdout: outstream.close() return headers = [] for path in paths: f = fileio.auto_open( path, mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) h, _ = headerops.get_header(f) headers.append(h) f.close() # Skip other headers if keep_first_header is True (False by default): if kwargs.get("keep_first_header", False): break if not headerops.all_same_columns(headers): raise ValueError("Input pairs cannot contain different columns") merged_header = headerops.merge_headers(headers) merged_header = headerops.append_new_pg(merged_header, ID=UTIL_NAME, PN=UTIL_NAME) outstream.writelines((l + "\n" for l in merged_header)) outstream.flush() # If concatenation requested instead of merging sorted input: if kwargs.get("concatenate", False): command = r""" /bin/bash -c 'export LC_COLLATE=C; export LANG=C; cat """ # Full merge that keeps the ordered input: else: command = r""" /bin/bash -c 'export LC_COLLATE=C; export LANG=C; sort -k {0},{0} -k {1},{1} -k {2},{2}n -k {3},{3}n -k {4},{4} --merge --field-separator=$'\''{5}'\'' {6} {7} {8} -S {9} {10} """.replace( "\n", " " ).format( pairsam_format.COL_C1 + 1, pairsam_format.COL_C2 + 1, pairsam_format.COL_P1 + 1, pairsam_format.COL_P2 + 1, pairsam_format.COL_PTYPE + 1, pairsam_format.PAIRSAM_SEP_ESCAPE, " --parallel={} ".format(nproc) if nproc > 1 else " ", " --batch-size={} ".format(max_nmerge) if max_nmerge else " ", " --temporary-directory={} ".format(tmpdir) if tmpdir else " ", memory, ( " --compress-program={} ".format(compress_program) if compress_program else " " ), ) for path in paths: if kwargs.get("cmd_in", None): command += r""" <(cat {} | {} | sed -n -e '\''/^[^#]/,$p'\'')""".format( path, kwargs["cmd_in"] ) elif path.endswith(".gz"): command += ( r""" <(bgzip -dc -@ {} {} | sed -n -e '\''/^[^#]/,$p'\'')""".format( kwargs["nproc_in"], path ) ) elif path.endswith(".lz4"): command += r""" <(lz4c -dc {} | sed -n -e '\''/^[^#]/,$p'\'')""".format( path ) else: command += r""" <(sed -n -e '\''/^[^#]/,$p'\'' {})""".format(path) command += "'" subprocess.check_call(command, shell=True, stdout=outstream) if outstream != sys.stdout: outstream.close() if __name__ == "__main__": merge() pairtools-1.1.3/pairtools/cli/parse.py000066400000000000000000000222211474715105500200070ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- import click import sys from ..lib import fileio, pairsam_format, headerops from . import cli, common_io_options from ..lib.stats import PairCounter from ..lib.parse_pysam import AlignmentFilePairtoolized from ..lib.parse import streaming_classify UTIL_NAME = "pairtools_parse" @cli.command() @click.argument("sam_path", type=str, required=False) @click.option( "-c", "--chroms-path", type=str, required=True, help="Chromosome order used to flip interchromosomal mates: " "path to a chromosomes file (e.g. UCSC chrom.sizes or similar) whose " "first column lists scaffold names. Any scaffolds not listed will be " "ordered lexicographically following the names provided.", ) @click.option( "-o", "--output", type=str, default="", help="output file. " " If the path ends with .gz or .lz4, the output is bgzip-/lz4-compressed." "By default, the output is printed into stdout. ", ) @click.option( "--assembly", type=str, help="Name of genome assembly (e.g. hg19, mm10) to store in the pairs header.", ) @click.option( "--min-mapq", type=int, default=1, show_default=True, help="The minimal MAPQ score to consider a read as uniquely mapped", ) @click.option( "--max-molecule-size", type=int, default=750, show_default=True, help="The maximal size of a Hi-C molecule; used to rescue single ligations" "(from molecules with three alignments) and to rescue complex ligations." "The default is based on oriented P(s) at short ranges of multiple Hi-C." "Not used with walks-policy all.", ) @click.option( "--drop-readid", is_flag=True, help="If specified, do not add read ids to the output", ) @click.option( "--drop-seq", is_flag=True, help="If specified, remove sequences and PHREDs from the sam fields", ) @click.option( "--drop-sam", is_flag=True, help="If specified, do not add sams to the output" ) @click.option( "--add-pair-index", is_flag=True, help="If specified, each pair will have pair index in the molecule", ) @click.option( "--add-columns", type=click.STRING, default="", help="Report extra columns describing alignments " "Possible values (can take multiple values as a comma-separated " "list): a SAM tag (any pair of uppercase letters) or {}.".format( ", ".join(pairsam_format.EXTRA_COLUMNS) ), ) @click.option( "--output-parsed-alignments", type=str, default="", help="output file for all parsed alignments, including walks." " Useful for debugging and rnalysis of walks." " If file exists, it will be open in the append mode." " If the path ends with .gz or .lz4, the output is bgzip-/lz4-compressed." " By default, not used.", ) @click.option( "--output-stats", type=str, default="", help="output file for various statistics of pairs file. " " By default, statistics is not generated.", ) @click.option( "--report-alignment-end", type=click.Choice(["5", "3"]), default="5", help="specifies whether the 5' or 3' end of the alignment is reported as" " the position of the Hi-C read.", ) @click.option( "--max-inter-align-gap", type=int, default=20, show_default=True, help="read segments that are not covered by any alignment and" ' longer than the specified value are treated as "null" alignments.' " These null alignments convert otherwise linear alignments into walks," " and affect how they get reported as a Hi-C pair (see --walks-policy).", ) @click.option( "--walks-policy", type=click.Choice(["mask", "5any", "5unique", "3any", "3unique", "all"]), default="5unique", help="the policy for reporting unrescuable walks (reads containing more" " than one alignment on one or both sides, that can not be explained by a" " single ligation between two mappable DNA fragments)." ' "mask" - mask walks (chrom="!", pos=0, strand="-"); ' ' "5any" - report the 5\'-most alignment on each side;' ' "5unique" - report the 5\'-most unique alignment on each side, if present;' ' "3any" - report the 3\'-most alignment on each side;' ' "3unique" - report the 3\'-most unique alignment on each side, if present;' ' "all" - report all available unique alignments on each side.', show_default=True, ) @click.option( "--readid-transform", type=str, default=None, help="A Python expression to modify read IDs. Useful when read IDs differ " "between the two reads of a pair. Must be a valid Python expression that " "uses variables called readID and/or i (the 0-based index of the read pair " "in the bam file) and returns a new value, e.g. \"readID[:-2]+'_'+str(i)\". " "Make sure that transformed readIDs remain unique!", show_default=True, ) @click.option( "--flip/--no-flip", is_flag=True, default=True, help="If specified, do not flip pairs in genomic order and instead preserve " "the order in which they were sequenced.", ) @common_io_options def parse( sam_path, chroms_path, output, output_parsed_alignments, output_stats, **kwargs ): """Find ligation pairs in .sam data, make .pairs. SAM_PATH : an input .sam/.bam file with paired-end sequence alignments of Hi-C molecules. If the path ends with .bam, the input is decompressed from bam with samtools. By default, the input is read from stdin. """ parse_py( sam_path, chroms_path, output, output_parsed_alignments, output_stats, **kwargs ) def parse_py( sam_path, chroms_path, output, output_parsed_alignments, output_stats, **kwargs ): ### Set up input stream if sam_path: # open input sam file with pysam input_sam = AlignmentFilePairtoolized( sam_path, "r", threads=kwargs.get("nproc_in") ) else: # read from stdin input_sam = AlignmentFilePairtoolized("-", "r", threads=kwargs.get("nproc_in")) ### Set up output streams outstream = fileio.auto_open( output, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) out_alignments_stream, out_stats_stream = None, None if output_parsed_alignments: out_alignments_stream = fileio.auto_open( output_parsed_alignments, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) if output_stats: out_stats_stream = fileio.auto_open( output_stats, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) if out_alignments_stream: out_alignments_stream.write( "readID\tside\tchrom\tpos\tstrand\tmapq\tcigar\tdist_5_lo\tdist_5_hi\tmatched_bp\n" ) # generate empty PairCounter if stats output is requested: out_stat = PairCounter() if output_stats else None ### Set up output parameters add_columns = kwargs.get("add_columns", []) add_columns = [col for col in add_columns.split(",") if col] for col in add_columns: if not ( (col in pairsam_format.EXTRA_COLUMNS) or (len(col) == 2 and col.isupper()) ): raise Exception("{} is not a valid extra column".format(col)) columns = pairsam_format.COLUMNS + ( [c + side for c in add_columns for side in ["1", "2"]] ) if kwargs.get("drop_sam", True): columns.pop(columns.index("sam1")) columns.pop(columns.index("sam2")) if not kwargs.get("add_pair_index", False): columns.pop(columns.index("walk_pair_index")) columns.pop(columns.index("walk_pair_type")) ### Parse header samheader = input_sam.header if not samheader: raise ValueError( "The input sam is missing a header! If reading a bam file, please use `samtools view -h` to include the header." ) ### Parse chromosome files present in the input sam_chromsizes = headerops.get_chromsizes_from_pysam_header(samheader) chromosomes = headerops.get_chrom_order(chroms_path, list(sam_chromsizes.keys())) ### Write new header to the pairsam file header = headerops.make_standard_pairsheader( assembly=kwargs.get("assembly", ""), chromsizes=[(chrom, sam_chromsizes[chrom]) for chrom in chromosomes], columns=columns, shape="whole matrix" if not kwargs["flip"] else "upper triangle", ) header = headerops.insert_samheader_pysam(header, samheader) header = headerops.append_new_pg(header, ID=UTIL_NAME, PN=UTIL_NAME) outstream.writelines((l + "\n" for l in header)) ### Parse input and write to the outputs streaming_classify( input_sam, outstream, chromosomes, out_alignments_stream, out_stat, **kwargs ) # save statistics to a file if it was requested: if out_stat: out_stat.save(out_stats_stream) if outstream != sys.stdout: outstream.close() # close optional output streams if needed: if out_alignments_stream and out_alignments_stream != sys.stdout: out_alignments_stream.close() if out_stats_stream and out_stats_stream != sys.stdout: out_stats_stream.close() if __name__ == "__main__": parse() pairtools-1.1.3/pairtools/cli/parse2.py000066400000000000000000000303251474715105500200750ustar00rootroot00000000000000# !/usr/bin/env python # -*- coding: utf-8 -*- import click import sys from ..lib import fileio, pairsam_format, headerops from . import cli, common_io_options from ..lib.stats import PairCounter from ..lib.parse_pysam import AlignmentFilePairtoolized from ..lib.parse import streaming_classify UTIL_NAME = "pairtools_parse2" @cli.command() @click.argument("sam_path", type=str, required=False) # Parsing options: @click.option( "-c", "--chroms-path", type=str, required=True, help="Chromosome order used to flip interchromosomal mates: " "path to a chromosomes file (e.g. UCSC chrom.sizes or similar) whose " "first column lists scaffold names. Any scaffolds not listed will be " "ordered lexicographically following the names provided.", ) @click.option( "-o", "--output", type=str, default="", help="output file with pairs. " " If the path ends with .gz or .lz4, the output is bgzip-/lz4-compressed." "By default, the output is printed into stdout. ", ) @click.option( "--report-position", type=click.Choice(["junction", "read", "walk", "outer"]), default="outer", help="""Reported position of alignments in pairs of complex walks (pos columns). Each alignment in .bam/.sam Hi-C-like data has two ends, and you can report one or another depending of the position of alignment on a read or in a pair. "junction" - inner ends of sequential alignments in each pair, aka ligation junctions, "read" - 5'-end of alignments relative to R1 or R2 read coordinate system (as in traditional Hi-C), "walk" - 5'-end of alignments relative to the whole walk coordinate system, "outer" - outer ends of sequential alignments in each pair (parse2 default). """, ) @click.option( "--report-orientation", type=click.Choice(["pair", "read", "walk", "junction"]), default="pair", help="""Reported orientataion of pairs in complex walk (strand columns). Each alignment in .bam/.sam Hi-C-like data has orientation, and you can report it relative to the read, pair or whole walk coordinate system. "pair" - orientation as if each pair in complex walk was sequenced independently from the outer ends or molecule (as in traditional Hi-C, also complex walks default), "read" - orientation defined by the read (R1 or R2 read coordinate system), "walk" - orientation defined by the walk coordinate system, "junction" - reversed "pair" orientation, as if pair was sequenced in both directions starting from the junction""", ) @click.option( "--assembly", type=str, help="Name of genome assembly (e.g. hg19, mm10) to store in the pairs header.", ) @click.option( "--min-mapq", type=int, default=1, show_default=True, help="The minimal MAPQ score to consider a read as uniquely mapped.", ) @click.option( "--max-inter-align-gap", type=int, default=20, show_default=True, help="Read segments that are not covered by any alignment and" ' longer than the specified value are treated as "null" alignments.' " These null alignments convert otherwise linear alignments into walks," " and affect how they get reported as a Hi-C pair.", ) @click.option( "--max-insert-size", type=int, default=500, show_default=True, help="When searching for overlapping ends of left and right read (R1 and R2), this sets the minimal distance " "when two alignments on the same strand and chromosome are considered part of the same fragment (and thus reported as the same alignment " "and not a pair). For traditional Hi-C with long restriction fragments and shorter molecules after ligation+sonication, this " "can be the expected molecule size. For complex walks with short restriction fragments, this can be the expected restriction fragment " "size. Note that unsequenced insert is *terra incognita* and might contain unsequenced DNA (including ligations) in it. " "This parameter is ignored in --single-end mode. ", ) @click.option( "--dedup-max-mismatch", type=int, default=3, show_default=True, help="Allowed mismatch between intramolecular alignments to detect readthrough duplicates. " "Pairs with both sides mapped within this distance (bp) from each " "other are considered duplicates. ", ) @click.option( "--single-end", is_flag=True, help="If specified, the input is single-end. " "Never use this for paired-end data, because R1 read will be omitted. " "If single-end data is provided, but parameter is unset, the pairs will be " "generated, but may contain artificial UN pairs. ", ) @click.option( "--expand/--no-expand", is_flag=True, help="If specified, perform combinatorial expansion on the pairs. " "Combinatorial expansion is a way to increase the number of contacts in you data, assuming that all DNA fragments in the same molecule (read) are in contact. " "Expanded pairs have modified pair type, 'E{separation}_{pair type}'", ) @click.option( "--max-expansion-depth", type=int, default=None, show_default=True, help="Works in combination with --expand. " "Maximum number of segments separating pair. By default, expanding all possible pairs." "Setting the number will limit the expansion depth and enforce contacts from the same " "side of the read. ", ) @click.option( "--add-pair-index", is_flag=True, help="If specified, parse2 will report pair index in the walk as additional columns (R1, R2, R1&R2 or R1-R2). " "See documentation: https://pairtools.readthedocs.io/en/latest/parsing.html#rescuing-complex-walks " "For combinatorial expanded pairs, two numbers will be reported: " "original pair index of the left and right segments. ", ) @click.option( "--flip/--no-flip", is_flag=True, default=False, help="If specified, flip pairs in genomic order and instead preserve " "the order in which they were sequenced. Note that no flip is recommended for analysis of walks because it will " "override the order of alignments in pairs. Flip is required for appropriate deduplication of sorted pairs. " "Flip is not required for cooler cload, which runs flipping internally. ", ) @click.option( "--add-columns", type=click.STRING, default="", help="Report extra columns describing alignments " "Possible values (can take multiple values as a comma-separated " "list): a SAM tag (any pair of uppercase letters) or {}.".format( ", ".join(pairsam_format.EXTRA_COLUMNS) ), ) @click.option( "--drop-readid/--keep-readid", is_flag=True, default=False, help="If specified, do not add read ids to the output. By default, keep read ids. Useful for long walks analysis. ", ) @click.option( "--readid-transform", type=str, default=None, help="A Python expression to modify read IDs. Useful when read IDs differ " "between the two reads of a pair. Must be a valid Python expression that " "uses variables called readID and/or i (the 0-based index of the read pair " "in the bam file) and returns a new value, e.g. \"readID[:-2]+'_'+str(i)\". " "Make sure that transformed readIDs remain unique!", show_default=True, ) @click.option( "--drop-seq/--keep-seq", is_flag=True, default=False, help="Remove sequences and PHREDs from the sam fields by default. Kept otherwise. ", ) @click.option( "--drop-sam/--keep-sam", is_flag=True, default=False, help="Do not add sams to the output by default. Kept otherwise. ", ) @click.option( "--output-parsed-alignments", type=str, default="", help="output file with all parsed alignments (one alignment per line)." " Useful for debugging and analysis of walks." " If file exists, it will be open in the append mode." " If the path ends with .gz or .lz4, the output is bgzip-/lz4-compressed." " By default, not used.", ) @click.option( "--output-stats", type=str, default="", help="output file for various statistics of pairs file. " " By default, statistics is not generated.", ) @common_io_options def parse2( sam_path, chroms_path, output, output_parsed_alignments, output_stats, **kwargs ): """Extracts pairs from .sam/.bam data with complex walks, make .pairs. SAM_PATH : an input .sam/.bam file with paired-end or single-end sequence alignments of Hi-C (or Hi-C-like) molecules. If the path ends with .bam, the input is decompressed from bam with samtools. By default, the input is read from stdin. """ parse2_py( sam_path, chroms_path, output, output_parsed_alignments, output_stats, **kwargs ) def parse2_py( sam_path, chroms_path, output, output_parsed_alignments, output_stats, **kwargs ): ### Set up input stream if sam_path: # open input sam file with pysam input_sam = AlignmentFilePairtoolized( sam_path, "r", threads=kwargs.get("nproc_in") ) else: # read from stdin input_sam = AlignmentFilePairtoolized("-", "r", threads=kwargs.get("nproc_in")) ### Set up output streams outstream = ( fileio.auto_open( output, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) if output else sys.stdout ) out_alignments_stream = ( fileio.auto_open( output_parsed_alignments, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) if output_parsed_alignments else None ) out_stats_stream = ( fileio.auto_open( output_stats, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) if output_stats else None ) if out_alignments_stream: out_alignments_stream.write( "readID\tside\tchrom\tpos\tstrand\tmapq\tcigar\tdist_5_lo\tdist_5_hi\tmatched_bp\n" ) # generate empty PairCounter if stats output is requested: out_stat = PairCounter() if output_stats else None ### Set up output parameters add_columns = kwargs.get("add_columns", []) add_columns = [col for col in add_columns.split(",") if col] for col in add_columns: if not ( (col in pairsam_format.EXTRA_COLUMNS) or (len(col) == 2 and col.isupper()) ): raise Exception("{} is not a valid extra column".format(col)) columns = pairsam_format.COLUMNS + ( [c + side for c in add_columns for side in ["1", "2"]] ) if kwargs.get("drop_sam", True): columns.pop(columns.index("sam1")) columns.pop(columns.index("sam2")) if not kwargs.get("add_pair_index", False): columns.pop(columns.index("walk_pair_index")) columns.pop(columns.index("walk_pair_type")) ### Parse header samheader = input_sam.header if not samheader: raise ValueError( "The input sam is missing a header! If reading a bam file, please use `samtools view -h` to include the header." ) ### Parse chromosome files present in the input sam_chromsizes = headerops.get_chromsizes_from_pysam_header(samheader) chromosomes = headerops.get_chrom_order(chroms_path, list(sam_chromsizes.keys())) ### Write new header to the pairsam file header = headerops.make_standard_pairsheader( assembly=kwargs.get("assembly", ""), chromsizes=[(chrom, sam_chromsizes[chrom]) for chrom in chromosomes], columns=columns, shape="whole matrix" if not kwargs["flip"] else "upper triangle", ) header = headerops.insert_samheader_pysam(header, samheader) header = headerops.append_new_pg(header, ID=UTIL_NAME, PN=UTIL_NAME) outstream.writelines((l + "\n" for l in header)) ### Parse input and write to the outputs streaming_classify( input_sam, outstream, chromosomes, out_alignments_stream, out_stat, parse2=True, **kwargs ) # save statistics to a file if it was requested: if out_stat: out_stat.save(out_stats_stream) if outstream != sys.stdout: outstream.close() if out_alignments_stream: out_alignments_stream.close() if out_stats_stream: out_stats_stream.close() if __name__ == "__main__": parse2() pairtools-1.1.3/pairtools/cli/phase.py000066400000000000000000000246121474715105500200030ustar00rootroot00000000000000import sys import click import re, fnmatch from ..lib import fileio, pairsam_format, headerops from . import cli, common_io_options from ..lib.phase import phase_side_XB, phase_side_XA UTIL_NAME = "pairtools_phase" @cli.command() @click.argument("pairs_path", type=str, required=False) @click.option( "-o", "--output", type=str, default="", help="output file." " If the path ends with .gz or .lz4, the output is bgzip-/lz4c-compressed." " By default, the output is printed into stdout.", ) @click.option( "--phase-suffixes", nargs=2, # type=click.Tuple([str, str]), help="Phase suffixes (of the chrom names), always a pair.", ) @click.option( "--clean-output", is_flag=True, help="Drop all columns besides the standard ones and phase1/2", ) @click.option( "--tag-mode", type=click.Choice(["XB", "XA"]), default="XB", help="Specifies the mode of bwa reporting." " XA will parse 'XA', the input should be generated with: --add-columns XA,NM,AS,XS --min-mapq 0" " XB will parse 'XB' tag, the input should be generated with: --add-columns XB,AS,XS --min-mapq 0 " " Note that XB tag is added by running bwa with -u tag, present in github version. " " Both modes report similar results: XB reports 0.002% contacts more for phased data, " " while XA can report ~1-2% more unphased contacts because its definition multiple mappers is more premissive. ", ) @click.option( "--report-scores/--no-report-scores", is_flag=True, default=False, help="Report scores of optional, suboptimal and second suboptimal alignments. " "NM (edit distance) with --tag-mode XA and AS (alfn score) with --tag-mode XB ", ) @common_io_options def phase( pairs_path, output, phase_suffixes, clean_output, tag_mode, report_scores, **kwargs ): """Phase pairs mapped to a diploid genome. Diploid genome is the genome with two set of the chromosome variants, where each chromosome has one of two suffixes (phase-suffixes) corresponding to the genome version (phase-suffixes). By default, phasing adds two additional columns with phase 0, 1 or "." (unpahsed). Phasing is based on detection of chromosome origin of each mapped fragment. Three scores are considered: best alignment score (S1), suboptimal alignment (S2) and second suboptimal alignment (S3) scores. Each fragment can be: 1) uniquely mapped and phased (S1>S2>S3, first alignment is the best hit), 2) uniquely mapped but unphased (S1=S2>S3, cannot distinguish between chromosome variants), 3) multiply mapped (S1=S2=S3) or unmapped. PAIRS_PATH : input .pairs/.pairsam file. If the path ends with .gz or .lz4, the input is decompressed by bgzip/lz4c. By default, the input is read from stdin. """ phase_py( pairs_path, output, phase_suffixes, clean_output, tag_mode, report_scores, **kwargs ) if __name__ == "__main__": phase() def phase_py( pairs_path, output, phase_suffixes, clean_output, tag_mode, report_scores, **kwargs ): instream = ( fileio.auto_open( pairs_path, mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) if pairs_path else sys.stdin ) outstream = ( fileio.auto_open( output, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) if output else sys.stdout ) header, body_stream = headerops.get_header(instream) header = headerops.append_new_pg(header, ID=UTIL_NAME, PN=UTIL_NAME) old_column_names = headerops.extract_column_names(header) idx_phase1 = len(old_column_names) idx_phase2 = len(old_column_names) + 1 if clean_output: new_column_names = [ col for col in old_column_names if col in pairsam_format.COLUMNS ] new_column_idxs = [ i for i, col in enumerate(old_column_names) if col in pairsam_format.COLUMNS ] new_column_idxs += [idx_phase1, idx_phase2] else: new_column_names = list(old_column_names) new_column_names.append("phase1") new_column_names.append("phase2") if report_scores: if tag_mode == "XB": new_column_names.append("S1_1") new_column_names.append("S1_2") new_column_names.append("S2_1") new_column_names.append("S2_2") new_column_names.append("S3_1") new_column_names.append("S3_2") if clean_output: new_column_idxs += [(idx_phase2 + i + 1) for i in range(6)] elif tag_mode == "XA": new_column_names.append("M1_1") new_column_names.append("M1_2") new_column_names.append("M2_1") new_column_names.append("M2_2") new_column_names.append("M3_1") new_column_names.append("M3_2") if clean_output: new_column_idxs += [(idx_phase2 + i + 1) for i in range(6)] header = headerops._update_header_entry( header, "columns", " ".join(new_column_names) ) if tag_mode == "XB": if ( ("XB1" not in old_column_names) or ("XB2" not in old_column_names) or ("AS1" not in old_column_names) or ("AS2" not in old_column_names) or ("XS1" not in old_column_names) or ("XS2" not in old_column_names) ): raise ValueError( "The input pairs file must be parsed with the flag --add-columns XB,AS,XS --min-mapq 0" ) COL_XB1 = old_column_names.index("XB1") COL_XB2 = old_column_names.index("XB2") COL_AS1 = old_column_names.index("AS1") COL_AS2 = old_column_names.index("AS2") COL_XS1 = old_column_names.index("XS1") COL_XS2 = old_column_names.index("XS2") elif tag_mode == "XA": if ( ("XA1" not in old_column_names) or ("XA2" not in old_column_names) or ("NM1" not in old_column_names) or ("NM2" not in old_column_names) or ("AS1" not in old_column_names) or ("AS2" not in old_column_names) or ("XS1" not in old_column_names) or ("XS2" not in old_column_names) ): raise ValueError( "The input pairs file must be parsed with the flag --add-columns XA,NM,AS,XS --min-mapq 0" ) COL_XA1 = old_column_names.index("XA1") COL_XA2 = old_column_names.index("XA2") COL_NM1 = old_column_names.index("NM1") COL_NM2 = old_column_names.index("NM2") COL_AS1 = old_column_names.index("AS1") COL_AS2 = old_column_names.index("AS2") COL_XS1 = old_column_names.index("XS1") COL_XS2 = old_column_names.index("XS2") outstream.writelines((l + "\n" for l in header)) for line in body_stream: cols = line.rstrip('\n').split(pairsam_format.PAIRSAM_SEP) cols.append("!") cols.append("!") if report_scores: for _ in range(6): cols.append("-1") pair_type = cols[pairsam_format.COL_PTYPE] if cols[pairsam_format.COL_C1] != pairsam_format.UNMAPPED_CHROM: if tag_mode == "XB": phase1, chrom_base1, S1_1, S2_1, S3_1 = phase_side_XB( cols[pairsam_format.COL_C1], cols[COL_XB1], int(cols[COL_AS1]), int(cols[COL_XS1]), phase_suffixes, ) elif tag_mode == "XA": phase1, chrom_base1, S1_1, S2_1, S3_1 = phase_side_XA( cols[pairsam_format.COL_C1], cols[COL_XA1], int(cols[COL_AS1]), int(cols[COL_XS1]), int(cols[COL_NM1]), phase_suffixes, ) if not report_scores: cols[idx_phase1] = phase1 else: ( cols[idx_phase1], cols[idx_phase1 + 2], cols[idx_phase1 + 4], cols[idx_phase1 + 6], ) = (phase1, str(S1_1), str(S2_1), str(S3_1)) cols[pairsam_format.COL_C1] = chrom_base1 if chrom_base1 == "!": cols[pairsam_format.COL_C1] = pairsam_format.UNMAPPED_CHROM cols[pairsam_format.COL_P1] = str(pairsam_format.UNMAPPED_POS) cols[pairsam_format.COL_S1] = pairsam_format.UNMAPPED_STRAND pair_type = "M" + pair_type[1] if cols[pairsam_format.COL_C2] != pairsam_format.UNMAPPED_CHROM: if tag_mode == "XB": phase2, chrom_base2, S1_2, S2_2, S3_2 = phase_side_XB( cols[pairsam_format.COL_C2], cols[COL_XB2], int(cols[COL_AS2]), int(cols[COL_XS2]), phase_suffixes, ) elif tag_mode == "XA": phase2, chrom_base2, S1_2, S2_2, S3_2 = phase_side_XA( cols[pairsam_format.COL_C2], cols[COL_XA2], int(cols[COL_AS2]), int(cols[COL_XS2]), int(cols[COL_NM2]), phase_suffixes, ) if not report_scores: cols[idx_phase2] = phase2 else: ( cols[idx_phase2], cols[idx_phase2 + 2], cols[idx_phase2 + 4], cols[idx_phase2 + 6], ) = (phase2, str(S1_2), str(S2_2), str(S3_2)) cols[pairsam_format.COL_C2] = chrom_base2 if chrom_base2 == "!": cols[pairsam_format.COL_C2] = pairsam_format.UNMAPPED_CHROM cols[pairsam_format.COL_P2] = str(pairsam_format.UNMAPPED_POS) cols[pairsam_format.COL_S2] = pairsam_format.UNMAPPED_STRAND pair_type = pair_type[0] + "M" cols[pairsam_format.COL_PTYPE] = pair_type if clean_output: cols = [cols[i] for i in new_column_idxs] outstream.write(pairsam_format.PAIRSAM_SEP.join(cols)) outstream.write("\n") if instream != sys.stdin: instream.close() if outstream != sys.stdout: outstream.close() if __name__ == "__main__": phase() pairtools-1.1.3/pairtools/cli/restrict.py000066400000000000000000000064731474715105500205470ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import click import warnings import numpy as np from ..lib import fileio, pairsam_format, headerops from . import cli, common_io_options from ..lib.restrict import find_rfrag UTIL_NAME = "pairtools_restrict" @cli.command() @click.argument("pairs_path", type=str, required=False) @click.option( "-f", "--frags", type=str, required=True, help="a tab-separated BED file with the positions of restriction fragments " "(chrom, start, end). Can be generated using cooler digest.", ) @click.option( "-o", "--output", type=str, default="", help="output .pairs/.pairsam file." " If the path ends with .gz/.lz4, the output is compressed by bgzip/lz4c." " By default, the output is printed into stdout.", ) @common_io_options def restrict(pairs_path, frags, output, **kwargs): """Assign restriction fragments to pairs. Identify the restriction fragments that got ligated into a Hi-C molecule. Note: rfrags are 0-indexed PAIRS_PATH : input .pairs/.pairsam file. If the path ends with .gz/.lz4, the input is decompressed by bgzip/lz4c. By default, the input is read from stdin. """ restrict_py(pairs_path, frags, output, **kwargs) def restrict_py(pairs_path, frags, output, **kwargs): instream = fileio.auto_open( pairs_path, mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) outstream = fileio.auto_open( output, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) header, body_stream = headerops.get_header(instream) header = headerops.append_new_pg(header, ID=UTIL_NAME, PN=UTIL_NAME) header = headerops.append_columns( header, [ "rfrag1", "rfrag_start1", "rfrag_end1", "rfrag2", "rfrag_start2", "rfrag_end2", ], ) outstream.writelines((l + "\n" for l in header)) rfrags = np.genfromtxt( frags, delimiter="\t", comments="#", dtype=None, encoding="ascii", names=["chrom", "start", "end"], ) rfrags.sort(order=["chrom", "start", "end"]) chrom_borders = np.r_[ 0, 1 + np.where(rfrags["chrom"][:-1] != rfrags["chrom"][1:])[0], rfrags.shape[0] ] rfrags = { rfrags["chrom"][i]: np.concatenate([[0], rfrags["end"][i:j] + 1]) for i, j in zip(chrom_borders[:-1], chrom_borders[1:]) } for line in body_stream: cols = line.rstrip('\n').split(pairsam_format.PAIRSAM_SEP) chrom1, pos1 = cols[pairsam_format.COL_C1], int(cols[pairsam_format.COL_P1]) rfrag_idx1, rfrag_start1, rfrag_end1 = find_rfrag(rfrags, chrom1, pos1) chrom2, pos2 = cols[pairsam_format.COL_C2], int(cols[pairsam_format.COL_P2]) rfrag_idx2, rfrag_start2, rfrag_end2 = find_rfrag(rfrags, chrom2, pos2) cols += [str(rfrag_idx1), str(rfrag_start1), str(rfrag_end1)] cols += [str(rfrag_idx2), str(rfrag_start2), str(rfrag_end2)] outstream.write(pairsam_format.PAIRSAM_SEP.join(cols)) outstream.write("\n") if instream != sys.stdin: instream.close() if outstream != sys.stdout: outstream.close() if __name__ == "__main__": restrict() pairtools-1.1.3/pairtools/cli/sample.py000066400000000000000000000036141474715105500201630ustar00rootroot00000000000000import sys import click import random from ..lib import fileio, pairsam_format, headerops from . import cli, common_io_options UTIL_NAME = "pairtools_sample" @cli.command() @click.argument("fraction", type=float, required=True) @click.argument("pairs_path", type=str, required=False) @click.option( "-o", "--output", type=str, default="", help="output file." " If the path ends with .gz or .lz4, the output is bgzip-/lz4c-compressed." " By default, the output is printed into stdout.", ) @click.option( "-s", "--seed", type=int, default=None, help="the seed of the random number generator.", ) @common_io_options def sample(fraction, pairs_path, output, seed, **kwargs): """Select a random subset of pairs in a pairs file. FRACTION: the fraction of the randomly selected pairs subset PAIRS_PATH : input .pairs/.pairsam file. If the path ends with .gz or .lz4, the input is decompressed by bgzip/lz4c. By default, the input is read from stdin. """ sample_py(fraction, pairs_path, output, seed, **kwargs) def sample_py(fraction, pairs_path, output, seed, **kwargs): instream = fileio.auto_open( pairs_path, mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) outstream = fileio.auto_open( output, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) header, body_stream = headerops.get_header(instream) header = headerops.append_new_pg(header, ID=UTIL_NAME, PN=UTIL_NAME) outstream.writelines((l + "\n" for l in header)) random.seed(seed) for line in body_stream: if random.random() <= fraction: outstream.write(line) if instream != sys.stdin: instream.close() if outstream != sys.stdout: outstream.close() if __name__ == "__main__": sample() pairtools-1.1.3/pairtools/cli/scaling.py000066400000000000000000000056661474715105500203330ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- import io import sys import click import pandas as pd from ..lib import fileio from . import cli, common_io_options from ..lib.scaling import compute_scaling UTIL_NAME = "pairtools_scaling" @cli.command() @click.argument("input_path", type=str, nargs=-1, required=False) @click.option( "-o", "--output", type=str, default="", help="output .tsv file with summary." ) @click.option( "--view", "--regions", help="Path to a BED file which defines which regions (viewframe) of the chromosomes to use. " "By default, this is parsed from .pairs header. ", type=str, required=False, default=None, ) @click.option( "--chunksize", type=int, default=100_000, show_default=True, required=False, help="Number of pairs in each chunk. Reduce for lower memory footprint.", ) @click.option( "--dist-range", type=click.Tuple([int, int]), default=(1, 1_000_000_000), show_default=True, required=False, help="Distance range. ", ) @click.option( "--n-dist-bins-decade", type=int, default=8, show_default=True, required=False, help="Number of bins to split the distance range in log10-space, specified per a factor of 10 difference.", ) @common_io_options def scaling(input_path, output, view, chunksize, dist_range, n_dist_bins_decade, **kwargs): """Calculate pairs scalings. INPUT_PATH : by default, a .pairs/.pairsam file to calculate statistics. If not provided, the input is read from stdin. The files with paths ending with .gz/.lz4 are decompressed by bgzip/lz4c. Output is .tsv file with scaling stats (both cis scalings and trans levels). """ scaling_py(input_path, output, view, chunksize, dist_range, n_dist_bins_decade, **kwargs) def scaling_py(input_path, output, view, chunksize, dist_range, n_dist_bins_decade, **kwargs): if len(input_path) == 0: raise ValueError(f"No input paths: {input_path}") instream = fileio.auto_open( input_path[0], mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) outstream = fileio.auto_open( output, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) if view is not None: view = pd.read_table(view) # Pass the header to the instream so that it can parse the header automatically cis_scalings, trans_levels = compute_scaling( instream, regions=view, chromsizes=None, dist_range=dist_range, n_dist_bins_decade=n_dist_bins_decade, chunksize=chunksize, ) summary_stats = pd.concat([cis_scalings, trans_levels]) # save statistics to the file summary_stats.to_csv(outstream, sep="\t", index=False) if instream != sys.stdin: instream.close() if outstream != sys.stdout: outstream.close() if __name__ == "__main__": scaling() pairtools-1.1.3/pairtools/cli/select.py000066400000000000000000000176031474715105500201640ustar00rootroot00000000000000import sys import click import re, fnmatch import warnings from ..lib import fileio, pairsam_format, headerops from ..lib.select import evaluate_stream from . import cli, common_io_options UTIL_NAME = "pairtools_select" @cli.command() @click.argument("condition", type=str) @click.argument("pairs_path", type=str, required=False) @click.option( "-o", "--output", type=str, default="", help="output file." " If the path ends with .gz or .lz4, the output is bgzip-/lz4c-compressed." " By default, the output is printed into stdout.", ) @click.option( "--output-rest", type=str, default="", help="output file for pairs of other types. " " If the path ends with .gz or .lz4, the output is bgzip-/lz4c-compressed." " By default, such pairs are dropped.", ) # Deprecated option to be removed in the future: # @click.option( # "--send-comments-to", # type=click.Choice(['selected', 'rest', 'both', 'none']), # default="both", # help="Which of the outputs should receive header and comment lines", # show_default=True) @click.option( "--chrom-subset", type=str, default=None, help="A path to a chromosomes file (tab-separated, 1st column contains " "chromosome names) containing a chromosome subset of interest. " "If provided, additionally filter pairs with both sides originating from " "the provided subset of chromosomes. This operation modifies the #chromosomes: " "and #chromsize: header fields accordingly.", ) @click.option( "--startup-code", type=str, default=None, help="An auxiliary code to execute before filtering. " "Use to define functions that can be evaluated in the CONDITION statement", ) @click.option( "-t", "--type-cast", type=(str, str), default=(), multiple=True, help="Cast a given column to a given type. By default, only pos and mapq " "are cast to int, other columns are kept as str. Provide as " "-t , e.g. -t read_len1 int. Multiple entries are allowed.", ) @click.option( "--remove-columns", "-r", help=f"Comma-separated list of columns to be removed, e.g.: {','.join(pairsam_format.COLUMNS)}", type=str, default="", required=False, ) @common_io_options def select( condition, pairs_path, output, output_rest, # send_comments_to, chrom_subset, startup_code, type_cast, remove_columns, **kwargs, ): """Select pairs according to some condition. CONDITION : A Python expression; if it returns True, select the read pair. Any column declared in the #columns line of the pairs header can be accessed by its name. If the header lacks the #columns line, the columns are assumed to follow the .pairs/.pairsam standard (readID, chrom1, chrom2, pos1, pos2, strand1, strand2, pair_type). Finally, CONDITION has access to COLS list which contains the string values of columns. In Bash, quote CONDITION with single quotes, and use double quotes for string variables inside CONDITION. PAIRS_PATH : input .pairs/.pairsam file. If the path ends with .gz or .lz4, the input is decompressed by bgzip/lz4c. By default, the input is read from stdin. The following functions can be used in CONDITION besides the standard Python functions: - csv_match(x, csv) - True if variable x is contained in a list of comma-separated values, e.g. csv_match(chrom1, 'chr1,chr2') - wildcard_match(x, wildcard) - True if variable x matches a wildcard, e.g. wildcard_match(pair_type, 'C*') - regex_match(x, regex) - True if variable x matches a Python-flavor regex, e.g. regex_match(chrom1, 'chr\d') \b Examples: pairtools select '(pair_type=="UU") or (pair_type=="UR") or (pair_type=="RU")' pairtools select 'chrom1==chrom2' pairtools select 'COLS[1]==COLS[3]' pairtools select '(chrom1==chrom2) and (abs(pos1 - pos2) < 1e6)' pairtools select '(chrom1=="!") and (chrom2!="!")' pairtools select 'regex_match(chrom1, "chr\d+") and regex_match(chrom2, "chr\d+")' pairtools select 'True' --chrom-subset mm9.reduced.chromsizes """ select_py( condition, pairs_path, output, output_rest, # send_comments_to, chrom_subset, startup_code, type_cast, remove_columns, **kwargs, ) def select_py( condition, pairs_path, output, output_rest, # send_comments_to, chrom_subset, startup_code, type_cast, remove_columns, **kwargs, ): instream = fileio.auto_open( pairs_path, mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) outstream = fileio.auto_open( output, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) # Optional output created only if requested: outstream_rest = None if output_rest: outstream_rest = fileio.auto_open( output_rest, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) # Parse the input stream: header, body_stream = headerops.get_header(instream) # Modify the header: header = headerops.append_new_pg(header, ID=UTIL_NAME, PN=UTIL_NAME) # Filter out unwanted columns: if remove_columns: input_columns = headerops.extract_column_names(header) remove_columns = remove_columns.split(",") for col in remove_columns: if col in pairsam_format.COLUMNS_PAIRS: warnings.warn( f"Removing required {col} column for .pairs format. Output is not .pairs anymore" ) elif col in pairsam_format.COLUMNS_PAIRSAM: warnings.warn( f"Removing required {col} column for .pairsam format. Output is not .pairsam anymore" ) updated_columns = [x for x in input_columns if x not in remove_columns] if len(updated_columns) == len(input_columns): warnings.warn( f"Some column(s) {','.join(remove_columns)} not in the file, the operation has no effect" ) else: header = headerops.set_columns(header, updated_columns) # Update the chromosomes: new_chroms = None if chrom_subset is not None: new_chroms = [l.strip().split("\t")[0] for l in open(chrom_subset, "r")] if new_chroms is not None: header = headerops.subset_chroms_in_pairsheader(header, new_chroms) outstream.writelines((l + "\n" for l in header)) if output_rest: outstream_rest.writelines((l + "\n" for l in header)) column_names = headerops.extract_column_names(header) if len(column_names) == 0: column_names = pairsam_format.COLUMNS # Columns filtration rule: if remove_columns: column_scheme = [input_columns.index(COL) for COL in updated_columns] # Format the condition: condition = condition.strip() if new_chroms is not None: condition = ( f"({condition}) and (chrom1 in {new_chroms}) and (chrom2 in {new_chroms})" ) for filter_passed, line in evaluate_stream( body_stream, condition, column_names, type_cast, startup_code ): COLS = line.rstrip('\n').split(pairsam_format.PAIRSAM_SEP) if remove_columns: COLS = [ COLS[idx] for idx in column_scheme ] # re-order the columns according to the scheme: line = pairsam_format.PAIRSAM_SEP.join(COLS) + "\n" # form the line if filter_passed: outstream.write(line) elif outstream_rest: outstream_rest.write(line) if instream != sys.stdin: instream.close() if outstream != sys.stdout: outstream.close() if output_rest and outstream_rest != sys.stdout: outstream_rest.close() if __name__ == "__main__": select() pairtools-1.1.3/pairtools/cli/sort.py000066400000000000000000000136721474715105500176760ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- import io import sys import click import subprocess import shutil import warnings from ..lib import fileio, pairsam_format, headerops from . import cli, common_io_options UTIL_NAME = "pairtools_sort" @cli.command() @click.argument("pairs_path", type=str, required=False) @click.option( "-o", "--output", type=str, default="", help="output pairs file." " If the path ends with .gz or .lz4, the output is compressed by bgzip " "or lz4, correspondingly. By default, the output is printed into stdout.", ) @click.option( "--c1", type=str, default=pairsam_format.COLUMNS_PAIRS[1], help=f"Chrom 1 column; default {pairsam_format.COLUMNS_PAIRS[1]}" "[input format option]", ) @click.option( "--c2", type=str, default=pairsam_format.COLUMNS_PAIRS[3], help=f"Chrom 2 column; default {pairsam_format.COLUMNS_PAIRS[3]}" "[input format option]", ) @click.option( "--p1", type=str, default=pairsam_format.COLUMNS_PAIRS[2], help=f"Position 1 column; default {pairsam_format.COLUMNS_PAIRS[2]}" "[input format option]", ) @click.option( "--p2", type=str, default=pairsam_format.COLUMNS_PAIRS[4], help=f"Position 2 column; default {pairsam_format.COLUMNS_PAIRS[4]}" "[input format option]", ) @click.option( "--pt", type=str, default=pairsam_format.COLUMNS_PAIRS[7], help=f"Pair type column; default {pairsam_format.COLUMNS_PAIRS[7]}" "[input format option]", ) @click.option( "--extra-col", nargs=1, type=str, multiple=True, help="Extra column (name or numerical index) that is also used for sorting." "The option can be provided multiple times." 'Example: --extra-col "phase1" --extra-col "phase2". [output format option]', ) @click.option( "--nproc", type=int, default=8, show_default=True, help="Number of processes to split the sorting work between.", ) @click.option( "--tmpdir", type=str, default="", help="Custom temporary folder for sorting intermediates.", ) @click.option( "--memory", type=str, default="2G", show_default=True, help="The amount of memory used by default.", ) @click.option( "--compress-program", type=str, default="auto", show_default=True, help="A binary to compress temporary sorted chunks. " "Must decompress input when the flag -d is provided. " "Suggested alternatives: gzip, lzop, lz4c, snzip. " 'If "auto", then use lz4c if available, and gzip ' "otherwise.", ) @common_io_options def sort( pairs_path, output, c1, c2, p1, p2, pt, extra_col, nproc, tmpdir, memory, compress_program, **kwargs, ): """Sort a .pairs/.pairsam file. Sort pairs in the lexicographic order along chrom1 and chrom2, in the numeric order along pos1 and pos2 and in the lexicographic order along pair_type. PAIRS_PATH : input .pairs/.pairsam file. If the path ends with .gz or .lz4, the input is decompressed by bgzip or lz4c, correspondingly. By default, the input is read as text from stdin. """ sort_py( pairs_path, output, c1, c2, p1, p2, pt, extra_col, nproc, tmpdir, memory, compress_program, **kwargs, ) def sort_py( pairs_path, output, c1, c2, p1, p2, pt, extra_col, nproc, tmpdir, memory, compress_program, **kwargs, ): instream = fileio.auto_open( pairs_path, mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) outstream = fileio.auto_open( output, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) header, body_stream = headerops.get_header(instream) header = headerops.append_new_pg(header, ID=UTIL_NAME, PN=UTIL_NAME) header = headerops.mark_header_as_sorted(header) outstream.writelines((l + "\n" for l in header)) outstream.flush() if compress_program == "auto": if shutil.which("lz4c") is not None: compress_program = "lz4c" else: warnings.warn( "lz4c is not found. Using gzip for compression of sorted chunks, " "which results in a minor decrease in performance. Please install " "lz4c for faster sorting." ) compress_program = "gzip" column_names = headerops.extract_column_names(header) columns = [c1, c2, p1, p2, pt] + list(extra_col) # Now generating the "-k ," expressions for all columns. # If column name is in the default pairsam format and has an integer dtype there, do numerical sorting cols = [] for col in columns: colindex = int(col) if col.isnumeric() else column_names.index(col) + 1 cols.append( f"-k {colindex},{colindex}{'n' if issubclass(pairsam_format.DTYPES_PAIRSAM.get(column_names[colindex-1], str), int) else ''}" ) cols = " ".join(cols) command = rf""" /bin/bash -c 'export LC_COLLATE=C; export LANG=C; sort {cols} --stable --field-separator=$'\''{pairsam_format.PAIRSAM_SEP_ESCAPE}'\'' --parallel={nproc} {f'--temporary-directory={tmpdir}' if tmpdir else ''} -S {memory} {f'--compress-program={compress_program}' if compress_program else ''}' """.replace( "\n", " " ) with subprocess.Popen( command, stdin=subprocess.PIPE, bufsize=-1, shell=True, stdout=outstream ) as process: stdin_wrapper = io.TextIOWrapper(process.stdin, "utf-8") for line in body_stream: stdin_wrapper.write(line) stdin_wrapper.flush() process.communicate() if instream != sys.stdin: instream.close() if outstream != sys.stdout: outstream.close() if __name__ == "__main__": sort() pairtools-1.1.3/pairtools/cli/split.py000066400000000000000000000112151474715105500200310ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import pipes import click from ..lib import fileio, pairsam_format, headerops from . import cli, common_io_options UTIL_NAME = "pairtools_split" @cli.command() @click.argument("pairsam_path", type=str, required=False) @click.option( "--output-pairs", type=str, default="", help="output pairs file." " If the path ends with .gz or .lz4, the output is bgzip-/lz4c-compressed." " If -, pairs are printed to stdout." " If not specified, pairs are dropped.", ) @click.option( "--output-sam", type=str, default="", help="output sam file." " If the path ends with .bam, the output is compressed into a bam file." " If -, sam entries are printed to stdout." " If not specified, sam entries are dropped.", ) @common_io_options def split(pairsam_path, output_pairs, output_sam, **kwargs): """Split a .pairsam file into .pairs and .sam. Restore a .sam file from sam1 and sam2 fields of a .pairsam file. Create a .pairs file without sam1/sam2 fields. PAIRSAM_PATH : input .pairsam file. If the path ends with .gz or .lz4, the input is decompressed by bgzip or lz4c. By default, the input is read from stdin. """ split_py(pairsam_path, output_pairs, output_sam, **kwargs) def split_py(pairsam_path, output_pairs, output_sam, **kwargs): instream = fileio.auto_open( pairsam_path, mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) # Output streams if (not output_pairs) and (not output_sam): raise ValueError("At least one output (pairs and/or sam) must be specified!") if (output_pairs == "-") and (output_sam == "-"): raise ValueError("Only one output (pairs or sam) can be printed in stdout!") outstream_pairs = None outstream_sam = None if output_pairs: outstream_pairs = fileio.auto_open( output_pairs, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) if output_sam: outstream_sam = fileio.auto_open( output_sam, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) header, body_stream = headerops.get_header(instream) header = headerops.append_new_pg(header, ID=UTIL_NAME, PN=UTIL_NAME) columns = headerops.extract_column_names(header) has_sams = False if columns: # trust the column order specified in the header if ("sam1" in columns) and ("sam2" in columns): sam1col = columns.index("sam1") sam2col = columns.index("sam2") columns.pop(max(sam1col, sam2col)) columns.pop(min(sam1col, sam2col)) header = headerops._update_header_entry( header, "columns", " ".join(columns) ) has_sams = True elif ("sam1" in columns) != ("sam2" in columns): raise ValueError( "According to the #columns header field only one sam entry is present" ) else: # assume that the file has sam columns and follows the pairsam format sam1col = pairsam_format.COL_SAM1 sam2col = pairsam_format.COL_SAM2 has_sams = True if output_pairs: outstream_pairs.writelines((l + "\n" for l in header)) if output_sam: outstream_sam.writelines( (l[11:].strip() + "\n" for l in header if l.startswith("#samheader:")) ) # Split sam1 = None sam2 = None for line in body_stream: cols = line.rstrip('\n').split(pairsam_format.PAIRSAM_SEP) if has_sams: if sam1col < sam2col: sam2 = cols.pop(sam2col) sam1 = cols.pop(sam1col) else: sam1 = cols.pop(sam1col) sam2 = cols.pop(sam2col) if output_pairs: # hard-coded tab separator to follow the DCIC pairs standard outstream_pairs.write("\t".join(cols)) outstream_pairs.write("\n") if output_sam and has_sams: for col in (sam1, sam2): if col != ".": for sam_entry in col.split(pairsam_format.INTER_SAM_SEP): outstream_sam.write( sam_entry.replace(pairsam_format.SAM_SEP, "\t") ) outstream_sam.write("\n") if output_pairs and outstream_pairs != sys.stdout: outstream_pairs.close() if output_sam and outstream_sam != sys.stdout: outstream_sam.close() if __name__ == "__main__": split() pairtools-1.1.3/pairtools/cli/stats.py000066400000000000000000000164721474715105500200460ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- import io import sys import click import pandas as pd from ..lib import fileio, pairsam_format, headerops from . import cli, common_io_options from ..lib.stats import PairCounter, do_merge from .._logging import get_logger logger = get_logger() UTIL_NAME = "pairtools_stats" @cli.command() @click.argument("input_path", type=str, nargs=-1, required=False) @click.option("-o", "--output", type=str, default="", help="output stats tsv file.") @click.option( "--merge", is_flag=True, help="If specified, merge multiple input stats files instead of calculating" " statistics of a .pairs/.pairsam file. Merging is performed via summation of" " all overlapping statistics. Non-overlapping statistics are appended to" " the end of the file. Supported for tsv stats with single filter.", ) @click.option( "--n-dist-bins-decade", type=int, default=PairCounter.N_DIST_BINS_DECADE_DEFAULT, show_default=True, required=False, help="Number of bins to split the distance range in log10-space, specified per a factor of 10 difference.", ) @click.option( "--with-chromsizes/--no-chromsizes", is_flag=True, default=True, help="If enabled, will store sizes of chromosomes from the header of the pairs file" " in the stats file.", ) @click.option( "--yaml/--no-yaml", is_flag=True, default=False, help="Output stats in yaml format instead of table. ", ) @click.option( "--bytile-dups/--no-bytile-dups", default=False, help="If enabled, will analyse by-tile duplication statistics to estimate" " library complexity more accurately." " Requires parent_readID column to be saved by dedup (will be ignored otherwise)" " Saves by-tile stats into --output_bytile-stats stream, or regular output if --output_bytile-stats is not provided.", ) @click.option( "--output-bytile-stats", default="", required=False, help="output file for tile duplicate statistics." " If file exists, it will be open in the append mode." " If the path ends with .gz or .lz4, the output is bgzip-/lz4c-compressed." " By default, by-tile duplicate statistics are not printed." " Note that the readID and parent_readID should be provided and contain tile information for this option.", ) # Filtering options: @click.option( "--filter", default=None, required=False, multiple=True, help="Filters with conditions to apply to the data (similar to `pairtools select`). " "For non-YAML output only the first filter will be reported. " """Example: pairtools stats --yaml --filter 'unique:(pair_type=="UU")' --filter 'close:(pair_type=="UU") and (abs(pos1-pos2)<10)' test.pairs """, ) @click.option( "--engine", default="pandas", required=False, help="Engine for regular expression parsing. " "Python will provide you regex functionality, while pandas does not accept custom funtctions and works faster. ", ) @click.option( "--chrom-subset", type=str, default=None, required=False, help="A path to a chromosomes file (tab-separated, 1st column contains " "chromosome names) containing a chromosome subset of interest. " "If provided, additionally filter pairs with both sides originating from " "the provided subset of chromosomes. This operation modifies the #chromosomes: " "and #chromsize: header fields accordingly.", ) @click.option( "--startup-code", type=str, default=None, required=False, help="An auxiliary code to execute before filtering. " "Use to define functions that can be evaluated in the CONDITION statement", ) @click.option( "-t", "--type-cast", type=(str, str), default=(), multiple=True, help="Cast a given column to a given type. By default, only pos and mapq " "are cast to int, other columns are kept as str. Provide as " "-t , e.g. -t read_len1 int. Multiple entries are allowed.", ) @common_io_options def stats( input_path, output, merge, n_dist_bins_decade, bytile_dups, output_bytile_stats, filter, **kwargs ): """Calculate pairs statistics. INPUT_PATH : by default, a .pairs/.pairsam file to calculate statistics. If not provided, the input is read from stdin. If --merge is specified, then INPUT_PATH is interpreted as an arbitrary number of stats files to merge. The files with paths ending with .gz/.lz4 are decompressed by bgzip/lz4c. """ stats_py( input_path, output, merge, n_dist_bins_decade, bytile_dups, output_bytile_stats, filter, **kwargs, ) def stats_py( input_path, output, merge, n_dist_bins_decade, bytile_dups, output_bytile_stats, filter, **kwargs ): if merge: do_merge(output, input_path, n_dist_bins_decade=n_dist_bins_decade, **kwargs) return if len(input_path) == 0: raise ValueError(f"No input paths: {input_path}") instream = fileio.auto_open( input_path[0], mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) outstream = fileio.auto_open( output, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) if bytile_dups and not output_bytile_stats: output_bytile_stats = outstream if output_bytile_stats: bytile_dups = True header, body_stream = headerops.get_header(instream) cols = headerops.extract_column_names(header) # Check necessary columns for reporting by-tile stats: if bytile_dups and "parent_readID" not in cols: logger.warning( "No 'parent_readID' column in the file, not generating duplicate stats." ) bytile_dups = False # Define filters and their properties first_filter_name = "no_filter" # default filter name for full output if filter is not None and len(filter) > 0: first_filter_name = filter[0].split(":", 1)[0] if len(filter) > 1 and not kwargs.get("yaml", False): logger.warn( f"Output the first filter only in non-YAML output: {first_filter_name}" ) filter = dict([f.split(":", 1) for f in filter]) else: filter = None stats = PairCounter( n_dist_bins_decade=n_dist_bins_decade, bytile_dups=bytile_dups, filters=filter, startup_code=kwargs.get("startup_code", ""), # for evaluation of filters type_cast=kwargs.get("type_cast", ()), # for evaluation of filters engine=kwargs.get("engine", "pandas"), ) # Collecting statistics for chunk in pd.read_table(body_stream, names=cols, chunksize=100_000): stats.add_pairs_from_dataframe(chunk) if kwargs.get("with_chromsizes", True): chromsizes = headerops.extract_chromsizes(header) stats.add_chromsizes(chromsizes) if bytile_dups: stats.save_bytile_dups(output_bytile_stats) # save statistics to file ... stats.save( outstream, yaml=kwargs.get("yaml", False), # format as yaml filter=first_filter_name if not kwargs.get("yaml", False) else None, # output only the first filter if non-YAML output ) if instream != sys.stdin: instream.close() if outstream != sys.stdout: outstream.close() if __name__ == "__main__": stats() pairtools-1.1.3/pairtools/lib/000077500000000000000000000000001474715105500163235ustar00rootroot00000000000000pairtools-1.1.3/pairtools/lib/__init__.py000066400000000000000000000003741474715105500204400ustar00rootroot00000000000000from . import fileio from . import dedup from . import filterbycov from . import headerops from . import pairsio from . import pairsam_format from . import parse from . import parse_pysam from . import restrict from . import stats from . import select pairtools-1.1.3/pairtools/lib/dedup.py000066400000000000000000000544711474715105500200110ustar00rootroot00000000000000import numpy as np import pandas as pd import scipy.spatial from scipy.sparse import coo_matrix from scipy.sparse.csgraph import connected_components from csv import QUOTE_NONE from . import dedup_cython, pairsam_format from .._logging import get_logger logger = get_logger() import time # Ignore pandas future warnings: import warnings warnings.simplefilter(action="ignore", category=FutureWarning) # Setting for cython deduplication: # you don't need to load more than 10k lines at a time b/c you get out of the # CPU cache, so this parameter is not adjustable MAX_LEN = 10000 def streaming_dedup( in_stream, colnames, chunksize, carryover, method, mark_dups, max_mismatch, extra_col_pairs, unmapped_chrom, outstream, outstream_dups, outstream_unmapped, keep_parent_id, out_stat, backend, n_proc, c1="chrom1", c2="chrom2", p1="pos1", p2="pos2", s1="strand1", s2="strand2", ): deduped_chunks = _dedup_stream( in_stream=in_stream, colnames=colnames, method=method, chunksize=chunksize, carryover=carryover, mark_dups=mark_dups, max_mismatch=max_mismatch, extra_col_pairs=extra_col_pairs, keep_parent_id=keep_parent_id, backend=backend, n_proc=n_proc, c1=c1, c2=c2, p1=p1, p2=p2, s1=s1, s2=s2, unmapped_chrom=unmapped_chrom, ) t0 = time.time() N = 0 for df_chunk in deduped_chunks: N += df_chunk.shape[0] # Write the stats if requested: if out_stat is not None: out_stat.add_pairs_from_dataframe(df_chunk, unmapped_chrom=unmapped_chrom) # Define masks of unmapped and duplicated reads: mask_mapped = np.logical_and( (df_chunk[c1] != unmapped_chrom), (df_chunk[c2] != unmapped_chrom), ) mask_duplicates = df_chunk["duplicate"] # Clean up dataframe: df_chunk = df_chunk.drop(columns=["duplicate"]) # Save the pairs: # Stream unmapped: if outstream_unmapped: df_chunk.loc[~mask_mapped, :].to_csv( outstream_unmapped, index=False, header=False, sep="\t", quoting=QUOTE_NONE, ) # If outstream_dups is the same as outstream, we save the mapped pairs to the same file if outstream_dups == outstream: df_chunk.loc[mask_mapped, :].to_csv( outstream, index=False, header=False, sep="\t", quoting=QUOTE_NONE ) else: # Save the dups: if outstream_dups: df_chunk.loc[mask_duplicates, :].to_csv( outstream_dups, index=False, header=False, sep="\t", quoting=QUOTE_NONE, ) # Drop readID if it was created (not needed for nodup and unmapped pairs): if keep_parent_id: df_chunk = df_chunk.drop(columns=["parent_readID"]) # Save unique: if outstream: df_chunk.loc[mask_mapped & (~mask_duplicates), :].to_csv( outstream, index=False, header=False, sep="\t", quoting=QUOTE_NONE ) t1 = time.time() t = t1 - t0 logger.debug(f"total time: {t}") if N > 0: logger.debug(f"time per mln pairs: {t/N*1e6}") else: logger.debug(f"Processed {N} pairs") def _dedup_stream( in_stream, colnames, method, chunksize, carryover, mark_dups, max_mismatch, extra_col_pairs, keep_parent_id, backend, n_proc, c1, c2, p1, p2, s1, s2, unmapped_chrom, ): # Stream the input dataframe: dfs = pd.read_table( in_stream, comment=None, names=colnames, chunksize=chunksize, dtype=pairsam_format.DTYPES_PAIRSAM, sep="\t", ) # Set up the carryover dataframe: df_prev_nodups = pd.DataFrame([]) prev_i = 0 # Iterate over chunks: for df in dfs: df["carryover"] = False input_chunk = pd.concat( [df_prev_nodups, df], axis=0, ignore_index=True ).reset_index(drop=True) df_marked = _dedup_chunk( input_chunk, r=max_mismatch, method=method, keep_parent_id=keep_parent_id, extra_col_pairs=extra_col_pairs, backend=backend, n_proc=n_proc, c1=c1, c2=c2, p1=p1, p2=p2, s1=s1, s2=s2, unmapped_chrom=unmapped_chrom, ) df_marked = ( df_marked[~df_marked["carryover"]] .drop(columns=["carryover"]) .reset_index(drop=True) ) mask_duplicated = df_marked["duplicate"] if mark_dups: df_marked.loc[mask_duplicated, "pair_type"] = "DD" yield df_marked # Filter out duplicates and store specific columns: df_nodups = df_marked.loc[~mask_duplicated, colnames] # Re-define carryover pairs: df_prev_nodups = df_nodups.tail(carryover).reset_index(drop=True) df_prev_nodups["carryover"] = True prev_i = len(df_prev_nodups) def _make_adj_mat(arr, size, r, method, n_proc=None, backend=None): if method not in ("max", "sum"): raise ValueError('Unknown method, only "sum" or "max" allowed') if method == "sum": p = 1 else: p = np.inf if backend == "sklearn": from sklearn import neighbors a_mat = neighbors.radius_neighbors_graph( arr, radius=r, p=p, n_jobs=n_proc, ) return a_mat elif backend == "scipy": import scipy.spatial from scipy.sparse import coo_matrix z = scipy.spatial.KDTree( arr, ) a = z.query_pairs(r=r, p=p, output_type="ndarray") a0 = a[:, 0] a1 = a[:, 1] a_mat = coo_matrix((np.ones_like(a0), (a0, a1)), shape=(size, size)) return a_mat else: raise ValueError('Unknown backend, only "scipy" or "sklearn" allowed') def _cluster_pairs( df_mapped, cols, p1, p2, r, method, n_proc, backend, ): groups = ( df_mapped[cols] .drop_duplicates() .reset_index(drop=True) .reset_index() .rename(columns={"index": "group"}) ) df_mapped = df_mapped.merge(groups, how="left", on=list(cols)) components = [] maxcluster_id = 0 for name, group in df_mapped.groupby("group"): a_mat = _make_adj_mat( group[[p1, p2]], size=group.shape[0], r=r, method=method, n_proc=n_proc, backend=backend, ) comp = connected_components(a_mat, directed=False)[1] + maxcluster_id + 1 components.append( pd.Series( name="cluster_id", index=group.index, data=comp, ) ) maxcluster_id = components[-1].max() df_mapped["cluster_id"] = pd.concat(components) df_mapped.drop(columns=["group"], inplace=True) return df_mapped def _cluster_pairs_nonmatching_col_pairs( df_mapped, col_pairs, p1, p2, r, method, n_proc, backend, ): groups_left = ( df_mapped[col_pairs[:, 0]] .drop_duplicates() .reset_index(drop=True) .reset_index() .rename(columns={"index": "group"}) ) df_mapped = df_mapped.merge(groups_left, how="left", on=list(col_pairs[:, 0])) groups_right = ( df_mapped[col_pairs[:, 1]] .drop_duplicates() .reset_index(drop=True) .reset_index() .rename(columns={"index": "group"}) ) df_mapped = df_mapped.merge( groups_right, on=list(col_pairs[:, 1]), suffixes=["_left", "_right"] ) components = [] maxcluster_id = 0 for name, group in df_mapped.groupby("group_left"): group = group[group["group_right"] == name] a_mat = _make_adj_mat( group[[p1, p2]], size=group.shape[0], r=r, method=method, n_proc=n_proc, backend=backend, ) components.append( pd.Series( name="cluster_id", index=group.index, data=connected_components(a_mat, directed=False)[1] + maxcluster_id, ) ) maxcluster_id = components[-1].max() df_mapped["cluster_id"] = pd.concat(components) df_mapped.drop(columns=["group_left", "group_right"], inplace=True) return df_mapped def _dedup_chunk( df, r, method, keep_parent_id, extra_col_pairs, backend, n_proc, c1, c2, p1, p2, s1, s2, unmapped_chrom, ): """Mark duplicates in a dataframe of pairs Parameters ---------- df : pd.DataFrame Dataframe with pairs, has to contain columns 'chrom1', 'pos1', 'chrom2', 'pos2' 'strand1', 'strand2' r : int Allowed distance between two pairs to call them duplicates method : str 'sum' or 'max' - whether 'r' uses sum of distances on two ends of pairs, or the maximal distance keep_parent_id : bool If True, the read ID of the read that was not labelled as a duplicate from a group of duplicates is recorded for each read marked as duplicate. Only possible with non-cython backends extra_col_pairs : list of tuples List of extra column pairs that need to match between two reads for them be considered duplicates (e.g. useful if alleles are annotated) backend : str 'scipy', 'sklearn', 'cython' unmapped_chrom : str, optional Which character denotes unmapped reads in the chrom1/chrom2 fields, by default "!" n_proc : int, optional How many cores to use, by default 1 Only works for 'sklearn' backend Returns ------- pd.DataFrame Dataframe with marked duplicates (extra boolean field 'duplicate'), and optionally recorded 'parent_readID' """ # Store the index of the dataframe: index_colname = df.index.name if index_colname is None: index_colname = "index" df = df.reset_index() # Remove the index temporarily # Set up columns to store the dedup info: df["cluster_id"] = -1 df["duplicate"] = False # Split mapped and unmapped reads: mask_unmapped = (df[c1] == unmapped_chrom) | (df[c2] == unmapped_chrom) df_unmapped = df.loc[mask_unmapped, :].copy() df_mapped = df.loc[~mask_unmapped, :].copy() N_mapped = df_mapped.shape[0] # If there are some mapped reads, dedup them: if N_mapped > 0: col_pairs = np.array( [ (c1, c1), (c2, c2), (s1, s1), (s2, s2), ] + extra_col_pairs ) if (col_pairs[:, 0] == col_pairs[:, 1]).all(): df_mapped = _cluster_pairs( df_mapped, col_pairs[:, 0], p1, p2, r, method, n_proc, backend, ) else: df_mapped = _cluster_pairs_nonmatching_col_pairs( df_mapped, col_pairs, p1, p2, r, method, n_proc, backend, ) mask_dups = df_mapped["cluster_id"].duplicated() df_mapped.loc[mask_dups, "duplicate"] = True # Mark parent IDs if requested: if keep_parent_id: df_mapped.loc[:, "parent_readID"] = df_mapped["cluster_id"].map( df_mapped[~mask_dups].set_index("cluster_id")["readID"] ) df_unmapped["parent_readID"] = "" # Reconstruct original dataframe with removed duplicated reads # (here, we rely on the sorting order that puts unmapped reads first): df = pd.concat([df_unmapped, df_mapped]).reset_index(drop=True) df = df.set_index(index_colname) # Set up the original index df = df.drop( ["cluster_id"], axis=1 ) # Remove the information that we don't need anymore: return df ### Cython deduplication #### def streaming_dedup_cython( method, max_mismatch, sep, c1ind, c2ind, p1ind, p2ind, s1ind, s2ind, extra_cols1, extra_cols2, unmapped_chrom, instream, outstream, outstream_dups, outstream_unmapped, out_stat, mark_dups, keep_parent_id=False, readid_ind=0, ): """ Cython-powered deduplication with online algorithm based on indexed list. Parameters ---------- method: "max" or "sum" max_mismatch: maximum allowed mismatch to count the pairs as duplicates sep: separator of the fields in the input file c1ind: index of the chr1 column c2ind: index of the chr2 column p1ind: index of the pos1 column p2ind: index of the pos2 column s1ind: index of the strand1 column s2ind: index of the strand2 column extra_cols1: extra columns for left alignment in a pair to add extra_cols2: extra columns for right alignment in a pair to add unmapped_chrom: Symbol of the chromosome for the unmapped alignment instream: input stream of pair file outstream: output stram of deduplicated pairs outstream_dups: output stream of duplicates (optionally with added parent_id, see keep_parent_id option) outstream_unmapped: output stram of unmapped pairs out_stat: output statistics mark_dups: if True, will add "DD" as the pair_type keep_parent_id: if True, additional column "parent_readID will be added to the output, can be useful for optical duplicates search readid_ind: index of the readID column in the input file Returns ------- """ maxind = max(c1ind, c2ind, p1ind, p2ind, s1ind, s2ind) if bool(extra_cols1) and bool(extra_cols2): maxind = max(maxind, max(extra_cols1), max(extra_cols2)) all_scols1 = [s1ind] + extra_cols1 all_scols2 = [s2ind] + extra_cols2 # if we do stats in the dedup, we need PAIR_TYPE # i do not see way around this: if out_stat: ptind = pairsam_format.COL_PTYPE maxind = max(maxind, ptind) dd = dedup_cython.OnlineDuplicateDetector( method, max_mismatch, returnData=False, keep_parent_id=keep_parent_id ) c1 = [] c2 = [] p1 = [] p2 = [] s1 = [] s2 = [] idx = [] line_buffer = [] cols_buffer = [] chromDict = {} strandDict = {} curMaxLen = max(MAX_LEN, dd.getLen()) t0 = time.time() N = 0 instream = iter(instream) read_idx = 0 # read index to mark the parent readID while True: rawline = next(instream, None) stripline = rawline.strip("\n") if rawline else None # take care of empty lines not at the end of the file separately if rawline and (not stripline): logger.warning("Empty line detected not at the end of the file") continue if stripline: cols = stripline.split(sep) if len(cols) <= maxind: raise ValueError( "Error parsing line {}: ".format(stripline) + " expected {} columns, got {}".format(maxind, len(cols)) ) if (cols[c1ind] == unmapped_chrom) or (cols[c2ind] == unmapped_chrom): if outstream_unmapped: outstream_unmapped.write(stripline) # don't forget terminal newline outstream_unmapped.write("\n") # add a pair to PairCounter if stats output is requested: if out_stat: out_stat.add_pair( cols[c1ind], int(cols[p1ind]), cols[s1ind], cols[c2ind], int(cols[p2ind]), cols[s2ind], cols[ptind], unmapped_chrom=unmapped_chrom, ) else: line_buffer.append(stripline) cols_buffer.append(cols) c1.append(fetchadd(cols[c1ind], chromDict)) c2.append(fetchadd(cols[c2ind], chromDict)) p1.append(int(cols[p1ind])) p2.append(int(cols[p2ind])) idx.append(read_idx) read_idx += 1 if bool(extra_cols1) and bool(extra_cols2): s1.append( fetchadd("".join(cols[i] for i in all_scols1), strandDict) ) s2.append( fetchadd("".join(cols[i] for i in all_scols2), strandDict) ) else: s1.append(fetchadd(cols[s1ind], strandDict)) s2.append(fetchadd(cols[s2ind], strandDict)) N += 1 if (not stripline) or (len(c1) == curMaxLen): if keep_parent_id: res, parents = dd.push( ar(c1, 32), ar(c2, 32), ar(p1, 32), ar(p2, 32), ar(s1, 32), ar(s2, 32), ) else: res = dd.push( ar(c1, 32), ar(c2, 32), ar(p1, 32), ar(p2, 32), ar(s1, 32), ar(s2, 32), ) if not stripline: if keep_parent_id: res_tmp, parents_tmp = dd.finish() parents = np.concatenate([parents, parents_tmp]) else: res_tmp = dd.finish() res = np.concatenate([res, res_tmp]) for i in range(len(res)): # not duplicated pair: if not res[i]: outstream.write(line_buffer[i]) # don't forget terminal newline outstream.write("\n") if out_stat: out_stat.add_pair( cols_buffer[i][c1ind], int(cols_buffer[i][p1ind]), cols_buffer[i][s1ind], cols_buffer[i][c2ind], int(cols_buffer[i][p2ind]), cols_buffer[i][s2ind], cols_buffer[i][ptind], unmapped_chrom=unmapped_chrom, ) # duplicated pair: else: if out_stat: out_stat.add_pair( cols_buffer[i][c1ind], int(cols_buffer[i][p1ind]), cols_buffer[i][s1ind], cols_buffer[i][c2ind], int(cols_buffer[i][p2ind]), cols_buffer[i][s2ind], "DD", unmapped_chrom=unmapped_chrom, ) if outstream_dups: if mark_dups: # DD-marked pair: output = sep.join(mark_split_pair_as_dup(cols_buffer[i])) else: # pair as is: output = line_buffer[i] if keep_parent_id: # Add parentID as the last column: parent_readID = line_buffer[parents[i]].split(sep)[ readid_ind ] output = sep.join([output, parent_readID]) outstream_dups.write(output) # don't forget terminal newline outstream_dups.write("\n") # flush buffers and perform necessary checks here: c1 = [] c2 = [] p1 = [] p2 = [] s1 = [] s2 = [] line_buffer = line_buffer[len(res) :] cols_buffer = cols_buffer[len(res) :] if not stripline: if len(line_buffer) != 0: raise ValueError( "{} lines left in the buffer, ".format(len(line_buffer)) + "should be none;" + "something went terribly wrong" ) break # process next line ... # all lines have been processed at this point. # streaming_dedup is over. t1 = time.time() t = t1 - t0 logger.debug(f"total time: {t}") if N > 0: logger.debug(f"time per mln pairs: {t/N*1e6}") else: logger.debug(f"Processed {N} pairs") def fetchadd(key, mydict): key = key.strip() if key not in mydict: mydict[key] = len(mydict) return mydict[key] def ar(mylist, val): return np.array(mylist, dtype={8: np.int8, 16: np.int16, 32: np.int32}[val]) #### Markasdup utilities: #### def mark_split_pair_as_dup(cols): # if the original columns ended with a new line, the marked columns # should as well. original_has_newline = cols[-1].endswith("\n") cols[pairsam_format.COL_PTYPE] = "DD" if (len(cols) > pairsam_format.COL_SAM1) and (len(cols) > pairsam_format.COL_SAM2): for i in (pairsam_format.COL_SAM1, pairsam_format.COL_SAM2): # split each sam column into sam entries, tag and assemble back cols[i] = pairsam_format.INTER_SAM_SEP.join( [ mark_sam_as_dup(sam) for sam in cols[i].split(pairsam_format.INTER_SAM_SEP) ] ) if original_has_newline and not cols[-1].endswith("\n"): cols[-1] = cols[-1] + "\n" return cols def mark_sam_as_dup(sam): """Tag the binary flag and the optional pair type field of a sam entry as a PCR duplicate.""" samcols = sam.split(pairsam_format.SAM_SEP) if len(samcols) == 1: return sam samcols[1] = str(int(samcols[1]) | 1024) for j in range(11, len(samcols)): if samcols[j].startswith("Yt:Z:"): samcols[j] = "Yt:Z:DD" return pairsam_format.SAM_SEP.join(samcols) pairtools-1.1.3/pairtools/lib/dedup_cython.pyx000066400000000000000000000135311474715105500215550ustar00rootroot00000000000000""" Legacy code: ``mark_duplicates`` is an offline method that finds duplicates in a given input dataset. For other applications on much larger datasets you may consider an online method ``OnlineDuplicateDetector`` which is implemented as a class. Note that for both methods data types are fixed: * chromosomes are int32 * position is int32 * strand is int32, which is basically the same as C type "char". """ import numpy as np import cython cimport numpy as np cimport cython ### Online deduplicator used in pairtools.dedup Cython: cdef class OnlineDuplicateDetector(object): cdef cython.int [:] c1 cdef cython.int [:] c2 cdef cython.int [:] p1 cdef cython.int [:] p2 cdef cython.int [:] s1 cdef cython.int [:] s2 cdef cython.char [:] rm cdef cython.int [:] parent_idxs cdef int methodid cdef int low cdef int high cdef int N cdef int max_mismatch cdef int returnData cdef int keep_parent_id def __init__(self, method, max_mismatch, returnData=False, keep_parent_id=False): if returnData == False: self.returnData = 0 else: self.returnData = 1 if keep_parent_id == False: self.keep_parent_id = 0 else: self.keep_parent_id = 1 self.parent_idxs = np.zeros(0, np.int32) self.N = 0 self.c1 = np.zeros(0, np.int32) self.c2 = np.zeros(0, np.int32) self.p1 = np.zeros(0, np.int32) self.p2 = np.zeros(0, np.int32) self.s1 = np.zeros(0, np.int32) self.s2 = np.zeros(0, np.int32) self.rm = np.zeros(0, np.int8) if method == "max": self.methodid = 0 elif method == "sum": self.methodid = 1 else: raise ValueError('method should be "sum" or "max"') self.max_mismatch = int(max_mismatch) self.low = 0 self.high = 1 def _shrink(self): if self.returnData == 1: firstret = self.rm[:self.low] retainMask = (np.asarray(firstret) == False) del firstret ret = [] for ar in [self.c1, self.c2, self.p1, self.p2, self.s1, self.s2]: ret.append(np.asarray(ar)[:self.low][retainMask]) self.c1 = self.c1[self.low:] self.c2 = self.c2[self.low:] self.p1 = self.p1[self.low:] self.p2 = self.p2[self.low:] self.s1 = self.s1[self.low:] self.s2 = self.s2[self.low:] pastrm = self.rm[:self.low] self.rm = self.rm[self.low:] self.high = self.high-self.low self.N = self.N - self.low if self.returnData == 1: self.low = 0 return ret if self.keep_parent_id == 1: # Return parent readIDs alongside with duplicates mask: pastidx = self.parent_idxs[:self.low] self.low = 0 return pastrm, pastidx self.low = 0 return pastrm def _run(self, finish=False): cdef int finishing = 0 cdef int extraCondition if finish: finishing = 1 while True: if self.low == self.N: break if self.high == self.N: if finishing == 1: self.low += 1 self.high = self.low + 1 continue else: break if self.rm[self.low] == 1: self.low += 1 self.high = self.low+1 continue # if high already removed, just continue if self.rm[self.high] == 1: self.high += 1 continue # if we jumped too far, continue if ((self.c1[self.high] != self.c1[self.low]) or (self.p1[self.high] - self.p1[self.low] > self.max_mismatch) or (self.p1[self.high] - self.p1[self.low] < 0 )): self.low += 1 self.high = self.low + 1 # restart high continue if self.methodid == 0: extraCondition = max( abs(self.p1[self.low] - self.p1[self.high]), abs(self.p2[self.low] - self.p2[self.high])) <= self.max_mismatch elif self.methodid == 1: # sum of distances <= max_mismatch extraCondition = ( abs(self.p1[self.low] - self.p1[self.high]) + abs(self.p2[self.low] - self.p2[self.high]) <= self.max_mismatch ) else: raise ValueError( "Unknown method id, this should not happen. " "Check code of this function.") if ((self.c2[self.low] == self.c2[self.high]) and (self.s1[self.low] == self.s1[self.high]) and (self.s2[self.low] == self.s2[self.high]) and extraCondition): self.rm[self.high] = 1 if self.keep_parent_id == 1: self.parent_idxs[self.high] = self.low self.high += 1 continue self.high += 1 return self._shrink() def push(self, c1, c2, p1, p2, s1, s2): self.c1 = np.concatenate([self.c1, c1]) self.c2 = np.concatenate([self.c2, c2]) self.p1 = np.concatenate([self.p1, p1]) self.p2 = np.concatenate([self.p2, p2]) self.s1 = np.concatenate([self.s1, s1]) self.s2 = np.concatenate([self.s2, s2]) self.rm = np.concatenate([self.rm, np.zeros(len(c1), dtype=np.int8)]) if self.keep_parent_id == 1: self.parent_idxs = np.concatenate([self.parent_idxs, np.zeros(len(c1), dtype=np.int32)]) self.N = self.N + len(c1) return self._run(finish=False) def finish(self): return self._run(finish=True) def getLen(self): return int(self.N)pairtools-1.1.3/pairtools/lib/fileio.py000066400000000000000000000217561474715105500201570ustar00rootroot00000000000000import shutil import pipes import subprocess import sys class ParseError(Exception): pass def auto_open(path, mode, nproc=1, command=None): """Guess the file format from the extension and use the corresponding binary to open it for reading or writing. If the extension is not known, open the file as text. If the binary allows parallel execution, specify the number of threads with `nproc`. If `command` is supplied, use it to open the file instead of auto-guessing. The command must accept the filename as the last argument, accept input through stdin and print output into stdout. Supported extensions and binaries (with comments): .bam - samtools view (allows parallel writing) .gz - pbgzip if available, otherwise bgzip .lz4 - lz4c (does not support parallel execution) """ # Empty filepath or False provided if not path or path == "-": if mode == "r": return sys.stdin if mode == "w": return sys.stdout if command: if mode == "w": t = pipes.Template() t.append(command, "--") f = t.open(path, "w") elif mode == "r": t = pipes.Template() t.append(command, "--") f = t.open(path, "r") else: raise ValueError("Unknown mode : {}".format(mode)) return f elif path.endswith(".bam"): if shutil.which("samtools") is None: raise ValueError( { "w": "samtools is not found, cannot compress output", "r": "samtools is not found, cannot decompress input", }[mode] ) if mode == "w": t = pipes.Template() t.append( "samtools view -bS {} -".format( "-@ " + str(nproc - 1) if nproc > 1 else "" ), "--", ) f = t.open(path, "w") elif mode == "r": t = pipes.Template() t.append("samtools view -h", "--") f = t.open(path, "r") else: raise ValueError("Unknown mode for .bam : {}".format(mode)) return f elif path.endswith(".gz"): if shutil.which("pbgzip") is not None: if mode == "w": t = pipes.Template() t.append("pbgzip -c -n {}".format(nproc), "--") f = t.open(path, "w") elif mode == "a": t = pipes.Template() t.append("pbgzip -c -n {} $IN >> $OUT".format(nproc), "ff") f = t.open(path, "w") elif mode == "r": t = pipes.Template() t.append("pbgzip -dc -n {}".format(nproc), "--") f = t.open(path, "r") else: raise ValueError("Unknown mode for .gz : {}".format(mode)) elif shutil.which("bgzip") is not None: if mode == "w": t = pipes.Template() t.append("bgzip -c -@ {}".format(nproc), "--") f = t.open(path, "w") elif mode == "a": t = pipes.Template() t.append("bgzip -c -@ {} $IN >> $OUT".format(nproc), "ff") f = t.open(path, "w") elif mode == "r": t = pipes.Template() t.append("bgzip -dc -@ {}".format(nproc), "--") f = t.open(path, "r") else: raise ValueError("Unknown mode for .gz : {}".format(mode)) elif shutil.which("gzip") is not None: if mode == "w": t = pipes.Template() t.append("gzip -c", "--") f = t.open(path, "w") elif mode == "a": t = pipes.Template() t.append("gzip -c $IN >> $OUT", "ff") f = t.open(path, "w") elif mode == "r": t = pipes.Template() t.append("gzip -dc", "--") f = t.open(path, "r") else: raise ValueError("Unknown mode for .gz : {}".format(mode)) else: raise ValueError( { "w": "pbgzip, bgzip and gzip are not found, cannot compress output", "a": "pbgzip, bgzip and gzip are is not found, cannot compress output", "r": "pbgzip, bgzip and gzip are is not found, cannot decompress input", }[mode] ) return f elif path.endswith(".lz4"): if shutil.which("lz4c") is None: raise ValueError( { "w": "lz4c is not found, cannot compress output", "a": "lz4c is not found, cannot compress output", "r": "lz4c is not found, cannot decompress input", }[mode] ) if mode == "w": t = pipes.Template() t.append("lz4c -cz", "--") f = t.open(path, "w") elif mode == "a": t = pipes.Template() t.append("lz4c -cz $IN >> $OUT", "ff") f = t.open(path, "w") elif mode == "r": t = pipes.Template() t.append("lz4c -cd", "--") f = t.open(path, "r") else: raise ValueError("Unknown mode : {}".format(mode)) return f else: return open(path, mode) class PipedIO: def __init__(self, file_or_path, command, mode="r"): """ An experimental class that reads/writes a file, piping the contents through another process. Parameters ---------- file_or_path : file-like object or str A path to the input/output file or an already opened file-like object. command : str A command to launch a reading/writing process. If mode is 'w', the process must accept input via stdin. If mode is 'r', the process must put output into stdout. If mode is 'r' and file_or_path is str, the path will be appended to the command as the last argument. mode : str The mode for opening, same as in open(mode=). Returns ------- file: a file-like object """ if issubclass(type(command), str): command = command.split(" ") self._command = command self._mode = mode if mode.startswith("r"): if issubclass(type(file_or_path), str): self._proc = subprocess.Popen( command + [file_or_path], universal_newlines=True, stdout=subprocess.PIPE, ) else: self._proc = subprocess.Popen( command, universal_newlines=True, stdin=file_or_path, stdout=subprocess.PIPE, ) self._stream = self._proc.stdout self._close_stream = self._proc.stdout.close elif mode.startswith("w") or mode.startswith("a"): f = ( open(file_or_path, mode=mode) if issubclass(type(file_or_path), str) else file_or_path ) self._proc = subprocess.Popen( command, universal_newlines=True, stdin=subprocess.PIPE, stdout=f ) self._stream = self._proc.stdin self.buffer = self._stream.buffer self.closed = self._stream.closed self.flush = self._stream.flush self.fileno = self._stream.fileno self.read = self._stream.read self.readline = self._stream.readline self.readlines = self._stream.readlines self.seek = self._stream.seek self.seekable = self._stream.seekable self.truncate = self._stream.truncate self.tell = self._stream.tell self.writable = self._stream.writable self.write = self._stream.write self.writelines = self._stream.writelines def close(self, timeout=None): self._stream.close() retcode = self._proc.wait(timeout=timeout) return retcode def get_stream_handlers(instream): """ Get the readline and peek functions for the provided input stream. Parameters: instream (file-like object): The input stream to get the handlers for. Returns: tuple: A tuple containing the following elements: - readline_f (function): The readline function for the input stream. - peek_f (function): The peek function for the input stream. Raises: ValueError: If the peek function cannot be found for the provided stream. """ readline_f, peek_f = None, None if hasattr(instream, "buffer"): peek_f = instream.buffer.peek readline_f = instream.buffer.readline elif hasattr(instream, "peek"): peek_f = instream.peek readline_f = instream.readline else: raise ValueError("Cannot find the peek() function of the provided stream!") return readline_f, peek_f pairtools-1.1.3/pairtools/lib/filterbycov.py000066400000000000000000000173761474715105500212430ustar00rootroot00000000000000import numpy as np import warnings from .dedup import mark_split_pair_as_dup from . import pairsam_format def fetchadd(key, mydict): key = key.strip() if key not in mydict: mydict[key] = len(mydict) return mydict[key] def ar(mylist, val): return np.array(mylist, dtype={8: np.int8, 16: np.int16, 32: np.int32}[val]) def _filterbycov(c1_in, p1_in, c2_in, p2_in, max_dist, method): """ This is a slow version of the filtering code used for testing purposes only Use cythonized version in the future!! """ c1 = np.asarray(c1_in, dtype=int) p1 = np.asarray(p1_in, dtype=int) c2 = np.asarray(c2_in, dtype=int) p2 = np.asarray(p2_in, dtype=int) M = np.r_[ np.c_[c1, p1], np.c_[c2, p2] ] # M is a table of (chrom, pos) with 2*N rows assert c1.shape[0] == c2.shape[0] N = 2 * c1.shape[0] ind_sorted = np.lexsort((M[:, 1], M[:, 0])) # sort by chromosomes, then positions # M[ind_sorted] # ind_sorted # M, M[ind_sorted] if method == "sum": proximity_count = np.zeros( N ) # keeps track of how many molecules each framgent end is close to elif method == "max": proximity_count = np.zeros(N) else: raise ValueError("Unknown method: {}".format(method)) low = 0 high = 1 while True: # boundary case finish if low == N: break # boundary case - CHECK if high == N: low += 1 high = low + 1 continue # check if "high" is proximal enough to "low" # first, if chromosomes not equal, we have gone too far, and the positions are not proximal if M[ind_sorted[low], 0] != M[ind_sorted[high], 0]: low += 1 high = low + 1 # restart high continue # next, if positions are not proximal, increase low, and continue elif np.abs(M[ind_sorted[high], 1] - M[ind_sorted[low], 1]) > max_dist: low += 1 high = low + 1 # restart high continue # if on the same chromosome, and the distance is "proximal enough", add to count of both "low" and "high" positions else: proximity_count[low] += 1 proximity_count[high] += 1 high += 1 # unsort proximity count # proximity_count = proximity_count[ind_sorted] proximity_count[ind_sorted] = np.copy(proximity_count) # print(M) # print(proximity_count) # if method is sum of pairs if method == "sum": pcounts = proximity_count[0 : N // 2] + proximity_count[N // 2 :] + 1 elif method == "max": pcounts = np.maximum( proximity_count[0 : N // 2] + 1, proximity_count[N // 2 :] + 1 ) else: raise ValueError("Unknown method: {}".format(method)) return pcounts def streaming_filterbycov( method, max_dist, max_cov, sep, c1ind, c2ind, p1ind, p2ind, s1ind, s2ind, unmapped_chrom, instream, outstream, outstream_high, outstream_unmapped, out_stat, mark_multi, ): # doing everything in memory maxind = max(c1ind, c2ind, p1ind, p2ind, s1ind, s2ind) # if we do stats in the dedup, we need PAIR_TYPE # i do not see way around this: if out_stat: ptind = pairsam_format.COL_PTYPE maxind = max(maxind, ptind) c1 = [] c2 = [] p1 = [] p2 = [] s1 = [] s2 = [] line_buffer = [] cols_buffer = [] chromDict = {} strandDict = {} n_unmapped = 0 n_high = 0 n_low = 0 instream = iter(instream) while True: rawline = next(instream, None) stripline = rawline.strip() if rawline else None # take care of empty lines not at the end of the file separately if rawline and (not stripline): warnings.warn("Empty line detected not at the end of the file") continue if stripline: cols = stripline.split(sep) if len(cols) <= maxind: raise ValueError( "Error parsing line {}: ".format(stripline) + " expected {} columns, got {}".format(maxind, len(cols)) ) if (cols[c1ind] == unmapped_chrom) or (cols[c2ind] == unmapped_chrom): if outstream_unmapped: outstream_unmapped.write(stripline) # don't forget terminal newline outstream_unmapped.write("\n") # add a pair to PairCounter if stats output is requested: if out_stat: out_stat.add_pair( cols[c1ind], int(cols[p1ind]), cols[s1ind], cols[c2ind], int(cols[p2ind]), cols[s2ind], cols[ptind], ) else: line_buffer.append(stripline) cols_buffer.append(cols) c1.append(fetchadd(cols[c1ind], chromDict)) c2.append(fetchadd(cols[c2ind], chromDict)) p1.append(int(cols[p1ind])) p2.append(int(cols[p2ind])) s1.append(fetchadd(cols[s1ind], strandDict)) s2.append(fetchadd(cols[s2ind], strandDict)) else: # when everything is loaded in memory... res = _filterbycov(c1, p1, c2, p2, max_dist, method) for i in range(len(res)): # not high-frequency interactor pairs: if not res[i] > max_cov: outstream.write(line_buffer[i]) # don't forget terminal newline outstream.write("\n") if out_stat: out_stat.add_pair( cols_buffer[i][c1ind], int(cols_buffer[i][p1ind]), cols_buffer[i][s1ind], cols_buffer[i][c2ind], int(cols_buffer[i][p2ind]), cols_buffer[i][s2ind], cols_buffer[i][ptind], ) # high-frequency interactor pairs: else: if out_stat: out_stat.add_pair( cols_buffer[i][c1ind], int(cols_buffer[i][p1ind]), cols_buffer[i][s1ind], cols_buffer[i][c2ind], int(cols_buffer[i][p2ind]), cols_buffer[i][s2ind], "FF", ) if outstream_high: outstream_high.write( # DD-marked pair: sep.join(mark_split_pair_as_dup(cols_buffer[i])) if mark_multi # pair as is: else line_buffer[i] ) # don't forget terminal newline outstream_high.write("\n") # flush buffers and perform necessary checks here: c1 = [] c2 = [] p1 = [] p2 = [] s1 = [] s2 = [] line_buffer = line_buffer[len(res) :] cols_buffer = cols_buffer[len(res) :] if not stripline: if len(line_buffer) != 0: raise ValueError( "{} lines left in the buffer, ".format(len(line_buffer)) + "should be none;" + "something went terribly wrong" ) break break pairtools-1.1.3/pairtools/lib/headerops.py000066400000000000000000000564241474715105500206620ustar00rootroot00000000000000from collections import defaultdict import sys import copy import itertools import warnings import numpy as np import pandas as pd from .. import __version__ from . import pairsam_format from .fileio import ParseError, get_stream_handlers from .._logging import get_logger logger = get_logger() PAIRS_FORMAT_VERSION = "1.0.0" SEP_COLS = " " SEP_CHROMS = " " COMMENT_CHAR = "#" def get_header(instream, comment_char=COMMENT_CHAR, ignore_warning=False): """Returns a header from the stream and an the reaminder of the stream with the actual data. Parameters ---------- instream : a file object An input stream. comment_char : str The character prepended to header lines (use '@' when parsing sams, '#' when parsing pairsams). ignore_warning : bool If True, then no warning will be generated if header of pairs file is empty. Returns ------- header : list The header lines, stripped of terminal spaces and newline characters. remainder_stream : stream/file-like object Stream with the remaining lines. """ header = [] if not comment_char: raise ValueError("Please, provide a comment char!") comment_byte = comment_char.encode() readline_f, peek_f = get_stream_handlers(instream) current_peek = peek_f(1) while current_peek.startswith(comment_byte): # consuming a line from buffer guarantees # that the remainder of the buffer starts # with the beginning of the line. line = readline_f() if isinstance(line, bytes): line = line.decode() # append line to header, since it does start with header header.append(line.rstrip('\n')) # peek into the remainder of the instream current_peek = peek_f(1) # apparently, next line does not start with the comment # return header and the instream, advanced to the beginning of the data if len(header) == 0 and not ignore_warning: logger.warning( "Headerless input, please, add the header by `pairtools header generate` or `pairtools header transfer`" ) return header, instream def extract_fields(header, field_name, save_rest=False): """ Extract the specified fields from the pairs header and return a list of corresponding values, even if a single field was found. Additionally, can return the list of intact non-matching entries. """ fields = [] rest = [] for l in header: if l.lstrip(COMMENT_CHAR).startswith(field_name + ":"): fields.append(l.split(":", 1)[1].rstrip('\n').lstrip()) elif save_rest: rest.append(l) if save_rest: return fields, rest else: return fields def extract_column_names(header): """ Extract column names from header lines. """ columns = extract_fields(header, "columns") if len(columns) != 0: return columns[0].split(SEP_COLS) else: return [] def validate_cols(stream, columns): """ Validate that the number of columns coincides between stream and columns. Checks only the first line in the pairs stream! Note that it irreversibly removes the header from the stream. Parameters ---------- stream: input stream, body or full .pairs file columns: columns to validate against Returns ------- True if the number of columns is identical between file and columns """ comment_byte = COMMENT_CHAR.encode() readline_f, peek_f = get_stream_handlers(stream) current_peek = peek_f(1) while current_peek.startswith(comment_byte): # consuming a line from buffer guarantees # that the remainder of the buffer starts # with the beginning of the line. line = readline_f() # peek into the remainder of the instream current_peek = peek_f(1) line = readline_f() if isinstance(line, bytes): line = line.decode() ncols_body = len(line.split(pairsam_format.PAIRSAM_SEP)) ncols_reference = ( len(columns) if isinstance(columns, list) else columns.split(SEP_COLS) ) return ncols_body == ncols_reference def validate_header_cols(stream, header): """Validate that the number of columns corresponds between the stream and header""" columns = extract_column_names(header) return validate_cols(stream, header) def is_empty_header(header): if len(header) == 0: return True if not header[0].startswith("##"): return True else: return False def extract_chromsizes(header): """ Extract chromosome sizes from header lines. """ chromsizes_str = extract_fields(header, "chromsize") chromsizes_str = list(zip(*[s.split(SEP_CHROMS) for s in chromsizes_str])) chromsizes = pd.Series(data=chromsizes_str[1], index=chromsizes_str[0]).astype( np.int64 ) return chromsizes def get_chromsizes_from_pysam_header(samheader): """Convert pysam header to pairtools chromosomes dict (ordered by Python default since 3.7). Example of pysam header converted to dict: dict([ ('SQ', [{'SN': 'chr1', 'LN': 248956422}, {'SN': 'chr10', 'LN': 133797422}, {'SN': 'chr11', 'LN': 135086622}, {'SN': 'chr12', 'LN': 133275309}]), ('PG', [{'ID': 'bwa', 'PN': 'bwa', 'VN': '0.7.17-r1188', 'CL': 'bwa mem -t 8 -SP -v1 hg38.fa test_1.1.fastq.gz test_2.1.fastq.gz'}]) ]) """ SQs = samheader.to_dict()["SQ"] chromsizes = [(sq["SN"], int(sq["LN"])) for sq in SQs] return dict(chromsizes) def get_chromsizes_from_file(chroms_file): """ Produce an "enumeration" of chromosomes based on the list of chromosomes """ chrom_sizes = dict() with open(chroms_file, "rt") as f: for line in f: chrom, size = line.strip().split("\t") chrom_sizes[chrom] = int(size) return chrom_sizes def get_chromsizes_from_pysam_header(samheader): """Convert pysam header to pairtools chromosomes (ordered dict). Example of pysam header converted to dict: dict([ ('SQ', [{'SN': 'chr1', 'LN': 248956422}, {'SN': 'chr10', 'LN': 133797422}, {'SN': 'chr11', 'LN': 135086622}, {'SN': 'chr12', 'LN': 133275309}]), ('PG', [{'ID': 'bwa', 'PN': 'bwa', 'VN': '0.7.17-r1188', 'CL': 'bwa mem -t 8 -SP -v1 hg38.fa test_1.1.fastq.gz test_2.1.fastq.gz'}]) ]) """ SQs = samheader.to_dict()["SQ"] chromsizes = [(sq["SN"], int(sq["LN"])) for sq in SQs] return dict(chromsizes) def get_chrom_order(chroms_file, sam_chroms=None): """ Produce an "enumeration" of chromosomes based on the list of chromosomes """ chrom_enum = dict() i = 1 with open(chroms_file, "rt") as f: for line in f: chrom = line.strip().split("\t")[0] if chrom and ((not sam_chroms) or (chrom in sam_chroms)): chrom_enum[chrom] = i i += 1 if sam_chroms: remaining = sorted( chrom for chrom in sam_chroms if chrom not in chrom_enum.keys() ) for chrom in remaining: chrom_enum[chrom] = i i += 1 return chrom_enum def make_standard_pairsheader( assembly=None, chromsizes=None, columns=pairsam_format.COLUMNS, shape="upper triangle", ): header = [] header.append("## pairs format v{}".format(PAIRS_FORMAT_VERSION)) header.append("#shape: {}".format(shape)) header.append( "#genome_assembly: {}".format(assembly if assembly is not None else "unknown") ) if chromsizes is not None: try: chromsizes = chromsizes.items() except AttributeError: pass for chrom, length in chromsizes: header.append("#chromsize: {} {}".format(chrom, length)) header.append("#columns: " + SEP_COLS.join(columns)) return header def subset_chroms_in_pairsheader(header, chrom_subset): new_header = [] for line in header: if line.startswith("#chromsize:"): if line.strip().split()[1] in chrom_subset: new_header.append(line) elif line.startswith("#chromosomes:"): line = SEP_CHROMS.join( ["#chromosomes:"] + [c for c in line.strip().split()[1:] if c in chrom_subset] ) new_header.append(line) else: new_header.append(line) return new_header def insert_samheader(header, samheader): """Insert samheader into header.""" new_header = [l for l in header if not l.startswith("#columns")] if samheader: new_header += ["#samheader: " + l for l in samheader] new_header += [l for l in header if l.startswith("#columns")] return new_header def insert_samheader_pysam(header, samheader): """Insert samheader into header,pysam version.""" new_header = [l for l in header if not l.startswith("#columns")] if samheader: new_header += ["#samheader: " + l for l in str(samheader).strip().split("\n")] new_header += [l for l in header if l.startswith("#columns")] return new_header def mark_header_as_sorted(header): header = copy.deepcopy(header) if is_empty_header(header): raise Exception("Input file is not valid .pairs, has no header or is empty.") if not any([l.startswith("#sorted") for l in header]): if header[0].startswith("##"): header.insert(1, "#sorted: chr1-chr2-pos1-pos2") else: header.insert(0, "#sorted: chr1-chr2-pos1-pos2") for i in range(len(header)): if header[i].startswith("#chromosomes"): chroms = header[i][12:].strip().split(SEP_CHROMS) header[i] = "#chromosomes: {}".format(SEP_CHROMS.join(sorted(chroms))) return header def append_new_pg(header, ID="", PN="", VN=None, CL=None, force=False): header = copy.deepcopy(header) if is_empty_header(header): raise Exception("Input file is not valid .pairs, has no header or is empty.") samheader, other_header = extract_fields(header, "samheader", save_rest=True) new_samheader = _add_pg_to_samheader(samheader, ID, PN, VN, CL, force) new_header = insert_samheader(other_header, new_samheader) return new_header def _update_header_entry(header, field, new_value): header = copy.deepcopy(header) found = False newline = "#{}: {}".format(field, new_value) for i in range(len(header)): if header[i].startswith(COMMENT_CHAR + field): header[i] = newline found = True if not found: if header[-1].startswith("#columns"): header.insert(-1, newline) else: header.append(newline) return header def _add_pg_to_samheader(samheader, ID="", PN="", VN=None, CL=None, force=False): """Append a @PG record to an existing sam header. If the header comes from a merged file and thus has multiple chains of @PG, append the provided PG to all of the chains, adding the numerical suffix of the branch to the ID. Parameters ---------- header : list of str ID, PN, VN, CL : std The keys of a new @PG record. If absent, VN is the version of pairtools and CL is taken from sys.argv. force : bool If True, ignore the inconsistencies among @PG records of the existing header. Returns ------- new_header : list of str A list of new headers lines, stripped of newline characters. """ if VN is None: VN = __version__ if CL is None: CL = " ".join(sys.argv) pre_pg_header = [ line.strip() for line in samheader if line.startswith("@HD") or line.startswith("@SQ") or line.startswith("@RG") ] post_pg_header = [ line.strip() for line in samheader if not line.startswith("@HD") and (not line.startswith("@SQ")) and (not line.startswith("@RG")) and (not line.startswith("@PG")) ] pg_chains = _parse_pg_chains(samheader, force=force) for i, br in enumerate(pg_chains): new_pg = {"ID": ID, "PN": PN, "VN": VN, "CL": CL} new_pg["PP"] = br[-1]["ID"] if len(pg_chains) > 1: new_pg["ID"] = new_pg["ID"] + "-" + str(i + 1) + "." + str(len(br) + 1) new_pg["raw"] = _format_pg(**new_pg) br.append(new_pg) new_header = ( pre_pg_header + [pg["raw"] for br in pg_chains for pg in br] + post_pg_header ) return new_header def _format_pg(**kwargs): out = ["@PG"] + [ "{}:{}".format(field, kwargs[field]) for field in ["ID", "PN", "CL", "PP", "DS", "VN"] if field in kwargs ] return "\t".join(out) def _parse_pg_chains(header, force=False): pg_chains = [] parsed_pgs = [] for l in header: if l.startswith("@PG"): tag_value_pairs = l.strip().split("\t")[1:] if not all(":" in tvp for tvp in tag_value_pairs): warnings.warn( f"Skipping the following @PG line, as it does not follow the SAM header standard of TAG:VALUE: {l}" ) continue parsed_tvp = dict( [tvp.split(":", maxsplit=1) for tvp in tag_value_pairs if ":" in tvp] ) if parsed_tvp: parsed_tvp["raw"] = l.strip() parsed_pgs.append(parsed_tvp) while True: if len(parsed_pgs) == 0: break for i in range(len(parsed_pgs)): pg = parsed_pgs[i] if "PP" not in pg: pg_chains.append([pg]) parsed_pgs.pop(i) break else: matching_chains = [ branch for branch in pg_chains if branch[-1]["ID"] == pg["PP"] ] if len(matching_chains) > 1: if force: matching_chains[0].append(pg) parsed_pgs.pop(i) break else: raise ParseError( "Multiple @PG records with the IDs identical to the PP field of another record:\n" + "\n".join([br[-1]["raw"] for br in matching_chains]) + "\nvs\n" + pg["raw"] ) if len(matching_chains) == 1: matching_chains[0].append(pg) parsed_pgs.pop(i) break if force: pg_chains.append([pg]) parsed_pgs.pop(i) break else: raise ParseError( "Cannot find the parental @PG record for the @PG records:\n" + "\n".join([pg["raw"] for pg in parsed_pgs]) ) return pg_chains def _toposort(dag, tie_breaker): """ Topological sort on a directed acyclic graph Uses Kahn's algorithm with a custom tie-breaking option. The dictionary ``dag`` can be interpreted in two ways: 1. A dependency graph (i.e. arcs point from values to keys), and the generator yields items with no dependences followed by items that depend on previous ones. 2. Arcs point from keys to values, in which case the generator produces a **reverse** topological ordering of the nodes. Parameters ---------- dag: dict of nodes to sets of nodes Directed acyclic graph encoded as a dictionary. tie_breaker: callable Function that picks a tie breaker from a set of nodes with no unprocessed dependences. Returns ------- Generator Notes ----- See . Based in part on activestate recipe: by Sam Denton (MIT licensed). """ # Drop self-edges. for k, v in dag.items(): v.discard(k) # Find all nodes that don't depend on anything # and include them with empty dependencies. indep_nodes = set.union(*dag.values()) - set(dag.keys()) dag.update({node: set() for node in indep_nodes}) while True: if not indep_nodes: break out = tie_breaker(indep_nodes) indep_nodes.discard(out) del dag[out] yield out for node, deps in dag.items(): deps.discard(out) if len(deps) == 0: indep_nodes.add(node) if len(dag) != 0: raise ValueError("Circular dependencies exist: {} ".format(list(dag.items()))) def merge_chrom_lists(*lsts): sentinel = "!NONE!" g = defaultdict(set) for lst in lsts: if len(lst) == 1: g[lst[0]].add(sentinel) for a, b in zip(lst[:-1], lst[1:]): g[b].add(a) if len(g) == 0: return [] chrom_list = list(_toposort(g.copy(), tie_breaker=min)) if sentinel in chrom_list: chrom_list.remove(sentinel) chrom_list = sorted(chrom_list) return chrom_list def _merge_samheaders(samheaders, force=False): # first, append an HD line if it is present in any files # if different lines are present, raise an error HDs = set.union( *[ set(line for line in samheader if line.startswith("@HD")) for samheader in samheaders ] ) if len(HDs) > 1 and not force: raise ParseError("More than one unique @HD line is found in samheaders!") HDs = [list(HDs)[0]] if HDs else [] # second, confirm that all files had the same SQ lines # add SQs from the first file, keeping its order SQs = [ set(line for line in samheader if line.startswith("@SQ")) for samheader in samheaders ] common_SQs = set.intersection(*SQs) SQs_same = all([len(samheader) == len(common_SQs) for samheader in SQs]) if not SQs_same and not (force): raise ParseError("The SQ (sequence) lines of the sam headers are not identical") SQs = [line for line in samheaders[0] if line.startswith("@SQ")] # third, append _all_ PG chains, adding a unique index according to the # provided merging order PGs = [] for i, samheader in enumerate(samheaders): for line in samheader: if line.startswith("@PG"): split_line = line.split("\t") for j in range(len(split_line)): if split_line[j].startswith("ID:") or split_line[j].startswith( "PP:" ): split_line[j] = split_line[j] + "-" + str(i + 1) PGs.append("\t".join(split_line)) # finally, add all residual unique lines rest = sum( [ list( set( line for line in samheader if (not line.startswith("@HD")) and (not line.startswith("@SQ")) and (not line.startswith("@PG")) ) ) for samheader in samheaders ], [], ) new_header = [] new_header += HDs new_header += SQs new_header += PGs new_header += rest return new_header def _merge_pairheaders(pairheaders, force=False): new_header = [] # first, add all keys that are expected to be the same among all headers keys_expected_identical = [ "## pairs format", "#sorted:", "#shape:", "#genome_assembly:", "#columns:", ] keys_orginal = [l.split()[0] for header in pairheaders for l in header] for k in keys_expected_identical: lines = [[l for l in header if l.startswith(k)] for header in pairheaders] same = all([l == lines[0] for l in lines]) if not (same or force): raise ParseError( "The following header entries must be the same " "the merged files: {}".format(k) ) new_header += lines[0] # second, merge and add the chromsizes fields. chrom_lists = [] chromsizes = {} for header in pairheaders: chromlist = [] for line in header: if line.startswith("#chromsize:"): chrom, length = line.strip("#chromsize:").split() chromsizes[chrom] = length chromlist.append(chrom) chrom_lists.append(chromlist) chroms_merged = merge_chrom_lists(*chrom_lists) if "#chromosomes:" in keys_orginal: chrom_line = "#chromosomes: {}".format(" ".join(chroms_merged)) new_header.extend([chrom_line]) chromsize_lines = [ "#chromsize: {} {}".format(chrom, chromsizes[chrom]) for chrom in chroms_merged ] new_header.extend(chromsize_lines) # finally, add a sorted list of other unique fields other_lines = sorted( set( l for h in pairheaders for l in h if not any( l.startswith(k) for k in keys_expected_identical + ["#chromosomes", "#chromsize"] ) ) ) if other_lines: if new_header[-1].startswith("#columns"): new_header = new_header[:-1] + other_lines + [new_header[-1]] else: new_header = new_header + other_lines return new_header def all_same_columns(pairheaders): key_target = "#columns:" lines = [[l for l in header if l.startswith(key_target)] for header in pairheaders] all_same = all([l == lines[0] for l in lines]) return all_same def merge_headers(headers, force=False): samheaders, pairheaders = zip( *[extract_fields(h, "samheader", save_rest=True) for h in headers] ) # HD headers contain information that becomes invalid after processing # with distiller. Do not print into the output. new_pairheader = _merge_pairheaders(pairheaders, force=False) new_samheader = _merge_samheaders(samheaders, force=force) new_header = insert_samheader(new_pairheader, new_samheader) return new_header def append_columns(header, columns): """ Appends columns to the header, separated by SEP_COLS Parameters ---------- header: Previous header columns: List of column names to append Returns ------- Modified header (appended columns to the field "#columns") """ for i in range(len(header)): if header[i].startswith("#columns: "): header[i] += SEP_COLS + SEP_COLS.join(columns) return header def get_colnames(header): """ Get column names of the header, separated by SEP_COLS Parameters ---------- header: Previous header Returns ------- List of column names """ for i in range(len(header)): if header[i].startswith("#columns: "): columns = header[i].split(SEP_COLS)[1:] return columns return [] def set_columns(header, columns): """ Set columns to the header, separated by SEP_COLS Parameters ---------- header: Previous header columns: List of column names to append Returns ------- Modified header (appended columns to the field "#columns") """ for i in range(len(header)): if header[i].startswith("#columns:"): header[i] = "#columns:" + SEP_COLS + SEP_COLS.join(columns) return header # def _guess_genome_assembly(samheader): # PG = [l for l in samheader if l.startswith('@PG') and '\tID:bwa' in l][0] # CL = [field for field in PG.split('\t') if field.startswith('CL:')] # # return ga pairtools-1.1.3/pairtools/lib/pairsam_format.py000066400000000000000000000036671474715105500217150ustar00rootroot00000000000000PAIRSAM_FORMAT_VERSION = "1.0.0" PAIRSAM_SEP = "\t" PAIRSAM_SEP_ESCAPE = r"\t" SAM_SEP = "\031" SAM_SEP_ESCAPE = r"\031" INTER_SAM_SEP = "\031NEXT_SAM\031" COL_READID = 0 COL_C1 = 1 COL_P1 = 2 COL_C2 = 3 COL_P2 = 4 COL_S1 = 5 COL_S2 = 6 COL_PTYPE = 7 COL_SAM1 = 8 COL_SAM2 = 9 COLUMNS = [ "readID", "chrom1", "pos1", "chrom2", "pos2", "strand1", "strand2", "pair_type", "sam1", "sam2", "walk_pair_index", "walk_pair_type", ] # Required columns for formats: COLUMNS_PAIRSAM = [ "readID", "chrom1", "pos1", "chrom2", "pos2", "strand1", "strand2", "pair_type", "sam1", "sam2", ] COLUMNS_PAIRS = [ "readID", "chrom1", "pos1", "chrom2", "pos2", "strand1", "strand2", "pair_type", ] DTYPES_PAIRSAM = { "readID": str, "chrom1": str, "pos1": int, "chrom2": str, "pos2": int, "strand1": str, "strand2": str, "pair_type": str, "sam1": str, "sam2": str, } DTYPES_PAIRS = { "readID": str, "chrom1": str, "pos1": int, "chrom2": str, "pos2": int, "strand1": str, "strand2": str, "pair_type": str, } UNMAPPED_CHROM = "!" UNMAPPED_POS = 0 UNMAPPED_STRAND = "-" UNANNOTATED_RFRAG = -1 EXTRA_COLUMNS = [ "mapq", "pos5", "pos3", "cigar", "read_len", "matched_bp", "algn_ref_span", "algn_read_span", "dist_to_5", "dist_to_3", "seq", "mismatches", # Format: "{ref_letter}:{mut_letter}:{phred}:{ref_position}:{read_position}" "read_side", "algn_idx", "same_side_algn_count" ] DTYPES_EXTRA_COLUMNS = { "mapq": int, "pos5": int, "pos3": int, "cigar": str, "read_len": int, "matched_bp": int, "algn_ref_span": int, "algn_read_span": int, "dist_to_5": int, "dist_to_3": int, "seq": str, "mismatches": str, "read_side": int, "algn_idx": int, "same_side_algn_count": int, } pairtools-1.1.3/pairtools/lib/pairsio.py000066400000000000000000000036221474715105500203460ustar00rootroot00000000000000import pandas as pd from . import fileio, headerops def read_pairs(pairs, nproc=3, cmd_in=None, **kwargs): """ Reads a file with .pairs format and returns a header, a dataframe of pairs, and chromsizes. Parameters: pairs (str or file-like object): A path to a .pairs file to read or an open file-like object/handle. nproc (int): Number of processes to use for reading the file. Default is 3. cmd_in (str): The command to be used for reading the file. Default is None. **kwargs: Additional keyword arguments to be passed to pd.read_csv. Useful options include: - chunksize (int): If specified, return an iterable object of type TextFileReader that reads in chunks of lines. - usecols (list-like or callable): Return a subset of the columns. If list-like, all elements must either be positional or strings. If callable, the callable function will be evaluated against the column names, returning names where the callable function evaluates to True. Returns: tuple: A tuple containing the following elements: - pairs_df (pd.DataFrame): A pandas DataFrame with pairs. - header (list of str): The original header of the pairs file. - chromsizes (dict): A dictionary containing chromosome sizes extracted from the header. """ pairs_stream = ( fileio.auto_open( pairs, mode="r", nproc=nproc, command=cmd_in, ) if isinstance(pairs, str) else pairs ) header, pairs_body = headerops.get_header(pairs_stream) cols = headerops.extract_column_names(header) chromsizes = headerops.extract_chromsizes(header) pairs_df = pd.read_csv( pairs_body, header=None, names=cols, sep="\t", dtype={"chrom1": str, "chrom2": str}, **kwargs ) return pairs_df, header, chromsizespairtools-1.1.3/pairtools/lib/parse.py000066400000000000000000001571361474715105500200240ustar00rootroot00000000000000""" Set of functions used for pairsam parse, migrated from pairtools/pairtools_parse.py Parse operates with several basic data types: I. pysam-based: 1. **sam entry** is a continuous aligned fragment of the read mapped to certain location in the genome. Because we read sam entries from .sam/.bam files automatically with modified pysam, each sam entry is in fact special AlignedSegmentPairtoolized Cython object that has alignment attributes and can be easily accessed from Python. Sam entries are gathered into reads by `group_alignments_by_side` function. 2. **read** is a collection of sam entries corresponding to a single Hi-C molecule. It is represented by three variables: readID, sams1 and sams2, which keep left and right sam entries, correspondingly. Read is populated from the stream of sam entries on a fly, the process happenning in `streaming_classify` function. II. python-based data types are parsed from pysam-based ones: 1. **alignment** is a continuous aligned fragment represented as dictionary with relevant fields, such as "chrom", "pos5", "pos3", "strand", "type", etc. `empty_alignment` creates empty alignment, `parse_pysam_entry` create new alignments from pysam entries, `mask_alignment` clears some fields of the alignment to match the default "unmapped" state. `flip_alignment`, `flip_orientation` and `flip_ends` are useful functions that help to orient alignments. 2. **pair** of two alignments is represented by three variables: algn1 (left alignment), algn2 (right alignment) and pair_index. Pairs are obtained by `parse_read` or `parse2_read`. Additionally, these functions also output all alignments for each side. """ from . import pairsam_format from .parse_pysam import get_mismatches_c def streaming_classify( instream, outstream, chromosomes, out_alignments_stream, out_stat, **kwargs ): """ Parse input sam file into individual reads, pairs, walks, then write to the outstream(s). Additional kwargs: min_mapq, drop_readid, drop_seq, drop_sam, add_pair_index, add_columns, # comma-separated list report_alignment_end, max_inter_align_gap parse: max_molecule_size walks_policy parse2: single_end: indicator whether single-end data is provided report_position, one of: "outer", "junction", "read", "walk" report_orientation, one of: "pair", "junction", "read", "walk" dedup_max_mismatch: For intramolecular deduplication max_insert_size: maximum insert size when searching for overlapping ends of R1 and R2 expand: perform combinatorial expansion or not max_expansion_depth: maximum expansion depth, works in combination with expand=True """ parse2 = kwargs.get("parse2", False) ### Store output parameters in a usable form: chrom_enum = dict( zip( [pairsam_format.UNMAPPED_CHROM] + list(chromosomes), range(len(chromosomes) + 1), ) ) add_columns = kwargs.get("add_columns", "") if isinstance(add_columns, str) and len(add_columns) > 0: add_columns = add_columns.split(",") elif len(add_columns) == 0: add_columns = [] elif not isinstance(add_columns, list): raise ValueError(f"Unknown type of add_columns: {type(add_columns)}") sam_tags = [col for col in add_columns if len(col) == 2 and col.isupper()] store_seq = "seq" in add_columns ### Compile readID transformation: readID_transform = kwargs.get("readid_transform", None) if readID_transform is not None: readID_transform = compile(readID_transform, "", "eval") ### Iterate over input pysam: instream = iter(instream) for (readID, (sams1, sams2)) in read_alignment_block(instream, sort=True, group_by_side=True, return_readID=True, readID_transform=readID_transform): ### Parse if not parse2: # regular parser: pairstream, all_algns1, all_algns2 = parse_read( sams1, sams2, min_mapq=kwargs["min_mapq"], max_molecule_size=kwargs["max_molecule_size"], max_inter_align_gap=kwargs["max_inter_align_gap"], walks_policy=kwargs["walks_policy"], sam_tags=sam_tags, store_seq=store_seq, report_mismatches=True if "mismatches" in add_columns else False, ) else: # parse2 parser: pairstream, all_algns1, all_algns2 = parse2_read( sams1, sams2, min_mapq=kwargs["min_mapq"], max_inter_align_gap=kwargs["max_inter_align_gap"], max_insert_size=kwargs.get("max_insert_size", 500), single_end=kwargs["single_end"], report_position=kwargs["report_position"], report_orientation=kwargs["report_orientation"], sam_tags=sam_tags, dedup_max_mismatch=kwargs["dedup_max_mismatch"], store_seq=store_seq, expand=kwargs["expand"], max_expansion_depth=kwargs["max_expansion_depth"], report_mismatches=True if "mismatches" in add_columns else False, ) ### Write: read_has_alignments = False for (algn1, algn2, pair_index) in pairstream: read_has_alignments = True # Alignment end defaults to 5' if report_alignment_end is unspecified: if kwargs.get("report_alignment_end", "5") == "5": algn1["pos"] = algn1["pos5"] algn2["pos"] = algn2["pos5"] else: algn1["pos"] = algn1["pos3"] algn2["pos"] = algn2["pos3"] if kwargs["flip"]: flip_pair = not check_pair_order(algn1, algn2, chrom_enum) if flip_pair: algn1, algn2 = algn2, algn1 sams1, sams2 = sams2, sams1 write_pairsam( algn1, algn2, readID=readID, pair_index=pair_index, sams1=sams1, sams2=sams2, out_file=outstream, drop_readid=kwargs["drop_readid"], drop_seq=kwargs["drop_seq"], drop_sam=kwargs["drop_sam"], add_pair_index=kwargs["add_pair_index"], add_columns=add_columns, ) # add a pair to PairCounter for stats output: if out_stat: out_stat.add_pair( algn1["chrom"], int(algn1["pos"]), algn1["strand"], algn2["chrom"], int(algn2["pos"]), algn2["strand"], algn1["type"] + algn2["type"], ) # write all alignments: if out_alignments_stream and read_has_alignments: write_all_algnments( readID, all_algns1, all_algns2, out_alignments_stream ) ############################ ### Alignment utilities: ### ############################ def empty_alignment(): return { "chrom": pairsam_format.UNMAPPED_CHROM, "pos5": pairsam_format.UNMAPPED_POS, "pos3": pairsam_format.UNMAPPED_POS, "pos": pairsam_format.UNMAPPED_POS, "strand": pairsam_format.UNMAPPED_STRAND, "dist_to_5": 0, "dist_to_3": 0, "mapq": 0, "is_unique": False, "is_mapped": False, "is_linear": True, "cigar": "*", "algn_ref_span": 0, "algn_read_span": 0, "matched_bp": 0, "clip3_ref": 0, "clip5_ref": 0, "read_len": 0, "type": "N", "mismatches": "", } def group_alignments_by_side(sams): """Group pysam AlignedSegments (sams) into left-read (R1) and right-read (R2) sam entries""" sams1 = [] sams2 = [] for sam_entry in sams: flag = sam_entry.flag if (flag & 0x40) != 0: sams1.append(sam_entry) # left read, or first read in a pair else: sams2.append(sam_entry) # right read, or mate pair return sams1, sams2 def read_alignment_block(instream, sort=True, group_by_side=True, return_readID=True, readID_transform=None): sams = [] prev_readID = None while True: sam_entry = next(instream, None) readID = sam_entry.query_name if sam_entry else None if readID_transform is not None and readID is not None: readID = eval(readID_transform) # Read is fully populated, then parse and write: if not (sam_entry) or ((readID != prev_readID) and prev_readID): if sort: sams = sorted(sams, key=lambda a: (a.is_read2, a.query_alignment_start)) out = sams if not group_by_side else group_alignments_by_side(sams) out = out if not return_readID else (prev_readID, out) yield out sams.clear() if sam_entry is None: break else: sams.append(sam_entry) prev_readID = readID def parse_pysam_entry( sam, min_mapq, sam_tags=None, store_seq=False, report_3_alignment_end=False, report_mismatches=False, ): """Parse alignments from pysam AlignedSegment entry :param sam: input pysam AlignedSegment entry :param min_mapq: minimal MAPQ to consider as a proper alignment :param sam_tags: list of sam tags to store :param store_seq: if True, the sequence will be parsed and stored in the output :param report_3_alignment_end: if True, 3'-end of alignment will be reported as position (will be deprecated) :param report_mismatches: if True, mismatches will be parsed from MD field :return: parsed aligned entry (dictionary) """ flag = sam.flag is_mapped = (flag & 0x04) == 0 mapq = sam.mapq is_unique = sam.is_unique(min_mapq) is_linear = sam.is_linear cigar = sam.cigar_dict if is_mapped: if (flag & 0x10) == 0: strand = "+" dist_to_5 = cigar["clip5_ref"] dist_to_3 = cigar["clip3_ref"] else: strand = "-" dist_to_5 = cigar["clip3_ref"] dist_to_3 = cigar["clip5_ref"] if is_unique: chrom = sam.reference_name if strand == "+": # Note that pysam output is zero-based, thus add +1: pos5 = sam.reference_start + 1 pos3 = sam.reference_start + cigar["algn_ref_span"] else: pos5 = sam.reference_start + cigar["algn_ref_span"] # Note that pysam output is zero-based, thus add +1: pos3 = sam.reference_start + 1 # Get number of matches: if not sam.has_tag("MD") or not report_mismatches: mismatches = "" else: seq = sam.query_sequence.upper() quals = sam.query_qualities aligned_pairs = sam.get_aligned_pairs(with_seq=True, matches_only=True) mismatches = get_mismatches_c(seq, quals, aligned_pairs) mismatches = ",".join( [ f"{original}:{mutated}:{phred}:{ref}:{read}" for original, mutated, phred, ref, read in mismatches ] ) # n_matches = len(aligned_pairs) else: chrom = pairsam_format.UNMAPPED_CHROM strand = pairsam_format.UNMAPPED_STRAND pos5 = pairsam_format.UNMAPPED_POS pos3 = pairsam_format.UNMAPPED_POS mismatches = "" else: chrom = pairsam_format.UNMAPPED_CHROM strand = pairsam_format.UNMAPPED_STRAND pos5 = pairsam_format.UNMAPPED_POS pos3 = pairsam_format.UNMAPPED_POS dist_to_5 = 0 dist_to_3 = 0 mismatches = "" algn = { "chrom": chrom, "pos5": pos5, "pos3": pos3, "strand": strand, "mapq": mapq, "is_mapped": is_mapped, "is_unique": is_unique, "is_linear": is_linear, "dist_to_5": dist_to_5, "dist_to_3": dist_to_3, "type": ("N" if not is_mapped else ("M" if not is_unique else "U")), "mismatches": mismatches, } algn.update(cigar) algn["pos"] = algn["pos3"] if report_3_alignment_end else algn["pos5"] ### Add tags to the alignment: if sam_tags: tags = sam.tags for tag in sam_tags: algn[tag] = "" for col, value in tags: for tag in sam_tags: if col == tag: algn[tag] = value continue if store_seq: algn["seq"] = sam.seq return algn def mask_alignment(algn): """ Reset the coordinates of an alignment. """ algn["chrom"] = pairsam_format.UNMAPPED_CHROM algn["pos5"] = pairsam_format.UNMAPPED_POS algn["pos3"] = pairsam_format.UNMAPPED_POS algn["pos"] = pairsam_format.UNMAPPED_POS algn["strand"] = pairsam_format.UNMAPPED_STRAND return algn def flip_alignment(hic_algn): """ Flip a single alignment as if it was sequenced from the opposite end :param hic_algn: Alignment to be modified :return: """ hic_algn = dict(hic_algn) # overwrite the variable with the copy of dictionary hic_algn["pos5"], hic_algn["pos3"] = hic_algn["pos3"], hic_algn["pos5"] hic_algn["strand"] = "+" if (hic_algn["strand"] == "-") else "-" return hic_algn def flip_orientation(hic_algn): """ Flip orientation of a single alignment :param hic_algn: Alignment to be modified :return: """ hic_algn = dict(hic_algn) # overwrite the variable with the copy of dictionary hic_algn["strand"] = "+" if (hic_algn["strand"] == "-") else "-" return hic_algn def flip_position(hic_algn): """ Flip ends of a single alignment :param hic_algn: Alignment to be modified :return: """ hic_algn = dict(hic_algn) # overwrite the variable with the copy of dictionary hic_algn["pos5"], hic_algn["pos3"] = hic_algn["pos3"], hic_algn["pos5"] return hic_algn def _convert_gaps_into_alignments(sorted_algns, max_inter_align_gap): """ Inplace conversion of gaps longer than max_inter_align_gap into alignments """ if (len(sorted_algns) == 1) and (not sorted_algns[0]["is_mapped"]): return last_5_pos = 0 for i in range(len(sorted_algns)): algn = sorted_algns[i] if algn["dist_to_5"] - last_5_pos > max_inter_align_gap: new_algn = empty_alignment() new_algn["dist_to_5"] = last_5_pos new_algn["algn_read_span"] = algn["dist_to_5"] - last_5_pos new_algn["read_len"] = algn["read_len"] new_algn["dist_to_3"] = new_algn["read_len"] - algn["dist_to_5"] last_5_pos = algn["dist_to_5"] + algn["algn_read_span"] sorted_algns.insert(i, new_algn) i += 2 else: last_5_pos = max(last_5_pos, algn["dist_to_5"] + algn["algn_read_span"]) i += 1 def normalize_alignment_list(algns, side, sort_by="dist_to_5", max_inter_align_gap=None): """ Normalize the alignment list: insert empty alignments in gaps between alignments, sort by distance to the 5' end, add read side, alignment index. Args: algns (list): The list of alignments. side (str): The side of the alignment. sort_by (str, optional): The key to sort the alignments by. Defaults to "dist_to_5". max_inter_align_gap (int, optional): The maximum allowed gap between alignments. Defaults to None. Returns: list: The normalized alignment list. """ if len(algns) == 0: algns = [empty_alignment()] if sort_by: algns = sorted(algns, key=lambda algn: algn[sort_by]) if max_inter_align_gap is not None: _convert_gaps_into_alignments(algns, max_inter_align_gap) for i, algn in enumerate(algns): algn["read_side"] = side algn["algn_idx"] = i algn["same_side_algn_count"] = len(algns) return algns #################### ### Parsing utilities: #################### def parse_read( sams1, sams2, min_mapq, max_molecule_size, max_inter_align_gap, walks_policy, sam_tags, store_seq, report_mismatches=False, ): """ Parse sam entries corresponding to a single read (or Hi-C molecule) into pairs of alignments. Returns ------- stream: iterator Each element is a triplet: (algn1, aldn2, pair_index) algn1, algn2: dict Two alignments selected for reporting as a Hi-C pair. pair_index pair index of a pair in the molecule. algns1, algns2: lists All alignments, sorted according to their order in on a read. """ # Check if there is at least one sam entry per side: if walks_policy == "all": is_empty = (len(sams1) == 0 and len(sams2) < 2) or ( len(sams2) == 0 and len(sams1) < 2 ) else: is_empty = (len(sams1) == 0) or (len(sams2) == 0) if is_empty: algns1 = [empty_alignment()] algns2 = [empty_alignment()] algns1[0]["type"] = "X" algns2[0]["type"] = "X" pair_index = (1, "R1-2") return iter([(algns1[0], algns2[0], pair_index)]), algns1, algns2 # Generate a sorted, gap-filled list of all alignments algns1 = [ parse_pysam_entry( sam, min_mapq, sam_tags, store_seq, report_mismatches=report_mismatches ) for sam in sams1 ] algns2 = [ parse_pysam_entry( sam, min_mapq, sam_tags, store_seq, report_mismatches=report_mismatches ) for sam in sams2 ] algns1 = normalize_alignment_list(algns1, 1, sort_by="dist_to_5", max_inter_align_gap=max_inter_align_gap) algns2 = normalize_alignment_list(algns2, 2, sort_by="dist_to_5", max_inter_align_gap=max_inter_align_gap) # By default, assume each molecule is a single pair with single unconfirmed pair: hic_algn1 = algns1[0] hic_algn2 = algns2[0] pair_index = (1, "R1-2") # Define the type of alignment on each side: is_chimeric_1 = len(algns1) > 1 is_chimeric_2 = len(algns2) > 1 # Parse chimeras if is_chimeric_1 or is_chimeric_2: # Report all the linear alignments in a read pair if walks_policy == "all": # Report linear alignments after deduplication of complex walks with default settings: return ( parse_complex_walk( algns1, algns2, max_molecule_size, report_position="outer", report_orientation="pair", ), algns1, algns2, ) elif walks_policy in ["mask", "5any", "5unique", "3any", "3unique"]: # Report only two alignments for a read pair rescued_linear_side = rescue_walk(algns1, algns2, max_molecule_size) # Walk was rescued as a simple walk: if rescued_linear_side is not None: pair_index = (1, "R1" if rescued_linear_side == 1 else "R2") # Walk is unrescuable: else: if walks_policy == "mask": hic_algn1 = mask_alignment(dict(hic_algn1)) hic_algn2 = mask_alignment(dict(hic_algn2)) hic_algn1["type"] = "W" hic_algn2["type"] = "W" elif walks_policy == "5any": hic_algn1 = algns1[0] hic_algn2 = algns2[0] elif walks_policy == "5unique": hic_algn1 = algns1[0] for algn in algns1: if algn["is_mapped"] and algn["is_unique"]: hic_algn1 = algn break hic_algn2 = algns2[0] for algn in algns2: if algn["is_mapped"] and algn["is_unique"]: hic_algn2 = algn break elif walks_policy == "3any": hic_algn1 = algns1[-1] hic_algn2 = algns2[-1] elif walks_policy == "3unique": hic_algn1 = algns1[-1] for algn in algns1[::-1]: if algn["is_mapped"] and algn["is_unique"]: hic_algn1 = algn break hic_algn2 = algns2[-1] for algn in algns2[::-1]: if algn["is_mapped"] and algn["is_unique"]: hic_algn2 = algn break # DEPRECATED: lower-case reported walks on the chimeric side if walks_policy != "mask": if is_chimeric_1: hic_algn1 = dict(hic_algn1) # hic_algn1["type"] = hic_algn1["type"].lower() if is_chimeric_2: hic_algn2 = dict(hic_algn2) # hic_algn2["type"] = hic_algn2["type"].lower() else: raise ValueError(f"Walks policy {walks_policy} is not supported.") return iter([(hic_algn1, hic_algn2, pair_index)]), algns1, algns2 def parse2_read( sams1, sams2, min_mapq, max_inter_align_gap, max_insert_size, single_end, report_position="outer", report_orientation="pair", sam_tags=[], dedup_max_mismatch=3, store_seq=False, report_mismatches=False, expand=False, max_expansion_depth=None, ): """ Parse sam entries corresponding to a Hi-C molecule into alignments in parse2 mode for a Hi-C pair. Returns ------- stream: iterator Each element is a triplet: (algn1, aldn2, pair_index) algn1, algn2: dict Two alignments selected for reporting as a Hi-C pair. pair_index pair index of a pair in the molecule, a tuple: (1, "R1-2") algns1, algns2: lists All alignments, sorted according to their order in on a read. """ # Single-end mode: if single_end: # Generate a sorted, gap-filled list of all alignments algns1 = [ parse_pysam_entry( sam, min_mapq, sam_tags, store_seq, report_mismatches=report_mismatches ) for sam in sams2 # note sams2, that's how these reads are typically parsed ] algns1 = normalize_alignment_list(algns1, 1, sort_by="dist_to_5", max_inter_align_gap=max_inter_align_gap) algns2 = [] # Empty alignment dummy if len(algns1) > 1: # Look for ligation pair, and report linear alignments after deduplication of complex walks: # (Note that coordinate system for single-end reads does not change the behavior) output = parse_complex_walk( algns1, algns2, max_insert_size, report_position, report_orientation, dedup_max_mismatch, expand, max_expansion_depth, ) output = [x for x in output if x[-1][-1] != "R1-2"] return (output, algns1, algns2) elif len(algns1) == 1: # If no additional information, we assume each molecule is a single ligation with single unconfirmed pair: algn2 = empty_alignment() pair_index = (1, "R1") return iter([(algns1[0], algn2, pair_index)]), algns1, algns2 else: # If no additional information, we assume each molecule is a single ligation with single unconfirmed pair: algn1 = empty_alignment() algn2 = empty_alignment() pair_index = (1, "R1") return iter([(algn1, algn2, pair_index)]), algns1, algns2 # Paired-end mode: else: # Check if there is at least one SAM entry per side: is_empty = (len(sams1) == 0 and len(sams2) < 2) or ( len(sams2) == 0 and len(sams1) < 2 ) if is_empty: algns1 = [empty_alignment()] algns2 = [empty_alignment()] algns1[0]["type"] = "X" algns2[0]["type"] = "X" pair_index = (1, "R1-2") return iter([(algns1[0], algns2[0], pair_index)]), algns1, algns2 # Generate a sorted, gap-filled list of all alignments algns1 = [ parse_pysam_entry( sam, min_mapq, sam_tags, store_seq, report_mismatches=report_mismatches ) for sam in sams1 ] algns2 = [ parse_pysam_entry( sam, min_mapq, sam_tags, store_seq, report_mismatches=report_mismatches ) for sam in sams2 ] algns1 = normalize_alignment_list(algns1, 1, sort_by="dist_to_5", max_inter_align_gap=max_inter_align_gap) algns2 = normalize_alignment_list(algns2, 2, sort_by="dist_to_5", max_inter_align_gap=max_inter_align_gap) is_chimeric_1 = len(algns1) > 1 is_chimeric_2 = len(algns2) > 1 if is_chimeric_1 or is_chimeric_2: # If at least one side is chimera, we must look for ligation pair, and # report linear alignments after deduplication of complex walks: return ( parse_complex_walk( algns1, algns2, max_insert_size, report_position, report_orientation, dedup_max_mismatch, expand, max_expansion_depth, ), algns1, algns2, ) else: # If no additional information, we assume each molecule is a single ligation with single unconfirmed pair: pair_index = (1, "R1-2") algn1, algn2, pair_index = format_pair( algns1[0], algns2[0], pair_index=pair_index, report_position=report_position, report_orientation=report_orientation, ) return iter([(algn1, algn2, pair_index)]), algns1, algns2 #################### ### Walks utilities: #################### def rescue_walk(algns1, algns2, max_molecule_size): """ Rescue a single ligation that appears as a walk. Checks if a molecule with three alignments could be formed via a single ligation between two fragments, where one fragment was so long that it got sequenced on both sides. Uses three criteria: 1) the 3'-end alignment on one side maps to the same chromosome as the alignment fully covering the other side (i.e. the linear alignment) 2) the two alignments point towards each other on the chromosome 3) the distance between the outer ends of the two alignments is below the specified threshold. Alternatively, a single ligation get rescued when the 3' sub-alignment maps to multiple locations or no locations at all. In the case of a successful rescue, tags the 3' sub-alignment with type='X' and the linear alignment on the other side with type='R'. Returns ------- linear_side : int If the case of a successful rescue, returns the index of the side with a linear alignment. """ # If both sides have one alignment or none, no need to rescue! n_algns1 = len(algns1) n_algns2 = len(algns2) if (n_algns1 <= 1) and (n_algns2 <= 1): return None # Can rescue only pairs with one chimeric alignment with two parts. if not ( ((n_algns1 == 1) and (n_algns2 == 2)) or ((n_algns1 == 2) and (n_algns2 == 1)) ): return None first_read_is_chimeric = n_algns1 > 1 chim5_algn = algns1[0] if first_read_is_chimeric else algns2[0] chim3_algn = algns1[1] if first_read_is_chimeric else algns2[1] linear_algn = algns2[0] if first_read_is_chimeric else algns1[0] # the linear alignment must be uniquely mapped if not (linear_algn["is_mapped"] and linear_algn["is_unique"]): return None can_rescue = True # we automatically rescue chimeric alignments with null and non-unique # alignments at the 3' side if chim3_algn["is_mapped"] and chim5_algn["is_unique"]: # 1) in rescued walks, the 3' alignment of the chimeric alignment must be on # the same chromosome as the linear alignment on the opposite side of the # molecule can_rescue &= chim3_algn["chrom"] == linear_algn["chrom"] # 2) in rescued walks, the 3' supplemental alignment of the chimeric # alignment and the linear alignment on the opposite side must point # towards each other can_rescue &= chim3_algn["strand"] != linear_algn["strand"] if linear_algn["strand"] == "+": can_rescue &= linear_algn["pos5"] < chim3_algn["pos5"] else: can_rescue &= linear_algn["pos5"] > chim3_algn["pos5"] # 3) in single ligations appearing as walks, we can infer the size of # the molecule and this size must be smaller than the maximal size of # Hi-C molecules after the size selection step of the Hi-C protocol if linear_algn["strand"] == "+": molecule_size = ( chim3_algn["pos5"] - linear_algn["pos5"] + chim3_algn["dist_to_5"] + linear_algn["dist_to_5"] ) else: molecule_size = ( linear_algn["pos5"] - chim3_algn["pos5"] + chim3_algn["dist_to_5"] + linear_algn["dist_to_5"] ) can_rescue &= molecule_size <= max_molecule_size if can_rescue: # changing the type of the 3' alignment on side 1, does not show up in the output: if first_read_is_chimeric: algns1[1]["type"] = "X" algns2[0]["type"] = "R" return 1 # changing the type of the 3' alignment on side 2, does not show up in the output: else: algns1[0]["type"] = "R" algns2[1]["type"] = "X" return 2 else: return None def parse_complex_walk( algns1, algns2, max_insert_size, report_position, report_orientation, dedup_max_mismatch=3, expand=False, max_expansion_depth=None, ): """ Parse a set of ligations that appear as a complex walk. This procedure is equivalent to intramolecular deduplication that preserved pair order in a walk. :param algns1: List of sequential lefts alignments :param algns2: List of sequential right alignments :param max_insert_size: maximum insert size when searching for overlapping ends of R1 and R2 :param report_position: one of "outer", "junction", "read", "walk"; sets pos5 and pos3 :param report_orientation: one of "pair", "junction", "read", "walk"; sets strand :param dedup_max_mismatch: allowed mismatch between intramolecular alignments to detect readthrough duplicates :param expand: perform combinatorial expansion of pairs or not :param max_expansion_depth: maximum depth (number of segments separating pair). All by default. :return: iterator with parsed pairs **Intramolecular deduplication** Forward read (left): right read (right): 5'------------------------->3' 3'<--------------------------5' algns1 algns2 <5---3><5---3><5---3><5---3> <3---5><3---5><3---5><3---5> l0 l1 l2 l3 r3 r2 r1 r0 Alignment - bwa mem reported hit or alignment after gaps conversion. Left and right alignments (algns1: [l0, l1, l2, l3], algns2: [r0, r1, r2, r3]) - alignments on left and right reads reported from 5' to 3' orientation. Intramolecular deduplication consists of two steps: I. iterative search of overlapping alignment pairs (aka overlap), II. if no overlaps or search not possible (less than 2 alignments on either sides), search for overlap of end alignments (aka partial overlap). III. report pairs before the overlap, deduplicated pairs of overlap and pairs after that. Iterative search of overlap is in fact scanning of the right read pairs for the hit with the 3'-most pair of the left read: 1. Initialize. Start from 3' of left and right reads. Set `current_left_pair` and `current_right_pair` pointers 2. Initial compare. Compare pairs l2-l3 and r3-r2 by `pairs_overlap`. If successful, we found the overlap, go to reporting. If unsuccessful, continue search. 3. Increment. Shift `current_right_pair` pointer by one (e.g., take the pair r2-r1). 4. Check. Check that this pair can form a potential overlap with left alignments: the number of pairs downstream from l2-l3 on left read should not be less than the number of pairs upstream from r2-r1 on right read. If overlap cannot be formed, no other overlap in this complex walk is possible, safely exit. If the potential overlap can be formed, continue comparison. 5. Compare. Compare the current pair of pairs on left and right reads. If comparison fails, go to step 3. If comparison is successful, go to 6. 6. Verify. Check that downstream pairs on the left read overlap with the upstream pairs on the right read. If yes, exit. If not, we do not have an overlap, go to step 3. """ AVAILABLE_REPORT_POSITION = ["outer", "junction", "read", "walk"] assert report_position in AVAILABLE_REPORT_POSITION, ( f"Cannot report position {report_position}, as it is not implemented" f'Available choices are: {", ".join(AVAILABLE_REPORT_POSITION)}' ) AVAILABLE_REPORT_ORIENTATION = ["pair", "junction", "read", "walk"] assert report_orientation in AVAILABLE_REPORT_ORIENTATION, ( f"Cannot report orientation {report_orientation}, as it is not implemented" f'Available choices are: {", ".join(AVAILABLE_REPORT_ORIENTATION)}' ) output_pairs = [] # Initialize (step 1). n_algns1 = len(algns1) n_algns2 = len(algns2) current_left_pair = current_right_pair = 1 remaining_left_pairs = ( n_algns1 - 1 ) # Number of possible pairs remaining on left read remaining_right_pairs = ( n_algns2 - 1 ) # Number of possible pairs remaining on right read checked_right_pairs = ( 0 # Number of checked pairs on right read (from the end of read) ) is_overlap = False # I. Iterative search of overlap, at least two alignments on each side: if (n_algns1 >= 2) and (n_algns2 >= 2): # Iteration includes check (step 4): while (remaining_left_pairs > checked_right_pairs) and ( remaining_right_pairs > 0 ): pair1 = (algns1[-current_left_pair - 1], algns1[-current_left_pair]) pair2 = (algns2[-current_right_pair - 1], algns2[-current_right_pair]) # Compare (initial or not, step 2 or 5): is_overlap = pairs_overlap( pair1, pair2, dedup_max_mismatch=dedup_max_mismatch ) if is_overlap: last_idx_left_temp = current_left_pair last_idx_right_temp = current_right_pair checked_right_temp = checked_right_pairs # Verify (step 6): while is_overlap and (checked_right_temp > 0): last_idx_left_temp += 1 last_idx_right_temp -= 1 pair1 = ( algns1[-last_idx_left_temp - 1], algns1[-last_idx_left_temp], ) pair2 = ( algns2[-last_idx_right_temp - 1], algns2[-last_idx_right_temp], ) is_overlap &= pairs_overlap( pair1, pair2, dedup_max_mismatch=dedup_max_mismatch ) checked_right_temp -= 1 if is_overlap: # exit current_right_pair += 1 break # Increment pointers (step 3) current_right_pair += 1 checked_right_pairs += 1 remaining_right_pairs -= 1 # No overlap found, roll the current_idx_right back to the initial value: if not is_overlap: current_right_pair = 1 if (n_algns2 == 0): last_reported_alignment_left = 1 last_reported_alignment_right = 0 else: # II. Search of partial overlap if there are less than 2 alignments at either sides, or no overlaps found if (current_right_pair == 1): last_reported_alignment_left = last_reported_alignment_right = 1 if partial_overlap( algns1[-1], algns2[-1], max_insert_size=max_insert_size, dedup_max_mismatch=dedup_max_mismatch, ): if ( n_algns1 >= 2 ): # single alignment on right read and multiple alignments on left pair_index = (len(algns1) - 1, "R1") output_pairs.append( format_pair( algns1[-2], algns1[-1], pair_index=pair_index, algn2_pos3=algns2[-1]["pos5"], report_position=report_position, report_orientation=report_orientation, ) ) last_reported_alignment_left = 2 # set the pointer for reporting if ( n_algns2 >= 2 ): # single alignment on left read and multiple alignments on right pair_index = (len(algns1), "R2") output_pairs.append( format_pair( algns2[-1], algns2[-2], pair_index=pair_index, algn1_pos3=algns1[-1]["pos5"], report_position=report_position, report_orientation=report_orientation, ) ) last_reported_alignment_right = 2 # set the pointer for reporting # Note that if n_algns1==n_algns2==1 and alignments overlap, then we don't need to check, # it's a non-ligated DNA fragment that we don't report. else: # end alignments do not overlap, report regular pair: pair_index = (len(algns1), "R1-2") output_pairs.append( format_pair( algns1[-1], algns2[-1], pair_index=pair_index, report_position=report_position, report_orientation=report_orientation, ) ) else: # there was an overlap, set some pointers: last_reported_alignment_left = ( last_reported_alignment_right ) = current_right_pair # III. Report all remaining alignments. # Report all unique alignments on left read (sequential): for i in range(0, n_algns1 - last_reported_alignment_left): pair_index = (i + 1, "R1") output_pairs.append( format_pair( algns1[i], algns1[i + 1], pair_index=pair_index, report_position=report_position, report_orientation=report_orientation, ) ) # Report the pairs where both left alignments overlap right: for i_overlapping in range(current_right_pair - 1): idx_left = n_algns1 - current_right_pair + i_overlapping idx_right = n_algns2 - 1 - i_overlapping pair_index = (idx_left + 1, "R1&2") output_pairs.append( format_pair( algns1[idx_left], algns1[idx_left + 1], pair_index=pair_index, algn2_pos3=algns2[idx_right - 1]["pos5"], report_position=report_position, report_orientation=report_orientation, ) ) # Report all the sequential chimeric pairs in the right read, but not the overlap: reporting_order = range( 0, min(current_right_pair, n_algns2 - last_reported_alignment_right) ) for i in reporting_order: # Determine the pair index depending on what is the overlap: shift = -1 if current_right_pair > 1 else 0 pair_index = ( ( n_algns1 + min(current_right_pair, n_algns2 - last_reported_alignment_right) - i + shift ), "R2", ) output_pairs.append( format_pair( algns2[i + 1], algns2[i], pair_index=pair_index, report_position=report_position, report_orientation=report_orientation, ) ) # Sort the pairs according to the pair index: output_pairs.sort(key=lambda x: int(x[-1][0])) if expand: output_pairs = expand_pairs(output_pairs, max_expansion_depth) return iter(output_pairs) ### Additional functions for pairs ### def expand_pairs(pairs_list, max_expansion_depth=None): """ Perform combinatorial expansion of the pairs. Parameters ---------- pairs_list: List of formatted pairs (triplets: algn1, algn2, pair_index). max_expansion_depth: maximum depth of expansion; all by default (None), number will enforce only pairs from the same strand. Returns ------- list of expanded pairs """ for algn1, _algn1, pair_index1 in pairs_list: for _algn2, algn2, pair_index2 in pairs_list: if pair_index1 > pair_index2: continue elif pair_index1 == pair_index2: # output regular pair with no change yield algn1, _algn1, pair_index1 else: pair_order1, pair_type1 = pair_index1 pair_order2, pair_type2 = pair_index2 separated_by = pair_order2 - pair_order1 if ( pair_type1 == "R1-2" or pair_type2 == "R1-2" or (pair_type1 == "R1" and pair_type2 == "R2") ): pair_type = "R1-2" elif pair_type1 == pair_type2: pair_type = pair_type1 elif pair_type1 == "R1&2": pair_type = pair_type2 elif pair_type2 == "R1&2": pair_type = pair_type1 else: raise ValueError( f"Unexpected error, pair types: {pair_type1}, {pair_type2}" ) same_read = pair_type != "R1-2" if (max_expansion_depth is None) or ( (separated_by <= max_expansion_depth) and same_read ): pair_type = f"E{separated_by}_{pair_type}" yield algn1, algn2, (pair_order1, pair_type) ### Additional functions for complex walks rescue ### def partial_overlap(algn1, algn2, max_insert_size=500, dedup_max_mismatch=5): """ Two ends of alignments overlap if: 1) they are from the same chromosome, 2) map in the opposite directions, 3) the distance between the outer ends of the two alignments is below the specified max_insert_size, 4) the distance between the outer ends of the two alignments is above the maximum alignment size. (4) guarantees that the alignments point towards each other on the chromosomes. Allowed mismatch between intramolecular alignments to detect readthrough duplicates. Return: 1 if the alignments overlap or both have troubles with unique mapping, 0 if they do not overlap or if we do not have enough information (e.g. only one of the alignments have troubles with being mapped). """ # Alignments with no match or with multiple matches are counted as overlaps if not (algn1["is_mapped"] and algn1["is_unique"]): if not (algn2["is_mapped"] and algn2["is_unique"]): return 1 # We assume that successful alignment cannot be an overlap with unmapped or multi-mapped region if not (algn1["is_mapped"] and algn1["is_unique"]): return 0 if not (algn2["is_mapped"] and algn2["is_unique"]): return 0 # Both alignments are mapped and unique do_overlap = True do_overlap &= algn1["chrom"] == algn2["chrom"] do_overlap &= algn1["strand"] != algn2["strand"] if algn1["strand"] == "+": min_algn_size = max( algn1["pos3"] - algn1["pos5"], algn2["pos5"] - algn2["pos3"] ) distance_outer_ends = algn2["pos5"] - algn1["pos5"] else: min_algn_size = max( algn1["pos5"] - algn1["pos3"], algn2["pos3"] - algn2["pos5"] ) distance_outer_ends = algn1["pos5"] - algn2["pos5"] do_overlap &= distance_outer_ends <= max_insert_size + dedup_max_mismatch do_overlap &= distance_outer_ends >= min_algn_size - dedup_max_mismatch if do_overlap: return 1 return 0 def pairs_overlap(algns1, algns2, dedup_max_mismatch=3): """ We assume algns1 originate from left read, and algns2 originate from right read: left read: right read: ----------------------------> <---------------------------- algns1 algns2 5------------3_5------------3 3------------5_3------------5' left_5'-algn left_3'-algn right_3'-algn right_5'-algn Two pairs of alignments overlap if: 1) chromosomes/mapping/strand of left_5'-algn and right_3'-algn are the same, 2) chromosomes/mapping/strand of left_3'-algn and right_5'-algn are the same, 3) pos3 of left_5'-algn is close to pos5 of right_3'-algn (with dedup_max_mismatch), and 4) pos5 of left_3'-algn is close to pos3 of right_5'-algn. Return: 1 of the pairs of alignments overlap, 0 otherwise. """ left5_algn = algns1[0] left3_algn = algns1[1] right5_algn = algns2[0] right3_algn = algns2[1] # We assume that successful alignment cannot be an overlap with unmapped or multi-mapped region: mapped_left5_algn = left5_algn["is_mapped"] and left5_algn["is_unique"] mapped_left3_algn = left3_algn["is_mapped"] and left3_algn["is_unique"] mapped_right5_algn = right5_algn["is_mapped"] and right5_algn["is_unique"] mapped_right3_algn = right3_algn["is_mapped"] and right3_algn["is_unique"] if not mapped_left5_algn and not mapped_right3_algn: left_overlap = True elif not mapped_left5_algn and mapped_right3_algn: left_overlap = False elif mapped_left5_algn and not mapped_right3_algn: left_overlap = False else: left_overlap = True left_overlap &= left5_algn["chrom"] == right3_algn["chrom"] left_overlap &= left5_algn["strand"] != right3_algn["strand"] if not mapped_left3_algn and not mapped_right5_algn: right_overlap = True elif not mapped_left3_algn and mapped_right5_algn: right_overlap = False elif mapped_left3_algn and not mapped_right5_algn: right_overlap = False else: right_overlap = True right_overlap &= left3_algn["chrom"] == right5_algn["chrom"] right_overlap &= left3_algn["strand"] != right5_algn["strand"] same_pair = True same_pair &= abs(left5_algn["pos3"] - right3_algn["pos5"]) <= dedup_max_mismatch same_pair &= abs(left3_algn["pos5"] - right5_algn["pos3"]) <= dedup_max_mismatch if left_overlap & right_overlap & same_pair: return 1 else: return 0 def format_pair( hic_algn1, hic_algn2, pair_index, report_position="outer", report_orientation="pair", algn1_pos5=None, algn1_pos3=None, algn2_pos5=None, algn2_pos3=None, ): """ Return a triplet: pair of formatted alignments and pair_index in a walk :param hic_algn1: Left alignment forming a pair :param hic_algn2: Right alignment forming a pair :param algns1: All left read alignments for formal reporting :param algns2: All right read alignments for formal reporting :param pair_index: Index of the pair :param algn1_pos5: Replace reported 5'-position of the alignment 1 with this value :param algn1_pos3: Replace reported 3'-position of the alignment 1 with this value :param algn2_pos5: Replace reported 5'-position of the alignment 2 with this value :param algn2_pos3: Replace reported 3'-position of the alignment 2 with this value """ # Make sure the original data is not modified: hic_algn1, hic_algn2 = dict(hic_algn1), dict(hic_algn2) # Adjust the 5' and 3'-ends: hic_algn1["pos5"] = algn1_pos5 if not algn1_pos5 is None else hic_algn1["pos5"] hic_algn1["pos3"] = algn1_pos3 if not algn1_pos3 is None else hic_algn1["pos3"] hic_algn2["pos5"] = algn2_pos5 if not algn2_pos5 is None else hic_algn2["pos5"] hic_algn2["pos3"] = algn2_pos3 if not algn2_pos3 is None else hic_algn2["pos3"] hic_algn1["type"] = ( "N" if not hic_algn1["is_mapped"] else "M" if not hic_algn1["is_unique"] else "U" ) hic_algn2["type"] = ( "N" if not hic_algn2["is_mapped"] else "M" if not hic_algn2["is_unique"] else "U" ) # Change orientation and positioning of pair for reporting: # AVAILABLE_REPORT_POSITION = ["outer", "pair", "read", "walk"] # AVAILABLE_REPORT_ORIENTATION = ["pair", "pair", "read", "walk"] pair_type = pair_index[1] if report_orientation == "read": pass elif report_orientation == "walk": if pair_type == "R2": hic_algn1 = flip_orientation(hic_algn1) hic_algn2 = flip_orientation(hic_algn2) elif pair_type == "R1-2": hic_algn2 = flip_orientation(hic_algn2) elif report_orientation == "pair": if pair_type == "R1" or pair_type == "R1&2": hic_algn2 = flip_orientation(hic_algn2) elif pair_type == "R2": hic_algn1 = flip_orientation(hic_algn1) elif report_orientation == "junction": if pair_type == "R1" or pair_type == "R1&2": hic_algn1 = flip_orientation(hic_algn1) elif pair_type == "R2": hic_algn2 = flip_orientation(hic_algn2) else: hic_algn1 = flip_orientation(hic_algn1) hic_algn2 = flip_orientation(hic_algn2) if report_position == "read": pass elif report_position == "walk": if pair_type == "R2": hic_algn1 = flip_position(hic_algn1) hic_algn2 = flip_position(hic_algn2) elif pair_type == "R1-2": hic_algn2 = flip_position(hic_algn2) elif report_position == "outer": if pair_type == "R1" or pair_type == "R1&2": hic_algn2 = flip_position(hic_algn2) elif pair_type == "R2": hic_algn1 = flip_position(hic_algn1) elif report_position == "junction": if pair_type == "R1" or pair_type == "R1&2": hic_algn1 = flip_position(hic_algn1) elif pair_type == "R2": hic_algn2 = flip_position(hic_algn2) elif pair_type == "R1-2": hic_algn1 = flip_position(hic_algn1) hic_algn2 = flip_position(hic_algn2) else: raise ValueError(f"Unknown pair type: {pair_type}") return [hic_algn1, hic_algn2, pair_index] def check_pair_order(algn1, algn2, chrom_enum): """ Check if a pair of alignments has the upper-triangular order or has to be flipped. """ # First, the pair is flipped according to the type of mapping on its sides. # Later, we will check it is mapped on both sides and, if so, flip the sides # according to these coordinates. has_correct_order = (algn1["is_mapped"], algn1["is_unique"]) <= ( algn2["is_mapped"], algn2["is_unique"], ) # If a pair has coordinates on both sides, it must be flipped according to # its genomic coordinates. if (algn1["chrom"] != pairsam_format.UNMAPPED_CHROM) and ( algn2["chrom"] != pairsam_format.UNMAPPED_CHROM ): has_correct_order = (chrom_enum[algn1["chrom"]], algn1["pos"]) <= ( chrom_enum[algn2["chrom"]], algn2["pos"], ) return has_correct_order ###################### ### Output utilities: ###################### def write_all_algnments(readID, all_algns1, all_algns2, out_file): """ Debug utility that outputs all alignments in .bam file before parsing walks/pairs """ for side_idx, all_algns in enumerate((all_algns1, all_algns2)): out_file.write(readID) out_file.write("\t") out_file.write(str(side_idx + 1)) out_file.write("\t") for algn in sorted(all_algns, key=lambda x: x["dist_to_5"]): out_file.write(algn["chrom"]) out_file.write("\t") out_file.write(str(algn["pos5"])) out_file.write("\t") out_file.write(algn["strand"]) out_file.write("\t") out_file.write(str(algn["mapq"])) out_file.write("\t") out_file.write(str(algn["cigar"])) out_file.write("\t") out_file.write(str(algn["dist_to_5"])) out_file.write("\t") out_file.write(str(algn["dist_to_5"] + algn["algn_read_span"])) out_file.write("\t") out_file.write(str(algn["matched_bp"])) out_file.write("\t") out_file.write("\n") def write_pairsam( algn1, algn2, readID, pair_index, sams1, sams2, out_file, drop_readid, drop_seq, drop_sam, add_pair_index, add_columns, ): """ Write output pairsam. Note: SAM is already tab-separated and any printable character between ! and ~ may appear in the PHRED field! (http://www.ascii-code.com/) Thus, use the vertical tab character to separate fields! """ cols = [ "." if drop_readid else readID, algn1["chrom"], str(algn1["pos"]), algn2["chrom"], str(algn2["pos"]), algn1["strand"], algn2["strand"], algn1["type"] + algn2["type"], ] if not drop_sam: for sams in [sams1, sams2]: if drop_seq: for sam in sams: sam.query_qualities = "" sam.query_sequence = "" cols.append( pairsam_format.INTER_SAM_SEP.join( [ sam.to_string().replace( "\t", pairsam_format.SAM_SEP ) # String representation of pysam alignment + pairsam_format.SAM_SEP + "Yt:Z:" + algn1["type"] + algn2["type"] for sam in sams ] ) ) if add_pair_index: cols.append(str(pair_index[0])) cols.append(pair_index[1]) for col in add_columns: # use get b/c empty alignments would not have sam tags (NM, AS, etc) cols.append(str(algn1.get(col, ""))) cols.append(str(algn2.get(col, ""))) out_file.write(pairsam_format.PAIRSAM_SEP.join(cols) + "\n") pairtools-1.1.3/pairtools/lib/parse_pysam.pyx000066400000000000000000000110151474715105500214060ustar00rootroot00000000000000from pysam.libcalignmentfile cimport AlignmentFile from pysam.libcalignedsegment cimport AlignedSegment, AlignmentHeader from pysam.libchtslib cimport * from pysam.libcutils cimport array_to_qualitystring cdef class AlignmentFilePairtoolized(AlignmentFile): """ Modified class that loads each entry as pairtoolozed alignment. """ def __next__(self): cdef int ret = self.cnext() if (ret >= 0): # Redefine the constructed object: return makeAlignedSegmentPairtoolized(self.b, self.header) elif ret == -2: raise IOError('truncated file') else: raise StopIteration cdef AlignedSegmentPairtoolized makeAlignedSegmentPairtoolized(bam1_t *src, AlignmentHeader header): '''return an AlignedSegmentPairtoolized object constructed from `src`''' # note that the following does not call __init__ # Redefine the constructed object: cdef AlignedSegmentPairtoolized dest = AlignedSegmentPairtoolized.__new__(AlignedSegmentPairtoolized) dest._delegate = bam_dup1(src) dest.header = header return dest cdef class AlignedSegmentPairtoolized(AlignedSegment): """ In the pairtoolized class we inherit everything and add some useful properties and functions on top of that. """ def is_unique(self, min_mapq): """true if read is unique mapping (by mapq)""" return self.mapq >= min_mapq property is_linear: """true if read is linear (SA is present in tages)""" def __get__(self): if self.has_tag('SA'): return False # for tag in self.tags: # if 'SA'==tag[0]: # return False return True property cigar_dict: """Parsed CIGAR as dictionary with interpretable fields""" def __get__(self): """Parse cigar tuples reported as cigartuples of pysam read entry. Reports alignment span, clipped nucleotides and more. See https://pysam.readthedocs.io/en/latest/api.html#pysam.AlignedSegment.cigartuples """ matched_bp = 0 algn_ref_span = 0 algn_read_span = 0 read_len = 0 clip5_ref = 0 clip3_ref = 0 cigarstring = self.cigarstring cigartuples = self.cigartuples if cigartuples is not None: for operation, length in cigartuples: if operation == 0: # M, match matched_bp += length algn_ref_span += length algn_read_span += length read_len += length elif operation == 1: # I, insertion algn_read_span += length read_len += length elif operation == 2: # D, deletion algn_ref_span += length elif ( operation == 4 or operation == 5 ): # S and H, soft clip and hard clip, respectively read_len += length if matched_bp == 0: clip5_ref = length else: clip3_ref = length return { "clip5_ref": clip5_ref, "clip3_ref": clip3_ref, "cigar": cigarstring, "algn_ref_span": algn_ref_span, "algn_read_span": algn_read_span, "read_len": read_len, "matched_bp": matched_bp } from cpython cimport array import cython cimport cython cpdef list get_mismatches_c(str seq, array.array quals, list aligned_pairs): ''' This function takes a SAM alignment and, for every mismatch between the read and reference sequences, returns a tuple (the reference bp, the read bp, PHRED quality of the bp, reference position, read position). Reference: https://github.com/gerlichlab/scshic_pipeline/blob/master/bin/seq_mismatches.pyx ''' cdef cython.int read_pos, ref_pos cdef str orig_bp, orig_bp_upper cdef list mismatches = [] for read_pos, ref_pos, orig_bp in aligned_pairs: orig_bp_upper = orig_bp.upper() if (seq[read_pos] != orig_bp_upper): mismatches.append( (orig_bp_upper, seq[read_pos], quals[read_pos], ref_pos, read_pos) ) return mismatchespairtools-1.1.3/pairtools/lib/phase.py000066400000000000000000000050111474715105500177720ustar00rootroot00000000000000def get_chrom_phase(chrom, phase_suffixes): if chrom.endswith(phase_suffixes[0]): return "0", chrom[: -len(phase_suffixes[0])] elif chrom.endswith(phase_suffixes[1]): return "1", chrom[: -len(phase_suffixes[1])] else: return "!", chrom def phase_side_XB(chrom, XB, AS, XS, phase_suffixes): phase, chrom_base = get_chrom_phase(chrom, phase_suffixes) XBs = [i for i in XB.split(";") if len(i) > 0] S1, S2, S3 = AS, XS, -1 # -1 if the second hit was not reported if AS > XS: # Primary hit has higher score than the secondary return phase, chrom_base, S1, S2, S3 elif len(XBs) >= 1: if len(XBs) >= 2: alt2_chrom, alt2_pos, alt2_CIGAR, alt2_NM, alt2_AS, alt_mapq = XBs[1].split( "," ) S3 = int(alt2_AS) if int(alt2_AS) == XS == AS: return "!", "!", S1, S2, S3 alt_chrom, alt_pos, alt_CIGAR, alt_NM, alt_AS, alt_mapq = XBs[0].split(",") alt_phase, alt_chrom_base = get_chrom_phase(alt_chrom, phase_suffixes) alt_is_homologue = (chrom_base == alt_chrom_base) and ( ((phase == "0") and (alt_phase == "1")) or ((phase == "1") and (alt_phase == "0")) ) if alt_is_homologue: return ".", chrom_base, S1, S2, S3 return "!", "!", S1, S2, S3 def phase_side_XA(chrom, XA, AS, XS, NM, phase_suffixes): phase, chrom_base = get_chrom_phase(chrom, phase_suffixes) XAs = [i for i in XA.split(";") if len(i.strip()) > 0] if len(XAs) >= 1: alt_chrom, alt_pos, alt_CIGAR, alt_NM = XAs[0].split(",") M1, M2, M3 = NM, int(alt_NM), -1 else: M1, M2, M3 = NM, -1, -1 # -1 if the second hit was not reported if AS > XS: # Primary hit has higher score than the secondary return phase, chrom_base, M1, M2, M3 elif len(XAs) >= 1: if len(XAs) >= 2: alt2_chrom, alt2_pos, alt2_CIGAR, alt2_NM = XAs[1].split(",") M3 = int(alt2_NM) if int(alt2_NM) == int(alt_NM) == NM: return "!", "!", M1, M2, M3 alt_chrom, alt_pos, alt_CIGAR, alt_NM = XAs[0].split(",") alt_phase, alt_chrom_base = get_chrom_phase(alt_chrom, phase_suffixes) alt_is_homologue = (chrom_base == alt_chrom_base) and ( ((phase == "0") and (alt_phase == "1")) or ((phase == "1") and (alt_phase == "0")) ) if alt_is_homologue: return ".", chrom_base, M1, M2, M3 return "!", "!", M1, M2, M3 pairtools-1.1.3/pairtools/lib/regions.pyx000066400000000000000000000030651474715105500205370ustar00rootroot00000000000000""" Moved from pairlib, library for fast regions assignment """ from cython.operator cimport dereference, postincrement, postdecrement from cpython cimport array import cython from libcpp.map cimport map from libcpp.algorithm cimport lower_bound, upper_bound from libcpp.string cimport string from libcpp.vector cimport vector import numpy as np cimport numpy as np cpdef np.ndarray assign_regs_c(np.ndarray chroms, np.ndarray pos, dict reg_dict): assert len(chroms) == len(pos) cdef int n = len(chroms) cdef np.ndarray[np.int64_t, ndim=2] result = -1 * np.ones((n, 3), dtype=np.int64) cdef map[string, vector[int]] reg_map = reg_dict cdef map[string, vector[int]].iterator reg_map_it = reg_map.begin() cdef map[string, vector[int]].iterator reg_map_end = reg_map.end() cdef vector[int].iterator lo_b, up_b cdef int position, reg_boundary_idx # this can be parallelized with prange for i in range(n): reg_map_it = reg_map.find(chroms[i]) if reg_map_it != reg_map_end: position = pos[i] up_b = upper_bound( dereference(reg_map_it).second.begin(), dereference(reg_map_it).second.end(), position) reg_boundary_idx = up_b - dereference(reg_map_it).second.begin() if reg_boundary_idx % 2 == 1: lo_b = up_b postdecrement(lo_b) result[i, 0] = (reg_boundary_idx - 1) // 2 result[i, 1] = dereference(lo_b) result[i, 2] = dereference(up_b) return resultpairtools-1.1.3/pairtools/lib/restrict.py000066400000000000000000000015231474715105500205350ustar00rootroot00000000000000from . import pairsam_format import warnings def find_rfrag(rfrags, chrom, pos): # Return empty if chromosome is unmapped: if chrom == pairsam_format.UNMAPPED_CHROM: return ( pairsam_format.UNANNOTATED_RFRAG, pairsam_format.UNMAPPED_POS, pairsam_format.UNMAPPED_POS, ) try: rsites_chrom = rfrags[chrom] except ValueError as e: warnings.warn( f"Chomosome {chrom} does not have annotated restriction fragments, return empty." ) return ( pairsam_format.UNANNOTATED_RFRAG, pairsam_format.UNMAPPED_POS, pairsam_format.UNMAPPED_POS, ) idx = min( max(0, rsites_chrom.searchsorted(pos, "right") - 1), len(rsites_chrom) - 2 ) return idx, rsites_chrom[idx], rsites_chrom[idx + 1] pairtools-1.1.3/pairtools/lib/scaling.py000066400000000000000000000363711474715105500203270ustar00rootroot00000000000000import numpy as np import pandas as pd from .regions import assign_regs_c from . import pairsio import bioframe def geomprog(factor, start=1): yield start while True: start *= factor yield start def _geomrange(start, end, factor, endpoint): prev = np.nan for i in geomprog(factor, start): x = int(round(i)) if x > end: break if x == prev: continue prev = x yield x if endpoint and prev != end: yield end def geomrange(start, end, factor, endpoint=False): return np.fromiter(_geomrange(start, end, factor, endpoint), dtype=int) def geomspace(start, end, num=50, endpoint=True): factor = (end / start) ** (1 / num) return geomrange(start, end, factor, endpoint=endpoint) def _to_float(arr_or_scalar): if np.isscalar(arr_or_scalar): return float(arr_or_scalar) else: return np.asarray(arr_or_scalar).astype(float) def assign_regs(chroms, pos, regs): gb_regs = regs.sort_values(["chrom", "start", "end"]).groupby("chrom") regs_dict = { chrom.encode(): regs_per_chrom[["start", "end"]] .values .flatten() .astype(np.int64) for chrom, regs_per_chrom in gb_regs } return assign_regs_c(np.asarray(chroms).astype("bytes"), np.asarray(pos), regs_dict) def cartesian_df_product(df1, df2, suffixes=["1", "2"]): return pd.merge( left=df1.assign(cartesian_product_dummy=1), right=df2.assign(cartesian_product_dummy=1), on=["cartesian_product_dummy"], how="outer", suffixes=suffixes, ).drop("cartesian_product_dummy", axis="columns") def make_empty_scaling(regions, dist_bins, multiindex=True): if dist_bins[0] != 0: dist_bins = np.r_[0, dist_bins] if dist_bins[-1] != np.iinfo(np.int64).max: dist_bins = np.r_[dist_bins, np.iinfo(np.int64).max] strands_table = pd.DataFrame( {"strand1": ["+", "+", "-", "-"], "strand2": ["+", "-", "+", "-"]} ) dists_table = pd.DataFrame( list(zip(dist_bins[:-1], dist_bins[1:])), columns=["min_dist", "max_dist"] ) out = regions.join(regions, on=None, lsuffix="1", rsuffix="2") out = cartesian_df_product(out, strands_table) out = cartesian_df_product(out, dists_table) if multiindex: index_by = [ "chrom1", "start1", "end1", "chrom2", "start2", "end2", "strand1", "strand2", "min_dist", "max_dist", ] out.set_index(index_by, inplace=True) return out def make_empty_cross_region_table( regions, drop_same_reg=True, split_by_strand=True, multiindex=True ): out = cartesian_df_product(regions, regions) if split_by_strand: strands_table = pd.DataFrame( {"strand1": ["+", "+", "-", "-"], "strand2": ["+", "-", "+", "-"]} ) out = cartesian_df_product(out, strands_table) if drop_same_reg: out = out[ (out["chrom1"] != out["chrom2"]) | (out["start1"] != out["start2"]) | (out["end1"] != out["end2"]) ] if multiindex: index_by = ["chrom1", "start1", "end1", "chrom2", "start2", "end2"] if split_by_strand: index_by += ["strand1", "strand2"] out.set_index(index_by, inplace=True) return out def bins_pairs_by_distance( pairs_df, dist_bins, regions=None, chromsizes=None, ignore_trans=False, keep_unassigned=False, ): dist_bins = np.r_[dist_bins, np.iinfo(np.int64).max] if regions is None: if chromsizes is None: chroms = sorted( set.union(set(pairs_df.chrom1.unique()), set(pairs_df.chrom2.unique())) ) regions = pd.DataFrame({"chrom": chroms, "start": 0, "end": -1}) regions = regions[["chrom", "start", "end"]] region_starts1, region_starts2 = 0, 0 region_ends1, region_ends2 = -1, -1 else: region_ends1 = pairs_df.chrom1.map(chromsizes).fillna(-1).astype(np.int64) region_ends2 = pairs_df.chrom2.map(chromsizes).fillna(-1).astype(np.int64) region_starts1 = np.where(region_ends1 > 0, 0, -1) region_starts2 = np.where(region_ends2 > 0, 0, -1) regions = pd.DataFrame( [ {"chrom": chrom, "start": 0, "end": length} for chrom, length in chromsizes.items() ] ) regions = regions[["chrom", "start", "end"]] try: regions = bioframe.from_any(regions) except Exception as e: raise ValueError(f"Invalid viewframe created from pairs file, {e}") else: if not bioframe.is_viewframe(regions): try: regions = bioframe.from_any(regions) except Exception as e: raise ValueError( f"Provided regions cannot be converted to viewframe, {e}" ) regions = regions[["chrom", "start", "end"]] _, region_starts1, region_ends1 = assign_regs( pairs_df.chrom1.values, pairs_df.pos1.values, regions ).T _, region_starts2, region_ends2 = assign_regs( pairs_df.chrom2.values, pairs_df.pos2.values, regions ).T pairs_reduced_df = pd.DataFrame( { "chrom1": pairs_df.chrom1.values, "start1": region_starts1, "end1": region_ends1, "chrom2": pairs_df.chrom2.values, "start2": region_starts2, "end2": region_ends2, "strand1": pairs_df.strand1.values, "strand2": pairs_df.strand2.values, "dist_bin_idx": np.searchsorted( dist_bins, np.abs(pairs_df.pos1 - pairs_df.pos2), side="right" ), "n_pairs": 1, }, copy=False, ) if not keep_unassigned: pairs_reduced_df = (pairs_reduced_df .query('(start1 >= 0) and (start2 >= 0)') # do not test for end1 and end2, as they can be -1 if regions and not specified .reset_index(drop=True)) pairs_reduced_df["min_dist"] = np.where( pairs_reduced_df["dist_bin_idx"] > 0, dist_bins[pairs_reduced_df["dist_bin_idx"] - 1], 0, ) pairs_reduced_df["max_dist"] = np.where( pairs_reduced_df["dist_bin_idx"] < len(dist_bins)-1, dist_bins[pairs_reduced_df["dist_bin_idx"]], np.iinfo(np.int64).max, ) # importantly, in the future, we may want to extend the function to plot scalings # for pairs from different regions! cis_region_pairs = ( (pairs_reduced_df.chrom1 == pairs_reduced_df.chrom2) & (pairs_reduced_df.start1 == pairs_reduced_df.start2) & (pairs_reduced_df.end1 == pairs_reduced_df.end2) ) pairs_for_scaling_mask = ( cis_region_pairs & (pairs_reduced_df.min_dist > 0) & (pairs_reduced_df.max_dist < np.iinfo(np.int64).max) ) pairs_for_scaling_df = pairs_reduced_df.loc[pairs_for_scaling_mask] pairs_for_scaling_counts = pairs_for_scaling_df.groupby( by=[ "chrom1", "start1", "end1", "chrom2", "start2", "end2", "strand1", "strand2", "min_dist", "max_dist", ] ).agg({"n_pairs": "sum"}) pairs_for_scaling_counts = ( make_empty_scaling(regions, dist_bins) .assign(n_pairs=0) .add(pairs_for_scaling_counts, fill_value=0) ) pairs_for_scaling_counts["n_pairs"] = pairs_for_scaling_counts["n_pairs"].astype( np.int64 ) if ignore_trans: pairs_no_scaling_counts = None else: pairs_no_scaling_df = pairs_reduced_df.loc[~cis_region_pairs] pairs_no_scaling_counts = pairs_no_scaling_df.groupby( by=[ "chrom1", "start1", "end1", "chrom2", "start2", "end2", "strand1", "strand2", ] ).agg({"n_pairs": "sum"}) pairs_no_scaling_counts = ( make_empty_cross_region_table(regions) .assign(n_pairs=0) .add(pairs_no_scaling_counts, fill_value=0) ) pairs_no_scaling_counts["n_pairs"] = pairs_no_scaling_counts["n_pairs"].astype( np.int64 ) return pairs_for_scaling_counts, pairs_no_scaling_counts def contact_areas_same_reg(min_dist, max_dist, region_length): min_dist = _to_float(min_dist) max_dist = _to_float(max_dist) scaffold_length = _to_float(region_length) outer_areas = np.maximum(region_length - min_dist, 0) ** 2 inner_areas = np.maximum(region_length - max_dist, 0) ** 2 return 0.5 * (outer_areas - inner_areas) def _contact_areas_diff_reg( min_dist, max_dist, region_start1, region_end1, region_start2, region_end2 ): return ( contact_areas_same_reg(min_dist, max_dist, np.abs(region_end2 - region_start1)) + contact_areas_same_reg( min_dist, max_dist, np.abs(region_end1 - region_start2) ) - contact_areas_same_reg( min_dist, max_dist, np.abs(region_start1 - region_start2) ) - contact_areas_same_reg(min_dist, max_dist, np.abs(region_end1 - region_end2)) ) def _contact_areas_trans(min_dist, max_dist, region_length1, region_length2): return ( contact_areas_same_reg(min_dist, max_dist, region_length1 + region_length2) - contact_areas_same_reg(min_dist, max_dist, region_length1) - contact_areas_same_reg(min_dist, max_dist, region_length2) ) def compute_scaling( pairs, regions=None, chromsizes=None, dist_range=(int(1e0), int(1e9)), n_dist_bins_decade=8, chunksize=int(1e7), ignore_trans=False, keep_unassigned=False, filter_f=None, nproc_in=4, ): """ Compute the contact-frequency-vs-distance (aka "scaling") curve from a table of contacts. Parameters ---------- pairs : pd.DataFrame or str or file-like object A table with pairs of genomic coordinates representing contacts. It can be a pandas DataFrame, a path to a pairs file, or a file-like object. regions : bioframe viewframe or None, optional Genomic regions of interest. It can be anything that can serve as input to bioframe.from_any, or None if not applicable. chromsizes : pd.DataFrame or None, optional Additional dataframe with chromosome sizes, if different from regions. dist_range : tuple of int, optional The range of distances to calculate the scaling curve. Default is (10, 1000000000). n_dist_bins : int, optional The number of distance bins per order of magnitude in a log10-space. Default is 8. chunksize : int, optional Size of chunks for calculations. Default is 10000000. ignore_trans : bool, optional Ignore trans interactions or not. Default is False. keep_unassigned : bool, optional Keep pairs that are not assigned to any region or not. Default is False. filter_f : function or None, optional A function that to filter contacts. Default is None. nproc_in : int, optional Number of processes to use for reading pairs file. Default is 1. Returns ------- sc : pd.DataFrame Scaling information for each distance bin. trans_counts : pd.DataFrame or None Trans interaction counts for each distance bin. None if ignore_trans is True. """ dist_bins = geomspace( dist_range[0], dist_range[1], int(np.round(np.log10(dist_range[1]/dist_range[0])*n_dist_bins_decade)) ) if isinstance(pairs, pd.DataFrame): pairs_df = pairs elif isinstance(pairs, str) or hasattr(pairs, "buffer") or hasattr(pairs, "peek"): pairs_df, _, _ = pairsio.read_pairs(pairs, nproc=nproc_in, chunksize=chunksize) else: raise ValueError( "pairs must be either a path to a pairs file or a pd.DataFrame" ) sc, trans_counts = None, None for pairs_chunk in [pairs_df] if isinstance(pairs_df, pd.DataFrame) else pairs_df: if filter_f: pairs_chunk = filter_f(pairs_chunk) sc_chunk, trans_counts_chunk = bins_pairs_by_distance( pairs_chunk, dist_bins, regions=regions, chromsizes=chromsizes, ignore_trans=ignore_trans, keep_unassigned=keep_unassigned ) sc = sc_chunk if sc is None else sc.add(sc_chunk, fill_value=0) trans_counts = ( trans_counts_chunk if trans_counts is None else trans_counts.add(trans_counts_chunk, fill_value=0) ) # if not (isinstance(regions, pd.DataFrame) and # (set(regions.columns) == set(['chrom', 'start','end']))): # raise ValueError('regions must be provided as a dict or chrom-indexed Series of chromsizes or as a bedframe.') sc.reset_index(inplace=True) sc["n_bp2"] = contact_areas_same_reg( sc["min_dist"], sc["max_dist"], sc["end1"] - sc["start1"] ) if not ignore_trans: trans_counts.reset_index(inplace=True) trans_counts["n_bp2"] = ( (trans_counts["end1"] - trans_counts["start1"]) * ( trans_counts["end2"] - trans_counts["start2"] )) return sc, trans_counts def norm_scaling_factor(bins, cfreqs, norm_window): """ Calculate the normalization factor for a contact-frequency-vs-distance curve, by setting the average contact frequency in a specified range of distances to 1.0. Args: bins (array-like): The distance bins. cfreqs (array-like): The contact frequencies. norm_window (tuple of float): A tuple with the range of distances to use for normalization. Returns: float: The normalization scaling factor. """ lo, hi = np.searchsorted(bins, norm_window) return cfreqs[lo:hi+1].mean() def norm_scaling(bins, cfreqs, norm_window, log_input=False): """ Normalize a contact-frequency-vs-distance curve, by setting the average contact frequency in a given window to 1.0. Args: bins (array-like): The distance bins. cfreqs (array-like): The contact frequencies. norm_window (tuple of float): A tuple with the range of distances to use for normalization. log_input (bool, optional): Whether the input contact frequencies were log-transformed. Defaults to False. Returns: float or array-like: The normalized contact frequencies. """ norm = norm_scaling_factor(bins, cfreqs, norm_window) if log_input: return cfreqs - norm else: return cfreqs / norm def unity_norm_scaling(bins, cfreqs, norm_range=(1e4, 1e9)): bin_lens = np.diff(bins) bin_mids = np.sqrt(bins[1:] * bins[:-1]) if norm_range is None: norm_cfreqs = cfreqs / np.sum(1.0 * (bin_lens * cfreqs)[np.isfinite(cfreqs)]) else: norm_cfreqs = cfreqs / np.sum( 1.0 * (bin_lens * cfreqs)[ np.isfinite(cfreqs) & (bin_mids > norm_range[0]) & (bin_mids < norm_range[1]) ] ) return norm_cfreqs pairtools-1.1.3/pairtools/lib/select.py000066400000000000000000000101141474715105500201510ustar00rootroot00000000000000from ..lib import fileio, pairsam_format, headerops import re, fnmatch # Create environment of important functions: wildcard_library = {} def wildcard_match(x, wildcard): if wildcard not in wildcard_library: regex = fnmatch.translate(wildcard) reobj = re.compile(regex) wildcard_library[wildcard] = reobj return wildcard_library[wildcard].fullmatch(x) csv_library = {} def csv_match(x, csv): if csv not in csv_library: csv_library[csv] = set(csv.split(",")) return x in csv_library[csv] regex_library = {} def regex_match(x, regex): if regex not in regex_library: reobj = re.compile(regex) regex_library[regex] = reobj return regex_library[regex].fullmatch(x) # Define default data types: TYPES = {"pos1": "int", "pos2": "int", "mapq1": "int", "mapq2": "int"} def evaluate_stream( headerless_stream, condition, column_names, type_cast=(), startup_code=None ): """ Evaluate expression for the input headerless stream. Parameters ---------- headerless_stream condition type_cast: Cast a given column to a given type. By default, only pos and mapq are cast to int, other columns are kept as str. Type: tupe of two strings. startup_code: An auxiliary code to execute before filtering. Use to define functions that can be evaluated in the CONDITION statement ======== Writes the output to one of two streams (regular or rest) """ # Define data types: TYPES.update(dict(type_cast)) # Execute startup code: if startup_code is not None: exec(startup_code, globals()) for i, col in enumerate(column_names): if col in TYPES: col_type = TYPES[col] condition = re.sub(r"\b%s\b" % col , "{}(COLS[{}])".format(col_type, i), condition) #condition.replace(col, "{}(COLS[{}])".format(col_type, i)) else: condition = re.sub(r"\b%s\b" % col, "COLS[{}]".format(i), condition) #condition = condition.replace(col, "COLS[{}]".format(i)) # Compile the filtering expression: match_func = compile(condition, "", "eval") for line in headerless_stream: COLS = line.rstrip('\n').split(pairsam_format.PAIRSAM_SEP) # Evaluate filtering expression: filter_passed = eval(match_func) # Produce the output: yield filter_passed, line def evaluate_df(df, condition, type_cast=(), startup_code=None, engine="pandas"): """ Evaluate expression for the input headerless stream. Parameters ---------- df: input dataframe for evaluation condition: condition to evaluate type_cast: additional types transformations, if different from default startup_code: An auxiliary code to execute before filtering. Use to define functions that can be evaluated in the CONDITION statement ======== Writes the output to one of two streams (regular or rest) """ # Define data types: TYPES.update(dict(type_cast)) # Execute startup code: if startup_code is not None: exec(startup_code, globals()) # Set up the column formats: for col in df.columns: if col in TYPES.keys(): if not str(df.dtypes[col]) != TYPES[col]: df[col] = df[col].astype(TYPES[col]) if engine == "pandas": try: filter_passed_output = df.eval(condition) except ValueError as e: raise ValueError(f"Try passing engine python to fix this: {e}") else: # Set up the columns indexing for i, col in enumerate(df.columns): condition = re.sub(r"\b%s\b" % col, "COLS[{}]".format(i), condition) #condition = condition.replace(col, "COLS[{}]".format(i)) filter_passed_output = [] match_func = compile(condition, "", "eval") for i, r in df.iterrows(): COLS = r.values # Evaluate filtering expression: filter_passed = eval(match_func) filter_passed_output.append(True if filter_passed else False) return filter_passed_output pairtools-1.1.3/pairtools/lib/stats.py000066400000000000000000001306611474715105500200420ustar00rootroot00000000000000import numpy as np import pandas as pd from scipy import special from collections.abc import Mapping import sys import yaml from . import fileio from .select import evaluate_df from .._logging import get_logger logger = get_logger() def parse_number(s): if s.isdigit(): return int(s) elif s.replace(".", "", 1).isdigit(): return float(s) else: return s def flat_dict_to_nested(input_dict, sep='/'): output_dict = {} for key, value in input_dict.items(): if type(key) == tuple: key_parts = key elif type(key) == str: key_parts = key.split(sep) else: raise ValueError(f"Key type can be either str or tuple. Found key {key} of type {type(key)}.") current_dict = output_dict for key_part in key_parts[:-1]: current_dict = current_dict.setdefault(key_part, {}) current_dict[key_parts[-1]] = value return output_dict def nested_dict_to_flat(d, tuple_keys=False, sep='/'): """Flatten a nested dictionary to a flat dictionary. Parameters ---------- d: dict A nested dictionary to flatten. tuple_keys: bool If True, keys will be joined into tuples. Otherwise, they will be joined into strings. sep: str The separator to use between the parent key and the key if tuple_keys==False. Returns ------- dict A flat dictionary. """ if tuple_keys: join_keys = lambda k1,k2: (k1,) + k2 else: join_keys = lambda k1,k2: (k1+sep+k2) if k2 else k1 out = {} for k1, v1 in d.items(): if isinstance(v1, dict): out.update({ join_keys(k1,k2): v2 for k2, v2 in nested_dict_to_flat(v1, tuple_keys, sep).items() }) else: if tuple_keys: out[(k1,)] = v1 else: out[k1] = v1 return out def is_nested_dict(d): """Check if a dictionary is nested. Parameters ---------- d: dict A dictionary to check. Returns ------- bool True if the dictionary is nested, False otherwise. """ if not isinstance(d, dict): return False for v in d.values(): if isinstance(v, dict): return True return False def is_tuple_keyed_dict(d): """Check if a dictionary is tuple-keyed. Parameters ---------- d: dict A dictionary to check. Returns ------- bool True if the dictionary is tuple-keyed, False otherwise. """ if not isinstance(d, dict): return False for k,v in d.items(): if not isinstance(k, tuple): return False if isinstance(v, dict): return False return True def is_str_keyed_dict(d): """Check if a dictionary is string-keyed. Parameters ---------- d: dict A dictionary to check. Returns ------- bool True if the dictionary is string-keyed, False otherwise. """ if not isinstance(d, dict): return False for k,v in d.keys(): if not isinstance(k, str): return False if isinstance(v, dict): return False return True def swap_levels_nested_dict(nested_dict, level1, level2, sep='/'): """Swap the order of two levels in a nested dictionary. Parameters ---------- nested_dict: dict A nested dictionary. level1: int The index of the first level to swap. level2: int The index of the second level to swap. Returns ------- dict A nested dictionary with the levels swapped. """ if is_tuple_keyed_dict(nested_dict): out = {} for k1, v1 in nested_dict.items(): k1_list = list(k1) k1_list[level1], k1_list[level2] = k1_list[level2], k1_list[level1] out[tuple(k1_list)] = v1 return out elif is_nested_dict(nested_dict): out = nested_dict_to_flat(nested_dict, tuple_keys=True) out = swap_levels_nested_dict(out, level1, level2) out = flat_dict_to_nested(out) return out elif is_str_keyed_dict(nested_dict): out = nested_dict_to_flat(nested_dict, sep=sep) out = swap_levels_nested_dict(out, level1, level2) out = {sep.join(k):v for k,v in out.items()} return out else: raise ValueError("Input dictionary must be either nested, string-keyed or tuple-keyed") class PairCounter(Mapping): """ A Counter for Hi-C pairs that accumulates various statistics. PairCounter implements two interfaces to access multi-level statistics: 1. as a nested dict, e.g. pairCounter['pair_types']['LL'] 2. as a flat dict, with the level keys separated by '/', e.g. pairCounter['pair_types/LL'] Other features: -- PairCounters can be saved into/loaded from a file -- multiple PairCounters can be merged via addition. """ _SEP = "\t" _KEY_SEP = "/" DIST_FREQ_REL_DIFF_THRESHOLD = 0.05 N_DIST_BINS_DECADE_DEFAULT = 8 MIN_LOG10_DIST_DEFAULT = 0 MAX_LOG10_DIST_DEFAULT = 9 def __init__( self, min_log10_dist=MIN_LOG10_DIST_DEFAULT, max_log10_dist=MAX_LOG10_DIST_DEFAULT, n_dist_bins_decade=N_DIST_BINS_DECADE_DEFAULT, bytile_dups=False, filters=None, **kwargs, ): # Define filters and parameters for filters evaluation: if filters is not None: self.filters = filters else: self.filters = {"no_filter": ""} self.startup_code = kwargs.get("startup_code", "") self.type_cast = kwargs.get("type_cast", ()) self.engine = kwargs.get("engine", "pandas") # Define default filter: if "no_filter" not in self.filters: self.filters["no_filter"] = "" self._stat = {key: {} for key in self.filters} # some variables used for initialization: # genomic distance bining for the ++/--/-+/+- distribution log10_dist_bin_step = 1.0 / n_dist_bins_decade self._dist_bins = np.unique( np.r_[ 0, np.round( 10 ** np.arange( min_log10_dist, max_log10_dist + 0.001, log10_dist_bin_step ) ).astype(np.int_), ] ) # establish structure of an empty _stat: for key in self.filters: self._stat[key]["filter_expression"] = self.filters[key] self._stat[key]["total"] = 0 self._stat[key]["total_unmapped"] = 0 self._stat[key]["total_single_sided_mapped"] = 0 # total_mapped = total_dups + total_nodups self._stat[key]["total_mapped"] = 0 self._stat[key]["total_dups"] = 0 self._stat[key]["total_nodups"] = 0 ######################################## # the rest of stats are based on nodups: ######################################## self._stat[key]["cis"] = 0 self._stat[key]["trans"] = 0 self._stat[key]["pair_types"] = {} # to be removed: # self._stat[key]["dedup"] = {} self._stat[key]["cis_1kb+"] = 0 self._stat[key]["cis_2kb+"] = 0 self._stat[key]["cis_4kb+"] = 0 self._stat[key]["cis_10kb+"] = 0 self._stat[key]["cis_20kb+"] = 0 self._stat[key]["cis_40kb+"] = 0 self._stat[key]["summary"] = dict( [ ("frac_cis", 0), ("frac_cis_1kb+", 0), ("frac_cis_2kb+", 0), ("frac_cis_4kb+", 0), ("frac_cis_10kb+", 0), ("frac_cis_20kb+", 0), ("frac_cis_40kb+", 0), ("frac_dups", 0), ("complexity_naive", 0), ] ) self._stat[key]["chrom_freq"] = {} self._stat[key]["dist_freq"] = { "+-": {bin.item(): 0 for bin in self._dist_bins}, "-+": {bin.item(): 0 for bin in self._dist_bins}, "--": {bin.item(): 0 for bin in self._dist_bins}, "++": {bin.item(): 0 for bin in self._dist_bins}, } self._stat[key]["chromsizes"] = {} # Summaries are derived from other stats and are recalculated on merge self._save_bytile_dups = bytile_dups if self._save_bytile_dups: self._bytile_dups = pd.DataFrame( index=pd.MultiIndex( levels=[[], []], codes=[[], []], names=["tile", "parent_tile"] ) ) self._summaries_calculated = False def __getitem__(self, key, filter="no_filter"): if isinstance(key, str): # let's strip any unintentional '/' # from either side of the key key = key.strip("/") if self._KEY_SEP in key: # multi-key to access nested elements k_fields = key.split(self._KEY_SEP) else: # single-key access flat part of PairCounter # or to access highest level of hierarchy return self._stat[filter][key] else: # clearly an error: raise ValueError("{} is not a valid key: must be str".format(key)) # K_FIELDS: # process multi-key case: # in this case key must be in ['pair_types','chrom_freq','dist_freq','dedup'] # get the first 'k' and keep the remainders in 'k_fields' k = k_fields.pop(0) if k in ["pair_types", "dedup"]: # assert there is only one element in key_fields left: # 'pair_types' and 'dedup' treated the same if len(k_fields) == 1: return self._stat[filter][k][k_fields[0]] else: raise ValueError( "{} is not a valid key: {} section implies 1 identifier".format( key, k ) ) elif k == "chrom_freq": # assert remaining key_fields == [chr1, chr2]: if len(k_fields) == 2: return self._stat[filter][k][tuple(k_fields)] else: raise ValueError( "{} is not a valid key: {} section implies 2 identifiers".format( key, k ) ) elif k == "dist_freq": # assert that last element of key_fields is the 'directions' # THIS IS DONE FOR CONSISTENCY WITH .stats FILE # SHOULD THAT BE CHANGED IN .stats AND HERE AS WELL? if len(k_fields) == 2: # assert 'dirs' in ['++','--','+-','-+'] dirs = k_fields.pop() # there is only genomic distance range of the bin that's left: (bin_range,) = k_fields # extract left border of the bin "1000000+" or "1500-6000": dist_bin_left = int( bin_range.strip("+") if bin_range.endswith("+") else bin_range.split("-")[0] ) # store corresponding value: return self._stat[filter]["dist_freq"][dirs][dist_bin_left] else: raise ValueError( "{} is not a valid key: {} section implies 2 identifiers".format( key, k ) ) else: raise ValueError("{} is not a valid key".format(k)) def __iter__(self): return iter(self._stat) def __len__(self): return len(self._stat) def find_dist_freq_convergence_distance(self, rel_threshold): """Finds the largest distance at which the frequency of pairs of reads with different strands deviates from their average by the specified relative threshold.""" out = {} all_strands = ["++", "--", "-+", "+-"] for filter in self.filters: out[filter] = {} dist_freqs_by_strands = { strands: np.array(list(self._stat[filter]["dist_freq"][strands].values())) for strands in all_strands} # Calculate the average frequency of pairs with different strands avg_freq_all_strands = np.mean(np.vstack(list(dist_freqs_by_strands.values())), axis=0) # Calculate the largest distance at which the frequency of pairs of at least one strand combination deviates from the average by the given threshold rel_deviations = {strands: np.nan_to_num( np.abs(dist_freqs_by_strands[strands] - avg_freq_all_strands) / avg_freq_all_strands) for strands in all_strands} idx_maxs = {strand:0 for strand in all_strands} for strands in all_strands: bin_exceeds = rel_deviations[strands] > rel_threshold if np.any(bin_exceeds): idx_maxs[strands] = np.max(np.nonzero(bin_exceeds)) # Find the largest distance and the strand combination where frequency of pairs deviates from the average by the given threshold: convergence_bin_idx = 0 convergence_strands = '??' convergence_dist = '0' for strands in all_strands: if (idx_maxs[strands] > convergence_bin_idx): convergence_bin_idx = idx_maxs[strands] convergence_strands = strands if idx_maxs[strands] < len(self._dist_bins): convergence_dist = self._dist_bins[convergence_bin_idx+1] else: convergence_dist = np.iinfo(np.int64) out[filter]["convergence_dist"] = convergence_dist out[filter]["strands_w_max_convergence_dist"] = convergence_strands out[filter]['convergence_rel_diff_threshold'] = rel_threshold out[filter]['n_cis_pairs_below_convergence_dist'] = { strands:dist_freqs_by_strands[strands][:convergence_bin_idx+1].sum() for strands in all_strands for strands in all_strands } out[filter]['n_cis_pairs_below_convergence_dist_all_strands'] = sum( list(out[filter]['n_cis_pairs_below_convergence_dist'].values())) n_cis_pairs_above_convergence_dist = { strands:dist_freqs_by_strands[strands][convergence_bin_idx+1:].sum() for strands in all_strands for strands in all_strands } out[filter]['n_cis_pairs_above_convergence_dist_all_strands'] = sum( list(n_cis_pairs_above_convergence_dist.values())) norms = dict( cis=self._stat[filter]['cis'], total_mapped=self._stat[filter]['total_mapped'] ) if 'total_nodups' in self._stat[filter]: norms['total_nodups'] = self._stat[filter]['total_nodups'] for key, norm_factor in norms.items(): out[filter][f'frac_{key}_in_cis_below_convergence_dist'] = { strands: n_cis_pairs / norm_factor for strands, n_cis_pairs in out[filter]['n_cis_pairs_below_convergence_dist'].items() } out[filter][f'frac_{key}_in_cis_below_convergence_dist_all_strands'] = sum( list(out[filter][f'frac_{key}_in_cis_below_convergence_dist'].values())) out[filter][f'frac_{key}_in_cis_above_convergence_dist_all_strands'] = ( sum(list(n_cis_pairs_above_convergence_dist.values())) / norm_factor ) return out def calculate_summaries(self): """calculate summary statistics (fraction of cis pairs at different cutoffs, complexity estimate) based on accumulated counts. Results are saved into self._stat["filter_name"]['summary"] """ convergence_stats = self.find_dist_freq_convergence_distance( self.DIST_FREQ_REL_DIFF_THRESHOLD) for filter_name in self.filters.keys(): for cis_count in ( "cis", "cis_1kb+", "cis_2kb+", "cis_4kb+", "cis_10kb+", "cis_20kb+", "cis_40kb+", ): self._stat[filter_name]["summary"][f"frac_{cis_count}"] = ( (self._stat[filter_name][cis_count] / self._stat[filter_name]["total_nodups"]) if self._stat[filter_name]["total_nodups"] > 0 else 0 ) self._stat[filter_name]["summary"]["dist_freq_convergence"] = convergence_stats[filter_name] self._stat[filter_name]["summary"]["frac_dups"] = ( (self._stat[filter_name]["total_dups"] / self._stat[filter_name]["total_mapped"]) if self._stat[filter_name]["total_mapped"] > 0 else 0 ) self._stat[filter_name]["summary"][ "complexity_naive" ] = estimate_library_complexity( self._stat[filter_name]["total_mapped"], self._stat[filter_name]["total_dups"], 0 ) if filter_name == "no_filter" and self._save_bytile_dups: # Estimate library complexity with information by tile, if provided: if self._bytile_dups.shape[0] > 0: self._stat[filter_name]["dups_by_tile_median"] = int( round( self._bytile_dups["dup_count"].median() * self._bytile_dups.shape[0] ) ) if "dups_by_tile_median" in self._stat[filter_name].keys(): self._stat[filter_name]["summary"][ "complexity_dups_by_tile_median" ] = estimate_library_complexity( self._stat[filter_name]["total_mapped"], self._stat[filter_name]["total_dups"], self._stat[filter_name]["total_dups"] - self._stat[filter_name]["dups_by_tile_median"], ) self._summaries_calculated = True @classmethod def from_file(cls, file_handle, n_dist_bins_decade=N_DIST_BINS_DECADE_DEFAULT): """create instance of PairCounter from file Parameters ---------- file_handle: file handle Returns ------- PairCounter new PairCounter filled with the contents of the input file """ # fill in from file - file_handle: default_filter = "no_filter" stat_from_file = cls(n_dist_bins_decade=n_dist_bins_decade) raw_stat = {} for l in file_handle: key_val_pair = l.strip().split(cls._SEP) if len(key_val_pair) == 0: # skip empty lines: continue if len(key_val_pair) != 2: # expect two _SEP separated values per line: raise fileio.ParseError( "{} is not a valid stats file".format(file_handle.name) ) raw_stat[key_val_pair[0]] = parse_number(key_val_pair[1]) ## TODO: check if raw_stat does not contain any unknown keys # Convert flat dict to nested dict stat_from_file._stat[default_filter].update(flat_dict_to_nested(raw_stat, sep=cls._KEY_SEP)) stat_from_file._stat[default_filter]['chrom_freq'] = nested_dict_to_flat( stat_from_file._stat[default_filter]['chrom_freq'], tuple_keys=True) bin_to_left_val = lambda bin: int(bin.rstrip('+') if ('+' in bin) else bin.split('-')[0]) stat_from_file._stat[default_filter]['dist_freq'] = { bin_to_left_val(k): v for k,v in stat_from_file._stat[default_filter]['dist_freq'].items() } stat_from_file._stat[default_filter]['dist_freq'] = swap_levels_nested_dict( stat_from_file._stat[default_filter]['dist_freq'], 0, 1 ) return stat_from_file @classmethod def from_yaml(cls, file_handle, n_dist_bins_decade=N_DIST_BINS_DECADE_DEFAULT): """create instance of PairCounter from file Parameters ---------- file_handle: file handle Returns ------- PairCounter new PairCounter filled with the contents of the input file """ # fill in from file - file_handle: stat = yaml.safe_load(file_handle) stat_from_file = cls( n_dist_bins_decade=n_dist_bins_decade, filters={key: val.get("filter_expression", "") for key, val in stat.items()} ) for key, filter in stat.items(): chromdict = {} for chroms in stat[key]["chrom_freq"].keys(): chromdict[tuple(chroms.split(cls._KEY_SEP))] = stat[key]["chrom_freq"][ chroms ] stat[key]["chrom_freq"] = chromdict stat_from_file._stat = stat return stat_from_file def add_pair( self, chrom1, pos1, strand1, chrom2, pos2, strand2, pair_type, unmapped_chrom="!", filter="no_filter", ): """Gather statistics for a Hi-C pair and add to the PairCounter. Parameters ---------- chrom1: str chromosome of the first read pos1: int position of the first read strand1: str strand of the first read chrom2: str chromosome of the first read pos2: int position of the first read strand2: str strand of the first read pair_type: str type of the mapped pair of reads unmapped_chrom: str what string denotes chromosomes in unmapped pairs (default: "!") filter: str name of the filter toward which the pair should count (default: "no_filter") """ self._stat[filter]["total"] += 1 # collect pair type stats including DD: self._stat[filter]["pair_types"][pair_type] = ( self._stat[filter]["pair_types"].get(pair_type, 0) + 1 ) if chrom1 == unmapped_chrom and chrom2 == unmapped_chrom: self._stat[filter]["total_unmapped"] += 1 elif chrom1 != unmapped_chrom and chrom2 != unmapped_chrom: self._stat[filter]["total_mapped"] += 1 # only mapped ones can be duplicates: if pair_type == "DD": self._stat[filter]["total_dups"] += 1 else: self._stat[filter]["total_nodups"] += 1 self._stat[filter]["chrom_freq"][(chrom1, chrom2)] = ( self._stat[filter]["chrom_freq"].get((chrom1, chrom2), 0) + 1 ) if chrom1 == chrom2: self._stat[filter]["cis"] += 1 dist = np.abs(pos2 - pos1) dist_bin = self._dist_bins[ np.searchsorted(self._dist_bins, dist, "right") - 1 ] self._stat[filter]["dist_freq"][strand1 + strand2][dist_bin] += 1 for dist_kb in [1, 2, 4, 10, 20, 40]: if dist >= dist_kb * 1000: self._stat[filter][f"cis_{dist_kb}kb+"] += 1 else: self._stat[filter]["trans"] += 1 else: self._stat[filter]["total_single_sided_mapped"] += 1 def add_pairs_from_dataframe(self, df, unmapped_chrom="!"): """Gather statistics for Hi-C pairs in a dataframe and add to the PairCounter. Parameters ---------- df: pd.DataFrame DataFrame with pairs. Needs to have columns: 'chrom1', 'pos1', 'chrom2', 'pos2', 'strand1', 'strand2', 'pair_type' """ for key in self.filters.keys(): if key == "no_filter": df_filtered = df.copy() else: condition = self.filters[key] filter_passed = evaluate_df( df, condition, type_cast=self.type_cast, startup_code=self.startup_code, engine=self.engine, ) df_filtered = df.loc[filter_passed, :].reset_index(drop=True) total_count = df_filtered.shape[0] self._stat[key]["total"] += total_count # collect pair type stats including DD: for pair_type, type_count in ( df_filtered["pair_type"].value_counts().items() ): self._stat[key]["pair_types"][pair_type] = ( self._stat[key]["pair_types"].get(pair_type, 0) + type_count ) # Count the unmapped by the "unmapped" chromosomes (debatable, as WW are also marked as ! and they might be mapped): unmapped_count = np.logical_and( df_filtered["chrom1"] == unmapped_chrom, df_filtered["chrom2"] == unmapped_chrom, ).sum() self._stat[key]["total_unmapped"] += int(unmapped_count) # Count the mapped: df_mapped = df_filtered.loc[ (df_filtered["chrom1"] != unmapped_chrom) & (df_filtered["chrom2"] != unmapped_chrom), :, ] mapped_count = df_mapped.shape[0] self._stat[key]["total_mapped"] += mapped_count self._stat[key]["total_single_sided_mapped"] += int( total_count - (mapped_count + unmapped_count) ) # Count the duplicates: if "duplicate" in df_mapped.columns: mask_dups = df_mapped["duplicate"] else: mask_dups = df_mapped["pair_type"] == "DD" df_dups = df_mapped[mask_dups] dups_count = df_dups.shape[0] self._stat[key]["total_dups"] += int(dups_count) self._stat[key]["total_nodups"] += int(mapped_count - dups_count) df_nodups = df_mapped.loc[~mask_dups, :] mask_cis = df_nodups["chrom1"] == df_nodups["chrom2"] df_cis = df_nodups.loc[mask_cis, :].copy() # Count pairs per chromosome: for (chrom1, chrom2), chrom_count in ( df_nodups[["chrom1", "chrom2"]].value_counts().items() ): self._stat[key]["chrom_freq"][(chrom1, chrom2)] = ( self._stat[key]["chrom_freq"].get((chrom1, chrom2), 0) + chrom_count ) # Count cis-trans by pairs: self._stat[key]["cis"] += df_cis.shape[0] self._stat[key]["trans"] += df_nodups.shape[0] - df_cis.shape[0] # Count cis distance frequencies: dist = np.abs(df_cis["pos2"].values - df_cis["pos1"].values) df_cis.loc[:, "bin_idx"] = ( np.searchsorted(self._dist_bins, dist, "right") - 1 ) for (strand1, strand2, bin_id), strand_bin_count in ( df_cis[["strand1", "strand2", "bin_idx"]].value_counts().items() ): self._stat[key]["dist_freq"][strand1 + strand2][ self._dist_bins[bin_id].item() ] += strand_bin_count self._stat[key]["cis_1kb+"] += int(np.sum(dist >= 1000)) self._stat[key]["cis_2kb+"] += int(np.sum(dist >= 2000)) self._stat[key]["cis_4kb+"] += int(np.sum(dist >= 4000)) self._stat[key]["cis_10kb+"] += int(np.sum(dist >= 10000)) self._stat[key]["cis_20kb+"] += int(np.sum(dist >= 20000)) self._stat[key]["cis_40kb+"] += int(np.sum(dist >= 40000)) ### Add by-tile dups if key == "no_filter" and self._save_bytile_dups and (df_dups.shape[0] > 0): bytile_dups = analyse_bytile_duplicate_stats(df_dups) self._bytile_dups = self._bytile_dups.add( bytile_dups, fill_value=0 ).astype(int) def add_chromsizes(self, chromsizes): """Add chromsizes field to the output stats Parameters ---------- chromsizes: Dataframe with chromsizes, read by headerops.chromsizes """ chromsizes = chromsizes.to_dict() for filter in self._stat.keys(): self._stat[filter]["chromsizes"] = chromsizes return def __add__(self, other, filter="no_filter"): # both PairCounter are implied to have a list of common fields: # # 'total', 'total_unmapped', 'total_single_sided_mapped', 'total_mapped', # 'cis', 'trans', 'pair_types', 'cis_1kb+', 'cis_2kb+', # 'cis_10kb+', 'cis_20kb+', 'chrom_freq', 'dist_freq', 'dedup' # # If 'chromsizes' are present, they must be identical # # initialize empty PairCounter for the result of summation: sum_stat = PairCounter() # use the empty PairCounter to iterate over: for k, v in sum_stat._stat[filter].items(): if k != "chromsizes" and ( (k not in self._stat[filter]) or (k not in other._stat[filter]) ): # Skip any missing fields and warn logger.warning( f"{k} not found in at least one of the input stats, skipping" ) continue # not nested fields are summed trivially: if isinstance(v, int): sum_stat._stat[filter][k] = ( self._stat[filter][k] + other._stat[filter][k] ) # sum nested dicts/arrays in a context dependet manner: else: if k in ["pair_types", "dedup"]: # handy function for summation of a pair of dicts: # https://stackoverflow.com/questions/10461531/merge-and-sum-of-two-dictionaries sum_dicts = lambda dict_x, dict_y: { key: dict_x.get(key, 0) + dict_y.get(key, 0) for key in set(dict_x) | set(dict_y) } # sum a pair of corresponding dicts: sum_stat._stat[filter][k] = sum_dicts( self._stat[filter][k], other._stat[filter][k] ) elif k == "chrom_freq": # union list of keys (chr1,chr2) with potential duplicates: union_keys_with_dups = list(self._stat[filter][k].keys()) + list( other._stat[filter][k].keys() ) # dict.fromkeys will take care of keys' order and duplicates in a consistent manner: # https://stackoverflow.com/questions/1720421/how-to-concatenate-two-lists-in-python # last comment to the 3rd Answer sum_stat._stat[filter][k] = dict.fromkeys(union_keys_with_dups) # perform a summation: for union_key in sum_stat._stat[filter][k]: sum_stat._stat[filter][k][union_key] = self._stat[filter][ k ].get(union_key, 0) + other._stat[filter][k].get(union_key, 0) elif k == "dist_freq": for dirs in sum_stat[k]: from functools import reduce def reducer(accumulator, element): for key, value in element.items(): accumulator[key] = accumulator.get(key, 0) + value return accumulator sum_stat[k][dirs] = reduce( reducer, [self._stat[filter][k][dirs], other._stat[filter][k][dirs]], {}, ) # sum_stat[k][dirs] = self._stat[filter][k][dirs] + other._stat[filter][k][dirs] elif k == "chromsizes": if k in self._stat[filter] and k in other._stat[filter]: if self._stat[filter][k] == other._stat[filter][k]: sum_stat._stat[filter][k] = self._stat[filter][k] elif ( len(self._stat[filter][k]) == 0 or len(other._stat[filter][k]) == 0 ): logger.warning( "One of the stats has no chromsizes recorded," "writing the one that is present to the output" ) if len(self._stat[filter][k]) > 0: sum_stat._stat[filter][k] = self._stat[filter][k] else: sum_stat._stat[filter][k] = other._stat[filter][k] else: raise ValueError( "Can't merge stats with different chromsizes" ) else: logger.warning( "One or both stats don't have chromsizes recorded" ) sum_stat.calculate_summaries() return sum_stat # we need this to be able to sum(list_of_PairCounters) def __radd__(self, other): if other == 0: return self else: return self.__add__(other) def flatten(self, filter="no_filter"): """return a flattened dict (formatted same way as .stats file) Performed for a single filter.""" # dict for flat store: flat_stat = {} # Storing statistics for k, v in self._stat[filter].items(): if isinstance(v, int): flat_stat[k] = v # store nested dicts/arrays in a context dependent manner: # nested categories are stored only if they are non-trivial else: if (k == "dist_freq") and v: for i in range(len(self._dist_bins)): for dirs, freqs in v.items(): dist = self._dist_bins[i] # last bin is treated differently: "100000+" vs "1200-3000": if i < len(self._dist_bins) - 1: dist_next = self._dist_bins[i + 1] formatted_key = self._KEY_SEP.join( ["{}", "{}-{}", "{}"] ).format(k, dist, dist_next, dirs) elif i == len(self._dist_bins) - 1: formatted_key = self._KEY_SEP.join( ["{}", "{}+", "{}"] ).format(k, dist, dirs) else: raise ValueError("There is a mismatch between dist_freq bins in the instance") # store key,value pair: try: flat_stat[formatted_key] = freqs[dist] except: # in some previous versions of stats, last bin was not reported, so we need to skip it now: if (dist not in freqs) and (i == len(self._dist_bins) - 1): flat_stat[formatted_key] = 0 else: raise ValueError(f"Error in {k} {dirs} {dist} {dist_next} {freqs}: source and destination bins do not match") elif (k in ["pair_types", "dedup", "chromsizes", 'summary']) and v: # 'pair_types' and 'dedup' are simple dicts inside, # treat them the exact same way: flat_stat.update( {k+self._KEY_SEP+k2 : v2 for k2,v2 in nested_dict_to_flat(v, sep=self._KEY_SEP).items()}) elif (k == "chrom_freq") and v: for (chrom1, chrom2), freq in v.items(): formatted_key = self._KEY_SEP.join(["{}", "{}", "{}"]).format( k, chrom1, chrom2 ) # store key,value pair: flat_stat[formatted_key] = freq # return flattened dict return flat_stat def format_yaml(self, filter="no_filter"): """return a formatted dict (for the yaml output) Performed for all filters at once.""" from copy import deepcopy formatted_stat = {filter_name: {} for filter_name in self.filters.keys()} # Storing statistics for each filter for filter_name in self.filters.keys(): for k, v in self._stat[filter_name].items(): if (k == "chrom_freq"): v = {self._KEY_SEP.join(k2):v2 for k2, v2 in v.items()} if v: formatted_stat[filter_name][k] = deepcopy(v) # return formatted dict formatted_stat = nested_dict_to_flat(formatted_stat, tuple_keys=True) for k in formatted_stat: v = formatted_stat[k] if isinstance(v, np.generic): formatted_stat[k] = v.item() formatted_stat = flat_dict_to_nested(formatted_stat) return formatted_stat def save(self, outstream, yaml=False, filter="no_filter"): """save PairCounter to tab-delimited text file. Flattened version of PairCounter is stored in the file. Parameters ---------- outstream: file handle yaml: is output in yaml format or table filter: filter to output in tsv mode Note ---- The order of the keys is not guaranteed Merging several .stats is not associative with respect to key order: merge(A,merge(B,C)) != merge(merge(A,B),C). Theys shou5ld match exactly, however, when soprted: sort(merge(A,merge(B,C))) == sort(merge(merge(A,B),C)) """ if not self._summaries_calculated: self.calculate_summaries() # write flattened version of the PairCounter to outstream, # will output all the filters if yaml: import yaml data = self.format_yaml() yaml.dump(data, outstream, default_flow_style=False, sort_keys=False) else: # will output a single filter data = self.flatten(filter=filter) for k, v in data.items(): outstream.write("{}{}{}\n".format(k, self._SEP, v)) def save_bytile_dups(self, outstream): """save bytile duplication counts to a tab-delimited text file. Parameters ---------- outstream: file handle """ if self._save_bytile_dups: self._bytile_dups.reset_index().to_csv(outstream, sep="\t", index=False) else: logger.error("Bytile dups are not calculated, cannot save.") def __repr__(self): return str(self._stat) ################## # Other functions: def do_merge(output, files_to_merge, **kwargs): # Parse all stats files. stats = [] for stat_file in files_to_merge: f = fileio.auto_open( stat_file, mode="r", nproc=kwargs.get("nproc_in"), command=kwargs.get("cmd_in", None), ) # use a factory method to instanciate PairCounter if kwargs.get("yaml", False): stat = PairCounter.from_yaml(f, n_dist_bins_decade=kwargs.get('n_dist_bins_decade', PairCounter.N_DIST_BINS_DECADE_DEFAULT)) else: stat = PairCounter.from_file(f, n_dist_bins_decade=kwargs.get('n_dist_bins_decade', PairCounter.N_DIST_BINS_DECADE_DEFAULT)) stats.append(stat) f.close() # combine stats from several files (files_to_merge): out_stat = sum(stats) # Save merged stats. outstream = fileio.auto_open( output, mode="w", nproc=kwargs.get("nproc_out"), command=kwargs.get("cmd_out", None), ) # save statistics to file ... out_stat.save(outstream) if outstream != sys.stdout: outstream.close() def estimate_library_complexity(nseq, ndup, nopticaldup=0): """Estimate library complexity accounting for optical/clustering duplicates Parameters ---------- nseq : int Total number of sequences ndup : int Total number of duplicates nopticaldup : int, optional Number of non-PCR duplicates, by default 0 Returns ------- float Estimated complexity """ nseq = nseq - nopticaldup if nseq == 0: logger.warning("Empty of fully duplicated library, can't estimate complexity") return 0 ndup = ndup - nopticaldup u = (nseq - ndup) / nseq if u == 0: logger.warning( "All the sequences are duplicates. Do you run complexity estimation on duplicates file?" ) return 0 seq_to_complexity = special.lambertw(-np.exp(-1 / u) / u).real + 1 / u complexity = float(nseq / seq_to_complexity) # clean np.int64 data type return complexity def analyse_bytile_duplicate_stats(df_dups, tile_dup_regex=False): """Count by-tile duplicates Parameters ---------- dups : pd.DataFrame Dataframe with duplicates that contains pared read IDs tile_dup_regex : bool, optional See extract_tile_info for details, by default False Returns ------- pd.DataFrame Grouped multi-indexed dataframe of pairwise by-tile duplication counts """ df_dups = df_dups.copy() df_dups["tile"] = extract_tile_info(df_dups["readID"], regex=tile_dup_regex) df_dups["parent_tile"] = extract_tile_info( df_dups["parent_readID"], regex=tile_dup_regex ) df_dups["same_tile"] = df_dups["tile"] == df_dups["parent_tile"] bytile_dups = ( df_dups.groupby(["tile", "parent_tile"]) .size() .reset_index(name="dup_count") .sort_values(["tile", "parent_tile"]) ) bytile_dups[["tile", "parent_tile"]] = np.sort( bytile_dups[["tile", "parent_tile"]].values, axis=1 ) bytile_dups = bytile_dups.groupby(["tile", "parent_tile"]).sum() return bytile_dups def extract_tile_info(series, regex=False): """Extract the name of the tile for each read name in the series Parameters ---------- series : pd.Series Series containing read IDs regex : bool, optional Regex to extract fields from the read IDs that correspond to tile IDs. By default False, uses a faster predefined approach for typical Illumina read names Example: r"(?:\w+):(?:\w+):(\w+):(\w+):(\w+):(?:\w+):(?:\w+)" Returns ------- Series Series containing tile IDs as strings """ if regex: split = series.str.extractall(regex).unstack().droplevel(1, axis=1) if split.shape[1] < 4: raise ValueError( f"Unable to convert tile names, does your readID have the tile information?\nHint: SRA removes tile information from readID.\nSample of your readIDs:\n{series.head()}" ) return split[0] + ":" + split[1] + ":" + split[2] else: try: split = [":".join(name.split(":")[2:5]) for name in series] except: raise ValueError( f"Unable to convert tile names, does your readID have the tile information?\nHint: SRA removes tile information from readID.\nSample of your readIDs:\n{series.head()}" ) return split def yaml2pandas(yaml_path): """Generate a pandas DataFrame with stats from a yaml file Formats the keys within each filter using the PairCounter.flatten() method, to achieve same naming as in non-yaml stats files. Parameters ---------- yaml_path : str Path to a yaml-formatted file with stats Returns ------- pd.DataFrame Dataframe with filter names in the index and stats in columns """ counter = PairCounter.from_yaml(open(yaml_path, "r")) stats = pd.concat( [ pd.DataFrame(counter.flatten(filter=filter), index=[filter]) for filter in counter.filters ] ) return stats pairtools-1.1.3/pyproject.toml000066400000000000000000000032211474715105500164530ustar00rootroot00000000000000[project] name = "pairtools" dynamic = ['version',] dependencies = [ 'cython', 'numpy>=1.10', 'click>=6.6', 'scipy>=1.7.0', 'pandas>=1.3.4', 'pysam>=0.15.0', 'pyyaml', 'bioframe>=0.3.3', ] requires-python = ">=3.9" description = "CLI tools to process mapped Hi-C data" authors = [ {name = "Open2C", email = "open.chromosome.collective@gmail.com"}, ] license = {text = "MIT License"} keywords = ["genomics", "bioinformatics", "Hi-C", "contact", "chromosome"] readme = "README.md" classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Science/Research", "Topic :: Scientific/Engineering :: Bio-Informatics", "Operating System :: OS Independent", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", ] [project.optional-dependencies] test = [ 'pytest', 'pytest-flake8', 'pytest-cov', ] doc = [ 'sphinx-click', 'ipython', 'nbsphinx', 'Sphinx>=7.0', 'sphinx_rtd_theme', 'docutils>0.16', ] [project.urls] Homepage = "https://github.com/open2c/pairtools" Documentation = "https://pairtools.readthedocs.io/en/latest/" Repository = "https://github.com/open2c/pairtools.git" Issues = "https://github.com/open2c/pairtools/issues" Changelog = "https://github.com/open2c/pairtools/blob/master/CHANGES.md" [project.scripts] pairtools = "pairtools.cli:cli" [build-system] requires = [ "setuptools", "cython", "numpy", "pysam"] build-backend = "setuptools.build_meta" pairtools-1.1.3/pytest.ini000066400000000000000000000003331474715105500155710ustar00rootroot00000000000000[pytest] addopts = --cov pairtools --cov-config .coveragerc --cov-report term-missing --cov-report html --cov-report xml filterwarnings = ignore::PendingDeprecationWarning testpaths = tests pairtools-1.1.3/readthedocs.yml000066400000000000000000000017311474715105500165530ustar00rootroot00000000000000 # .readthedocs.yml # For some reason, readthedocs' platform does not import the installed package (from .../envs/), # but instead reads another copy from .../checkouts/. This other copy does not have compiled # cython objects and throws and error. # To overcome this issue, we had to use a custom job to install pairtools in the editable mode # and thus ensure that the cython code is compiled. # Another potentially useful trick in the future: setting environmental variables # (e.g. PIP_VERBOSE and PIP_NO_BUILD_ISOLATION=false) can control pip's behaviour in # the standard install job. version: 2 build: os: ubuntu-22.04 tools: python: "3.10" jobs: post_create_environment: - pip install numpy cython pysam - pip install --no-build-isolation -e .[doc] - python -c "import pairtools.lib.dedup_cython" # python: # install: # - method: pip # path: . # extra_requirements: # - doc sphinx: configuration: doc/conf.py pairtools-1.1.3/setup.py000066400000000000000000000055351474715105500152630ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- import io import os import re import glob from setuptools import find_packages, setup from setuptools.extension import Extension try: from Cython.Distutils import build_ext as _build_ext from Cython.Build import cythonize except ImportError: raise ImportError('Cython is now required to build the extension modules.') def _read(*parts, **kwargs): filepath = os.path.join(os.path.dirname(__file__), *parts) encoding = kwargs.pop("encoding", "utf-8") with io.open(filepath, encoding=encoding) as fh: text = fh.read() return text def get_version(): version = re.search( r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', _read("pairtools", "__init__.py"), re.MULTILINE, ).group(1) return version def get_ext_modules(): ext = ".pyx" src_files = glob.glob( #os.path.join(os.path.dirname(__file__), "pairtools", "lib", "*" + ext) os.path.join("pairtools", "lib", "*" + ext) ) ext_modules = [] for src_file in src_files: name = "pairtools.lib." + os.path.splitext(os.path.basename(src_file))[0] if 'pysam' in name: import pysam ext_modules.append( Extension( name, [src_file], extra_link_args=pysam.get_libraries(), include_dirs=pysam.get_include(), define_macros=pysam.get_defines(), ) ) elif "regions" in name: ext_modules.append( Extension( name, [src_file], language="c++", ) ) else: ext_modules.append(Extension(name, [src_file])) ext_modules = cythonize(ext_modules) # , annotate=True return ext_modules class build_ext(_build_ext): # Extension module build configuration def finalize_options(self): _build_ext.finalize_options(self) # Fix to work with bootstrapped numpy installation # http://stackoverflow.com/a/21621689/579416 # Prevent numpy from thinking it is still in its setup process: #__builtins__.__NUMPY_SETUP__ = False import numpy self.include_dirs.append(numpy.get_include()) def run(self): # Import numpy here, only when headers are needed import numpy # Add numpy headers to include_dirs self.include_dirs.append(numpy.get_include()) # Call original build_ext command _build_ext.run(self) setup( version=get_version(), ext_modules=get_ext_modules(), cmdclass={"build_ext": build_ext}, zip_safe=False, # entry_points={ # "console_scripts": [ # "pairtools = pairtools.cli:cli", # ] # }, packages=find_packages(), ) pairtools-1.1.3/tests/000077500000000000000000000000001474715105500147035ustar00rootroot00000000000000pairtools-1.1.3/tests/data/000077500000000000000000000000001474715105500156145ustar00rootroot00000000000000pairtools-1.1.3/tests/data/mock.2.pairsam000066400000000000000000000021301474715105500202570ustar00rootroot00000000000000## pairs format v1.0.0 #shape: upper triangle #genome_assembly: unknown #samheader: @SQ SN:chr1 LN:100 #samheader: @SQ SN:chr2 LN:100 #samheader: @SQ SN:chr3 LN:100 #samheader: @PG ID:bwa PN:bwa VN:0.7.15-r1140 CL:bwa mem -SP /path/ucsc.hg19.fasta.gz /path/1.fastq.gz /path/2.fastq.gz #chromosomes: chr2 chr3 chr1 #columns: readID chrom1 pos1 chrom2 pos2 strand1 strand2 pair_type sam1 sam2 readid01 chr1 1 chr2 25 + + UU readid01129chr1160101Mchr2250CGFFXS:i:0Yt:Z:UU readid0165chr22560101Mchr110ATIIXS:i:0Yt:Z:UU readid02 chr1 1 chr1 40 + + UU readid02129chr1160101Mchr1400CGFFXS:i:0Yt:Z:UU readid0265chr14060101Mchr110ATIIXS:i:0Yt:Z:UU readid03 chr1 1 chr1 3 + + UR readid03129chr1160101Mchr130CGFFXS:i:0Yt:Z:UR readid0365chr1360101Mchr110ATIIXS:i:0Yt:Z:UR readid04 ! 0 chr1 3 - + NU readid04129chr1160101Mchr130CGFFXS:i:0Yt:Z:NU readid0465chr1360101Mchr110ATIIXS:i:0Yt:Z:NU readid05 ! 0 ! 0 - - NN readid05129chr1160101Mchr130CGFFXS:i:0Yt:Z:NN readid0565chr1360101Mchr110ATIIXS:i:0Yt:Z:NNpairtools-1.1.3/tests/data/mock.4dedup.pairsam000066400000000000000000000010731474715105500213100ustar00rootroot00000000000000## pairs format v1.0.0 #sorted: chr1-chr2-pos1-pos2 #shape: upper triangle #genome_assembly: unknown #chromosomes: chr1 chr2 #columns: readID chrom1 pos1 chrom2 pos2 strand1 strand2 pair_type sam1 sam2 readid1 ! 0 chr1 25 - + NU . . readid2 ! 0 chr1 25 - + NU . . readid3 chr1 1 chr1 20 + + UU . . readid4 chr1 1 chr1 20 + + UU . . readid5 chr1 1 chr1 25 + + UU . . readid6 chr1 1 chr1 27 + + UU . . readid7 chr1 1 chr1 28 + - UU . . readid8 chr1 1 chr1 28 + + UU . . readid9 chr1 1 chr1 50 + + UU . . readid10 chr1 2 chr1 21 + + UU . . readid11 chr1 1 chr2 25 + + UU . .pairtools-1.1.3/tests/data/mock.4dedup_diffcolnames.pairsam000066400000000000000000000010551474715105500240220ustar00rootroot00000000000000## pairs format v1.0.0 #sorted: chr1-chr2-pos1-pos2 #shape: upper triangle #genome_assembly: unknown #chromosomes: chr1 chr2 #columns: readID chr1 p1 chr2 p2 str1 str2 pair_type sam1 sam2 readid1 ! 0 chr1 25 - + NU . . readid2 ! 0 chr1 25 - + NU . . readid3 chr1 1 chr1 20 + + UU . . readid4 chr1 1 chr1 20 + + UU . . readid5 chr1 1 chr1 25 + + UU . . readid6 chr1 1 chr1 27 + + UU . . readid7 chr1 1 chr1 28 + - UU . . readid8 chr1 1 chr1 28 + + UU . . readid9 chr1 1 chr1 50 + + UU . . readid10 chr1 2 chr1 21 + + UU . . readid11 chr1 1 chr2 25 + + UU . .pairtools-1.1.3/tests/data/mock.4filterbycov.pairs000066400000000000000000000013151474715105500222200ustar00rootroot00000000000000## pairs format v1.0.0 #shape: upper triangle #genome_assembly: unknown #samheader: @SQ SN:chr1 LN:100 #samheader: @SQ SN:chr2 LN:100 #samheader: @SQ SN:chr3 LN:100 #samheader: @PG ID:bwa PN:bwa VN:0.7.15-r1140 CL:bwa mem -SP /path/ucsc.hg19.fasta.gz /path/1.fastq.gz /path/2.fastq.gz #chromosomes: chr2 chr3 chr1 #chromsize: chr2 100 #chromsize: chr3 100 #chromsize: chr1 100 #columns: readID chrom1 pos1 chrom2 pos2 strand1 strand2 pair_type sam1 sam2 readid01 chr2 40 chr3 2 + + UU readid02 chr1 6 chr1 9 + + UR readid03 chr1 1 chr2 20 + + UU readid04 chr1 50 chr1 1 + + UU readid05 chr1 1 chr1 5 + + UU readid06 chr1 20 chr1 30 + + UR readid07 ! 0 chr1 3 - + NU readid08 ! 0 chr1 3 - + MU readid09 ! 0 ! 0 - - WW pairtools-1.1.3/tests/data/mock.4flip.pairs000066400000000000000000000016131474715105500206230ustar00rootroot00000000000000## pairs format v1.0.0 #shape: upper triangle #genome_assembly: unknown #samheader: @SQ SN:chr1 LN:10000 #samheader: @SQ SN:chr2 LN:10000 #samheader: @PG ID:bwa PN:bwa VN:0.7.15-r1140 CL:bwa mem -SP /path/ucsc.hg19.fasta.gz /path/1.fastq.gz /path/2.fastq.gz #chromosomes: chr1 chr2 #chromsize: chr1 10000 #chromsize: chr2 10000 #columns: readID chrom1 pos1 chrom2 pos2 strand1 strand2 pair_type sam1 sam2 readid01 chr1 1 chr1 2 + + UU readid02 chr1 1 chr2 2 + + UU readid03 chr1 2 chr1 1 + + UU readid04 chr1 21 chr1 2 + + UU readid05 chr2 2 chr1 1 + + UU readid06 chr2 1 chr1 2 + + UU readid07 chr1 2 chr1 1 - + UU readid08 chr1 2 chr1 1 + + RU readid09 ! 0 chr1 3 - + NU readid10 ! 0 chr1 3 - + MU readid11 ! 0 ! 0 + - WW readid12 chr1 1 chrU 1 + + UU readid13 chrU 1 chr1 1 + + UU readid14 chrU 100 chrU 1 + + UU readid15 chrU1 100 chrU 100 + + UU readid16 ! 0 chrU 100 + + NU readid17 chrU 0 ! 0 + + UN pairtools-1.1.3/tests/data/mock.4stats.pairs000066400000000000000000000013011474715105500210210ustar00rootroot00000000000000## pairs format v1.0.0 #shape: upper triangle #genome_assembly: unknown #samheader: @SQ SN:chr1 LN:100 #samheader: @SQ SN:chr2 LN:100 #samheader: @SQ SN:chr3 LN:100 #samheader: @PG ID:bwa PN:bwa VN:0.7.15-r1140 CL:bwa mem -SP /path/ucsc.hg19.fasta.gz /path/1.fastq.gz /path/2.fastq.gz #chromosomes: chr2 chr3 chr1 #chromsize: chr2 100 #chromsize: chr3 100 #chromsize: chr1 100 #columns: readID chrom1 pos1 chrom2 pos2 strand1 strand2 pair_type readid01 chr1 1 chr1 50 + + UU readid02 chr1 1 chr1 50 + + DD readid03 chr1 1 chr1 2 + + UU readid04 chr1 1 chr1 3 + + UR readid05 chr1 1 chr2 20 + + UU readid06 chr2 1 chr3 2 + + UU readid07 ! 0 chr1 3 - + NU readid08 ! 0 chr1 3 - + MU readid09 ! 0 ! 0 - - WW pairtools-1.1.3/tests/data/mock.chrom.sizes000066400000000000000000000000261474715105500207310ustar00rootroot00000000000000chr1 10000 chr2 10000 pairtools-1.1.3/tests/data/mock.pairsam000066400000000000000000000035741474715105500201340ustar00rootroot00000000000000## pairs format v1.0.0 #shape: upper triangle #genome_assembly: unknown #samheader: @SQ SN:chr1 LN:100 #samheader: @SQ SN:chr2 LN:100 #samheader: @SQ SN:chr3 LN:100 #samheader: @PG ID:bwa PN:bwa VN:0.7.15-r1140 CL:bwa mem -SP /path/ucsc.hg19.fasta.gz /path/1.fastq.gz /path/2.fastq.gz #chromosomes: chr2 chr3 chr1 #chromsize: chr2 100 #chromsize: chr3 100 #chromsize: chr1 100 #columns: readID chrom1 pos1 chrom2 pos2 strand1 strand2 pair_type sam1 sam2 readid01 chr1 1 chr2 20 + + UU readid01129chr1160101Mchr2200CGFFXS:i:0Yt:Z:UU readid0165chr22060101Mchr110ATIIXS:i:0Yt:Z:UU readid02 chr1 1 chr1 50 + + UU readid02129chr1160101Mchr1500CGFFXS:i:0Yt:Z:UU readid0265chr15060101Mchr110ATIIXS:i:0Yt:Z:UU readid03 chr1 1 chr1 2 + + UU readid03129chr1160101Mchr120CGFFXS:i:0Yt:Z:UU readid0365chr1260101Mchr110ATIIXS:i:0Yt:Z:UU readid04 chr1 1 chr1 3 + + UR readid04129chr1160101Mchr130CGFFXS:i:0Yt:Z:UR readid0465chr1360101Mchr110ATIIXS:i:0Yt:Z:UR readid05 chr2 1 chr3 2 + + UU readid05129chr2160101Mchr320CGFFXS:i:0Yt:Z:UU readid0565chr3260101Mchr210ATIIXS:i:0Yt:Z:UU readid06 ! 0 chr1 3 - + NU readid06129chr1160101Mchr130CGFFXS:i:0Yt:Z:NU readid0665chr1360101Mchr110ATIIXS:i:0Yt:Z:NU readid07 ! 0 chr1 3 - + MU readid07129chr1160101Mchr130CGFFXS:i:0Yt:Z:NU readid0765chr1360101Mchr110ATIIXS:i:0Yt:Z:NU readid08 ! 0 ! 0 - - WW readid08129chr1160101Mchr130CGFFXS:i:0Yt:Z:WW readid0865chr1360101Mchr110ATIIXS:i:0Yt:Z:WW readid09 chr1 120 chr1 121 + + UU readid09129chr112060101Mchr11210CGFFXS:i:0Yt:Z:UU readid0965chr112160101Mchr11200ATIIXS:i:0Yt:Z:UU readid10 chr1 13 chr1 14 + + UU readid10129chr11360101Mchr1140CGFFXS:i:0Yt:Z:UU readid1065chr11460101Mchr1130ATIIXS:i:0Yt:Z:UU pairtools-1.1.3/tests/data/mock.parse-all.sam000066400000000000000000000265061474715105500211370ustar00rootroot00000000000000@SQ SN:chr1 LN:10000 @SQ SN:chr2 LN:10000 @PG ID:mock PN:mock VN:0.0.0 CL:mock readid01 65 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UU,1,R1-2 readid01 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UU,1,R1-2 readid02 97 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,249,+,-,UU,1,R1-2 readid02 145 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,249,+,-,UU,1,R1-2 readid03 65 chr1 10 60 1S49M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UU,1,R1-2 readid03 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UU,1,R1-2 readid04 81 chr1 10 60 49M1S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,58,chr1,200,-,+,UU,1,R1-2 readid04 161 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,58,chr1,200,-,+,UU,1,R1-2 readid05 97 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,248,+,-,UU,1,R1-2 readid05 145 chr1 200 60 1S49M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,248,+,-,UU,1,R1-2 readid06 97 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,248,+,-,UU,1,R1-2 readid06 145 chr1 200 60 49M1S chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,248,+,-,UU,1,R1-2 readid07 97 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,247,+,-,UU,1,R1-2 readid07 145 chr1 200 60 1S48M1S chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,247,+,-,UU,1,R1-2 readid08 105 chr1 10 60 50M = 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,10,-,+,NU,1,R1-2 readid08 149 * 0 0 * chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,10,-,+,NU,1,R1-2 readid09 85 * 0 0 * chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,10,-,+,NU,1,R1-2 readid09 169 chr1 10 60 50M = 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,10,-,+,NU,1,R1-2 readid10 77 * 0 0 * * 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,NN,1,R1-2 readid10 141 * 0 0 * * 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,NN,1,R1-2 readid11 105 chr1 10 0 50M = 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,NM,1,R1-2 readid11 149 * 0 0 * chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,NM,1,R1-2 readid12 85 * 0 0 * chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,NM,1,R1-2 readid12 169 chr1 10 0 50M = 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,NM,1,R1-2 readid13 65 chr1 10 0 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,200,-,+,MU,1,R1-2 readid13 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,200,-,+,MU,1,R1-2 readid14 65 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,10,-,+,MU,1,R1-2 readid14 129 chr1 200 0 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,10,-,+,MU,1,R1-2 readid15 65 chr1 10 0 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,MM,1,R1-2 readid15 129 chr1 200 0 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,MM,1,R1-2 readid16 65 chr1 10 60 25M25S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,300,-,25M25H,60,0; CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UU,1,R1 readid16 2129 chr1 300 60 25M25H chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25S,60,0; CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UU,1,R1 readid16 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UU,1,R1 readid17 65 chr1 10 60 25M25S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,5300,-,25M25H,60,0; CT:Z:SIMULATED:chr1,10,chr1,5300,+,+,UU,1,R1|chr1,200,chr1,5324,+,-,UU,2,R1-2 readid17 2129 chr1 5300 60 25M25H chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25S,60,0; CT:Z:SIMULATED:chr1,10,chr1,5300,+,+,UU,1,R1|chr1,200,chr1,5324,+,-,UU,2,R1-2 readid17 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,5300,+,+,UU,1,R1|chr1,200,chr1,5324,+,-,UU,2,R1-2 readid18 65 chr1 10 60 25M25S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,300,+,25M25H,60,0; CT:Z:SIMULATED:chr1,10,chr1,324,+,-,UU,1,R1|chr1,200,chr1,300,+,+,UU,2,R1-2 readid18 2113 chr1 300 60 25M25H chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25S,60,0; CT:Z:SIMULATED:chr1,10,chr1,324,+,-,UU,1,R1|chr1,200,chr1,300,+,+,UU,2,R1-2 readid18 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,300,+,+,UU,1,R1|chr1,200,chr1,300,+,+,UU,2,R1-2 readid19 81 chr1 300 60 25M25S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25H,60,0; CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UU,1,R1 readid19 2113 chr1 10 60 25M25H chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr10,300,-,25M25S,60,0; CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UU,1,R1 readid19 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UU,1,R1 readid20 65 chr1 10 60 25M25S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,300,+,25M25H,60,0; CT:Z:SIMULATED:chr1,10,chr1,324,+,-,UU,1,R1|chr1,300,chr1,2000,+,+,UU,2,R1-2|chr1,200,chr1,2024,+,-,UU,3,R2 readid20 2113 chr1 300 60 25M25H chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25S,60,0; CT:Z:SIMULATED:chr1,10,chr1,324,+,-,UU,1,R1|chr1,300,chr1,2000,+,+,UU,2,R1-2|chr1,200,chr1,2024,+,-,UU,3,R2 readid20 129 chr1 200 60 25M25S chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,2000,+,25S25M,60,0; CT:Z:SIMULATED:chr1,10,chr1,324,+,-,UU,1,R1|chr1,300,chr1,2000,+,+,UU,2,R1-2|chr1,200,chr1,2024,+,-,UU,3,R2 readid20 2177 chr1 2000 60 25S25M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,2000,+,25S25M,60,0; CT:Z:SIMULATED:chr1,10,chr1,324,+,-,UU,1,R1|chr1,300,chr1,2000,+,+,UU,2,R1-2|chr1,200,chr1,2024,+,-,UU,3,R2 readid21 105 chr1 10 60 25M25S * 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,5300,-,25M25H,60,0; CT:Z:SIMULATED:chr1,10,chr1,5300,+,+,UU,1,R1|!,0,chr1,5324,-,-,NU,2,R1-2 readid21 2169 chr1 5300 60 25M25H * 0 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25S,60,0; CT:Z:SIMULATED:chr1,10,chr1,5300,+,+,UU,1,R1|!,0,chr1,5324,-,-,NU,2,R1-2 readid21 141 * 0 0 * chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,5300,+,+,UU,1,R1|!,0,chr1,5324,-,-,NU,2,R1-2 readid22 65 chr1 10 60 25M25S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,5300,-,25M25H,60,0; CT:Z:SIMULATED:chr1,10,chr1,5300,+,+,UU,1,R1|!,0,chr1,5324,-,-,MU,2,R1-2 readid22 2129 chr1 5300 60 25M25H chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25S,60,0; CT:Z:SIMULATED:chr1,10,chr1,5300,+,+,UU,1,R1|!,0,chr1,5324,-,-,MU,2,R1-2 readid22 129 chr1 200 0 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,5300,+,+,UU,1,R1|!,0,chr1,5324,-,-,MU,2,R1-2 readid23 129 chr1 200 0 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,XX,1,R1-2 readid24 65 chr1 10 60 25M25S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,5300,-,25M25H,60,0; CT:Z:SIMULATED:chr1,10,chr1,5300,+,+,UU,1,R1|!,0,chr1,5324,-,-,NU,2,R1-2 readid24 2129 chr1 5300 60 25M25H chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,5300,+,+,UU,1,R1|!,0,chr1,5324,-,-,NU,2,R1-2 pairtools-1.1.3/tests/data/mock.parse2-single-end.expand.sam000066400000000000000000000037551474715105500237550ustar00rootroot00000000000000@SQ SN:chr1 LN:10000 @SQ SN:chr2 LN:10000 @PG ID:mock PN:mock VN:0.0.0 CL:mock readid01 0 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,249,+,-,UU,1,R1 readid01 0 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,249,+,-,UU,1,R1 readid02 0 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,249,+,-,UU,1,R1|chr1,10,chr1,500,+,+,UU,1,E1_R1|chr1,200,chr1,500,+,+,UU,2,R1 readid02 0 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,249,+,-,UU,1,R1|chr1,10,chr1,500,+,+,UU,1,E1_R1|chr1,200,chr1,500,+,+,UU,2,R1 readid02 16 chr1 500 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,249,+,-,UU,1,R1|chr1,10,chr1,500,+,+,UU,1,E1_R1|chr1,200,chr1,500,+,+,UU,2,R1 readid03 0 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UU,1,R1|chr1,10,chr1,500,+,+,UU,1,E1_R1|chr1,249,chr1,500,-,+,UU,2,R1 readid03 16 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UU,1,R1|chr1,10,chr1,500,+,+,UU,1,E1_R1|chr1,249,chr1,500,-,+,UU,2,R1 readid03 16 chr1 500 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UU,1,R1|chr1,10,chr1,500,+,+,UU,1,E1_R1|chr1,249,chr1,500,-,+,UU,2,R1pairtools-1.1.3/tests/data/mock.parse2-single-end.sam000066400000000000000000000022031474715105500224620ustar00rootroot00000000000000@SQ SN:chr1 LN:10000 @SQ SN:chr2 LN:10000 @PG ID:mock PN:mock VN:0.0.0 CL:mock readid01 0 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,249,+,-,UU,1,R1 readid01 0 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,249,+,-,UU,1,R1 readid02 0 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,249,+,-,UU,1,R1|chr1,200,chr1,500,+,+,UU,2,R1 readid02 0 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,249,+,-,UU,1,R1|chr1,200,chr1,500,+,+,UU,2,R1 readid02 16 chr1 500 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,249,+,-,UU,1,R1|chr1,200,chr1,500,+,+,UU,2,R1 pairtools-1.1.3/tests/data/mock.parse2.sam000066400000000000000000000354431474715105500204530ustar00rootroot00000000000000@SQ SN:chr1 LN:10000 @SQ SN:chr2 LN:10000 @PG ID:mock PN:mock VN:0.0.0 CL:mock readid01 65 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,59,chr1,249,+,+,UU,1,R1-2 readid01 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,59,chr1,249,+,+,UU,1,R1-2 readid02 97 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,59,chr1,200,+,-,UU,1,R1-2 readid02 145 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,59,chr1,200,+,-,UU,1,R1-2 readid03 65 chr1 10 60 1S49M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,58,chr1,249,+,+,UU,1,R1-2 readid03 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,58,chr1,249,+,+,UU,1,R1-2 readid04 81 chr1 10 60 49M1S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,249,-,+,UU,1,R1-2 readid04 161 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,249,-,+,UU,1,R1-2 readid05 97 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,59,chr1,200,+,-,UU,1,R1-2 readid05 145 chr1 200 60 1S49M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,59,chr1,200,+,-,UU,1,R1-2 readid06 97 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,59,chr1,200,+,-,UU,1,R1-2 readid06 145 chr1 200 60 49M1S chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,59,chr1,200,+,-,UU,1,R1-2 readid07 97 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,59,chr1,200,+,-,UU,1,R1-2 readid07 145 chr1 200 60 1S48M1S chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,59,chr1,200,+,-,UU,1,R1-2 readid08 105 chr1 10 60 50M = 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,59,-,+,NU,1,R1-2 readid08 149 * 0 0 * chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,59,-,+,NU,1,R1-2 readid09 85 * 0 0 * chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,59,-,+,NU,1,R1-2 readid09 169 chr1 10 60 50M = 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,59,-,+,NU,1,R1-2 readid10 77 * 0 0 * * 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,NN,1,R1-2 readid10 141 * 0 0 * * 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,NN,1,R1-2 readid11 105 chr1 10 0 50M = 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,NM,1,R1-2 readid11 149 * 0 0 * chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,NM,1,R1-2 readid12 85 * 0 0 * chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,NM,1,R1-2 readid12 169 chr1 10 0 50M = 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,NM,1,R1-2 readid13 65 chr1 10 0 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,249,-,+,MU,1,R1-2 readid13 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,249,-,+,MU,1,R1-2 readid14 65 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,59,-,+,MU,1,R1-2 readid14 129 chr1 200 0 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,59,-,+,MU,1,R1-2 readid15 65 chr1 10 0 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,MM,1,R1-2 readid15 129 chr1 200 0 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,MM,1,R1-2 readid16 65 chr1 10 60 25M25S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,300,-,25M25H,60,0; CT:Z:SIMULATED:chr1,34,chr1,324,+,+,UU,1,R1 readid16 2129 chr1 300 60 25M25H chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25S,60,0; CT:Z:SIMULATED:chr1,34,chr1,324,+,+,UU,1,R1 readid16 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,34,chr1,324,+,+,UU,1,R1 readid17 65 chr1 10 60 25M25S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,5300,-,25M25H,60,0; CT:Z:SIMULATED:chr1,34,chr1,5324,+,+,UU,1,R1|chr1,249,chr1,5300,+,-,UU,2,R1-2 readid17 2129 chr1 5300 60 25M25H chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25S,60,0; CT:Z:SIMULATED:chr1,34,chr1,5324,+,+,UU,1,R1|chr1,249,chr1,5300,+,-,UU,2,R1-2 readid17 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,34,chr1,5324,+,+,UU,1,R1|chr1,249,chr1,5300,+,-,UU,2,R1-2 readid18 65 chr1 10 60 25M25S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,300,+,25M25H,60,0; CT:Z:SIMULATED:chr1,34,chr1,300,+,-,UU,1,R1|chr1,249,chr1,324,+,+,UU,2,R1-2 readid18 2113 chr1 300 60 25M25H chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25S,60,0; CT:Z:SIMULATED:chr1,34,chr1,300,+,-,UU,1,R1|chr1,249,chr1,324,+,+,UU,2,R1-2 readid18 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,34,chr1,300,+,-,UU,1,R1|chr1,249,chr1,324,+,+,UU,2,R1-2 readid19 81 chr1 300 60 25M25S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25H,60,0; CT:Z:SIMULATED:chr1,34,chr1,324,+,+,UU,1,R1 readid19 2113 chr1 10 60 25M25H chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr10,300,-,25M25S,60,0; CT:Z:SIMULATED:chr1,34,chr1,324,+,+,UU,1,R1 readid19 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,34,chr1,324,+,+,UU,1,R1 readid20 65 chr1 10 60 25M25S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,300,+,25M25H,60,0; CT:Z:SIMULATED:chr1,34,chr1,300,+,-,UU,1,R1|chr1,324,chr1,2024,+,+,UU,2,R1-2|chr1,224,chr1,2000,+,-,UU,3,R2 readid20 2113 chr1 300 60 25M25H chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25S,60,0; CT:Z:SIMULATED:chr1,34,chr1,300,+,-,UU,1,R1|chr1,324,chr1,2024,+,+,UU,2,R1-2|chr1,224,chr1,2000,+,-,UU,3,R2 readid20 129 chr1 200 60 25M25S chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,2000,+,25S25M,60,0; CT:Z:SIMULATED:chr1,34,chr1,300,+,-,UU,1,R1|chr1,324,chr1,2024,+,+,UU,2,R1-2|chr1,224,chr1,2000,+,-,UU,3,R2 readid20 2177 chr1 2000 60 25S25M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,2000,+,25S25M,60,0; CT:Z:SIMULATED:chr1,34,chr1,300,+,-,UU,1,R1|chr1,324,chr1,2024,+,+,UU,2,R1-2|chr1,224,chr1,2000,+,-,UU,3,R2 readid21 105 chr1 10 60 25M25S * 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,5300,-,25M25H,60,0; CT:Z:SIMULATED:chr1,34,chr1,5324,+,+,UU,1,R1|!,0,chr1,5300,-,-,NU,2,R1-2 readid21 2169 chr1 5300 60 25M25H * 0 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25S,60,0; CT:Z:SIMULATED:chr1,34,chr1,5324,+,+,UU,1,R1|!,0,chr1,5300,-,-,NU,2,R1-2 readid21 141 * 0 0 * chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,34,chr1,5324,+,+,UU,1,R1|!,0,chr1,5300,-,-,NU,2,R1-2 readid22 65 chr1 10 60 25M25S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,5300,-,25M25H,60,0; CT:Z:SIMULATED:chr1,34,chr1,5324,+,+,UU,1,R1|!,0,chr1,5300,-,-,MU,2,R1-2 readid22 2129 chr1 5300 60 25M25H chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25S,60,0; CT:Z:SIMULATED:chr1,34,chr1,5324,+,-,UU,1,R1|!,0,chr1,5300,-,-,MU,2,R1-2 readid22 129 chr1 200 0 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,34,chr1,5324,+,-,UU,1,R1|!,0,chr1,5300,-,-,MU,2,R1-2 readid23 129 chr1 200 0 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,XX,1,R1-2 readid24 65 chr1 10 60 25M25S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,5300,-,25M25H,60,0; CT:Z:SIMULATED:chr1,34,chr1,5324,+,+,UU,1,R1|!,0,chr1,5300,-,-,NU,2,R1-2 readid24 2129 chr1 5300 60 25M25H chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 CT:Z:SIMULATED:chr1,34,chr1,5324,+,+,UU,1,R1|!,0,chr1,5300,-,-,NU,2,R1-2 readid25 97 chr1 1 60 36S45M = 1 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,200,+,38M43S,60,0; CT:Z:SIMULATED:chr1,1,chr1,237,-,+,UU,1,R1&2 readid25 2145 chr1 200 60 38M43H chr1 1 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,1,+,36S45M,60,0; CT:Z:SIMULATED:chr1,1,chr1,237,-,+,UU,1,R1&2 readid25 145 chr1 1 60 168S53M = 1 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,200,-,132S38M51S,60,0; CT:Z:SIMULATED:chr1,1,chr1,237,-,+,UU,1,R1&2 readid25 2193 chr1 200 60 132H38M51H chr1 1 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,1,-,168S53M,60,0; CT:Z:SIMULATED:chr1,1,chr1,237,-,+,UU,1,R1&2 readid26 97 chr1 200 60 36S45M = 1 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,1,+,38M43S,60,0; CT:Z:SIMULATED:chr1,38,chr1,200,+,-,UU,1,R1&2 readid26 2145 chr1 1 60 38M43H chr1 1 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,200,+,36S45M,60,0; CT:Z:SIMULATED:chr1,38,chr1,200,+,-,UU,1,R1&2 readid26 145 chr1 200 60 168S53M = 1 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,1,-,132S38M51S,60,0; CT:Z:SIMULATED:chr1,38,chr1,200,+,-,UU,1,R1&2 readid26 2193 chr1 1 60 132H38M51H chr1 1 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,200,-,168S53M,60,0; CT:Z:SIMULATED:chr1,38,chr1,200,1,+,-,UU,1,R1&2 readid27 97 chr1 128 60 81M = 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 CT:Z:SIMULATED:chr1,1,chr1,369,-,+,UU,1,R2 readid27 145 chr1 200 60 170M51S = 128 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,1,-,168S53M,60,0; CT:Z:SIMULATED:chr1,1,chr1,369,-,+,UU,1,R2 readid27 2193 chr1 1 60 168H53M chr1 128 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,200,-,170M51S,60,0; CT:Z:SIMULATED:chr1,1,chr1,369,-,+,UU,1,R2 pairtools-1.1.3/tests/data/mock.rsites.bed000066400000000000000000000001011474715105500205210ustar00rootroot00000000000000chr1 0 100 chr1 100 500 chr1 500 10000 chr2 0 200 chr2 200 10000 pairtools-1.1.3/tests/data/mock.sam000066400000000000000000000235141474715105500172540ustar00rootroot00000000000000@SQ SN:chr1 LN:1000 @SQ SN:chr2 LN:1000 @PG ID:mock PN:mock VN:0.0.0 CL:mock readid01 65 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UU readid01 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UU readid02 97 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,249,+,-,UU readid02 145 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,249,+,-,UU readid03 65 chr1 10 60 1S49M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UU readid03 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UU readid04 81 chr1 10 60 49M1S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,58,chr1,200,-,+,UU readid04 161 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,58,chr1,200,-,+,UU readid05 97 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,248,+,-,UU readid05 145 chr1 200 60 1S49M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,248,+,-,UU readid06 97 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,248,+,-,UU readid06 145 chr1 200 60 49M1S chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,248,+,-,UU readid07 97 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,247,+,-,UU readid07 145 chr1 200 60 1S48M1S chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,247,+,-,UU readid08 105 chr1 10 60 50M = 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,10,-,+,NU readid08 149 * 0 0 * chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,10,-,+,NU readid09 85 * 0 0 * chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,10,-,+,NU readid09 169 chr1 10 60 50M = 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,10,-,+,NU readid10 77 * 0 0 * * 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,NN readid10 141 * 0 0 * * 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,NN readid11 105 chr1 10 0 50M = 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,NM readid11 149 * 0 0 * chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,NM readid12 85 * 0 0 * chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,NM readid12 169 chr1 10 0 50M = 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,NM readid13 65 chr1 10 0 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,200,-,+,MU readid13 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,200,-,+,MU readid14 65 chr1 10 60 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,10,-,+,MU readid14 129 chr1 200 0 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,chr1,10,-,+,MU readid15 65 chr1 10 0 50M chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,MM readid15 129 chr1 200 0 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,MM readid16 65 chr1 10 60 25M25S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,300,-,25M25H,60,0; CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UR readid16 2129 chr1 300 60 25M25H chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25S,60,0; CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UR readid16 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UR readid17 65 chr1 10 60 25M25S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,5300,-,25M25H,60,0; CT:Z:SIMULATED:!,0,!,0,-,-,WW readid17 2129 chr1 5300 60 25M25H chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25S,60,0; CT:Z:SIMULATED:!,0,!,0,-,-,WW readid17 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,WW readid18 65 chr1 10 60 25M25S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,300,+,25M25H,60,0; CT:Z:SIMULATED:!,0,!,0,-,-,WW readid18 2113 chr1 300 60 25M25H chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25S,60,0; CT:Z:SIMULATED:!,0,!,0,-,-,WW readid18 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,WW readid19 81 chr1 300 60 25M25S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25H,60,0; CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UR readid19 2113 chr1 10 60 25M25H chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr10,300,-,25M25S,60,0; CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UR readid19 129 chr1 200 60 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:chr1,10,chr1,200,+,+,UR readid20 65 chr1 10 60 25M25S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,300,+,25M25H,60,0; CT:Z:SIMULATED:!,0,!,0,-,-,WW readid20 2113 chr1 300 60 25M25H chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25S,60,0; CT:Z:SIMULATED:!,0,!,0,-,-,WW readid20 129 chr1 200 60 25M25S chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,2000,+,25S25M,60,0; CT:Z:SIMULATED:!,10,!,0,-,-,WW readid20 2177 chr1 2000 60 25S25M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,2000,+,25S25M,60,0; CT:Z:SIMULATED:!,0,!,0,-,-,WW readid21 105 chr1 10 60 25M25S * 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,5300,-,25M25H,60,0; CT:Z:SIMULATED:!,0,!,0,-,-,WW readid21 2169 chr1 5300 60 25M25H * 0 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25S,60,0; CT:Z:SIMULATED:!,0,!,0,-,-,WW readid21 141 * 0 0 * chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,WW readid22 65 chr1 10 60 25M25S chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,5300,-,25M25H,60,0; CT:Z:SIMULATED:!,0,!,0,-,-,WW readid22 2129 chr1 5300 60 25M25H chr1 200 0 AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 SA:Z:chr1,10,+,25M25S,60,0; CT:Z:SIMULATED:!,0,!,0,-,-,WW readid22 129 chr1 200 0 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,WW readid23 129 chr1 200 0 50M chr1 10 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA NM:i:0 NM:i:0 CT:Z:SIMULATED:!,0,!,0,-,-,XX pairtools-1.1.3/tests/data/mock.test-restr.pairs000066400000000000000000000013161474715105500217210ustar00rootroot00000000000000## pairs format v1.0.0 #shape: upper triangle #genome_assembly: unknown #samheader: @SQ SN:chr1 LN:10000 #samheader: @SQ SN:chr2 LN:10000 #samheader: @PG ID:bwa PN:bwa VN:0.7.15-r1140 CL:bwa mem -SP /path/ucsc.hg19.fasta.gz /path/1.fastq.gz /path/2.fastq.gz #chromosomes: chr1 chr2 #chromsize: chr1 10000 #chromsize: chr2 10000 #columns: readID chrom1 pos1 chrom2 pos2 strand1 strand2 pair_type rfrag_test1 rfrag_test2 readid01 chr1 1 chr2 20 + + UU 0 0 readid02 chr1 100 chr2 20 - + UU 0 0 readid03 chr1 100 chr2 20 + + UU 0 0 readid04 chr1 499 chr2 20 + + UU 1 0 readid05 chr1 600 chr2 20 + + UU 2 0 readid06 chr1 1 chr2 200 + + UU 0 0 readid07 chr1 1 chr2 500 + + UU 0 1 readid08 chr1 10001 chr2 10001 + + UU 2 1 pairtools-1.1.3/tests/data/mock_empty.4dedup.pairsam000066400000000000000000000003111474715105500225200ustar00rootroot00000000000000## pairs format v1.0.0 #sorted: chr1-chr2-pos1-pos2 #shape: upper triangle #genome_assembly: unknown #chromosomes: chr1 chr2 #columns: readID chrom1 pos1 chrom2 pos2 strand1 strand2 pair_type sam1 sam2pairtools-1.1.3/tests/test_dedup.py000066400000000000000000000162631474715105500174250ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import sys import subprocess import pytest import tempfile testdir = os.path.dirname(os.path.realpath(__file__)) tmpdir = tempfile.TemporaryDirectory() tmpdir_name = tmpdir.name mock_pairsam_path_dedup = os.path.join(testdir, "data", "mock.4dedup.pairsam") mock_pairsam_path_dedup_diff_colnames = os.path.join( testdir, "data", "mock.4dedup_diffcolnames.pairsam" ) dedup_path = os.path.join(tmpdir_name, "dedup.pairsam") unmapped_path = os.path.join(tmpdir_name, "unmapped.pairsam") dups_path = os.path.join(tmpdir_name, "dups.pairsam") dedup_path_cython = os.path.join(tmpdir_name, "dedup.cython.pairsam") unmapped_path_cython = os.path.join(tmpdir_name, "unmapped.cython.pairsam") dups_path_cython = os.path.join(tmpdir_name, "dups.cython.pairsam") dedup_max_path = os.path.join(tmpdir_name, "dedup_max.pairsam") unmapped_max_path = os.path.join(tmpdir_name, "unmapped_max.pairsam") dups_max_path = os.path.join(tmpdir_name, "dups_max.pairsam") dedup_markdups_path = os.path.join(tmpdir_name, "dedup.markdups.pairsam") unmapped_markdups_path = os.path.join(tmpdir_name, "unmapped.markdups.pairsam") dups_markdups_path = os.path.join(tmpdir_name, "dups.markdups.pairsam") dedup_path_diff_colnames = os.path.join(tmpdir_name, "dedup.diff_colnames.pairsam") unmapped_path_diff_colnames = os.path.join( tmpdir_name, "unmapped.diff_colnames.pairsam" ) dups_path_diff_colnames = os.path.join(tmpdir_name, "dups.diff_colnames.pairsam") max_mismatch = 1 mock_empty_pairsam_path_dedup = os.path.join(testdir, "data", "mock_empty.4dedup.pairsam") @pytest.fixture def setup_dedup(): try: subprocess.check_output( [ "python", "-m", "pairtools", "dedup", mock_pairsam_path_dedup, "--output", dedup_path, "--output-dups", dups_path, "--output-unmapped", unmapped_path, "--max-mismatch", str(max_mismatch), ], ) subprocess.check_output( [ "python", "-m", "pairtools", "dedup", mock_pairsam_path_dedup, "--output", dedup_path_cython, "--output-dups", dups_path_cython, "--output-unmapped", unmapped_path_cython, "--max-mismatch", str(max_mismatch), "--backend", "cython", ], ) subprocess.check_output( [ "python", "-m", "pairtools", "dedup", mock_pairsam_path_dedup, "--output", dedup_max_path, "--output-dups", dups_max_path, "--output-unmapped", unmapped_max_path, "--max-mismatch", str(max_mismatch), "--method", "max", ], ) subprocess.check_output( [ "python", "-m", "pairtools", "dedup", mock_pairsam_path_dedup, "--mark-dups", "--output", dedup_markdups_path, "--output-dups", dups_markdups_path, "--output-unmapped", unmapped_markdups_path, "--max-mismatch", str(max_mismatch), ], ) subprocess.check_output( [ "python", "-m", "pairtools", "dedup", mock_pairsam_path_dedup_diff_colnames, "--mark-dups", "--output", dedup_path_diff_colnames, "--output-dups", dups_path_diff_colnames, "--output-unmapped", unmapped_path_diff_colnames, "--max-mismatch", str(max_mismatch), "--c1", "chr1", "--c2", "chr2", "--p1", "p1", "--p2", "p2", "--s1", "str1", "--s2", "str2", ], ) except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e def test_mock_pairsam(setup_dedup): pairsam_pairs = [ l.strip().split("\t") for l in open(mock_pairsam_path_dedup, "r") if not l.startswith("#") and l.strip() ] for (ddp, up, dp) in [ (dedup_path, unmapped_path, dups_path), (dedup_max_path, unmapped_max_path, dups_max_path), (dedup_markdups_path, unmapped_markdups_path, dups_markdups_path), ( dedup_path_diff_colnames, unmapped_path_diff_colnames, dups_path_diff_colnames, ), ]: dedup_pairs = [ l.strip().split("\t") for l in open(ddp, "r") if not l.startswith("#") and l.strip() ] unmapped_pairs = [ l.strip().split("\t") for l in open(up, "r") if not l.startswith("#") and l.strip() ] dup_pairs = [ l.strip().split("\t") for l in open(dp, "r") if not l.startswith("#") and l.strip() ] # check that at least a few pairs remained in deduped and dup files assert len(dedup_pairs) > 0 assert len(dup_pairs) > 0 assert len(unmapped_pairs) > 0 import pandas as pd # check that all pairsam entries survived deduping: assert len(dedup_pairs) + len(unmapped_pairs) + len(dup_pairs) == len( pairsam_pairs ) def pairs_overlap(pair1, pair2, max_mismatch): overlap = ( (pair1[1] == pair2[1]) and (pair1[3] == pair2[3]) and (pair1[5] == pair2[5]) and (pair1[6] == pair2[6]) and (abs(int(pair1[2]) - int(pair2[2])) <= max_mismatch) and (abs(int(pair1[4]) - int(pair2[4])) <= max_mismatch) ) return overlap # check that deduped pairs do not overlap assert all( [ not pairs_overlap(pair1, pair2, max_mismatch) for i, pair1 in enumerate(dedup_pairs) for j, pair2 in enumerate(dedup_pairs) if i != j ] ) # check that the removed duplicates overlap with at least one of the # deduplicated entries assert all( [ any([pairs_overlap(pair1, pair2, 3) for pair2 in dedup_pairs]) for pair1 in dup_pairs ] ) empty_dedup_pairs = [ l.strip().split("\t") for l in open(mock_empty_pairsam_path_dedup, "r") if not l.startswith("#") and l.strip() ] assert len(empty_dedup_pairs) == 0 tmpdir.cleanup() pairtools-1.1.3/tests/test_filterbycov.py000066400000000000000000000102041474715105500206410ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import sys import subprocess import pytest import tempfile testdir = os.path.dirname(os.path.realpath(__file__)) mock_pairs_path_filterbycov = os.path.join(testdir, "data", "mock.4filterbycov.pairs") tmpdir = tempfile.TemporaryDirectory() tmpdir_name = tmpdir.name params = [ {"max_dist": 0, "max_cov": 3}, {"max_dist": 0, "max_cov": 2}, {"max_dist": 1, "max_cov": 1}, ] for p in params: p["lowcov_path"] = os.path.join( tmpdir_name, "lowcov.{}.{}.pairs".format(p["max_dist"], p["max_cov"]) ) p["highcov_path"] = os.path.join( tmpdir_name, "highcov.{}.{}.pairs".format(p["max_dist"], p["max_cov"]) ) p["unmapped_path"] = os.path.join( tmpdir_name, "unmapped.{}.{}.pairs".format(p["max_dist"], p["max_cov"]) ) @pytest.fixture def setup_filterbycov(): try: for p in params: subprocess.check_output( [ "python", "-m", "pairtools", "filterbycov", mock_pairs_path_filterbycov, "--output", p["lowcov_path"], "--output-highcov", p["highcov_path"], "--output-unmapped", p["unmapped_path"], "--max-dist", str(p["max_dist"]), "--max-cov", str(p["max_cov"]), ] ) except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e def test_mock_pairs(setup_filterbycov): all_pairs = [ l.strip().split("\t") for l in open(mock_pairs_path_filterbycov, "r") if not l.startswith("#") and l.strip() ] for p in params: lowcov_pairs = [ l.strip().split("\t") for l in open(p["lowcov_path"], "r") if not l.startswith("#") and l.strip() ] highcov_pairs = [ l.strip().split("\t") for l in open(p["highcov_path"], "r") if not l.startswith("#") and l.strip() ] unmapped_pairs = [ l.strip().split("\t") for l in open(p["unmapped_path"], "r") if not l.startswith("#") and l.strip() ] # check that at least a few pairs remained in deduped and dup files # assert len(lowcov_pairs) > 0 # assert len(highcov_pairs) > 0 # assert len(unmapped_pairs) > 0 # check that all pairs entries survived deduping: assert len(lowcov_pairs) + len(unmapped_pairs) + len(highcov_pairs) == len( all_pairs ) assert all([(pair[1] != "!" and pair[3] != "!") for pair in lowcov_pairs]) assert all([(pair[1] != "!" and pair[3] != "!") for pair in highcov_pairs]) assert all([(pair[1] == "!" or pair[3] == "!") for pair in unmapped_pairs]) def update_coverage(coverage, chrom, pos, max_dist): if chrom == "!": return coverage[chrom] = coverage.get(chrom, {}) for i in range(max(0, pos - max_dist), pos + max_dist + 1): coverage[chrom][i] = coverage[chrom].get(i, 0) + 1 coverage = {} for pair in all_pairs: update_coverage(coverage, pair[1], int(pair[2]), p["max_dist"]) update_coverage(coverage, pair[3], int(pair[4]), p["max_dist"]) for pair in lowcov_pairs: # print (p['max_cov'],p['max_dist']) # print (pair, coverage[pair[1]][int(pair[2])]) # print (pair, coverage[pair[3]][int(pair[4])]) assert coverage[pair[1]][int(pair[2])] <= p["max_cov"] assert coverage[pair[3]][int(pair[4])] <= p["max_cov"] for pair in highcov_pairs: # print (p['max_cov'],p['max_dist']) # print (pair, coverage[pair[1]][int(pair[2])]) # print (pair, coverage[pair[3]][int(pair[4])]) assert (coverage[pair[1]][int(pair[2])] > p["max_cov"]) or ( coverage[pair[3]][int(pair[4])] > p["max_cov"] ) tmpdir.cleanup() pairtools-1.1.3/tests/test_flip.py000066400000000000000000000036751474715105500172610ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import sys import subprocess import pytest testdir = os.path.dirname(os.path.realpath(__file__)) mock_pairs_path = os.path.join(testdir, "data", "mock.4flip.pairs") mock_chromsizes_path = os.path.join(testdir, "data", "mock.chrom.sizes") def test_flip(): try: result = subprocess.check_output( [ "python", "-m", "pairtools", "flip", mock_pairs_path, "-c", mock_chromsizes_path, ], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e orig_pairs = [ l.strip().split("\t") for l in open(mock_pairs_path, "r") if not l.startswith("#") and l.strip() ] flipped_pairs = [ l.strip().split("\t") for l in result.split("\n") if not l.startswith("#") and l.strip() ] chrom_enum = {"!": 0, "chr1": 1, "chr2": 2, "chrU": 3, "chrU1": 4} # chrU stands for unannotated chromosome, which has less priority than annotated ones # chrU1 is another unannotated chromosome, which should go lexigographically after chrU for orig_pair, flipped_pair in zip(orig_pairs, flipped_pairs): has_correct_order = (chrom_enum[orig_pair[1]], int(orig_pair[2])) <= ( chrom_enum[orig_pair[3]], int(orig_pair[4]), ) if has_correct_order: assert all([c1 == c2 for c1, c2 in zip(orig_pair, flipped_pair)]) if not has_correct_order: assert orig_pair[1] == flipped_pair[3] assert orig_pair[2] == flipped_pair[4] assert orig_pair[3] == flipped_pair[1] assert orig_pair[4] == flipped_pair[2] assert orig_pair[5] == flipped_pair[6] assert orig_pair[6] == flipped_pair[5] assert orig_pair[7] == flipped_pair[7][::-1] pairtools-1.1.3/tests/test_header.py000066400000000000000000000026071474715105500175510ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import sys import pytest import subprocess testdir = os.path.dirname(os.path.realpath(__file__)) def test_generate(): """Test generation of the header. Example run: pairtools header generate tests/data/mock.pairsam \ --chroms-path tests/data/mock.chrom.sizes --pairsam \ --sam-path tests/data/mock.sam """ mock_sam_path = os.path.join(testdir, "data", "mock.sam") mock_pairs_path = os.path.join(testdir, "data", "mock.pairsam") mock_chroms_path = os.path.join(testdir, "data", "mock.chrom.sizes") try: result = subprocess.check_output( [ "python", "-m", "pairtools", "header", "generate", "--chroms-path", mock_chroms_path, "--sam-path", mock_sam_path, "--pairsam", mock_pairs_path, ], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e # check if the header got transferred correctly sam_header = [l.strip() for l in open(mock_sam_path, "r") if l.startswith("@")] pairsam_header = [l.strip() for l in result.split("\n") if l.startswith("#")] for l in sam_header: assert any([l in l2 for l2 in pairsam_header]) pairtools-1.1.3/tests/test_headerops.py000066400000000000000000000105051474715105500202670ustar00rootroot00000000000000# -*- coding: utf-8 -*- from pairtools.lib import headerops import pytest def test_make_standard_header(): header = headerops.make_standard_pairsheader() assert any([l.startswith("## pairs format") for l in header]) assert any([l.startswith("#shape") for l in header]) assert any([l.startswith("#columns") for l in header]) header = headerops.make_standard_pairsheader( chromsizes=[("b", 100), ("c", 100), ("a", 100)] ) assert sum([l.startswith("#chromsize") for l in header]) == 3 def test_samheaderops(): header = headerops.make_standard_pairsheader() samheader = [ "@SQ\tSN:chr1\tLN:100", "@SQ\tSN:chr2\tLN:100", "@SQ\tSN:chr3\tLN:100", "@PG\tID:bwa\tPN:bwa\tCL:bwa", "@PG\tID:bwa-2\tPN:bwa\tCL:bwa\tPP:bwa", ] header_with_sam = headerops.insert_samheader(header, samheader) assert len(header_with_sam) == len(header) + len(samheader) for l in samheader: assert any([l2.startswith("#samheader") and l in l2 for l2 in header_with_sam]) # test adding new programs to the PG chain header_extra_pg = headerops.append_new_pg(header_with_sam, ID="test", PN="test") # test if all lines got transferred assert all([(old_l in header_extra_pg) for old_l in header_with_sam]) # test if one PG got added assert len(header_extra_pg) == len(header_with_sam) + 1 # test if the new PG has PP matching the ID of one of already existing PGs new_l = [l for l in header_extra_pg if l not in header_with_sam][0] pp = [f[3:] for f in new_l.split("\t") if f.startswith("PP:")][0] assert ( len( [ l for l in header_extra_pg if l.startswith("#samheader") and ("\tID:{}\t".format(pp) in l) ] ) == 1 ) def test_merge_pairheaders(): headers = [["## pairs format v1.0"], ["## pairs format v1.0"]] merged_header = headerops._merge_pairheaders(headers) assert merged_header == headers[0] headers = [["## pairs format v1.0", "#a"], ["## pairs format v1.0", "#b"]] merged_header = headerops._merge_pairheaders(headers) assert merged_header == ["## pairs format v1.0", "#a", "#b"] headers = [ ["## pairs format v1.0", "#chromsize: chr1 100", "#chromsize: chr2 200"], ["## pairs format v1.0", "#chromsize: chr1 100", "#chromsize: chr2 200"], ] merged_header = headerops._merge_pairheaders(headers) assert merged_header == headers[0] def test_merge_different_pairheaders(): with pytest.raises(Exception): headers = [["## pairs format v1.0"], ["## pairs format v1.1"]] merged_header = headerops._merge_pairheaders(headers) def test_force_merge_pairheaders(): headers = [ ["## pairs format v1.0", "#chromsize: chr1 100"], ["## pairs format v1.0", "#chromsize: chr2 200"], ] merged_header = headerops._merge_pairheaders(headers, force=True) assert merged_header == [ "## pairs format v1.0", "#chromsize: chr1 100", "#chromsize: chr2 200", ] def test_merge_samheaders(): headers = [ ["@HD\tVN:1"], ["@HD\tVN:1"], ] merged_header = headerops._merge_samheaders(headers) assert merged_header == headers[0] headers = [ [ "@HD\tVN:1", "@SQ\tSN:chr1\tLN:100", "@SQ\tSN:chr2\tLN:100", ], [ "@HD\tVN:1", "@SQ\tSN:chr1\tLN:100", "@SQ\tSN:chr2\tLN:100", ], ] merged_header = headerops._merge_samheaders(headers) assert merged_header == headers[0] headers = [ [ "@HD\tVN:1", "@PG\tID:bwa\tPN:bwa\tPP:cat", ], [ "@HD\tVN:1", "@PG\tID:bwa\tPN:bwa\tPP:cat", ], ] merged_header = headerops._merge_samheaders(headers) print(merged_header) assert merged_header == [ "@HD\tVN:1", "@PG\tID:bwa-1\tPN:bwa\tPP:cat-1", "@PG\tID:bwa-2\tPN:bwa\tPP:cat-2", ] def test_merge_headers(): headers = [ [ "## pairs format v1.0", "#samheader: @HD\tVN:1", "#samheader: @SQ\tSN:chr1\tLN:100", "#samheader: @SQ\tSN:chr2\tLN:100", ] ] * 2 merged_header = headerops.merge_headers(headers) assert merged_header == headers[0] pairtools-1.1.3/tests/test_markasdup.py000066400000000000000000000017111474715105500203030ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import sys import subprocess import pytest testdir = os.path.dirname(os.path.realpath(__file__)) def test_mock_pairsam(): mock_pairsam_path = os.path.join(testdir, "data", "mock.pairsam") try: result = subprocess.check_output( ["python", "-m", "pairtools", "markasdup", mock_pairsam_path], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e pairsam_body = [ l.strip() for l in open(mock_pairsam_path, "r") if not l.startswith("#") and l.strip() ] output_body = [ l.strip() for l in result.split("\n") if not l.startswith("#") and l.strip() ] # check that all pairsam entries survived sorting: assert len(pairsam_body) == len(output_body) # check that all pairtypes got changed to DD for l in output_body: assert l.split("\t")[7] == "DD" pairtools-1.1.3/tests/test_merge.py000066400000000000000000000073131474715105500174170ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import sys import subprocess import pytest import tempfile testdir = os.path.dirname(os.path.realpath(__file__)) tmpdir = tempfile.TemporaryDirectory() tmpdir_name = tmpdir.name mock_pairsam_path_1 = os.path.join(testdir, "data", "mock.pairsam") mock_pairsam_path_2 = os.path.join(testdir, "data", "mock.2.pairsam") mock_sorted_pairsam_path_1 = os.path.join(tmpdir_name, "1.pairsam") mock_sorted_pairsam_path_2 = os.path.join(tmpdir_name, "2.pairsam") @pytest.fixture def setup_sort_two(): try: subprocess.check_output( [ "python", "-m", "pairtools", "sort", mock_pairsam_path_1, "--output", mock_sorted_pairsam_path_1, ], ) subprocess.check_output( [ "python", "-m", "pairtools", "sort", mock_pairsam_path_2, "--output", mock_sorted_pairsam_path_2, ], ) except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e def test_mock_pairsam(setup_sort_two): try: result = subprocess.check_output( [ "python", "-m", "pairtools", "merge", mock_sorted_pairsam_path_1, mock_sorted_pairsam_path_2, ], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e # check that all pairsam entries survived sorting: pairsam_body_1 = [ l.strip() for l in open(mock_pairsam_path_1, "r") if not l.startswith("#") and l.strip() ] pairsam_body_2 = [ l.strip() for l in open(mock_pairsam_path_2, "r") if not l.startswith("#") and l.strip() ] output_body = [ l.strip() for l in result.split("\n") if not l.startswith("#") and l.strip() ] assert len(pairsam_body_1) + len(pairsam_body_2) == len(output_body) # check the sorting order of the output: prev_pair = None for l in output_body: cur_pair = l.split("\t")[1:8] if prev_pair is not None: assert cur_pair[0] >= prev_pair[0] if cur_pair[0] == prev_pair[0]: assert cur_pair[2] >= prev_pair[2] if cur_pair[2] == prev_pair[2]: assert int(cur_pair[1]) >= int(prev_pair[1]) if int(cur_pair[1]) == int(prev_pair[1]): assert int(cur_pair[3]) >= int(prev_pair[3]) prev_pair = cur_pair # Check that the header is preserved: try: result = subprocess.check_output( [ "python", "-m", "pairtools", "merge", "--keep-first-header", mock_sorted_pairsam_path_1, mock_sorted_pairsam_path_2, ], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e # check the headers: pairsam_header_1 = [ l.strip() for l in open(mock_sorted_pairsam_path_1, "r") if l.startswith("#") and l.strip() ] pairsam_header_2 = [ l.strip() for l in open(mock_sorted_pairsam_path_2, "r") if l.startswith("#") and l.strip() ] output_header = [ l.strip() for l in result.split("\n") if l.startswith("#") and l.strip() ] assert len(pairsam_header_1) + 1 == len(output_header) tmpdir.cleanup() pairtools-1.1.3/tests/test_parse.py000066400000000000000000000065201474715105500174310ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import sys import pytest import subprocess testdir = os.path.dirname(os.path.realpath(__file__)) def test_python_version(): assert sys.version_info[0] == 3, "Use Python 3!" def test_mock_pysam(): """Parse non-chimeric alignments with walks-policy mask with pysam backend.""" mock_sam_path = os.path.join(testdir, "data", "mock.sam") mock_chroms_path = os.path.join(testdir, "data", "mock.chrom.sizes") try: result = subprocess.check_output( [ "python", "-m", "pairtools", "parse", "--walks-policy", "mask", "-c", mock_chroms_path, mock_sam_path, ], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e # check if the header got transferred correctly sam_header = [l.strip() for l in open(mock_sam_path, "r") if l.startswith("@")] pairsam_header = [l.strip() for l in result.split("\n") if l.startswith("#")] for l in sam_header: assert any([l in l2 for l2 in pairsam_header]) # check that the pairs got assigned properly for l in result.split("\n"): if l.startswith("#") or not l: continue print(l) assigned_pair = l.split("\t")[1:8] simulated_pair = l.split("CT:Z:SIMULATED:", 1)[1].split("\031", 1)[0].split(",") print(assigned_pair) print(simulated_pair) print() assert assigned_pair == simulated_pair def test_mock_pysam_parse_all(): """Parse all alignment in each read with walks-policy all and pysam backend.""" mock_sam_path = os.path.join(testdir, "data", "mock.parse-all.sam") mock_chroms_path = os.path.join(testdir, "data", "mock.chrom.sizes") try: result = subprocess.check_output( [ "python", "-m", "pairtools", "parse", "--walks-policy", "all", "-c", mock_chroms_path, "--add-pair-index", mock_sam_path, ], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e # check if the header got transferred correctly sam_header = [l.strip() for l in open(mock_sam_path, "r") if l.startswith("@")] pairsam_header = [l.strip() for l in result.split("\n") if l.startswith("#")] for l in sam_header: assert any([l in l2 for l2 in pairsam_header]) # check that the pairs got assigned properly id_counter = 0 prev_id = "" for l in result.split("\n"): if l.startswith("#") or not l: continue if prev_id == l.split("\t")[0]: id_counter += 1 else: id_counter = 0 prev_id = l.split("\t")[0] assigned_pair = l.split("\t")[1:8] + l.split("\t")[-2:] simulated_pair = ( l.split("CT:Z:SIMULATED:", 1)[1] .split("\031", 1)[0] .split("|")[id_counter] .split(",") ) print(assigned_pair) print(simulated_pair, prev_id) print() assert assigned_pair == simulated_pair pairtools-1.1.3/tests/test_parse2.py000066400000000000000000000174511474715105500175200ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import sys import pytest import subprocess testdir = os.path.dirname(os.path.realpath(__file__)) def test_mock_pysam_parse2_read(): mock_sam_path = os.path.join(testdir, "data", "mock.parse2.sam") mock_chroms_path = os.path.join(testdir, "data", "mock.chrom.sizes") try: result = subprocess.check_output( [ "python", "-m", "pairtools", "parse2", "-c", mock_chroms_path, "--add-pair-index", "--flip", "--report-position", "junction", "--report-orientation", "pair", mock_sam_path, ], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e # check if the header got transferred correctly sam_header = [l.strip() for l in open(mock_sam_path, "r") if l.startswith("@")] pairsam_header = [l.strip() for l in result.split("\n") if l.startswith("#")] for l in sam_header: assert any([l in l2 for l2 in pairsam_header]) # check that the pairs got assigned properly id_counter = 0 prev_id = "" for l in result.split("\n"): if l.startswith("#") or not l: continue if prev_id == l.split("\t")[0]: id_counter += 1 else: id_counter = 0 prev_id = l.split("\t")[0] assigned_pair = l.split("\t")[1:8] + l.split("\t")[-2:] print(l.split("SIMULATED:", 1)[1].split("\031", 1)[0].split("|"), id_counter) simulated_pair = ( l.split("SIMULATED:", 1)[1] .split("\031", 1)[0] .split("|")[id_counter] .split(",") ) print(assigned_pair) print(simulated_pair, prev_id) print() assert assigned_pair == simulated_pair def test_mock_pysam_parse2_pair(): mock_sam_path = os.path.join(testdir, "data", "mock.parse-all.sam") mock_chroms_path = os.path.join(testdir, "data", "mock.chrom.sizes") try: result = subprocess.check_output( [ "python", "-m", "pairtools", "parse2", "-c", mock_chroms_path, "--add-pair-index", "--flip", "--report-position", "outer", "--report-orientation", "pair", mock_sam_path, ], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e # check if the header got transferred correctly sam_header = [l.strip() for l in open(mock_sam_path, "r") if l.startswith("@")] pairsam_header = [l.strip() for l in result.split("\n") if l.startswith("#")] for l in sam_header: assert any([l in l2 for l2 in pairsam_header]) # check that the pairs got assigned properly id_counter = 0 prev_id = "" for l in result.split("\n"): if l.startswith("#") or not l: continue if prev_id == l.split("\t")[0]: id_counter += 1 else: id_counter = 0 prev_id = l.split("\t")[0] assigned_pair = l.split("\t")[1:8] + l.split("\t")[-2:] simulated_pair = ( l.split("SIMULATED:", 1)[1] .split("\031", 1)[0] .split("|")[id_counter] .split(",") ) print(assigned_pair) print(simulated_pair, prev_id) print() assert assigned_pair == simulated_pair def test_mock_pysam_parse2_single_end(): """Testing single-end mode for parse2, no-flip mode. --report-position is outer (parse2 default) --report-orientation is pair (parse2 default) """ mock_sam_path = os.path.join(testdir, "data", "mock.parse2-single-end.sam") mock_chroms_path = os.path.join(testdir, "data", "mock.chrom.sizes") try: result = subprocess.check_output( [ "python", "-m", "pairtools", "parse2", "-c", mock_chroms_path, "--single-end", "--add-pair-index", "--no-flip", "--report-position", "outer", "--report-orientation", "pair", mock_sam_path, ], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e # check if the header got transferred correctly sam_header = [l.strip() for l in open(mock_sam_path, "r") if l.startswith("@")] pairsam_header = [l.strip() for l in result.split("\n") if l.startswith("#")] for l in sam_header: assert any([l in l2 for l2 in pairsam_header]) # check that the pairs got assigned properly id_counter = 0 prev_id = "" for l in result.split("\n"): if l.startswith("#") or not l: continue if prev_id == l.split("\t")[0]: id_counter += 1 else: id_counter = 0 prev_id = l.split("\t")[0] assigned_pair = l.split("\t")[1:8] + l.split("\t")[-2:] print(l.split("SIMULATED:", 1)[1].split("\031", 1)[0].split("|"), id_counter) simulated_pair = ( l.split("SIMULATED:", 1)[1] .split("\031", 1)[0] .split("|")[id_counter] .split(",") ) print(assigned_pair) print(simulated_pair, prev_id) print() assert assigned_pair == simulated_pair def test_mock_pysam_parse2_single_end_expand(): """Testing single-end mode for parse2, no-flip mode, with --expand. --report-position is outer (parse2 default) --report-orientation is pair (parse2 default) """ mock_sam_path = os.path.join(testdir, "data", "mock.parse2-single-end.expand.sam") mock_chroms_path = os.path.join(testdir, "data", "mock.chrom.sizes") try: result = subprocess.check_output( [ "python", "-m", "pairtools", "parse2", "-c", mock_chroms_path, "--single-end", "--expand", "--add-pair-index", "--no-flip", "--report-position", "outer", "--report-orientation", "pair", mock_sam_path, ], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e # check if the header got transferred correctly sam_header = [l.strip() for l in open(mock_sam_path, "r") if l.startswith("@")] pairsam_header = [l.strip() for l in result.split("\n") if l.startswith("#")] for l in sam_header: assert any([l in l2 for l2 in pairsam_header]) # check that the pairs got assigned properly id_counter = 0 prev_id = "" for l in result.split("\n"): if l.startswith("#") or not l: continue if prev_id == l.split("\t")[0]: id_counter += 1 else: id_counter = 0 prev_id = l.split("\t")[0] assigned_pair = l.split("\t")[1:8] + l.split("\t")[-2:] print(l.split("SIMULATED:", 1)[1].split("\031", 1)[0].split("|"), id_counter) simulated_pair = ( l.split("SIMULATED:", 1)[1] .split("\031", 1)[0] .split("|")[id_counter] .split(",") ) print(assigned_pair) print(simulated_pair, prev_id) print() assert assigned_pair == simulated_pair pairtools-1.1.3/tests/test_restrict.py000066400000000000000000000031251474715105500201540ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import sys import pytest import subprocess testdir = os.path.dirname(os.path.realpath(__file__)) def test_restrict(): """Restrict pairs file""" mock_pairs_path = os.path.join(testdir, "data", "mock.test-restr.pairs") mock_rfrag_path = os.path.join(testdir, "data", "mock.rsites.bed") try: result = subprocess.check_output( [ "python", "-m", "pairtools", "restrict", "-f", mock_rfrag_path, mock_pairs_path, ], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e # check if the header got transferred correctly true_header = [l.strip() for l in open(mock_pairs_path, "r") if l.startswith("@")] output_header = [l.strip() for l in result.split("\n") if l.startswith("#")] for l in true_header: assert any([l in l2 for l2 in output_header]) # check that the pairs got assigned properly cols = [x for x in output_header if x.startswith("#columns")][0].split(" ")[1:] COL_RFRAG1_TRUE = cols.index("rfrag_test1") COL_RFRAG2_TRUE = cols.index("rfrag_test2") COL_RFRAG1_OUTPUT = cols.index("rfrag1") COL_RFRAG2_OUTPUT = cols.index("rfrag2") for l in result.split("\n"): if l.startswith("#") or not l: continue line = l.split() assert line[COL_RFRAG1_TRUE] == line[COL_RFRAG1_OUTPUT] assert line[COL_RFRAG2_TRUE] == line[COL_RFRAG2_OUTPUT] pairtools-1.1.3/tests/test_scaling.py000066400000000000000000000013031474715105500177310ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import sys import subprocess import pytest import pandas as pd import io testdir = os.path.dirname(os.path.realpath(__file__)) def test_scaling(): mock_pairsam_path = os.path.join(testdir, "data", "mock.pairsam") try: result = subprocess.check_output( ["python", "-m", "pairtools", "scaling", mock_pairsam_path], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e output = pd.read_csv(io.StringIO(result), sep="\t", header=0) assert ( output["n_pairs"].sum() == 9 ) # double unmapped pairs are currently ignored by lib.scaling pairtools-1.1.3/tests/test_select.py000066400000000000000000000156001474715105500175750ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import sys import subprocess import pytest from pairtools.lib import pairsam_format testdir = os.path.dirname(os.path.realpath(__file__)) mock_pairsam_path = os.path.join(testdir, "data", "mock.pairsam") mock_chromsizes_path = os.path.join(testdir, "data", "mock.chrom.sizes") def test_preserve(): try: result = subprocess.check_output( ["python", "-m", "pairtools", "select", "True", mock_pairsam_path], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e pairsam_body = [ l.strip() for l in open(mock_pairsam_path, "r") if not l.startswith("#") and l.strip() ] output_body = [ l.strip() for l in result.split("\n") if not l.startswith("#") and l.strip() ] assert all(l in pairsam_body for l in output_body) def test_equal(): try: result = subprocess.check_output( [ "python", "-m", "pairtools", "select", '(pair_type == "RU") or (pair_type == "UR") or (pair_type == "UU")', mock_pairsam_path, ], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e print(result) pairsam_body = [ l.strip() for l in open(mock_pairsam_path, "r") if not l.startswith("#") and l.strip() ] output_body = [ l.strip() for l in result.split("\n") if not l.startswith("#") and l.strip() ] assert all(l.split("\t")[7] in ["RU", "UR", "UU"] for l in output_body) assert all( l in output_body for l in pairsam_body if l.split("\t")[7] in ["RU", "UR", "UU"] ) def test_csv(): try: result = subprocess.check_output( [ "python", "-m", "pairtools", "select", 'csv_match(pair_type, "RU,UR,UU")', mock_pairsam_path, ], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e print(result) pairsam_body = [ l.strip() for l in open(mock_pairsam_path, "r") if not l.startswith("#") and l.strip() ] output_body = [ l.strip() for l in result.split("\n") if not l.startswith("#") and l.strip() ] assert all(l.split("\t")[7] in ["RU", "UR", "UU"] for l in output_body) assert all( l in output_body for l in pairsam_body if l.split("\t")[7] in ["RU", "UR", "UU"] ) def test_wildcard(): try: result = subprocess.check_output( [ "python", "-m", "pairtools", "select", 'wildcard_match(pair_type, "*U")', mock_pairsam_path, ], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e print(result) pairsam_body = [ l.strip() for l in open(mock_pairsam_path, "r") if not l.startswith("#") and l.strip() ] output_body = [ l.strip() for l in result.split("\n") if not l.startswith("#") and l.strip() ] assert all(l.split("\t")[7] in ["NU", "MU", "RU", "UU"] for l in output_body) assert all( l in output_body for l in pairsam_body if l.split("\t")[7] in ["NU", "MU", "RU", "UU"] ) def test_regex(): try: result = subprocess.check_output( [ "python", "-m", "pairtools", "select", 'regex_match(pair_type, "[NM]U")', mock_pairsam_path, ], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e print(result) pairsam_body = [ l.strip() for l in open(mock_pairsam_path, "r") if not l.startswith("#") and l.strip() ] output_body = [ l.strip() for l in result.split("\n") if not l.startswith("#") and l.strip() ] assert all(l.split("\t")[7] in ["NU", "MU"] for l in output_body) assert all( l in output_body for l in pairsam_body if l.split("\t")[7] in ["NU", "MU"] ) def test_chrom_subset(): try: result = subprocess.check_output( [ "python", "-m", "pairtools", "select", "True", "--chrom-subset", mock_chromsizes_path, mock_pairsam_path, ], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e pairsam_body = [ l.strip() for l in open(mock_pairsam_path, "r") if not l.startswith("#") and l.strip() ] output_body = [ l.strip() for l in result.split("\n") if not l.startswith("#") and l.strip() ] output_header = [ l.strip() for l in result.split("\n") if l.startswith("#") and l.strip() ] chroms_from_chrom_field = [ l.strip().split()[1:] for l in result.split("\n") if l.startswith("#chromosomes:") ][0] assert set(chroms_from_chrom_field) == set(["chr1", "chr2"]) chroms_from_chrom_sizes = [ l.strip().split()[1] for l in result.split("\n") if l.startswith("#chromsize:") ] assert set(chroms_from_chrom_sizes) == set(["chr1", "chr2"]) def test_remove_columns(): """Test removal of columns from the file Example run: pairtools select True --remove-columns sam1,sam2 tests/data/mock.pairsam """ mock_pairs_path = os.path.join(testdir, "data", "mock.pairsam") try: result = subprocess.check_output( [ "python", "-m", "pairtools", "select", "True", "--remove-columns", "sam1,sam2", mock_pairs_path, ], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e # check if the columns are removed properly: pairsam_header = [l.strip() for l in result.split("\n") if l.startswith("#")] for l in pairsam_header: if l.startswith("#columns:"): line = l.strip() assert ( line == "#columns: readID chrom1 pos1 chrom2 pos2 strand1 strand2 pair_type" ) # check that the pairs got assigned properly for l in result.split("\n"): if l.startswith("#") or not l: continue assert len(l.split(pairsam_format.PAIRSAM_SEP)) == 8 pairtools-1.1.3/tests/test_sort.py000066400000000000000000000037751474715105500173170ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import sys import subprocess import pytest testdir = os.path.dirname(os.path.realpath(__file__)) def test_mock_pairsam(): mock_pairsam_path = os.path.join(testdir, "data", "mock.pairsam") try: result = subprocess.check_output( ["python", "-m", "pairtools", "sort", mock_pairsam_path], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e # Check that the only changes strings are a @PG record of a SAM header, # the "#sorted" entry and chromosomes pairsam_header = [ l.strip() for l in open(mock_pairsam_path, "r") if l.startswith("#") ] output_header = [l.strip() for l in result.split("\n") if l.startswith("#")] print(output_header) print(pairsam_header) for l in output_header: if not any([l in l2 for l2 in pairsam_header]): assert ( l.startswith("#samheader: @PG") or l.startswith("#sorted") or l.startswith("#chromosomes") ) pairsam_body = [ l.strip() for l in open(mock_pairsam_path, "r") if not l.startswith("#") and l.strip() ] output_body = [ l.strip() for l in result.split("\n") if not l.startswith("#") and l.strip() ] # check that all pairsam entries survived sorting: assert len(pairsam_body) == len(output_body) # check the sorting order of the output: prev_pair = None for l in output_body: cur_pair = l.split("\t")[1:8] if prev_pair is not None: assert cur_pair[0] >= prev_pair[0] if cur_pair[0] == prev_pair[0]: assert cur_pair[2] >= prev_pair[2] if cur_pair[2] == prev_pair[2]: assert int(cur_pair[1]) >= int(prev_pair[1]) if int(cur_pair[1]) == int(prev_pair[1]): assert int(cur_pair[3]) >= int(prev_pair[3]) prev_pair = cur_pair pairtools-1.1.3/tests/test_split.py000066400000000000000000000051051474715105500174500ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import sys import subprocess import pytest import tempfile testdir = os.path.dirname(os.path.realpath(__file__)) mock_pairsam_path = os.path.join(testdir, "data", "mock.pairsam") tmpdir = tempfile.TemporaryDirectory() tmpdir_name = tmpdir.name pairs_path = os.path.join(tmpdir_name, "out.pairs") sam_path = os.path.join(tmpdir_name, "out.sam") @pytest.fixture def setup_split(): try: subprocess.check_output( [ "python", "-m", "pairtools", "split", mock_pairsam_path, "--output-pairs", pairs_path, "--output-sam", sam_path, ], ) except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e def test_split(setup_split): pairsam_lines = [l.strip() for l in open(mock_pairsam_path, "r") if l.strip()] pairs_lines = [l.strip() for l in open(pairs_path, "r") if l.strip()] sam_lines = [l.strip() for l in open(sam_path, "r") if l.strip()] # check that all entries survived splitting: n_pairsam = len([l for l in pairsam_lines if not l.startswith("#")]) n_pairs = len([l for l in pairs_lines if not l.startswith("#")]) n_sam = len([l for l in sam_lines if not l.startswith("@")]) // 2 assert n_pairsam == n_pairs assert n_pairsam == n_sam # check that the header survived splitting: pairsam_header = [ l.strip() for l in open(mock_pairsam_path, "r") if l.strip() and l.startswith("#") ] pairs_header = [ l.strip() for l in open(pairs_path, "r") if l.strip() and l.startswith("#") ] sam_header = [ l.strip() for l in open(sam_path, "r") if l.strip() and l.startswith("@") ] assert all( any(l in l2 for l2 in pairsam_header) for l in sam_header if not l.startswith("@PG") ) assert all( l in pairsam_header for l in pairs_header if (not (l.startswith("#columns") or l.startswith("#samheader"))) ) columns_pairsam = [l for l in pairsam_header if l.startswith("#columns")][ 0 ].split()[1:] columns_pairs = [l for l in pairs_header if l.startswith("#columns")][0].split()[1:] assert ( ("sam1" in columns_pairsam) and ("sam2" in columns_pairsam) and ("sam1" not in columns_pairs) and ("sam2" not in columns_pairs) ) assert [c for c in columns_pairsam if c != "sam1" and c != "sam2"] == columns_pairs tmpdir.cleanup() pairtools-1.1.3/tests/test_stats.py000066400000000000000000000147561474715105500174670ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import sys import subprocess import numpy as np import yaml import pytest testdir = os.path.dirname(os.path.realpath(__file__)) def test_mock_pairsam(): mock_pairsam_path = os.path.join(testdir, "data", "mock.4stats.pairs") try: result = subprocess.check_output( ["python", "-m", "pairtools", "stats", "--yaml", mock_pairsam_path], ).decode("ascii") except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e stats = yaml.safe_load(result) # for k in stats["no_filter"]: # try: # stats["no_filter"][k] = int(stats["no_filter"][k]) # except (ValueError, TypeError): # stats["no_filter"][k] = float(stats["no_filter"][k]) assert stats["no_filter"]["total"] == 9 assert stats["no_filter"]["total_single_sided_mapped"] == 2 assert stats["no_filter"]["total_mapped"] == 6 assert stats["no_filter"]["total_dups"] == 1 assert stats["no_filter"]["cis"] == 3 assert stats["no_filter"]["trans"] == 2 assert stats["no_filter"]["pair_types"]["UU"] == 4 assert stats["no_filter"]["pair_types"]["NU"] == 1 assert stats["no_filter"]["pair_types"]["WW"] == 1 assert stats["no_filter"]["pair_types"]["UR"] == 1 assert stats["no_filter"]["pair_types"]["MU"] == 1 assert stats["no_filter"]["pair_types"]["DD"] == 1 assert stats["no_filter"]["chrom_freq"]["chr1/chr2"] == 1 assert stats["no_filter"]["chrom_freq"]["chr1/chr1"] == 3 assert stats["no_filter"]["chrom_freq"]["chr2/chr3"] == 1 for orientation in ("++", "+-", "-+", "--"): s = stats["no_filter"]["dist_freq"][orientation] for k, val in s.items(): if orientation == "++" and k in [1, 2, 42]: assert s[k] == 1 else: assert s[k] == 0 assert stats["no_filter"]["summary"]["frac_cis"] == 0.6 assert stats["no_filter"]["summary"]["frac_cis_1kb+"] == 0 assert stats["no_filter"]["summary"]["frac_cis_2kb+"] == 0 assert stats["no_filter"]["summary"]["frac_cis_4kb+"] == 0 assert stats["no_filter"]["summary"]["frac_cis_10kb+"] == 0 assert stats["no_filter"]["summary"]["frac_cis_20kb+"] == 0 assert stats["no_filter"]["summary"]["frac_cis_40kb+"] == 0 assert np.isclose(stats["no_filter"]["summary"]["frac_dups"], 1 / 6) def test_merge_stats(): mock_pairsam_path = os.path.join(testdir, "data", "mock.4stats.pairs") try: subprocess.check_output( [ "python", "-m", "pairtools", "stats", "--with-chromsizes", mock_pairsam_path, "--output", "mock.stats", ], ) subprocess.check_output( [ "python", "-m", "pairtools", "stats", "--no-chromsizes", mock_pairsam_path, "--output", "mock.no_chromsizes.stats", ], ) subprocess.check_output( [ "python", "-m", "pairtools", "stats", "mock.stats", "mock.stats", "--merge", "--output", "mock.merged_chromsizes.stats", ], ) subprocess.check_output( [ "python", "-m", "pairtools", "stats", "mock.stats", "mock.no_chromsizes.stats", "--merge", "--output", "mock.merged_mixed.stats", ], ) subprocess.check_output( [ "python", "-m", "pairtools", "stats", "mock.no_chromsizes.stats", "mock.no_chromsizes.stats", "--merge", "--output", "mock.merged_no_chromsizes.stats", ], ) except subprocess.CalledProcessError as e: print(e.output) print(sys.exc_info()) raise e from pairtools.lib.stats import PairCounter @pytest.fixture def pair_counter(): counter = PairCounter(filters={"f1": "filter1", "f2": "filter2"}) counter._dist_bins = np.array([1, 1000, 10000, 100000, 1000000]) # Populate the counter with some sample data counter._stat["f1"]["dist_freq"] = { "++": {1: 80, 1000: 80, 10000: 91, 100000: 95}, "--": {1: 100, 1000: 100, 10000: 100, 100000: 100}, "-+": {1: 100, 1000: 100, 10000: 100, 100000: 100}, "+-": {1: 120, 1000: 120, 10000: 109, 100000: 105}, } counter._stat["f2"]["dist_freq"] = { "++": {1: 200, 1000: 180, 10000: 160, 100000: 140}, "--": {1: 220, 1000: 190, 10000: 170, 100000: 150}, "-+": {1: 210, 1000: 185, 10000: 165, 100000: 145}, "+-": {1: 230, 1000: 195, 10000: 175, 100000: 155}, } return counter def test_find_dist_freq_convergence_distance(pair_counter): result = pair_counter.find_dist_freq_convergence_distance(0.1) assert "f1" in result assert "f2" in result f1_result = result["f1"] assert "convergence_dist" in f1_result assert "strands_w_max_convergence_dist" in f1_result assert "convergence_rel_diff_threshold" in f1_result assert "n_cis_pairs_below_convergence_dist" in f1_result assert "n_cis_pairs_below_convergence_dist_all_strands" in f1_result assert "n_cis_pairs_above_convergence_dist_all_strands" in f1_result assert "frac_cis_in_cis_below_convergence_dist" in f1_result assert "frac_cis_in_cis_below_convergence_dist_all_strands" in f1_result assert "frac_cis_in_cis_above_convergence_dist_all_strands" in f1_result assert "frac_total_mapped_in_cis_below_convergence_dist" in f1_result assert "frac_total_mapped_in_cis_below_convergence_dist_all_strands" in f1_result assert "frac_total_mapped_in_cis_above_convergence_dist_all_strands" in f1_result assert f1_result["convergence_rel_diff_threshold"] == 0.1 assert f1_result["convergence_dist"] == 10000 assert f1_result["strands_w_max_convergence_dist"] == "++" # f2_result = result["f2"] # assert "convergence_dist" in f2_result # assert "strands_w_max_convergence_dist" in f2_result # assert "convergence_rel_diff_threshold" in f2_result # Add more assertions for f2_result as needed