[med-svn] [khmer] 01/01: New upstream version 2.1.2+dfsg
Michael Crusoe
misterc-guest at moszumanska.debian.org
Sat Oct 7 17:04:05 UTC 2017
This is an automated email from the git hooks/post-receive script.
misterc-guest pushed a commit to annotated tag upstream/2.1.2+dfsg
in repository khmer.
commit 5744859184e534a7cd484b98fa1cdf1bc069e8b9
Author: Michael R. Crusoe <michael.crusoe at gmail.com>
Date: Thu Oct 5 09:09:07 2017 -0700
New upstream version 2.1.2+dfsg
---
.gitignore | 1 +
CHANGELOG.md | 18 +
Doxyfile.in | 6 +-
MANIFEST.in | 1 +
Makefile | 52 +-
doc/dev/a-quick-guide-to-testing.rst | 2 +-
doc/dev/codebase-guide.rst | 9 +-
doc/dev/development.rst | 48 +-
doc/dev/guidelines-continued-dev.rst | 28 +
doc/requirements.txt | 1 +
examples/c++-api/Makefile | 19 +-
examples/c++-api/bloom.cc | 6 +-
examples/c++-api/consume.cc | 6 +-
examples/c++-api/exact-counting.cc | 7 +-
{lib => include/khmer}/.gitignore | 0
include/khmer/_cpy_countgraph.hh | 35 +
.../khmer/_cpy_counttable.hh | 30 +-
include/khmer/_cpy_graphlabels.hh | 87 +
include/khmer/_cpy_hashgraph.hh | 274 +
include/khmer/_cpy_hashset.hh | 73 +
include/khmer/_cpy_hashtable.hh | 145 +
include/khmer/_cpy_hllcounter.hh | 81 +
include/khmer/_cpy_khmer.hh | 114 +
include/khmer/_cpy_nodegraph.hh | 42 +
.../khmer/_cpy_nodetable.hh | 35 +-
include/khmer/_cpy_readaligner.hh | 43 +
include/khmer/_cpy_readparsers.hh | 140 +
.../khmer/_cpy_smallcountgraph.hh | 41 +-
.../khmer/_cpy_smallcounttable.hh | 33 +-
include/khmer/_cpy_subsetpartition.hh | 58 +
include/khmer/_cpy_utils.hh | 67 +
{lib => include/oxli}/.gitignore | 0
{lib => include/oxli}/alphabets.hh | 4 +-
{lib => include/oxli}/assembler.hh | 6 +-
{lib => include/oxli}/hashgraph.hh | 12 +-
{lib => include/oxli}/hashtable.hh | 109 +-
{lib => include/oxli}/hllcounter.hh | 4 +-
{lib => include/oxli}/kmer_filters.hh | 4 +-
{lib => include/oxli}/kmer_hash.hh | 8 +-
{lib => include/oxli}/labelhash.hh | 8 +-
{lib => include/oxli}/magic | 6 +-
lib/khmer.hh => include/oxli/oxli.hh | 10 +-
.../oxli/oxli_exception.hh | 50 +-
{lib => include/oxli}/read_aligner.hh | 10 +-
{lib => include/oxli}/read_parsers.hh | 48 +-
{lib => include/oxli}/storage.hh | 16 +-
{lib => include/oxli}/subset.hh | 4 +-
{lib => include/oxli}/traversal.hh | 4 +-
khmer/__init__.py | 7 +-
khmer/_khmer.cc | 4959 ------------
khmer/_oxli/__init__.py | 6 +
khmer/_oxli/assembly.pxd | 75 +
khmer/_oxli/assembly.pyx | 134 +
khmer/_oxli/graphs.pxd | 182 +
khmer/_oxli/graphs.pyx | 20 +
khmer/_oxli/hashing.pxd | 67 +
khmer/_oxli/hashing.pyx | 66 +
khmer/_oxli/hllcounter.pxd | 38 +
khmer/_oxli/oxli_types.pxd | 19 +
khmer/_oxli/parsing.pxd | 164 +
khmer/_oxli/parsing.pyx | 532 ++
khmer/_oxli/traversal.pxd | 19 +
khmer/_oxli/utils.pxd | 14 +
khmer/_oxli/utils.pyx | 42 +
khmer/_version.py | 6 +-
khmer/khmer_args.py | 5 +-
khmer/thread_utils.py | 1 +
khmer/utils.py | 119 +-
oxli/__init__.py | 1 +
oxli/build_graph.py | 1 +
pytest.ini | 4 +
scripts/abundance-dist-single.py | 3 +-
scripts/annotate-partitions.py | 1 +
scripts/count-median.py | 1 +
scripts/do-partition.py | 1 +
scripts/extract-partitions.py | 1 +
scripts/fastq-to-fasta.py | 1 +
scripts/filter-abund-single.py | 2 +-
scripts/filter-stoptags.py | 1 +
scripts/find-knots.py | 1 +
scripts/interleave-reads.py | 1 +
scripts/load-into-counting.py | 2 +-
scripts/make-initial-stoptags.py | 1 +
scripts/partition-graph.py | 1 +
scripts/sample-reads-randomly.py | 1 +
scripts/split-paired-reads.py | 1 +
scripts/unique-kmers.py | 1 +
setup.cfg | 4 +-
setup.py | 97 +-
{lib => src/khmer}/.gitignore | 0
.../khmer/_cpy_countgraph.cc | 220 +-
.../khmer/_cpy_counttable.cc | 56 +-
src/khmer/_cpy_graphlabels.cc | 510 ++
.../khmer/_cpy_hashgraph.cc | 833 +-
src/khmer/_cpy_hashset.cc | 355 +
src/khmer/_cpy_hashtable.cc | 1016 +++
src/khmer/_cpy_hllcounter.cc | 364 +
src/khmer/_cpy_khmer.cc | 441 ++
src/khmer/_cpy_nodegraph.cc | 162 +
.../khmer/_cpy_nodetable.cc | 65 +-
src/khmer/_cpy_readaligner.cc | 242 +
src/khmer/_cpy_readparsers.cc | 639 ++
.../khmer/_cpy_smallcountgraph.cc | 133 +-
.../khmer/_cpy_smallcounttable.cc | 52 +-
src/khmer/_cpy_subsetpartition.cc | 263 +
src/khmer/_cpy_utils.cc | 177 +
{lib => src/oxli}/.check_openmp.cc | 0
{lib => src/oxli}/.gitignore | 0
{lib => src/oxli}/Makefile | 55 +-
{lib => src/oxli}/alphabets.cc | 4 +-
{lib => src/oxli}/assembler.cc | 4 +-
{lib => src/oxli}/hashgraph.cc | 96 +-
{lib => src/oxli}/hashtable.cc | 179 +-
{lib => src/oxli}/hllcounter.cc | 19 +-
{lib => src/oxli}/kmer_filters.cc | 10 +-
{lib => src/oxli}/kmer_hash.cc | 45 +-
{lib => src/oxli}/labelhash.cc | 95 +-
{lib => src/oxli}/oxli.pc.in | 0
{lib => src/oxli}/read_aligner.cc | 10 +-
{lib => src/oxli}/read_parsers.cc | 38 +-
{lib => src/oxli}/storage.cc | 102 +-
{lib => src/oxli}/subset.cc | 146 +-
{lib => src/oxli}/test-Colors.cc | 14 +-
{lib => src/oxli}/test-compile.cc | 4 +-
{lib => src/oxli}/traversal.cc | 14 +-
tests/{test_assembly.py => graph_features.py} | 389 +-
tests/khmer_tst_utils.py | 1 +
tests/test-data/banding-reads.fq | 8000 ++++++++++++++++++++
tests/test-data/bogus.fa | 2 +
tests/test_banding.py | 158 +
tests/test_countgraph.py | 6 -
tests/test_cython_assembly.py | 441 ++
tests/test_cython_parsing.py | 442 ++
tests/test_filter_abund.py | 2 +
tests/test_functions.py | 295 +-
tests/test_scripts.py | 25 +
tests/test_sequence_validation.py | 83 +-
tests/test_subset_graph.py | 2 +
tests/test_tabletype.py | 5 +-
tests/test_threaded_sequence_processor.py | 1 +
140 files changed, 17454 insertions(+), 7168 deletions(-)
diff --git a/.gitignore b/.gitignore
index c0ec73d..300b2c4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -52,4 +52,5 @@ pylint_report.txt
pep8_report.txt
pep257_report.txt
.cache/
+khmer/_oxli/*.cpp
.eggs
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8fca9e9..283bd4f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,24 @@ The khmer project's command line scripts adhere to
[Semantic Versioning](http://semver.org/). The Python and C++ APIs are not yet
under semantic versioning, but will be in future versions of khmer.
+## [Unreleased]
+
+### Added
+- Cython wrapper for liboxli.
+- Cython containers for parsing, assembly, and hashing.
+- Header install for liboxli.
+- New function `consume_fasta_banding` for bulk loading of sequences into
+ hashtables. Only k-mers whose hashed values fall within a specified range are
+ counted.
+
+### Changed
+- Non-ACTG handling significantly changed so that only bulk-loading functions
+ "clean" sequences of non-DNA characters. See #1590 for details.
+- Split CPython wrapper file into per-class files under `src/khmer` and
+ `include/khmer`.
+- Moved liboxli headers to include/oxli and implementations to src/oxli.
+- Removed CPython assembler wrappers.
+
## [2.1.1] - 2017-05-25
### Added
- Document for submission to the Journal of Open Source Software.
diff --git a/Doxyfile.in b/Doxyfile.in
index 3e358cc..92f2702 100644
--- a/Doxyfile.in
+++ b/Doxyfile.in
@@ -753,8 +753,10 @@ WARN_LOGFILE =
# spaces.
# Note: If this tag is empty the current directory is searched.
-INPUT = lib \
- khmer \
+INPUT = include/oxli \
+ include/khmer \
+ src/oxli \
+ src/khmer \
scripts
# This tag can be used to specify the character encoding of the source files
diff --git a/MANIFEST.in b/MANIFEST.in
index b88b08a..6a317ff 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -3,6 +3,7 @@ include versioneer.py MANIFEST.in CITATION CONTRIBUTING.md Doxyfile.in
include LICENSE TODO .ycm_extra_conf.py authors.csv
recursive-include lib *.hh *.cc [Mm]akefile* get_version.py
recursive-include khmer *.hh
+recursive-include khmer/_oxli *.pxd *.cpp
recursive-include third-party *.cc *.1 *.xsl README* sample* words* *.sh *.c
recursive-include third-party manual* [Mm]akefile* *.pl *.dsp CHANGES *.txt *.h
recursive-include third-party ChangeLog FAQ INDEX configure *.xsl
diff --git a/Makefile b/Makefile
index 05afbfb..7ce926e 100644
--- a/Makefile
+++ b/Makefile
@@ -37,13 +37,17 @@
# `SHELL=bash` Will break Titus's laptop, so don't use BASH-isms like
# `[[` conditional expressions.
-CPPSOURCES=$(wildcard lib/*.cc lib/*.hh khmer/_khmer.cc khmer/*.hh) setup.py
+#
+PREFIX=/usr/local
+CPPSOURCES=$(wildcard src/oxli/*.cc include/oxli/*.hh src/khmer/_cpy_*.cc include/khmer/_cpy_*.hh) setup.py
+CYSOURCES=$(wildcard khmer/_oxli/*.pxd khmer/_oxli/*.pyx)
PYSOURCES=$(filter-out khmer/_version.py, \
$(wildcard khmer/*.py scripts/*.py oxli/*.py) )
-SOURCES=$(PYSOURCES) $(CPPSOURCES) setup.py
+SOURCES=$(PYSOURCES) $(CPPSOURCES) $(CYSOURCES) setup.py
DEVPKGS=pep8==1.6.2 diff_cover autopep8 pylint coverage gcovr pytest \
- pydocstyle pyenchant
+ 'pytest-runner>=2.0,<3dev' pydocstyle pyenchant
+
GCOVRURL=git+https://github.com/nschum/gcovr.git@never-executed-branches
VERSION=$(shell ./setup.py version | grep Version | awk '{print $$4}' \
@@ -58,6 +62,7 @@ INCLUDESTRING=$(shell gcc -E -x c++ - -v < /dev/null 2>&1 >/dev/null \
| grep '^ /' | grep -v cc1plus)
INCLUDEOPTS=$(shell gcc -E -x c++ - -v < /dev/null 2>&1 >/dev/null \
| grep '^ /' | grep -v cc1plus | awk '{print "-I" $$1 " "}')
+
PYINCLUDE=$(shell python -c "from __future__ import print_function; \
import sysconfig; flags = ['-I' + sysconfig.get_path('include'), \
'-I' + sysconfig.get_path('platinclude')]; print(' '.join(flags))")
@@ -82,6 +87,7 @@ endif
MODEXT=$(shell python -c \
"import sysconfig;print(sysconfig.get_config_var('SO'))")
EXTENSION_MODULE = khmer/_khmer$(MODEXT)
+CY_MODULES = $($(wildcard khmer/_oxli/*.pyx): .pyx=.$(MODEXT))
PYLINT_TEMPLATE="{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}"
@@ -102,7 +108,7 @@ install-dependencies:
## sharedobj : build khmer shared object file
sharedobj: $(EXTENSION_MODULE)
-$(EXTENSION_MODULE): $(CPPSOURCES)
+$(EXTENSION_MODULE): $(CPPSOURCES) $(CYSOURCES)
./setup.py build_ext --inplace
coverage-debug: $(CPPSOURCES)
@@ -122,18 +128,21 @@ dist/khmer-$(VERSION).tar.gz: $(SOURCES)
## clean : clean up all temporary / machine-generated files
clean: FORCE
- cd lib && $(MAKE) clean || true
+ cd src/oxli && $(MAKE) clean || true
cd tests && rm -rf khmertest_* || true
- rm -f pytest_runner-*.egg pytests.xml
+ rm -f pytests.xml
rm -f $(EXTENSION_MODULE)
- rm -f khmer/*.pyc lib/*.pyc scripts/*.pyc tests/*.pyc oxli/*.pyc \
- sandbox/*.pyc khmer/__pycache__/* sandbox/__pycache__/*
+ rm -f khmer/*.pyc scripts/*.pyc tests/*.pyc oxli/*.pyc \
+ sandbox/*.pyc khmer/__pycache__/* sandbox/__pycache__/* \
+ khmer/_oxli/*.cpp
./setup.py clean --all || true
rm -f coverage-debug
rm -Rf .coverage coverage-gcovr.xml coverage.xml
rm -f diff-cover.html
rm -Rf build dist
- rm -rf __pycache__/ .eggs/ khmer.egg-info/
+ rm -rf __pycache__/ khmer.egg-info/
+ @find ./ -type d -name __pycache__ -exec rm -rf {} +
+ @find ./khmer/ -type f -name *$(MODEXT) -exec rm -f {} +
-rm -f *.gcov
debug: FORCE
@@ -263,32 +272,37 @@ doxygen: doc/doxygen/html/index.html
doc/doxygen/html/index.html: $(CPPSOURCES) $(PYSOURCES)
mkdir -p doc/doxygen
- sed "s=\$${VERSION}=$$(python ./lib/get_version.py)=" Doxyfile.in | \
+ sed "s=\$${VERSION}=$(VERSION)=" Doxyfile.in | \
sed "s=\$${INCLUDES}=$(INCLUDESTRING)=" > Doxyfile
doxygen
-lib: FORCE
- cd lib && \
+liboxli: FORCE
+ cd src/oxli && \
$(MAKE)
-# Runs a test of ./lib
+install-liboxli: liboxli
+ cd src/oxli && $(MAKE) install PREFIX=$(PREFIX)
+ mkdir -p $(PREFIX)/include/khmer
+ cp -r include/khmer/_cpy_*.hh $(PREFIX)/include/khmer/
+
+# Runs a test of liboxli
libtest: FORCE
rm -rf install_target
mkdir -p install_target
- cd lib && \
+ cd src/oxli && \
$(MAKE) clean && \
$(MAKE) all && \
$(MAKE) install PREFIX=../install_target
test -d install_target/include
- test -f install_target/include/oxli/khmer.hh
+ test -f install_target/include/oxli/oxli.hh
test -d install_target/lib
test -f install_target/lib/liboxli.a
$(CXX) -std=c++11 -o install_target/test-prog-static \
- -I install_target/include lib/test-compile.cc \
+ -I install_target/include src/oxli/test-compile.cc \
install_target/lib/liboxli.a
$(CXX) -std=c++11 -o install_target/test-prog-dynamic \
-I install_target/include -L install_target/lib \
- lib/test-compile.cc -loxli
+ src/oxli/test-compile.cc -loxli
rm -rf install_target
## test : run the khmer test suite
@@ -297,12 +311,12 @@ test: FORCE
py.test -m ${TESTATTR}
sloccount.sc: $(CPPSOURCES) $(PYSOURCES) $(wildcard tests/*.py) Makefile
- sloccount --duplicates --wide --details lib khmer scripts tests \
+ sloccount --duplicates --wide --details include src khmer scripts tests \
setup.py Makefile > sloccount.sc
## sloccount : count lines of code
sloccount:
- sloccount lib khmer scripts tests setup.py Makefile
+ sloccount src include khmer scripts tests setup.py Makefile
coverity-build:
if [ -x "${cov_analysis_dir}/bin/cov-build" ]; \
diff --git a/doc/dev/a-quick-guide-to-testing.rst b/doc/dev/a-quick-guide-to-testing.rst
index 0539ff9..aef91bc 100644
--- a/doc/dev/a-quick-guide-to-testing.rst
+++ b/doc/dev/a-quick-guide-to-testing.rst
@@ -51,7 +51,7 @@ working!
* We maintain fairly complete test coverage of our code. What this
means is that we have automated tests that, when run, execute most
- of the lines of Python and C++ code in our lib/, khmer/ and scripts/
+ of the lines of Python and C++ code in our src/, khmer/ and scripts/
directories. This doesn't *guarantee* things are correct, but it
does mean that at least most of the code works at some basic level.
diff --git a/doc/dev/codebase-guide.rst b/doc/dev/codebase-guide.rst
index 167aea6..f110a3f 100644
--- a/doc/dev/codebase-guide.rst
+++ b/doc/dev/codebase-guide.rst
@@ -42,10 +42,15 @@ A quick guide to the khmer codebase
The ``CHANGELOG.md`` file lists major changes to the codebase with each version,
with the most recent version first.
-The ``lib/`` directory contains all of the C++ code.
+The ``include/`` directory contains all C++ and C headers. The core C++ library
+is under ``include/oxli``, and the CPython wrapper is under ``include/khmer``.
+
+The ``src`` directory contains all of the C++ and CPython code. This structure
+corresponds to the one in ``include``. The main CPython module is built in
+``src/khmer/_cpy_khmer.hh``.
The ``khmer/`` directory contains the `khmer` package (``khmer/__init__.py``,
-etc) and the C++-to-Python bridge (``khmer/_khmer.cc``).
+etc) and experimental Cython bindings under ``khmer/_oxli``.
The ``scripts/`` and ``sandbox/`` directory contain Python command-line scripts.
diff --git a/doc/dev/development.rst b/doc/dev/development.rst
index 1c964c4..f455d90 100644
--- a/doc/dev/development.rst
+++ b/doc/dev/development.rst
@@ -36,8 +36,8 @@
Contact: khmer-project at idyll.org
-Development miscellany
-======================
+Development Nuts and Bolts
+==========================
Third-party use
---------------
@@ -127,7 +127,7 @@ Python / C integration
----------------------
The Python extension that wraps the C++ core of khmer lives in
-``khmer/_khmer.cc``
+``src/khmer/_cpy_khmer.cc``
This wrapper code is tedious and annoying so we use a static analysis tool to
check for correctness.
@@ -151,13 +151,13 @@ Errors to ignore: "Unhandled Python exception raised calling 'execute' method",
Warnings to address: ::
- khmer/_khmer.cc:3109:1: note: this function is too complicated
+ src/khmer/_cpy_khmer.cc:3109:1: note: this function is too complicated
for the reference-count checker to fully analyze: not all paths were
analyzed
Adjust --maxtrans and re-run. ::
- khmer/_khmer.cc:2191:61: warning: Mismatching type in call to
+ src/khmer/_cpy_khmer.cc:2191:61: warning: Mismatching type in call to
Py_BuildValue with format code "i" [enabled by default]
argument 2 ("D.68937") had type
"long long unsigned int"
@@ -169,7 +169,43 @@ See below for a format string cheat sheet One also benefits by matching C type
with the function signature used later.
"I" for unsigned int
-"K" for unsigned long long a.k.a khmer::HashIntoType.
+"K" for unsigned long long a.k.a oxli::HashIntoType.
+
+Linking Against liboxli
+-----------------------
+
+The C++ library can be installed as a shared library and linked against from external projects.
+To build and install it, run: ::
+
+ make install-liboxli
+
+This command can be given an optional ``PREFIX`` variable to control where the library and headers are
+installed (by default, in ``/usr/local``. Code can then include the headers by prefixing their paths
+with ``oxli/``. For example, to use ``Hashgraph``, use ``#include "oxli/hashgraph.hh"``. To compile,
+add ``-Ioxli`` to your compiler invocation.
+
+
+Experimental Cython Bindings
+----------------------------
+
+khmer includes experimental Cython bindings in ``khmer/_oxli``. ``wrapper.pxd`` contains all the C++
+library declarations. To use extension classes in regular Python code, simply ``import`` them: for
+example, to get the wrapped ``ReadParser``, use ``from khmer._oxli.parsing import FastxParser``.
+Extension classes can all be used in external Cython code by using `cimport`; the declarations in
+``wrapper.pxd`` can also be used, meaning you have access to liboxli. Note that for any ``cimport``'ed code
+to work, you'll need to install liboxli and include ``oxli`` in your Cython project's ``Extension``
+class. This is done by adding ``oxli`` to the ``libraries`` argument of your ``Extension`` object in
+``setup.py``, which instructs setuptools to add ``-Ioxli`` to its compiler invocation.
+
+ An example: ::
+
+
+ cy_ext = Extension('mypackage.example',
+ sources = 'mypackage/example.pyx',
+ extra_compile_args = ['-arch', 'x86_64', '-stdlib=libc++'],
+ libraries = ['oxli'],
+ include_dirs = [],
+ language = 'c++')
Read handling
-------------
diff --git a/doc/dev/guidelines-continued-dev.rst b/doc/dev/guidelines-continued-dev.rst
index e7958e5..56f4d97 100644
--- a/doc/dev/guidelines-continued-dev.rst
+++ b/doc/dev/guidelines-continued-dev.rst
@@ -142,6 +142,34 @@ GNU `aspell` can also be used to check the spelling in a single file::
aspell check --mode ccpp $filename
+Cython Style
+~~~~~~~~~~~~
+
+Cython code can become messy very quickly, and as such, we have guidelines
+for style and structure.
+
+When wrapping code from liboxli:
+
+- `extern` definition should begin with `Cp`; for example, `CpHashtable` wraps
+ `oxli::Hashtable`.
+- If the extension class wrapping the liboxli class stores it as a pointer,
+ it should be named `_this`. If it wraps a stack object directly, it should
+ be named `_obj`.
+
+For imports,
+
+- `__future__` imports at the top, as usual.
+- `libc` cimports next,
+- then `libcpp` imports and cimports.
+- followed by cimports
+- and finally, regular imports.
+
+Generally,
+
+- Pure C methods should be underscore prefixed.
+- `cpdef` methods do not need to be underscore prefixed.
+
+
Resolving merge conflicts
-------------------------
diff --git a/doc/requirements.txt b/doc/requirements.txt
index e1b9440..f56137b 100644
--- a/doc/requirements.txt
+++ b/doc/requirements.txt
@@ -1,3 +1,4 @@
sphinxcontrib-autoprogram==0.1.2
setuptools>=3.4.1
guzzle_sphinx_theme==0.7.11
+Cython>=0.25.2
diff --git a/examples/c++-api/Makefile b/examples/c++-api/Makefile
index 982053a..4cd0641 100644
--- a/examples/c++-api/Makefile
+++ b/examples/c++-api/Makefile
@@ -1,20 +1,23 @@
-CFLAGS=--std=c++11 \
- -I ../../lib \
+CXXFLAGS=--std=c++11 \
+ -I ../../include/ \
-I ../../third-party/smhasher \
-I ../../third-party/seqan/core/include/
+TESTS=exact-counting bloom consume
+
+%: %.cc ../../src/oxli/liboxli.a
+ $(CXX) $(CXXFLAGS) $< ../../src/oxli/liboxli.a -o $@
+
+../../src/oxli/liboxli.a:
+ cd ../../src/oxli && make
+
run: all
./exact-counting
./bloom
./consume reads.fastq
-all: exact-counting bloom consume
+all: $(TESTS)
clean:
-rm -f exact-counting bloom consume
-%: %.cc ../../lib/liboxli.a
- $(CXX) $(CFLAGS) -o $* $*.cc ../../lib/liboxli.a
-
-../../lib/liboxli.a:
- cd ../../lib && make
diff --git a/examples/c++-api/bloom.cc b/examples/c++-api/bloom.cc
index 5657839..cbf829a 100644
--- a/examples/c++-api/bloom.cc
+++ b/examples/c++-api/bloom.cc
@@ -3,10 +3,10 @@
// memory requirements.
#include <vector>
-#include "khmer.hh"
-#include "hashtable.hh"
+#include "oxli/oxli.hh"
+#include "oxli/hashtable.hh"
-using namespace khmer;
+using namespace oxli;
int main()
{
diff --git a/examples/c++-api/consume.cc b/examples/c++-api/consume.cc
index 8d805e2..3b2ad22 100644
--- a/examples/c++-api/consume.cc
+++ b/examples/c++-api/consume.cc
@@ -1,10 +1,10 @@
// A demonstration of khmer's primary sequence loading function.
#include <vector>
-#include "khmer.hh"
-#include "hashtable.hh"
+#include "oxli/oxli.hh"
+#include "oxli/hashtable.hh"
-using namespace khmer;
+using namespace oxli;
using namespace read_parsers;
int main(int argc, char **argv)
diff --git a/examples/c++-api/exact-counting.cc b/examples/c++-api/exact-counting.cc
index a42549d..36eff62 100644
--- a/examples/c++-api/exact-counting.cc
+++ b/examples/c++-api/exact-counting.cc
@@ -3,10 +3,11 @@
#include <vector>
#include <cmath>
-#include "khmer.hh"
-#include "hashgraph.hh"
+#include "oxli/oxli.hh"
+#include "oxli/hashgraph.hh"
-using namespace khmer;
+
+using namespace oxli;
int main()
{
diff --git a/lib/.gitignore b/include/khmer/.gitignore
similarity index 100%
copy from lib/.gitignore
copy to include/khmer/.gitignore
diff --git a/include/khmer/_cpy_countgraph.hh b/include/khmer/_cpy_countgraph.hh
new file mode 100644
index 0000000..acef8a7
--- /dev/null
+++ b/include/khmer/_cpy_countgraph.hh
@@ -0,0 +1,35 @@
+#ifndef _CPY_COUNTGRAPH_HH
+#define _CPY_COUNTGRAPH_HH
+
+#include <Python.h>
+#include "_cpy_utils.hh"
+#include "_cpy_hashgraph.hh"
+
+
+namespace khmer {
+
+typedef struct {
+ khmer_KHashgraph_Object khashgraph;
+ oxli::Countgraph * countgraph;
+} khmer_KCountgraph_Object;
+
+extern PyTypeObject khmer_KCountgraph_Type
+CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KCountgraph_Object");
+
+extern PyMethodDef khmer_countgraph_methods[];
+
+PyObject* khmer_countgraph_new(PyTypeObject * type, PyObject * args,
+ PyObject * kwds);
+
+void khmer_countgraph_dealloc(khmer_KCountgraph_Object * obj);
+
+PyObject *
+count_get_raw_tables(khmer_KCountgraph_Object * self, PyObject * args);
+
+PyObject *
+count_do_subset_partition_with_abundance(khmer_KCountgraph_Object * me,
+ PyObject * args);
+
+}
+
+#endif
diff --git a/lib/alphabets.hh b/include/khmer/_cpy_counttable.hh
similarity index 76%
copy from lib/alphabets.hh
copy to include/khmer/_cpy_counttable.hh
index 58b7129..81a9803 100644
--- a/lib/alphabets.hh
+++ b/include/khmer/_cpy_counttable.hh
@@ -1,5 +1,6 @@
/*
This file is part of khmer, https://github.com/dib-lab/khmer/, and is
+Copyright (C) 2010-2015, Michigan State University.
Copyright (C) 2015-2016, The Regents of the University of California.
Redistribution and use in source and binary forms, with or without
@@ -34,19 +35,26 @@ LICENSE (END)
Contact: khmer-project at idyll.org
*/
-#ifndef SYMBOLS_HH
-#define SYMBOLS_HH
+#ifndef _CPY_COUNTTABLE_HH
+#define _CPY_COUNTTABLE_HH
-namespace khmer
-{
-namespace alphabets
-{
+#include <Python.h>
+#include "_cpy_khmer.hh"
-extern std::string DNA_SIMPLE;
-extern std::string DNAN_SIMPLE;
-extern std::string IUPAC_NUCL;
-extern std::string IUPAC_AA;
+namespace khmer {
+
+typedef struct {
+ khmer_KHashtable_Object khashtable;
+ oxli::Counttable * counttable;
+} khmer_KCounttable_Object;
+
+extern PyTypeObject khmer_KCounttable_Type
+CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KCounttable_Object");
+
+PyObject* khmer_counttable_new(PyTypeObject * type, PyObject * args,
+ PyObject * kwds);
}
-}
+
+
#endif
diff --git a/include/khmer/_cpy_graphlabels.hh b/include/khmer/_cpy_graphlabels.hh
new file mode 100644
index 0000000..454fca7
--- /dev/null
+++ b/include/khmer/_cpy_graphlabels.hh
@@ -0,0 +1,87 @@
+#ifndef _CPY_GRAPHLABELS_HH
+#define _CPY_GRAPHLABELS_HH
+
+#include <Python.h>
+#include "_cpy_utils.hh"
+#include "oxli/labelhash.hh"
+
+
+namespace khmer {
+
+typedef struct {
+ PyObject_HEAD
+ oxli::LabelHash * labelhash;
+} khmer_KGraphLabels_Object;
+
+
+extern PyTypeObject khmer_KGraphLabels_Type;
+
+extern PyMethodDef khmer_graphlabels_methods[];
+
+PyObject * khmer_graphlabels_new(PyTypeObject * type, PyObject *args,
+ PyObject *kwds);
+
+void khmer_graphlabels_dealloc(khmer_KGraphLabels_Object * obj);
+
+
+PyObject *
+labelhash_get_all_labels(khmer_KGraphLabels_Object * me, PyObject * args);
+
+
+PyObject *
+labelhash_consume_seqfile_and_tag_with_labels(khmer_KGraphLabels_Object * me,
+ PyObject * args);
+
+
+PyObject *
+labelhash_consume_partitioned_fasta_and_tag_with_labels(
+ khmer_KGraphLabels_Object * me, PyObject * args);
+
+
+PyObject *
+labelhash_consume_sequence_and_tag_with_labels(khmer_KGraphLabels_Object * me,
+ PyObject * args);
+
+
+PyObject *
+labelhash_sweep_label_neighborhood(khmer_KGraphLabels_Object * me,
+ PyObject * args);
+
+// Similar to find_all_tags, but returns tags in a way actually usable by python
+// need a tags_in_sequence iterator or function in c++ land for reuse in all
+// these functions
+
+
+PyObject *
+labelhash_sweep_tag_neighborhood(khmer_KGraphLabels_Object * me,
+ PyObject * args);
+
+
+PyObject *
+labelhash_get_tag_labels(khmer_KGraphLabels_Object * me, PyObject * args);
+
+
+PyObject *
+labelhash_n_labels(khmer_KGraphLabels_Object * me, PyObject * args);
+
+
+PyObject *
+labelhash_label_across_high_degree_nodes(khmer_KGraphLabels_Object * me,
+ PyObject * args);
+
+
+PyObject *
+labelhash_assemble_labeled_path(khmer_KGraphLabels_Object * me,
+ PyObject * args);
+
+
+PyObject *
+labelhash_save_labels_and_tags(khmer_KGraphLabels_Object * me, PyObject * args);
+
+
+PyObject *
+labelhash_load_labels_and_tags(khmer_KGraphLabels_Object * me, PyObject * args);
+
+}
+
+#endif
diff --git a/include/khmer/_cpy_hashgraph.hh b/include/khmer/_cpy_hashgraph.hh
new file mode 100644
index 0000000..a2ba39b
--- /dev/null
+++ b/include/khmer/_cpy_hashgraph.hh
@@ -0,0 +1,274 @@
+/*
+This file is part of khmer, https://github.com/dib-lab/khmer/, and is
+Copyright (C) 2010-2015, Michigan State University.
+Copyright (C) 2015-2016, The Regents of the University of California.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+ * Neither the name of the Michigan State University nor the names
+ of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+LICENSE (END)
+
+Contact: khmer-project at idyll.org
+*/
+#ifndef _CPY_HASHGRAPH_HH
+#define _CPY_HASHGRAPH_HH
+
+#include <Python.h>
+#include "_cpy_utils.hh"
+#include "_cpy_hashtable.hh"
+#include "oxli/hashgraph.hh"
+
+
+namespace khmer {
+
+
+typedef struct {
+ khmer_KHashtable_Object khashtable;
+ oxli::Hashgraph * hashgraph;
+} khmer_KHashgraph_Object;
+
+
+extern PyTypeObject khmer_KHashgraph_Type
+CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KHashgraph_Object");
+
+
+extern PyMethodDef khmer_hashgraph_methods[];
+
+
+//
+// Method definitions
+//
+
+
+PyObject *
+hashgraph_find_high_degree_nodes(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_neighbors(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_traverse_linear_path(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_assemble_linear_path(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_n_tags(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_print_stop_tags(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_print_tagset(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_load_stop_tags(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+
+PyObject *
+hashgraph_save_stop_tags(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+
+PyObject *
+hashgraph_repartition_largest_partition(khmer_KHashgraph_Object * me,
+ PyObject * args);
+
+
+PyObject *
+hashgraph_calc_connected_graph_size(khmer_KHashgraph_Object * me,
+ PyObject * args);
+
+
+PyObject *
+hashgraph_kmer_degree(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_trim_on_stoptags(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_do_subset_partition(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+
+PyObject *
+hashgraph_merge_subset(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_merge_from_disk(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_consume_seqfile_and_tag_with_reads_parser(khmer_KHashgraph_Object * me,
+ PyObject * args);
+
+
+PyObject *
+hashgraph_consume_partitioned_fasta(khmer_KHashgraph_Object * me,
+ PyObject * args);
+
+
+PyObject *
+hashgraph_find_all_tags(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_assign_partition_id(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_add_tag(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_add_stop_tag(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_get_stop_tags(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_get_tagset(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_output_partitions(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_save_partitionmap(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_load_partitionmap(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph__validate_partitionmap(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_count_partitions(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_subset_count_partitions(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_subset_partition_size_distribution(khmer_KHashgraph_Object * me,
+ PyObject * args);
+
+
+PyObject *
+hashgraph_load_tagset(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_save_tagset(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_save_subset_partitionmap(khmer_KHashgraph_Object * me,
+ PyObject * args);
+
+
+PyObject *
+hashgraph_load_subset_partitionmap(khmer_KHashgraph_Object * me,
+ PyObject * args);
+
+
+PyObject *
+hashgraph__set_tag_density(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph__get_tag_density(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph__validate_subset_partitionmap(khmer_KHashgraph_Object * me,
+ PyObject * args);
+
+
+PyObject *
+hashgraph_set_partition_id(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_join_partitions(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_get_partition_id(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_divide_tags_into_subsets(khmer_KHashgraph_Object * me,
+ PyObject * args);
+
+
+PyObject *
+hashgraph_count_kmers_within_radius(khmer_KHashgraph_Object * me,
+ PyObject * args);
+
+
+PyObject *
+hashgraph_extract_unique_paths(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_consume_and_tag(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_get_tags_and_positions(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_find_all_tags_list(khmer_KHashgraph_Object * me, PyObject * args);
+
+
+PyObject *
+hashgraph_consume_seqfile_and_tag(khmer_KHashgraph_Object * me, PyObject * args);
+
+}
+
+#endif
diff --git a/include/khmer/_cpy_hashset.hh b/include/khmer/_cpy_hashset.hh
new file mode 100644
index 0000000..10f063b
--- /dev/null
+++ b/include/khmer/_cpy_hashset.hh
@@ -0,0 +1,73 @@
+
+#ifndef _CPY_HASHSET_HH
+#define _CPY_HASHSET_HH
+
+#include <Python.h>
+#include "oxli/oxli.hh"
+#include "_cpy_utils.hh"
+
+
+namespace khmer {
+
+typedef struct {
+ PyObject_HEAD
+ oxli::SeenSet * hashes;
+ oxli::WordLength ksize;
+} khmer_HashSet_Object;
+
+
+typedef struct {
+ PyObject_HEAD
+ khmer_HashSet_Object * parent;
+ oxli::SeenSet::iterator * it;
+} _HashSet_iterobj;
+
+extern PyMethodDef khmer_HashSet_methods[];
+
+extern PySequenceMethods khmer_HashSet_seqmethods[];
+
+extern PyTypeObject khmer_HashSet_Type;
+
+extern PyTypeObject _HashSet_iter_Type;
+
+
+khmer_HashSet_Object * create_HashSet_Object(oxli::SeenSet * h,
+ oxli::WordLength k);
+
+void
+khmer_HashSet_dealloc(khmer_HashSet_Object * obj);
+
+PyObject* khmer_HashSet_new(PyTypeObject * type, PyObject * args,
+ PyObject * kwds);
+
+void _HashSet_iter_dealloc(_HashSet_iterobj * obj);
+
+
+PyObject * _HashSet_iter(PyObject * self);
+
+PyObject * _HashSet_iternext(PyObject * self);
+
+PyObject * khmer_HashSet_iter(PyObject * self);
+
+
+int khmer_HashSet_len(khmer_HashSet_Object * o);
+
+PyObject * khmer_HashSet_concat(khmer_HashSet_Object * o,
+ khmer_HashSet_Object * o2);
+
+PyObject * khmer_HashSet_concat_inplace(khmer_HashSet_Object * o,
+ khmer_HashSet_Object * o2);
+
+int khmer_HashSet_contains(khmer_HashSet_Object * o, PyObject * val);
+
+PyObject *
+hashset_add(khmer_HashSet_Object * me, PyObject * args);
+
+PyObject *
+hashset_remove(khmer_HashSet_Object * me, PyObject * args);
+
+PyObject *
+hashset_update(khmer_HashSet_Object * me, PyObject * args);
+}
+
+#endif
diff --git a/include/khmer/_cpy_hashtable.hh b/include/khmer/_cpy_hashtable.hh
new file mode 100644
index 0000000..a80f897
--- /dev/null
+++ b/include/khmer/_cpy_hashtable.hh
@@ -0,0 +1,145 @@
+#ifndef _CPY_HASHTABLE_HH
+#define _CPY_HASHTABLE_HH
+
+#include <Python.h>
+#include "_cpy_utils.hh"
+#include "oxli/oxli.hh"
+#include "oxli/hashtable.hh"
+
+
+namespace khmer {
+
+typedef struct {
+ PyObject_HEAD
+ oxli::Hashtable * hashtable;
+} khmer_KHashtable_Object;
+
+extern PyMethodDef khmer_hashtable_methods[];
+
+extern PyTypeObject khmer_KHashtable_Type
+CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KHashtable_Object");
+
+
+PyObject *
+hashtable_ksize(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_hash(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_reverse_hash(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_n_occupied(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_n_unique_kmers(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_count(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_consume_seqfile(khmer_KHashtable_Object * me, PyObject * args);
+
+PyObject *
+hashtable_consume_seqfile_banding(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_consume_seqfile_with_reads_parser(khmer_KHashtable_Object * me,
+ PyObject * args);
+
+
+PyObject *
+hashtable_consume(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_get(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_set_use_bigcount(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_get_use_bigcount(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_get_min_count(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_get_max_count(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject * hashtable_abundance_distribution_with_reads_parser(khmer_KHashtable_Object * me, PyObject * args);
+PyObject * hashtable_abundance_distribution(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_trim_on_abundance(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_trim_below_abundance(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_find_spectral_error_positions(khmer_KHashtable_Object * me,
+ PyObject * args);
+
+
+PyObject *
+hashtable_abundance_distribution(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_load(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_save(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_get_hashsizes(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_get_median_count(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_median_at_least(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_get_kmers(khmer_KHashtable_Object * me, PyObject * args);
+
+
+PyObject *
+hashtable_get_kmer_counts(khmer_KHashtable_Object * me, PyObject * args);
+
+
+
+PyObject *
+hashtable_get_kmer_hashes(khmer_KHashtable_Object * me, PyObject * args);
+
+
+
+PyObject *
+hashtable_get_kmer_hashes_as_hashset(khmer_KHashtable_Object * me,
+ PyObject * args);
+
+
+}
+
+#endif
diff --git a/include/khmer/_cpy_hllcounter.hh b/include/khmer/_cpy_hllcounter.hh
new file mode 100644
index 0000000..a50f50e
--- /dev/null
+++ b/include/khmer/_cpy_hllcounter.hh
@@ -0,0 +1,81 @@
+#ifndef _CPY_HLLCOUNTER_HH
+#define _CPY_HLLCOUNTER_HH
+
+#include <Python.h>
+#include "_cpy_utils.hh"
+#include "oxli/hllcounter.hh"
+
+namespace khmer {
+
+typedef struct {
+ PyObject_HEAD
+ oxli::HLLCounter * hllcounter;
+} khmer_KHLLCounter_Object;
+
+
+//
+// KHLLCounter object
+//
+
+extern PyMethodDef khmer_hllcounter_methods[];
+
+extern PyGetSetDef khmer_hllcounter_getseters[];
+
+extern PyTypeObject khmer_KHLLCounter_Type;
+
+
+PyObject* khmer_hllcounter_new(PyTypeObject * type, PyObject * args,
+ PyObject * kwds);
+
+
+void khmer_hllcounter_dealloc(khmer_KHLLCounter_Object * obj);
+
+
+PyObject *
+hllcounter_add(khmer_KHLLCounter_Object * me, PyObject * args);
+
+PyObject *
+hllcounter_estimate_cardinality(khmer_KHLLCounter_Object * me, PyObject * args);
+
+PyObject *
+hllcounter_consume_string(khmer_KHLLCounter_Object * me, PyObject * args);
+
+
+PyObject * hllcounter_consume_seqfile(khmer_KHLLCounter_Object * me,
+ PyObject * args, PyObject * kwds);
+
+PyObject * hllcounter_merge(khmer_KHLLCounter_Object * me,
+ PyObject * args);
+
+PyObject *
+hllcounter_get_erate(khmer_KHLLCounter_Object * me);
+
+
+PyObject *
+hllcounter_get_ksize(khmer_KHLLCounter_Object * me);
+
+
+int
+hllcounter_set_ksize(khmer_KHLLCounter_Object * me, PyObject *value,
+ void *closure);
+
+
+int
+hllcounter_set_erate(khmer_KHLLCounter_Object * me, PyObject *value,
+ void *closure);
+
+
+PyObject *
+hllcounter_getalpha(khmer_KHLLCounter_Object * me);
+
+
+PyObject *
+hllcounter_getcounters(khmer_KHLLCounter_Object * me);
+
+
+PyObject * hllcounter_merge(khmer_KHLLCounter_Object * me,
+ PyObject * args);
+
+}
+
+#endif
diff --git a/include/khmer/_cpy_khmer.hh b/include/khmer/_cpy_khmer.hh
new file mode 100644
index 0000000..5dcbad0
--- /dev/null
+++ b/include/khmer/_cpy_khmer.hh
@@ -0,0 +1,114 @@
+/*
+This file is part of khmer, https://github.com/dib-lab/khmer/, and is
+Copyright (C) 2010-2015, Michigan State University.
+Copyright (C) 2015-2016, The Regents of the University of California.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+ * Neither the name of the Michigan State University nor the names
+ of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+LICENSE (END)
+
+Contact: khmer-project at idyll.org
+*/
+
+//
+// A module for Python that exports khmer C++ library functions.
+//
+#ifndef _CPY_KHMER_HH
+#define _CPY_KHMER_HH
+
+#include <Python.h>
+
+#include <iostream>
+
+#include "_cpy_utils.hh"
+
+
+//
+// Python 2/3 compatibility: Module initialization
+// http://python3porting.com/cextensions.html#module-initialization
+//
+
+#if PY_MAJOR_VERSION >= 3
+#define MOD_ERROR_VAL NULL
+#define MOD_SUCCESS_VAL(val) val
+#define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void)
+#define MOD_DEF(ob, name, doc, methods) \
+ static struct PyModuleDef moduledef = { \
+ PyModuleDef_HEAD_INIT, name, doc, -1, methods, }; \
+ ob = PyModule_Create(&moduledef);
+#else
+#define MOD_ERROR_VAL
+#define MOD_SUCCESS_VAL(val)
+#define MOD_INIT(name) void init##name(void)
+#define MOD_DEF(ob, name, doc, methods) \
+ ob = Py_InitModule3(name, methods, doc);
+#endif
+
+
+
+#include "_cpy_readparsers.hh"
+
+#include "_cpy_hashtable.hh"
+#include "_cpy_nodetable.hh"
+#include "_cpy_counttable.hh"
+#include "_cpy_smallcounttable.hh"
+
+#include "_cpy_hashgraph.hh"
+#include "_cpy_subsetpartition.hh"
+#include "_cpy_countgraph.hh"
+#include "_cpy_nodegraph.hh"
+#include "_cpy_smallcountgraph.hh"
+
+#include "_cpy_graphlabels.hh"
+#include "_cpy_hashset.hh"
+#include "_cpy_hllcounter.hh"
+#include "_cpy_readaligner.hh"
+
+
+namespace khmer {
+
+PyObject * forward_hash(PyObject * self, PyObject * args);
+
+PyObject * forward_hash_no_rc(PyObject * self, PyObject * args);
+
+PyObject * reverse_hash(PyObject * self, PyObject * args);
+
+PyObject * murmur3_forward_hash(PyObject * self, PyObject * args);
+
+PyObject * murmur3_forward_hash_no_rc(PyObject * self, PyObject * args);
+
+PyObject * reverse_complement(PyObject * self, PyObject * args);
+
+PyObject * get_version_cpp( PyObject * self, PyObject * args );
+
+extern PyMethodDef KhmerMethods[];
+
+}
+
+#endif
diff --git a/include/khmer/_cpy_nodegraph.hh b/include/khmer/_cpy_nodegraph.hh
new file mode 100644
index 0000000..7cad990
--- /dev/null
+++ b/include/khmer/_cpy_nodegraph.hh
@@ -0,0 +1,42 @@
+#ifndef _CPY_NODEGRAPH_HH
+#define _CPY_NODEGRAPH_HH
+
+#include <Python.h>
+#include "_cpy_utils.hh"
+#include "_cpy_hashgraph.hh"
+#include "oxli/hashgraph.hh"
+
+
+namespace khmer {
+
+typedef struct {
+ khmer_KHashgraph_Object khashgraph;
+ oxli::Nodegraph * nodegraph;
+} khmer_KNodegraph_Object;
+
+void khmer_nodegraph_dealloc(khmer_KNodegraph_Object * obj);
+
+// __new__ for nodegraph; necessary for proper subclassing
+// This will essentially do what the old factory function did. Unlike many __new__
+// methods, we take our arguments here, because there's no "uninitialized" nodegraph
+// object; we have to have k and the table sizes before creating the new objects
+PyObject* khmer_nodegraph_new(PyTypeObject * type, PyObject * args,
+ PyObject * kwds);
+
+extern PyTypeObject khmer_KNodegraph_Type
+CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KNodegraph_Object");
+
+extern PyMethodDef khmer_nodegraph_methods[];
+
+PyObject *
+nodegraph_update(khmer_KNodegraph_Object * me, PyObject * args);
+
+
+PyObject *
+nodegraph_get_raw_tables(khmer_KNodegraph_Object * self, PyObject * args);
+
+
+
+}
+
+#endif
diff --git a/lib/alphabets.hh b/include/khmer/_cpy_nodetable.hh
similarity index 73%
copy from lib/alphabets.hh
copy to include/khmer/_cpy_nodetable.hh
index 58b7129..301cae2 100644
--- a/lib/alphabets.hh
+++ b/include/khmer/_cpy_nodetable.hh
@@ -1,5 +1,6 @@
/*
This file is part of khmer, https://github.com/dib-lab/khmer/, and is
+Copyright (C) 2010-2015, Michigan State University.
Copyright (C) 2015-2016, The Regents of the University of California.
Redistribution and use in source and binary forms, with or without
@@ -34,19 +35,31 @@ LICENSE (END)
Contact: khmer-project at idyll.org
*/
-#ifndef SYMBOLS_HH
-#define SYMBOLS_HH
+#ifndef _CPY_NODETABLE_HH
+#define _CPY_NODETABLE_HH
-namespace khmer
-{
-namespace alphabets
-{
+#include <Python.h>
+#include "_cpy_utils.hh"
+#include "_cpy_hashtable.hh"
+#include "oxli/hashtable.hh"
-extern std::string DNA_SIMPLE;
-extern std::string DNAN_SIMPLE;
-extern std::string IUPAC_NUCL;
-extern std::string IUPAC_AA;
+
+namespace khmer {
+
+typedef struct {
+ khmer_KHashtable_Object khashtable;
+ oxli::Nodetable * nodetable;
+} khmer_KNodetable_Object;
+
+
+extern PyMethodDef khmer_nodetable_methods[];
+
+extern PyTypeObject khmer_KNodetable_Type
+CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KNodetable_Object");
+
+PyObject* khmer_nodetable_new(PyTypeObject * type, PyObject * args,
+ PyObject * kwds);
}
-}
+
#endif
diff --git a/include/khmer/_cpy_readaligner.hh b/include/khmer/_cpy_readaligner.hh
new file mode 100644
index 0000000..8a1d4b9
--- /dev/null
+++ b/include/khmer/_cpy_readaligner.hh
@@ -0,0 +1,43 @@
+#ifndef _CPY_READALIGNER_HH
+#define _CPY_READALIGNER_HH
+
+#include <Python.h>
+#include "oxli/read_aligner.hh"
+
+namespace khmer {
+
+typedef struct {
+ PyObject_HEAD
+ oxli::ReadAligner * aligner;
+} khmer_ReadAligner_Object;
+
+extern PyTypeObject khmer_ReadAlignerType;
+
+extern PyMethodDef khmer_ReadAligner_methods[];
+
+
+PyObject* khmer_ReadAligner_new(PyTypeObject *type, PyObject * args,
+ PyObject *kwds);
+
+
+void khmer_readaligner_dealloc(khmer_ReadAligner_Object* obj);
+
+
+PyObject * readaligner_align(khmer_ReadAligner_Object * me,
+ PyObject * args);
+
+
+PyObject * readaligner_align_forward(khmer_ReadAligner_Object * me,
+ PyObject * args);
+
+
+PyObject* khmer_ReadAligner_get_scoring_matrix(
+ khmer_ReadAligner_Object * me, PyObject * args);
+
+
+PyObject* khmer_ReadAligner_get_transition_probabilities(
+ khmer_ReadAligner_Object * me, PyObject * args);
+
+}
+
+#endif
diff --git a/include/khmer/_cpy_readparsers.hh b/include/khmer/_cpy_readparsers.hh
new file mode 100644
index 0000000..6b4c016
--- /dev/null
+++ b/include/khmer/_cpy_readparsers.hh
@@ -0,0 +1,140 @@
+
+#ifndef _CPY_READPARSERS_HH
+#define _CPY_READPARSERS_HH
+
+#include <Python.h>
+#include "_cpy_utils.hh"
+#include "oxli/read_parsers.hh"
+
+namespace khmer
+{
+
+typedef struct {
+ PyObject_HEAD
+ //! Pointer to the low-level genomic read object.
+ oxli::read_parsers::Read * read;
+} khmer_Read_Object;
+
+
+typedef struct {
+ PyObject_HEAD
+ oxli::read_parsers::FastxParserPtr parser;
+} khmer_ReadParser_Object;
+
+
+typedef struct {
+ PyObject_HEAD
+ //! Pointer to Python parser object for reference counting purposes.
+ PyObject * parent;
+ //! Persistent value of pair mode across invocations.
+ int pair_mode;
+} khmer_ReadPairIterator_Object;
+
+
+
+PyObject*
+khmer_Read_new(PyTypeObject * type, PyObject * args, PyObject * kwds);
+
+
+int
+khmer_Read_init(khmer_Read_Object *self, PyObject *args, PyObject *kwds);
+
+
+void
+khmer_Read_dealloc(khmer_Read_Object * obj);
+
+
+Py_ssize_t
+khmer_Read_len(khmer_Read_Object* obj);
+
+
+extern PySequenceMethods khmer_Read_sequence_methods;
+
+
+PyObject *
+Read_get_name(khmer_Read_Object * obj, void * closure );
+
+
+PyObject *
+Read_get_sequence(khmer_Read_Object * obj, void * closure);
+
+
+PyObject *
+Read_get_quality(khmer_Read_Object * obj, void * closure);
+
+
+PyObject *
+Read_get_description(khmer_Read_Object * obj, void * closure);
+
+
+PyObject *
+Read_get_cleaned_seq(khmer_Read_Object * obj, void * closure);
+
+
+int
+Read_set_cleaned_seq(khmer_Read_Object *obj, PyObject *value, void *closure);
+
+
+extern PyGetSetDef khmer_Read_accessors [];
+
+
+extern PyTypeObject khmer_Read_Type;
+
+
+void
+_ReadParser_dealloc(khmer_ReadParser_Object * obj);
+
+
+void
+khmer_ReadPairIterator_dealloc(khmer_ReadPairIterator_Object * obj);
+
+
+PyObject *
+_ReadParser_new( PyTypeObject * subtype, PyObject * args, PyObject * kwds );
+
+
+PyObject *
+_ReadParser_iternext( PyObject * self );
+
+
+PyObject *
+_ReadPairIterator_iternext(khmer_ReadPairIterator_Object * myself);
+
+
+extern PyTypeObject khmer_ReadPairIterator_Type;
+
+
+PyObject *
+ReadParser_iter_reads(PyObject * self, PyObject * args );
+
+
+PyObject *
+ReadParser_get_num_reads(khmer_ReadParser_Object * me);
+
+
+PyObject *
+ReadParser_iter_read_pairs(PyObject * self, PyObject * args );
+
+
+PyObject *
+ReadParser_close(PyObject * self, PyObject * args);
+
+
+extern PyMethodDef _ReadParser_methods [];
+
+
+extern PyGetSetDef khmer_ReadParser_accessors[];
+
+
+extern PyTypeObject khmer_ReadParser_Type
+CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_ReadParser_Object");
+
+
+void _init_ReadParser_Type_constants();
+
+
+oxli::read_parsers::FastxParserPtr& _PyObject_to_khmer_ReadParser(PyObject * py_object);
+
+} // namespace khmer
+
+#endif
diff --git a/lib/alphabets.hh b/include/khmer/_cpy_smallcountgraph.hh
similarity index 66%
copy from lib/alphabets.hh
copy to include/khmer/_cpy_smallcountgraph.hh
index 58b7129..495bea5 100644
--- a/lib/alphabets.hh
+++ b/include/khmer/_cpy_smallcountgraph.hh
@@ -1,6 +1,6 @@
/*
This file is part of khmer, https://github.com/dib-lab/khmer/, and is
-Copyright (C) 2015-2016, The Regents of the University of California.
+Copyright (C) 2016, The Regents of the University of California.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
@@ -34,19 +34,36 @@ LICENSE (END)
Contact: khmer-project at idyll.org
*/
-#ifndef SYMBOLS_HH
-#define SYMBOLS_HH
-namespace khmer
-{
-namespace alphabets
-{
+#ifndef _CPY_SMALLCOUNTGRAPH_HH
+#define _CPY_SMALLCOUNTGRAPH_HH
-extern std::string DNA_SIMPLE;
-extern std::string DNAN_SIMPLE;
-extern std::string IUPAC_NUCL;
-extern std::string IUPAC_AA;
+#include <Python.h>
+#include "_cpy_utils.hh"
+#include "_cpy_hashgraph.hh"
+#include "oxli/hashgraph.hh"
+
+namespace khmer {
+
+typedef struct {
+ khmer_KHashgraph_Object khashgraph;
+ oxli::SmallCountgraph * countgraph;
+} khmer_KSmallCountgraph_Object;
+
+
+extern PyTypeObject khmer_KSmallCountgraph_Type
+CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KSmallCountgraph_Object");
+
+extern PyMethodDef khmer_smallcountgraph_methods[];
+
+void khmer_smallcountgraph_dealloc(khmer_KSmallCountgraph_Object * obj);
+
+PyObject* khmer_smallcountgraph_new(PyTypeObject * type, PyObject * args,
+ PyObject * kwds);
+
+PyObject *
+smallcount_get_raw_tables(khmer_KSmallCountgraph_Object * self, PyObject * args);
}
-}
+
#endif
diff --git a/lib/alphabets.hh b/include/khmer/_cpy_smallcounttable.hh
similarity index 72%
copy from lib/alphabets.hh
copy to include/khmer/_cpy_smallcounttable.hh
index 58b7129..82dc3e3 100644
--- a/lib/alphabets.hh
+++ b/include/khmer/_cpy_smallcounttable.hh
@@ -1,6 +1,6 @@
/*
This file is part of khmer, https://github.com/dib-lab/khmer/, and is
-Copyright (C) 2015-2016, The Regents of the University of California.
+Copyright (C) 2016, The Regents of the University of California.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
@@ -34,19 +34,28 @@ LICENSE (END)
Contact: khmer-project at idyll.org
*/
-#ifndef SYMBOLS_HH
-#define SYMBOLS_HH
-namespace khmer
-{
-namespace alphabets
-{
+#ifndef _CPY_SMALLCOUNTTABLE_HH
+#define _CPY_SMALLCOUNTTABLE_HH
-extern std::string DNA_SIMPLE;
-extern std::string DNAN_SIMPLE;
-extern std::string IUPAC_NUCL;
-extern std::string IUPAC_AA;
+#include <Python.h>
+#include "_cpy_utils.hh"
+#include "_cpy_hashtable.hh"
+#include "oxli/hashtable.hh"
+
+namespace khmer {
+
+typedef struct {
+ khmer_KHashtable_Object khashtable;
+ oxli::SmallCounttable * counttable;
+} khmer_KSmallCounttable_Object;
+
+extern PyTypeObject khmer_KSmallCounttable_Type
+CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KSmallCounttable_Object");
+
+PyObject* khmer_smallcounttable_new(PyTypeObject * type, PyObject * args,
+ PyObject * kwds);
}
-}
+
#endif
diff --git a/include/khmer/_cpy_subsetpartition.hh b/include/khmer/_cpy_subsetpartition.hh
new file mode 100644
index 0000000..e65ddd2
--- /dev/null
+++ b/include/khmer/_cpy_subsetpartition.hh
@@ -0,0 +1,58 @@
+#ifndef _CPY_SUBSET_HH
+#define _CPY_SUBSET_HH
+
+#include <Python.h>
+#include "_cpy_utils.hh"
+#include "oxli/subset.hh"
+
+namespace khmer {
+
+typedef struct {
+ PyObject_HEAD
+ oxli::pre_partition_info * PrePartitionInfo;
+} khmer_PrePartitionInfo_Object;
+
+typedef struct {
+ PyObject_HEAD
+ oxli::SubsetPartition * subset;
+} khmer_KSubsetPartition_Object;
+
+
+
+extern PyTypeObject khmer_PrePartitionInfo_Type;
+
+void khmer_PrePartitionInfo_dealloc(khmer_PrePartitionInfo_Object * obj);
+
+
+extern PyTypeObject khmer_KSubsetPartition_Type;
+
+extern PyMethodDef khmer_subset_methods[];
+
+
+void khmer_subset_dealloc(khmer_KSubsetPartition_Object * obj);
+
+PyObject *
+subset_count_partitions(khmer_KSubsetPartition_Object * me, PyObject * args);
+
+
+PyObject *
+subset_report_on_partitions(khmer_KSubsetPartition_Object * me, PyObject * args);
+
+
+PyObject *
+subset_partition_size_distribution(khmer_KSubsetPartition_Object * me,
+ PyObject * args);
+
+
+PyObject *
+subset_partition_sizes(khmer_KSubsetPartition_Object * me, PyObject * args);
+
+
+PyObject *
+subset_partition_average_coverages(khmer_KSubsetPartition_Object * me,
+ PyObject * args);
+
+
+}
+
+#endif
diff --git a/include/khmer/_cpy_utils.hh b/include/khmer/_cpy_utils.hh
new file mode 100644
index 0000000..471a33a
--- /dev/null
+++ b/include/khmer/_cpy_utils.hh
@@ -0,0 +1,67 @@
+#ifndef _CPY_UTILS_HH
+#define _CPY_UTILS_HH
+
+
+#include <Python.h>
+#include <vector>
+#include "oxli/oxli.hh"
+#include "oxli/kmer_hash.hh"
+#include "oxli/hashtable.hh"
+#include "oxli/oxli_exception.hh"
+
+//
+// Python 2/3 compatibility: PyInt and PyLong
+//
+
+#if (PY_MAJOR_VERSION >= 3)
+#define PyInt_Check(arg) PyLong_Check(arg)
+#define PyInt_AsLong(arg) PyLong_AsLong(arg)
+#define PyInt_FromLong(arg) PyLong_FromLong(arg)
+#define Py_TPFLAGS_HAVE_ITER 0
+#endif
+
+//
+// Python 2/3 compatibility: PyBytes and PyString
+// https://docs.python.org/2/howto/cporting.html#str-unicode-unification
+//
+
+#include "bytesobject.h"
+
+
+namespace khmer {
+
+
+bool
+convert_HashIntoType_to_PyObject(const oxli::HashIntoType &hashval,
+ PyObject **value);
+
+
+bool
+convert_PyLong_to_HashIntoType(PyObject * value,
+ oxli::HashIntoType &hashval);
+
+
+bool
+convert_PyObject_to_HashIntoType(PyObject * value,
+ oxli::HashIntoType& hashval,
+ oxli::WordLength ksize);
+
+
+bool
+ht_convert_PyObject_to_HashIntoType(PyObject * value,
+ oxli::HashIntoType& hashval,
+ const oxli::Hashtable * ht);
+
+
+bool
+ht_convert_PyObject_to_Kmer(PyObject * value,
+ oxli::Kmer& kmer,
+ const oxli::Hashtable * ht);
+
+
+bool convert_Pytablesizes_to_vector(PyListObject * sizes_list_o,
+ std::vector<uint64_t>& sizes);
+
+}
+
+#endif
diff --git a/lib/.gitignore b/include/oxli/.gitignore
similarity index 100%
copy from lib/.gitignore
copy to include/oxli/.gitignore
diff --git a/lib/alphabets.hh b/include/oxli/alphabets.hh
similarity index 96%
rename from lib/alphabets.hh
rename to include/oxli/alphabets.hh
index 58b7129..982b8c6 100644
--- a/lib/alphabets.hh
+++ b/include/oxli/alphabets.hh
@@ -37,13 +37,15 @@ Contact: khmer-project at idyll.org
#ifndef SYMBOLS_HH
#define SYMBOLS_HH
-namespace khmer
+namespace oxli
{
namespace alphabets
{
extern std::string DNA_SIMPLE;
extern std::string DNAN_SIMPLE;
+extern std::string RNA_SIMPLE;
+extern std::string RNAN_SIMPLE;
extern std::string IUPAC_NUCL;
extern std::string IUPAC_AA;
diff --git a/lib/assembler.hh b/include/oxli/assembler.hh
similarity index 99%
rename from lib/assembler.hh
rename to include/oxli/assembler.hh
index b7e142a..48bbe91 100644
--- a/lib/assembler.hh
+++ b/include/oxli/assembler.hh
@@ -39,7 +39,7 @@ Contact: khmer-project at idyll.org
#include <functional>
-#include "khmer.hh"
+#include "oxli.hh"
#include "kmer_hash.hh"
#include "hashgraph.hh"
#include "kmer_filters.hh"
@@ -47,7 +47,7 @@ Contact: khmer-project at idyll.org
#include "labelhash.hh"
-namespace khmer
+namespace oxli
{
class Hashgraph;
@@ -173,5 +173,5 @@ public:
StringVector& paths) const;
};
-} //namespace khmer
+} //namespace oxli
#endif
diff --git a/lib/hashgraph.hh b/include/oxli/hashgraph.hh
similarity index 97%
rename from lib/hashgraph.hh
rename to include/oxli/hashgraph.hh
index b8bb805..e41fdaa 100644
--- a/lib/hashgraph.hh
+++ b/include/oxli/hashgraph.hh
@@ -53,7 +53,7 @@ Contact: khmer-project at idyll.org
#include "traversal.hh"
#include "subset.hh"
-namespace khmer
+namespace oxli
{
namespace read_parsers
{
@@ -74,7 +74,7 @@ namespace khmer
#define CALLBACK_PERIOD 100000
-namespace khmer
+namespace oxli
{
//
// Hashgraph: Extension of Hashtable to support graph operations.
@@ -95,7 +95,7 @@ protected:
{
_tag_density = DEFAULT_TAG_DENSITY;
if (!(_tag_density % 2 == 0)) {
- throw khmer_exception();
+ throw oxli_exception();
}
partition = new SubsetPartition(this);
_all_tags_spin_lock = 0;
@@ -134,7 +134,7 @@ public:
{
// must be odd; can't be set if tags exist.
if (!(d % 2 == 0) || !all_tags.empty()) {
- throw khmer_exception();
+ throw oxli_exception();
}
_tag_density = d;
}
@@ -262,7 +262,7 @@ public:
};
// Hashgraph-derived class with ByteStorage.
-class Countgraph : public khmer::Hashgraph
+class Countgraph : public oxli::Hashgraph
{
public:
explicit Countgraph(WordLength ksize, std::vector<uint64_t> sizes)
@@ -270,7 +270,7 @@ public:
};
// Hashgraph-derived class with NibbleStorage.
-class SmallCountgraph : public khmer::Hashgraph
+class SmallCountgraph : public oxli::Hashgraph
{
public:
explicit SmallCountgraph(WordLength ksize, std::vector<uint64_t> sizes)
diff --git a/lib/hashtable.hh b/include/oxli/hashtable.hh
similarity index 84%
rename from lib/hashtable.hh
rename to include/oxli/hashtable.hh
index 66ea2c4..0d91b06 100644
--- a/lib/hashtable.hh
+++ b/include/oxli/hashtable.hh
@@ -52,16 +52,17 @@ Contact: khmer-project at idyll.org
#include <memory>
#include "MurmurHash3.h"
-#include "khmer.hh"
-#include "khmer_exception.hh"
+#include "oxli.hh"
+#include "oxli_exception.hh"
#include "kmer_hash.hh"
#include "read_parsers.hh"
#include "storage.hh"
#include "subset.hh"
+
using namespace std;
-namespace khmer
+namespace oxli
{
namespace read_parsers
{
@@ -72,9 +73,56 @@ class FastxReader;
#define CALLBACK_PERIOD 100000
-namespace khmer
+namespace oxli
{
+
+inline bool is_prime(uint64_t n)
+{
+ if (n < 2) {
+ return false;
+ }
+ if (n == 2) {
+ return true;
+ }
+ if (n % 2 == 0) {
+ return false;
+ }
+ for (unsigned long long i=3; i < sqrt(n) + 1; i += 2) {
+ if (n % i == 0) {
+ return false;
+ }
+ }
+ return true;
+}
+
+
+inline std::vector<uint64_t> get_n_primes_near_x(uint32_t n, uint64_t x)
+{
+ std::vector<uint64_t> primes;
+ if (x == 1 && n == 1) {
+ primes.push_back(1);
+ return primes;
+ }
+
+ uint64_t i = x - 1;
+ if (i % 2 == 0) {
+ i--;
+ }
+ while (primes.size() != n && i > 0) {
+ if (is_prime(i)) {
+ primes.push_back(i);
+ }
+ if (i == 1) {
+ break;
+ }
+ i -= 2;
+ }
+
+ // might return < n primes if x is too small
+ return primes;
+}
+
typedef std::unique_ptr<KmerHashIterator> KmerHashIteratorPtr;
class Hashtable: public
@@ -180,13 +228,13 @@ public:
{
store->add(khash);
}
- void add(const char * kmer)
+ bool add(const char * kmer)
{
- store->add(hash_dna(kmer));
+ return store->add(hash_dna(kmer));
}
- void add(HashIntoType khash)
+ bool add(HashIntoType khash)
{
- store->add(khash);
+ return store->add(khash);
}
// get the count for the given k-mer.
@@ -212,13 +260,6 @@ public:
// count every k-mer in the string.
unsigned int consume_string(const std::string &s);
- // checks each read for non-ACGT characters
- bool check_and_normalize_read(std::string &read) const;
-
- // check each read for non-ACGT characters, and then consume it.
- unsigned int check_and_process_read(std::string &read,
- bool &is_valid);
-
// Count every k-mer in a file containing nucleotide sequences.
template<typename SeqIO>
void consume_seqfile(
@@ -236,6 +277,26 @@ public:
unsigned long long &n_consumed
);
+ // Consume sequences in k-mer banding mode.
+ template<typename SeqIO>
+ void consume_seqfile_banding(
+ std::string const &filename,
+ unsigned int num_bands,
+ unsigned int band,
+ unsigned int &total_reads,
+ unsigned long long &n_consumed
+ );
+
+ // Consume sequences in k-mer banding mode.
+ template<typename SeqIO>
+ void consume_seqfile_banding(
+ read_parsers::ReadParserPtr<SeqIO>& parser,
+ unsigned int num_bands,
+ unsigned int band,
+ unsigned int &total_reads,
+ unsigned long long &n_consumed
+ );
+
void set_use_bigcount(bool b)
{
store->set_use_bigcount(b);
@@ -356,7 +417,7 @@ public:
}
if (done()) {
- throw khmer_exception("past end of iterator");
+ throw oxli_exception("past end of iterator");
}
std::string kmer;
@@ -387,7 +448,7 @@ public:
};
-class MurmurHashtable : public khmer::Hashtable
+class MurmurHashtable : public oxli::Hashtable
{
public:
explicit MurmurHashtable(WordLength ksize, Storage * s)
@@ -399,7 +460,7 @@ public:
hash_dna(const char * kmer) const
{
if (!(strlen(kmer) >= _ksize)) {
- throw khmer_exception("Supplied kmer string doesn't match the underlying k-size.");
+ throw oxli_exception("Supplied kmer string doesn't match the underlying k-size.");
}
return _hash_murmur(kmer, _ksize);
}
@@ -407,19 +468,19 @@ public:
inline virtual HashIntoType
hash_dna_top_strand(const char * kmer) const
{
- throw khmer_exception("not implemented");
+ throw oxli_exception("not implemented");
}
inline virtual HashIntoType
hash_dna_bottom_strand(const char * kmer) const
{
- throw khmer_exception("not implemented");
+ throw oxli_exception("not implemented");
}
inline virtual std::string
unhash_dna(HashIntoType hashval) const
{
- throw khmer_exception("not implemented");
+ throw oxli_exception("not implemented");
}
virtual KmerHashIteratorPtr new_kmer_iterator(const char * sp) const
@@ -440,7 +501,7 @@ public:
};
// Hashtable-derived class with ByteStorage.
-class Counttable : public khmer::MurmurHashtable
+class Counttable : public oxli::MurmurHashtable
{
public:
explicit Counttable(WordLength ksize, std::vector<uint64_t> sizes)
@@ -448,7 +509,7 @@ public:
};
// Hashtable-derived class with NibbleStorage.
-class SmallCounttable : public khmer::MurmurHashtable
+class SmallCounttable : public oxli::MurmurHashtable
{
public:
explicit SmallCounttable(WordLength ksize, std::vector<uint64_t> sizes)
@@ -456,7 +517,7 @@ public:
};
// Hashtable-derived class with BitStorage.
-class Nodetable : public khmer::MurmurHashtable
+class Nodetable : public oxli::MurmurHashtable
{
public:
explicit Nodetable(WordLength ksize, std::vector<uint64_t> sizes)
diff --git a/lib/hllcounter.hh b/include/oxli/hllcounter.hh
similarity index 99%
rename from lib/hllcounter.hh
rename to include/oxli/hllcounter.hh
index 8720f6f..fecea3e 100644
--- a/lib/hllcounter.hh
+++ b/include/oxli/hllcounter.hh
@@ -41,10 +41,10 @@ Contact: khmer-project at idyll.org
#include <string>
#include <vector>
-#include "khmer.hh"
+#include "oxli.hh"
#include "read_parsers.hh"
-namespace khmer
+namespace oxli
{
namespace read_parsers
diff --git a/lib/kmer_filters.hh b/include/oxli/kmer_filters.hh
similarity index 98%
rename from lib/kmer_filters.hh
rename to include/oxli/kmer_filters.hh
index 3c6ad58..3511324 100644
--- a/lib/kmer_filters.hh
+++ b/include/oxli/kmer_filters.hh
@@ -39,12 +39,12 @@ Contact: khmer-project at idyll.org
#include <functional>
-#include "khmer.hh"
+#include "oxli.hh"
#include "kmer_hash.hh"
#include "labelhash.hh"
-namespace khmer
+namespace oxli
{
class Hashtable;
diff --git a/lib/kmer_hash.hh b/include/oxli/kmer_hash.hh
similarity index 98%
rename from lib/kmer_hash.hh
rename to include/oxli/kmer_hash.hh
index caf98a6..da1228d 100644
--- a/lib/kmer_hash.hh
+++ b/include/oxli/kmer_hash.hh
@@ -44,7 +44,7 @@ Contact: khmer-project at idyll.org
#include <string.h>
#include <string>
-#include "khmer.hh"
+#include "oxli.hh"
// test validity
#ifdef KHMER_EXTRA_SANITY_CHECKS
@@ -94,7 +94,7 @@ Contact: khmer-project at idyll.org
#endif
-namespace khmer
+namespace oxli
{
// two-way hash functions.
HashIntoType _hash(const char * kmer, const WordLength k);
@@ -115,6 +115,10 @@ HashIntoType _hash_murmur(const std::string& kmer, const WordLength k,
HashIntoType _hash_murmur_forward(const std::string& kmer,
const WordLength k);
+// Function to support k-mer banding.
+std::pair<uint64_t, uint64_t> compute_band_interval(unsigned int num_bands,
+ unsigned int band);
+
/**
* \class Kmer
*
diff --git a/lib/labelhash.hh b/include/oxli/labelhash.hh
similarity index 98%
rename from lib/labelhash.hh
rename to include/oxli/labelhash.hh
index 3fe371b..f6cec0e 100644
--- a/lib/labelhash.hh
+++ b/include/oxli/labelhash.hh
@@ -45,10 +45,10 @@ Contact: khmer-project at idyll.org
#include <utility>
#include "hashgraph.hh"
-#include "khmer.hh"
+#include "oxli.hh"
#include "read_parsers.hh"
-namespace khmer
+namespace oxli
{
class Hashgraph;
@@ -123,7 +123,7 @@ protected:
uint32_t _tag_labels_spin_lock;
public:
- khmer::Hashgraph * graph;
+ oxli::Hashgraph * graph;
explicit LabelHash(Hashgraph * ht) : graph(ht)
{
@@ -195,7 +195,7 @@ public:
const Label label);
};
-} // namespace khmer
+} // namespace oxli
#define ACQUIRE_TAG_COLORS_SPIN_LOCK \
while(!__sync_bool_compare_and_swap( &_tag_labels_spin_lock, 0, 1));
diff --git a/lib/magic b/include/oxli/magic
similarity index 91%
rename from lib/magic
rename to include/oxli/magic
index 9b7f580..0262364 100644
--- a/lib/magic
+++ b/include/oxli/magic
@@ -37,13 +37,13 @@
#
# Example:
#
-# $ file --magic-file lib/magic tests/test-data/normC20k20.ct
+# $ file --magic-file include/oxli/magic tests/test-data/normC20k20.ct
# tests/test-data/normC20k20.ct: Binary from the khmer project, file format version 4, k-mer countgraph
#
-# $ file --magic-file lib/magic --mime-type tests/test-data/normC20k20.ct
+# $ file --magic-file include/oxli/magic --mime-type tests/test-data/normC20k20.ct
# tests/test-data/normC20k20.ct: application/vnd.oxli.countgraph
#
-# $ file --magic-file lib/magic --extension tests/test-data/normC20k20.ct
+# $ file --magic-file include/oxli/magic --extension tests/test-data/normC20k20.ct
# tests/test-data/normC20k20.ct: oxlicg
#
# See also:
diff --git a/lib/khmer.hh b/include/oxli/oxli.hh
similarity index 98%
rename from lib/khmer.hh
rename to include/oxli/oxli.hh
index e1af0d7..ac89236 100644
--- a/lib/khmer.hh
+++ b/include/oxli/oxli.hh
@@ -35,8 +35,8 @@ LICENSE (END)
Contact: khmer-project at idyll.org
*/
-#ifndef KHMER_HH
-# define KHMER_HH
+#ifndef OXLI_HH
+# define OXLI_HH
// C standard integer types are used almost ubiquitously.
# if (__cplusplus >= 201103L)
@@ -75,7 +75,7 @@ private:\
#include <list>
#include <functional>
-#include "khmer_exception.hh"
+#include "oxli_exception.hh"
# define MAX_KCOUNT 255
# define MAX_BIGCOUNT 65535
@@ -103,7 +103,7 @@ private:\
# define MIN( a, b ) (((a) > (b)) ? (b) : (a))
# define MAX( a, b ) (((a) < (b)) ? (b) : (a))
-namespace khmer
+namespace oxli
{
// largest number we can count up to, exactly. (8 bytes)
@@ -169,4 +169,4 @@ typedef std::list<KmerFilter> KmerFilterList;
typedef std::vector<std::string> StringVector;
}
-#endif // KHMER_HH
+#endif // OXLI_HH
diff --git a/lib/khmer_exception.hh b/include/oxli/oxli_exception.hh
similarity index 71%
rename from lib/khmer_exception.hh
rename to include/oxli/oxli_exception.hh
index 3e4b40d..8cde430 100644
--- a/lib/khmer_exception.hh
+++ b/include/oxli/oxli_exception.hh
@@ -41,7 +41,7 @@ Contact: khmer-project at idyll.org
#include <exception>
#include <string>
-namespace khmer
+namespace oxli
{
///
@@ -49,13 +49,13 @@ namespace khmer
//
// All exceptions should be derived from this base class or a sub-class
//
-class khmer_exception : public std::exception
+class oxli_exception : public std::exception
{
public:
- explicit khmer_exception(const std::string& msg = "Generic khmer exception")
+ explicit oxli_exception(const std::string& msg = "Generic oxli exception")
: _msg(msg) { }
- virtual ~khmer_exception() throw() { }
+ virtual ~oxli_exception() throw() { }
virtual const char* what() const throw ()
{
return _msg.c_str();
@@ -71,39 +71,47 @@ protected:
///
// A base class for file exceptions.
//
-class khmer_file_exception : public khmer_exception
+class oxli_file_exception : public oxli_exception
{
public:
- explicit khmer_file_exception(const std::string& msg)
- : khmer_exception(msg) { }
+ explicit oxli_file_exception(const std::string& msg)
+ : oxli_exception(msg) { }
};
// A base exception for value exceptions
-class khmer_value_exception : public khmer_exception
+class oxli_value_exception : public oxli_exception
{
public:
- explicit khmer_value_exception(const std::string& msg)
- : khmer_exception(msg) { }
+ explicit oxli_value_exception(const std::string& msg)
+ : oxli_exception(msg) { }
+};
+
+
+class oxli_ptr_exception : public oxli_exception
+{
+public:
+ explicit oxli_ptr_exception(const std::string& msg)
+ : oxli_exception(msg) { }
};
/////// Specialised Exceptions /////
-class InvalidStream : public khmer_file_exception
+class InvalidStream : public oxli_file_exception
{
public:
InvalidStream()
- : khmer_file_exception("Generic InvalidStream error") {}
+ : oxli_file_exception("Generic InvalidStream error") {}
explicit InvalidStream(const std::string& msg)
- : khmer_file_exception(msg) {}
+ : oxli_file_exception(msg) {}
};
-class StreamReadError : public khmer_file_exception
+class StreamReadError : public oxli_file_exception
{
public:
StreamReadError()
- : khmer_file_exception("Generic StreamReadError error") {}
+ : oxli_file_exception("Generic StreamReadError error") {}
explicit StreamReadError(const std::string& msg)
- : khmer_file_exception(msg) {}
+ : oxli_file_exception(msg) {}
};
@@ -111,25 +119,25 @@ public:
// An exception for invalid arguments to functions
//
-class InvalidValue : public khmer_value_exception
+class InvalidValue : public oxli_value_exception
{
public:
explicit InvalidValue(const std::string& msg)
- : khmer_value_exception(msg) { }
+ : oxli_value_exception(msg) { }
};
///
// An exception for trying to change a read-only attributes
//
-class ReadOnlyAttribute : public khmer_exception
+class ReadOnlyAttribute : public oxli_exception
{
public:
explicit ReadOnlyAttribute(const std::string& msg)
- : khmer_exception(msg) { }
+ : oxli_exception(msg) { }
};
-} // end namespace khmer
+} // end namespace oxli
#endif // KHMER_EXCEPTION_HH
diff --git a/lib/read_aligner.hh b/include/oxli/read_aligner.hh
similarity index 98%
rename from lib/read_aligner.hh
rename to include/oxli/read_aligner.hh
index cb0c456..150f9ac 100644
--- a/lib/read_aligner.hh
+++ b/include/oxli/read_aligner.hh
@@ -48,13 +48,13 @@ Contact: khmer-project at idyll.org
#include <string>
#include <vector>
-#include "khmer.hh"
+#include "oxli.hh"
#include "hashgraph.hh"
#include "kmer_hash.hh"
#define READ_ALIGNER_DEBUG 0
-namespace khmer
+namespace oxli
{
enum State { MATCH, INSERT_READ, INSERT_GRAPH,
@@ -226,7 +226,7 @@ private:
const HashIntoType bitmask;
const size_t rc_left_shift;
- khmer::Countgraph* m_ch;
+ oxli::Countgraph* m_ch;
ScoringMatrix m_sm;
size_t m_trusted_cutoff;
@@ -244,7 +244,7 @@ public:
Alignment* Align(const std::string&);
Alignment* AlignForward(const std::string&);
- ReadAligner(khmer::Countgraph* ch,
+ ReadAligner(oxli::Countgraph* ch,
BoundedCounterType trusted_cutoff, double bits_theta)
: bitmask(comp_bitmask(ch->ksize())),
rc_left_shift(ch->ksize() * 2 - 2),
@@ -265,7 +265,7 @@ public:
#endif
}
- ReadAligner(khmer::Countgraph* ch,
+ ReadAligner(oxli::Countgraph* ch,
BoundedCounterType trusted_cutoff, double bits_theta,
double* scoring_matrix, double* transitions)
: bitmask(comp_bitmask(ch->ksize())),
diff --git a/lib/read_parsers.hh b/include/oxli/read_parsers.hh
similarity index 84%
rename from lib/read_parsers.hh
rename to include/oxli/read_parsers.hh
index 04a9bdb..69dbc37 100644
--- a/lib/read_parsers.hh
+++ b/include/oxli/read_parsers.hh
@@ -38,10 +38,6 @@ Contact: khmer-project at idyll.org
#ifndef READ_PARSERS_HH
#define READ_PARSERS_HH
-#include <seqan/seq_io.h> // IWYU pragma: keep
-#include <seqan/sequence.h> // IWYU pragma: keep
-#include <seqan/stream.h> // IWYU pragma: keep
-
#include <regex.h>
#include <stddef.h>
#include <stdint.h>
@@ -52,41 +48,47 @@ Contact: khmer-project at idyll.org
#include <utility>
#include <memory>
-#include "khmer.hh"
-#include "khmer_exception.hh"
+#include "oxli.hh"
+#include "oxli_exception.hh"
+
+
+namespace seqan
+{
+ class SequenceStream; // forward dec seqan dep
+}
-namespace khmer
+namespace oxli
{
namespace read_parsers
{
-struct NoMoreReadsAvailable : public khmer_file_exception {
+struct NoMoreReadsAvailable : public oxli_file_exception {
explicit NoMoreReadsAvailable(const std::string& msg) :
- khmer_file_exception(msg) {}
+ oxli_file_exception(msg) {}
NoMoreReadsAvailable() :
- khmer_file_exception("No more reads available in this stream.") {}
+ oxli_file_exception("No more reads available in this stream.") {}
};
-struct InvalidRead : public khmer_value_exception {
+struct InvalidRead : public oxli_value_exception {
explicit InvalidRead(const std::string& msg) :
- khmer_value_exception(msg) {}
+ oxli_value_exception(msg) {}
InvalidRead() :
- khmer_value_exception("Invalid FASTA/Q read") {}
+ oxli_value_exception("Invalid FASTA/Q read") {}
};
-struct UnknownPairReadingMode : public khmer_value_exception {
+struct UnknownPairReadingMode : public oxli_value_exception {
explicit UnknownPairReadingMode(const std::string& msg) :
- khmer_value_exception(msg) {}
+ oxli_value_exception(msg) {}
UnknownPairReadingMode() :
- khmer_value_exception("Unknown pair reading mode supplied.") {}
+ oxli_value_exception("Unknown pair reading mode supplied.") {}
};
-struct InvalidReadPair : public khmer_value_exception {
+struct InvalidReadPair : public oxli_value_exception {
explicit InvalidReadPair(const std::string& msg) :
- khmer_value_exception(msg) {}
+ oxli_value_exception(msg) {}
InvalidReadPair() :
- khmer_value_exception("Invalid read pair detected.") {}
+ oxli_value_exception("Invalid read pair detected.") {}
};
@@ -174,7 +176,7 @@ class FastxReader
{
private:
std::string _filename;
- seqan::SequenceStream _stream;
+ std::unique_ptr<seqan::SequenceStream> _stream;
uint32_t _spin_lock;
size_t _num_reads;
bool _have_qualities;
@@ -198,7 +200,7 @@ inline PartitionID _parse_partition_id(std::string name)
PartitionID p = 0;
const char * s = name.c_str() + name.length() - 1;
if (!(*(s + 1) == (unsigned int) NULL)) {
- throw khmer_exception();
+ throw oxli_exception();
}
while(*s != '\t' && s >= name.c_str()) {
@@ -212,7 +214,7 @@ inline PartitionID _parse_partition_id(std::string name)
err = "consume_partitioned_fasta cannot find partition ID for read ";
err += name;
- throw khmer_value_exception(err);
+ throw oxli_value_exception(err);
}
return p;
@@ -230,6 +232,6 @@ typedef std::unique_ptr<ReadParser<FastxReader>> FastxParserPtr;
} // namespace read_parsers
-} // namespace khmer
+} // namespace oxli
#endif // READ_PARSERS_HH
diff --git a/lib/storage.hh b/include/oxli/storage.hh
similarity index 98%
rename from lib/storage.hh
rename to include/oxli/storage.hh
index 4228a35..944d82b 100644
--- a/lib/storage.hh
+++ b/include/oxli/storage.hh
@@ -43,8 +43,7 @@ Contact: khmer-project at idyll.org
#include <mutex>
using MuxGuard = std::lock_guard<std::mutex>;
-namespace khmer
-{
+namespace oxli {
typedef std::map<HashIntoType, BoundedCounterType> KmerCountMap;
//
@@ -67,7 +66,7 @@ public:
virtual const uint64_t n_occupied() const = 0;
virtual const uint64_t n_unique_kmers() const = 0;
virtual BoundedCounterType test_and_set_bits( HashIntoType khash ) = 0;
- virtual void add(HashIntoType khash) = 0;
+ virtual bool add(HashIntoType khash) = 0;
virtual const BoundedCounterType get_count(HashIntoType khash) const = 0;
virtual Byte ** get_raw_tables() = 0;
@@ -196,9 +195,9 @@ public:
return 0; // kmer already seen
} // test_and_set_bits
- inline void add(HashIntoType khash)
+ inline bool add(HashIntoType khash)
{
- test_and_set_bits(khash);
+ return test_and_set_bits(khash);
}
// get the count for the given k-mer hash.
@@ -315,7 +314,7 @@ public:
return !x;
}
- void add(HashIntoType khash)
+ bool add(HashIntoType khash)
{
bool is_new_kmer = false;
@@ -352,6 +351,8 @@ public:
if (is_new_kmer) {
__sync_add_and_fetch(&_n_unique_kmers, 1);
}
+
+ return is_new_kmer;
}
// get the count for the given k-mer hash.
@@ -511,7 +512,7 @@ public:
return !x;
}
- inline void add(HashIntoType khash)
+ inline bool add(HashIntoType khash)
{
bool is_new_kmer = false;
unsigned int n_full = 0;
@@ -563,6 +564,7 @@ public:
__sync_add_and_fetch(&_n_unique_kmers, 1);
}
+ return is_new_kmer;
}
// get the count for the given k-mer hash.
diff --git a/lib/subset.hh b/include/oxli/subset.hh
similarity index 99%
rename from lib/subset.hh
rename to include/oxli/subset.hh
index 02a710b..67f3e94 100644
--- a/lib/subset.hh
+++ b/include/oxli/subset.hh
@@ -42,9 +42,9 @@ Contact: khmer-project at idyll.org
#include <queue>
#include <string>
-#include "khmer.hh"
+#include "oxli.hh"
-namespace khmer
+namespace oxli
{
class Countgraph;
class Hashgraph;
diff --git a/lib/traversal.hh b/include/oxli/traversal.hh
similarity index 99%
rename from lib/traversal.hh
rename to include/oxli/traversal.hh
index ded14fa..4b96ea2 100644
--- a/lib/traversal.hh
+++ b/include/oxli/traversal.hh
@@ -40,12 +40,12 @@ Contact: khmer-project at idyll.org
#include <queue>
#include <functional>
-#include "khmer.hh"
+#include "oxli.hh"
#include "hashtable.hh"
#include "kmer_hash.hh"
#include "kmer_filters.hh"
-namespace khmer
+namespace oxli
{
#ifndef TRAVERSAL_LEFT
diff --git a/khmer/__init__.py b/khmer/__init__.py
index f3c9996..f4d2fa6 100644
--- a/khmer/__init__.py
+++ b/khmer/__init__.py
@@ -50,9 +50,7 @@ from khmer._khmer import Nodegraph as _Nodegraph
from khmer._khmer import Nodetable as _Nodetable
from khmer._khmer import HLLCounter as _HLLCounter
from khmer._khmer import ReadAligner as _ReadAligner
-from khmer._khmer import LinearAssembler
-from khmer._khmer import SimpleLabeledAssembler
-from khmer._khmer import JunctionCountAssembler
+
from khmer._khmer import HashSet
from khmer._khmer import Read
from khmer._khmer import forward_hash
@@ -515,3 +513,6 @@ class ReadAligner(_ReadAligner):
the traditional way.
"""
_ReadAligner.__init__(self)
+
+from khmer._oxli.assembly import (LinearAssembler, SimpleLabeledAssembler,
+ JunctionCountAssembler)
diff --git a/khmer/_khmer.cc b/khmer/_khmer.cc
deleted file mode 100644
index 04633fe..0000000
--- a/khmer/_khmer.cc
+++ /dev/null
@@ -1,4959 +0,0 @@
-/*
-This file is part of khmer, https://github.com/dib-lab/khmer/, and is
-Copyright (C) 2010-2015, Michigan State University.
-Copyright (C) 2015-2016, The Regents of the University of California.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
-
- * Neither the name of the Michigan State University nor the names
- of its contributors may be used to endorse or promote products
- derived from this software without specific prior written
- permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-LICENSE (END)
-
-Contact: khmer-project at idyll.org
-*/
-
-//
-// A module for Python that exports khmer C++ library functions.
-//
-
-// Must be first.
-#include <Python.h>
-
-#include <iostream>
-
-#include "khmer.hh"
-#include "kmer_hash.hh"
-#include "hashtable.hh"
-#include "hashgraph.hh"
-#include "assembler.hh"
-#include "read_aligner.hh"
-#include "labelhash.hh"
-#include "khmer_exception.hh"
-#include "hllcounter.hh"
-
-using namespace khmer;
-using namespace read_parsers;
-
-//
-// Python 2/3 compatibility: PyInt and PyLong
-//
-
-#if (PY_MAJOR_VERSION >= 3)
-#define PyInt_Check(arg) PyLong_Check(arg)
-#define PyInt_AsLong(arg) PyLong_AsLong(arg)
-#define PyInt_FromLong(arg) PyLong_FromLong(arg)
-#define Py_TPFLAGS_HAVE_ITER 0
-#endif
-
-//
-// Python 2/3 compatibility: PyBytes and PyString
-// https://docs.python.org/2/howto/cporting.html#str-unicode-unification
-//
-
-#include "bytesobject.h"
-
-//
-// Python 2/3 compatibility: Module initialization
-// http://python3porting.com/cextensions.html#module-initialization
-//
-
-#if PY_MAJOR_VERSION >= 3
-#define MOD_ERROR_VAL NULL
-#define MOD_SUCCESS_VAL(val) val
-#define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void)
-#define MOD_DEF(ob, name, doc, methods) \
- static struct PyModuleDef moduledef = { \
- PyModuleDef_HEAD_INIT, name, doc, -1, methods, }; \
- ob = PyModule_Create(&moduledef);
-#else
-#define MOD_ERROR_VAL
-#define MOD_SUCCESS_VAL(val)
-#define MOD_INIT(name) void init##name(void)
-#define MOD_DEF(ob, name, doc, methods) \
- ob = Py_InitModule3(name, methods, doc);
-#endif
-
-using namespace khmer;
-
-//
-// Function necessary for Python loading:
-//
-
-extern "C" {
- MOD_INIT(_khmer);
-}
-
-/***********************************************************************/
-
-// Convert a hash to a python long object.
-static bool convert_HashIntoType_to_PyObject(const HashIntoType &hashval,
- PyObject **value)
-{
- *value = PyLong_FromUnsignedLongLong(hashval);
- return true;
-}
-
-
-// Convert a python long to a hash
-static bool convert_PyLong_to_HashIntoType(PyObject * value,
- HashIntoType &hashval)
-{
- if (PyLong_Check(value)) {
- //(PyLongObject *)
- hashval = PyLong_AsUnsignedLongLong(value);
- return true;
- } else if (PyInt_Check(value)) {
- hashval = PyInt_AsLong(value);
- return true;
- } else {
- PyErr_SetString(PyExc_ValueError, "could not convert to hash");
- return false;
- }
-}
-
-
-// Take a Python object and (try to) convert it to a HashIntoType.
-// Note: will set error condition and return false if cannot do.
-
-static bool convert_PyObject_to_HashIntoType(PyObject * value,
- HashIntoType& hashval,
- WordLength ksize)
-{
- if (PyInt_Check(value) || PyLong_Check(value)) {
- return convert_PyLong_to_HashIntoType(value, hashval);
- } else {
- PyErr_SetString(PyExc_ValueError,
- "must use a hash");
- return false;
- }
-}
-
-// Take a Python object and (try to) convert it to a HashIntoType.
-// Note: will set error condition and return false if cannot do.
-// Further note: the main difference between this and
-// ht_convert_PyObject_to_Kmer is that this will not pass HashIntoType
-// numbers through the Kmer class, which means reverse complements
-// will not be calculated. There is a test in test_nodegraph.py
-// that checks this.
-
-static bool ht_convert_PyObject_to_HashIntoType(PyObject * value,
- HashIntoType& hashval,
- const Hashtable * ht)
-{
- if (PyInt_Check(value) || PyLong_Check(value)) {
- return convert_PyLong_to_HashIntoType(value, hashval);
- } else if (PyUnicode_Check(value)) {
- PyObject* val_as_str = PyUnicode_AsEncodedString(value,
- "utf-8", "strict");
- std::string s = PyBytes_AsString(val_as_str);
- if (strlen(s.c_str()) != ht->ksize()) {
- Py_DECREF(val_as_str);
- PyErr_SetString(PyExc_ValueError,
- "k-mer length must equal the k-mer size");
- return false;
- }
-
- try {
- hashval = ht->hash_dna(s.c_str());
- } catch (khmer_exception &e) {
- PyErr_SetString(PyExc_ValueError, e.what());
- Py_DECREF(val_as_str);
- return false;
- }
-
- Py_DECREF(val_as_str);
- return true;
-
- } else if (PyBytes_Check(value)) {
- std::string s = PyBytes_AsString(value);
- if (strlen(s.c_str()) != ht->ksize()) {
- PyErr_SetString(PyExc_ValueError,
- "k-mer length must equal the k-mer size");
- return false;
- }
- try {
- hashval = ht->hash_dna(s.c_str());
- } catch (khmer_exception &e) {
- PyErr_SetString(PyExc_ValueError, e.what());
- return false;
- }
- return true;
- } else {
- PyErr_SetString(PyExc_ValueError,
- "k-mers must be either a hash or a string");
- return false;
- }
-}
-
-// Take a Python object and (try to) convert it to a khmer::Kmer.
-// Note: will set error condition and return false if cannot do.
-
-static bool ht_convert_PyObject_to_Kmer(PyObject * value,
- Kmer& kmer, const Hashtable * ht)
-{
- if (PyInt_Check(value) || PyLong_Check(value)) {
- HashIntoType h;
- if (!convert_PyLong_to_HashIntoType(value, h)) {
- return false;
- }
- kmer.set_from_unique_hash(h, ht->ksize());
- return true;
- } else if (PyUnicode_Check(value)) {
- std::string s = PyBytes_AsString(PyUnicode_AsEncodedString(
- value, "utf-8", "strict"));
- if (strlen(s.c_str()) != ht->ksize()) {
- PyErr_SetString(PyExc_ValueError,
- "k-mer length must equal the k-mer size");
- return false;
- }
- kmer = Kmer(s, ht->ksize());
- return true;
-
- } else if (PyBytes_Check(value)) {
- std::string s = PyBytes_AsString(value);
- if (strlen(s.c_str()) != ht->ksize()) {
- PyErr_SetString(PyExc_ValueError,
- "k-mer length must equal the k-mer size");
- return false;
- }
- kmer = Kmer(s, ht->ksize());
- return true;
- } else {
- PyErr_SetString(PyExc_ValueError,
- "k-mers must be either a hash or a string");
- return false;
- }
-}
-
-
-static bool convert_Pytablesizes_to_vector(PyListObject * sizes_list_o,
- std::vector<uint64_t>& sizes)
-{
- Py_ssize_t sizes_list_o_length = PyList_GET_SIZE(sizes_list_o);
- if (sizes_list_o_length < 1) {
- PyErr_SetString(PyExc_ValueError,
- "tablesizes needs to be one or more numbers");
- return false;
- }
- for (Py_ssize_t i = 0; i < sizes_list_o_length; i++) {
- PyObject * size_o = PyList_GET_ITEM(sizes_list_o, i);
- if (PyLong_Check(size_o)) {
- sizes.push_back(PyLong_AsUnsignedLongLong(size_o));
- } else if (PyInt_Check(size_o)) {
- sizes.push_back(PyInt_AsLong(size_o));
- } else if (PyFloat_Check(size_o)) {
- sizes.push_back(PyFloat_AS_DOUBLE(size_o));
- } else {
- PyErr_SetString(PyExc_TypeError,
- "2nd argument must be a list of ints, longs, or floats");
- return false;
- }
- }
- return true;
-}
-
-
-static FastxParserPtr& _PyObject_to_khmer_ReadParser(PyObject * py_object);
-
-/***********************************************************************/
-
-//
-// Read object -- name, sequence, and FASTQ stuff
-//
-
-namespace khmer
-{
-
-namespace python
-{
-
-typedef struct {
- PyObject_HEAD
- //! Pointer to the low-level genomic read object.
- read_parsers:: Read * read;
-} khmer_Read_Object;
-
-
-static
-PyObject*
-khmer_Read_new(PyTypeObject * type, PyObject * args, PyObject * kwds)
-{
- khmer_Read_Object * self;
- self = (khmer_Read_Object *)type->tp_alloc(type, 0);
- if (self != NULL) {
- try {
- self->read = new Read;
- } catch (std::bad_alloc &exc) {
- Py_DECREF(self);
- return PyErr_NoMemory();
- }
- }
- return (PyObject *)self;
-}
-
-static
-int
-khmer_Read_init(khmer_Read_Object *self, PyObject *args, PyObject *kwds)
-{
- const char * name{};
- const char * description{};
- const char * sequence{};
- const char * quality{};
- char *kwlist[5] = {
- const_cast<char *>("name"), const_cast<char *>("sequence"),
- const_cast<char *>("quality"), const_cast<char *>("description"), NULL
- };
-
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "ss|zz", kwlist,
- &name, &sequence, &quality, &description)) {
- return -1;
- }
-
- if (name != NULL) {
- self->read->name = name;
- }
- if (sequence != NULL) {
- self->read->sequence = sequence;
- self->read->set_clean_seq();
- }
- if (quality != NULL) {
- self->read->quality = quality;
- }
- if (description != NULL) {
- self->read->description = description;
- }
- return 0;
-}
-
-static
-void
-khmer_Read_dealloc(khmer_Read_Object * obj)
-{
- delete obj->read;
- obj->read = NULL;
- Py_TYPE(obj)->tp_free((PyObject*)obj);
-}
-
-
-static Py_ssize_t
-khmer_Read_len(khmer_Read_Object* obj)
-{
- return obj->read->sequence.size();
-}
-
-static PySequenceMethods khmer_Read_sequence_methods = {
- (lenfunc)khmer_Read_len, /* sq_length */
-};
-
-
-static
-PyObject *
-Read_get_name(khmer_Read_Object * obj, void * closure )
-{
- if (obj->read->name.size() > 0) {
- return PyUnicode_FromString(obj->read->name.c_str());
- } else {
- PyErr_SetString(PyExc_AttributeError,
- "'Read' object has no attribute 'name'.");
- return NULL;
- }
-}
-
-
-static
-PyObject *
-Read_get_sequence(khmer_Read_Object * obj, void * closure)
-{
- if (obj->read->sequence.size() > 0) {
- return PyUnicode_FromString(obj->read->sequence.c_str());
- } else {
- PyErr_SetString(PyExc_AttributeError,
- "'Read' object has no attribute 'sequence'.");
- return NULL;
- }
-}
-
-
-static
-PyObject *
-Read_get_quality(khmer_Read_Object * obj, void * closure)
-{
- if (obj->read->quality.size() > 0) {
- return PyUnicode_FromString(obj->read->quality.c_str());
- } else {
- PyErr_SetString(PyExc_AttributeError,
- "'Read' object has no attribute 'quality'.");
- return NULL;
- }
-}
-
-
-static
-PyObject *
-Read_get_description(khmer_Read_Object * obj, void * closure)
-{
- if (obj->read->description.size() > 0) {
- return PyUnicode_FromString(obj->read->description.c_str());
- } else {
- PyErr_SetString(PyExc_AttributeError,
- "'Read' object has no attribute 'description'.");
- return NULL;
- }
-}
-
-
-static
-PyObject *
-Read_get_cleaned_seq(khmer_Read_Object * obj, void * closure)
-{
- if (obj->read->cleaned_seq.size() > 0) {
- return PyUnicode_FromString(obj->read->cleaned_seq.c_str());
- } else if (obj->read->sequence.size() > 0) {
- obj->read->set_clean_seq();
- return PyUnicode_FromString(obj->read->cleaned_seq.c_str());
- } else {
- PyErr_SetString(PyExc_AttributeError,
- "'Read' object has no attribute 'cleaned_seq'.");
- return NULL;
- }
-}
-
-
-// TODO? Implement setters.
-
-
-static PyGetSetDef khmer_Read_accessors [ ] = {
- {
- (char *)"name",
- (getter)Read_get_name, (setter)NULL,
- (char *)"Read identifier.", NULL
- },
- {
- (char *)"sequence",
- (getter)Read_get_sequence, (setter)NULL,
- (char *)"Genomic sequence.", NULL
- },
- {
- (char *)"quality",
- (getter)Read_get_quality, (setter)NULL,
- (char *)"Quality scores.", NULL
- },
- {
- (char *)"description",
- (getter)Read_get_description, (setter)NULL,
- (char *)"Description.", NULL
- },
- {
- (char *)"cleaned_seq",
- (getter)Read_get_cleaned_seq, (setter)NULL,
- (char *)"Cleaned sequence.", NULL
- },
-
- { NULL, NULL, NULL, NULL, NULL } // sentinel
-};
-
-
-static PyTypeObject khmer_Read_Type = {
- PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
- "khmer.Read", /* tp_name */
- sizeof(khmer_Read_Object), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)khmer_Read_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_compare */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- &khmer_Read_sequence_methods, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- "A FASTQ record plus some metadata.", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- 0, /* tp_methods */
- 0, /* tp_members */
- (PyGetSetDef *)khmer_Read_accessors, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)khmer_Read_init, /* tp_init */
- 0, /* tp_alloc */
- khmer_Read_new, /* tp_new */
-};
-
-
-/***********************************************************************/
-
-//
-// ReadParser object -- parse reads directly from streams
-// ReadPairIterator -- return pairs of Read objects
-//
-
-
-typedef struct {
- PyObject_HEAD
- FastxParserPtr parser;
-} khmer_ReadParser_Object;
-
-
-typedef struct {
- PyObject_HEAD
- //! Pointer to Python parser object for reference counting purposes.
- PyObject * parent;
- //! Persistent value of pair mode across invocations.
- int pair_mode;
-} khmer_ReadPairIterator_Object;
-
-
-static
-void
-_ReadParser_dealloc(khmer_ReadParser_Object * obj)
-{
- Py_TYPE(obj)->tp_free((PyObject*)obj);
-}
-
-
-static
-void
-khmer_ReadPairIterator_dealloc(khmer_ReadPairIterator_Object * obj)
-{
- Py_DECREF(obj->parent);
- obj->parent = NULL;
- Py_TYPE(obj)->tp_free((PyObject*)obj);
-}
-
-
-static PyObject *
-_ReadParser_new( PyTypeObject * subtype, PyObject * args, PyObject * kwds )
-{
- const char * ifile_name_CSTR;
-
- if (!PyArg_ParseTuple(args, "s", &ifile_name_CSTR )) {
- return NULL;
- }
- std:: string ifile_name( ifile_name_CSTR );
-
- PyObject * self = subtype->tp_alloc( subtype, 1 );
- if (self == NULL) {
- return NULL;
- }
- khmer_ReadParser_Object * myself = (khmer_ReadParser_Object *)self;
-
- // Wrap the low-level parser object.
- try {
- myself->parser = get_parser<FastxReader>(ifile_name);
- } catch (khmer_file_exception &exc) {
- PyErr_SetString( PyExc_OSError, exc.what() );
- return NULL;
- }
- return self;
-}
-
-
-static
-PyObject *
-_ReadParser_iternext( PyObject * self )
-{
- khmer_ReadParser_Object * myself = (khmer_ReadParser_Object *)self;
- FastxParserPtr& parser = myself->parser;
- std::string exc_string;
-
- bool stop_iteration = false;
- const char *value_exception = NULL;
- const char *file_exception = NULL;
- Read *the_read_PTR = NULL;
- try {
- the_read_PTR = new Read( );
- } catch (std::bad_alloc &exc) {
- return PyErr_NoMemory();
- }
-
- Py_BEGIN_ALLOW_THREADS
- stop_iteration = parser->is_complete( );
- if (!stop_iteration) {
- try {
- *the_read_PTR = parser->get_next_read();
- } catch (NoMoreReadsAvailable &exc) {
- stop_iteration = true;
- } catch (khmer_file_exception &exc) {
- exc_string = exc.what();
- file_exception = exc_string.c_str();
- } catch (khmer_value_exception &exc) {
- exc_string = exc.what();
- value_exception = exc_string.c_str();
- }
- }
- Py_END_ALLOW_THREADS
-
- // Note: Can simply return NULL instead of setting the StopIteration
- // exception.
- if (stop_iteration) {
- delete the_read_PTR;
- return NULL;
- }
-
- if (file_exception != NULL) {
- delete the_read_PTR;
- PyErr_SetString(PyExc_OSError, file_exception);
- return NULL;
- }
- if (value_exception != NULL) {
- delete the_read_PTR;
- PyErr_SetString(PyExc_ValueError, value_exception);
- return NULL;
- }
-
- PyObject * the_read_OBJECT = khmer_Read_Type.tp_alloc( &khmer_Read_Type, 1 );
- ((khmer_Read_Object *)the_read_OBJECT)->read = the_read_PTR;
- return the_read_OBJECT;
-}
-
-
-static
-PyObject *
-_ReadPairIterator_iternext(khmer_ReadPairIterator_Object * myself)
-{
- khmer_ReadParser_Object * parent = (khmer_ReadParser_Object*)myself->parent;
- FastxParserPtr& parser = parent->parser;
- uint8_t pair_mode = myself->pair_mode;
-
- ReadPair the_read_pair;
- bool stop_iteration = false;
- const char *value_exception = NULL;
- const char *file_exception = NULL;
- std::string exc_string;
-
- Py_BEGIN_ALLOW_THREADS
- stop_iteration = parser->is_complete( );
- if (!stop_iteration) {
- try {
- the_read_pair = parser->get_next_read_pair(pair_mode);
- } catch (NoMoreReadsAvailable &exc) {
- stop_iteration = true;
- } catch (khmer_file_exception &exc) {
- exc_string = exc.what();
- file_exception = exc_string.c_str();
- } catch (khmer_value_exception &exc) {
- exc_string = exc.what();
- value_exception = exc_string.c_str();
- }
- }
- Py_END_ALLOW_THREADS
-
- // Note: Can return NULL instead of setting the StopIteration exception.
- if (stop_iteration) {
- return NULL;
- }
- if (file_exception != NULL) {
- PyErr_SetString(PyExc_OSError, file_exception);
- return NULL;
- }
- if (value_exception != NULL) {
- PyErr_SetString(PyExc_ValueError, value_exception);
- return NULL;
- }
-
- // Copy elements of 'ReadPair' object into Python tuple.
- // TODO? Replace dummy reads with 'None' object.
- PyObject * read_1_OBJECT = khmer_Read_Type.tp_alloc( &khmer_Read_Type, 1 );
- try {
- ((khmer_Read_Object *)read_1_OBJECT)->read = new Read( the_read_pair.first );
- } catch (std::bad_alloc &e) {
- return PyErr_NoMemory();
- }
- PyObject * read_2_OBJECT = khmer_Read_Type.tp_alloc( &khmer_Read_Type, 1 );
- try {
- ((khmer_Read_Object *)read_2_OBJECT)->read = new Read( the_read_pair.second );
- } catch (std::bad_alloc &e) {
- delete ((khmer_Read_Object *)read_1_OBJECT)->read;
- return PyErr_NoMemory();
- }
- PyObject * tup = PyTuple_Pack( 2, read_1_OBJECT, read_2_OBJECT );
- Py_XDECREF(read_1_OBJECT);
- Py_XDECREF(read_2_OBJECT);
- return tup;
-}
-
-static PyTypeObject khmer_ReadPairIterator_Type = {
- PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
- "_khmer.ReadPairIterator", /* tp_name */
- sizeof(khmer_ReadPairIterator_Object), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)khmer_ReadPairIterator_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_compare */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- "Iterates over 'ReadParser' objects and returns read pairs.", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- PyObject_SelfIter, /* tp_iter */
- (iternextfunc)_ReadPairIterator_iternext, /* tp_iternext */
-};
-
-
-
-static
-PyObject *
-ReadParser_iter_reads(PyObject * self, PyObject * args )
-{
- return PyObject_SelfIter( self );
-}
-
-static
-PyObject *
-ReadParser_get_num_reads(khmer_ReadParser_Object * me)
-{
- return PyLong_FromLong(me->parser->get_num_reads());
-}
-
-static
-PyObject *
-ReadParser_iter_read_pairs(PyObject * self, PyObject * args )
-{
- int pair_mode = ReadParser<FastxReader>::PAIR_MODE_ERROR_ON_UNPAIRED;
-
- if (!PyArg_ParseTuple( args, "|i", &pair_mode )) {
- return NULL;
- }
-
- // Capture existing read parser.
- PyObject * obj = khmer_ReadPairIterator_Type.tp_alloc(
- &khmer_ReadPairIterator_Type, 1
- );
- if (obj == NULL) {
- return NULL;
- }
- khmer_ReadPairIterator_Object * rpi = (khmer_ReadPairIterator_Object *)obj;
- rpi->parent = self;
- rpi->pair_mode = pair_mode;
-
- // Increment reference count on existing ReadParser object so that it
- // will not go away until all ReadPairIterator instances have gone away.
- Py_INCREF( self );
-
- return obj;
-}
-
-
-PyObject *
-ReadParser_close(PyObject * self, PyObject * args)
-{
- FastxParserPtr& rparser = _PyObject_to_khmer_ReadParser(self);
- rparser->close();
-
- Py_INCREF(Py_None);
- return Py_None;
-}
-
-static PyMethodDef _ReadParser_methods [ ] = {
- {
- "iter_reads", (PyCFunction)ReadParser_iter_reads,
- METH_NOARGS, "Iterates over reads."
- },
- {
- "iter_read_pairs", (PyCFunction)ReadParser_iter_read_pairs,
- METH_VARARGS, "Iterates over paired reads as pairs."
- },
- {
- "close", (PyCFunction)ReadParser_close,
- METH_NOARGS, "Close associated files."
- },
- { NULL, NULL, 0, NULL } // sentinel
-};
-
-static PyGetSetDef khmer_ReadParser_accessors[] = {
- {
- (char *)"num_reads",
- (getter)ReadParser_get_num_reads, NULL,
- (char *)"count of reads processed thus far.",
- NULL
- },
- {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
-};
-
-static PyTypeObject khmer_ReadParser_Type
-CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_ReadParser_Object")
-= {
- PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
- "_khmer.ReadParser", /* tp_name */
- sizeof(khmer_ReadParser_Object), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)_ReadParser_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_compare */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- "Parses streams from various file formats, " \
- "such as FASTA and FASTQ.", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- PyObject_SelfIter, /* tp_iter */
- (iternextfunc)_ReadParser_iternext, /* tp_iternext */
- _ReadParser_methods, /* tp_methods */
- 0, /* tp_members */
- khmer_ReadParser_accessors, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- _ReadParser_new, /* tp_new */
-};
-
-void _init_ReadParser_Type_constants()
-{
- PyObject * cls_attrs_DICT = PyDict_New( );
- if (cls_attrs_DICT == NULL) {
- return;
- }
-
- // Place pair mode constants into class dictionary.
- int result;
- PyObject *value = PyLong_FromLong(
- ReadParser<FastxReader>::PAIR_MODE_IGNORE_UNPAIRED);
- if (value == NULL) {
- Py_DECREF(cls_attrs_DICT);
- return;
- }
- result = PyDict_SetItemString(cls_attrs_DICT,
- "PAIR_MODE_IGNORE_UNPAIRED", value );
- Py_XDECREF(value);
- if (!result) {
- Py_DECREF(cls_attrs_DICT);
- return;
- }
-
- value = PyLong_FromLong(ReadParser<FastxReader>::PAIR_MODE_ERROR_ON_UNPAIRED);
- if (value == NULL) {
- Py_DECREF(cls_attrs_DICT);
- return;
- }
- result = PyDict_SetItemString(cls_attrs_DICT,
- "PAIR_MODE_ERROR_ON_UNPAIRED", value);
- Py_XDECREF(value);
- if (!result) {
- Py_DECREF(cls_attrs_DICT);
- return;
- }
-
- khmer_ReadParser_Type.tp_dict = cls_attrs_DICT;
-}
-
-} // namespace python
-
-} // namespace khmer
-
-
-static FastxParserPtr& _PyObject_to_khmer_ReadParser(PyObject * py_object)
-{
- // TODO: Add type-checking.
-
- return ((python:: khmer_ReadParser_Object *)py_object)->parser;
-}
-
-typedef struct {
- PyObject_HEAD
- pre_partition_info * PrePartitionInfo;
-} khmer_PrePartitionInfo_Object;
-
-static
-void
-khmer_PrePartitionInfo_dealloc(khmer_PrePartitionInfo_Object * obj)
-{
- delete obj->PrePartitionInfo;
- obj->PrePartitionInfo = NULL;
- Py_TYPE(obj)->tp_free((PyObject*)obj);
-}
-
-static PyTypeObject khmer_PrePartitionInfo_Type = {
- PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
- "_khmer.PrePartitionInfo", /* tp_name */
- sizeof(khmer_PrePartitionInfo_Object),/* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)khmer_PrePartitionInfo_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_compare */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- "Stores a k-kmer and a set of tagged seen k-mers.", /* tp_doc */
-};
-
-
-/***********************************************************************/
-/***********************************************************************/
-
-typedef struct {
- PyObject_HEAD
- SeenSet * hashes;
- WordLength ksize;
-} khmer_HashSet_Object;
-
-static khmer_HashSet_Object * create_HashSet_Object(SeenSet * h, WordLength k);
-
-static
-void
-khmer_HashSet_dealloc(khmer_HashSet_Object * obj)
-{
- delete obj->hashes;
- obj->hashes = NULL;
- obj->ksize = 0;
- Py_TYPE(obj)->tp_free((PyObject*)obj);
-}
-
-static PyObject* khmer_HashSet_new(PyTypeObject * type, PyObject * args,
- PyObject * kwds)
-{
- khmer_HashSet_Object * self;
-
- self = (khmer_HashSet_Object *)type->tp_alloc(type, 0);
-
- if (self != NULL) {
- PyObject * list_o = NULL;
- WordLength k;
- if (!PyArg_ParseTuple(args, "b|O!", &k, &PyList_Type, &list_o)) {
- Py_DECREF(self);
- return NULL;
- }
-
- try {
- self->hashes = new SeenSet;
- self->ksize = k;
- } catch (std::bad_alloc &e) {
- Py_DECREF(self);
- return PyErr_NoMemory();
- }
-
- if (list_o) {
- Py_ssize_t size = PyList_Size(list_o);
- for (Py_ssize_t i = 0; i < size; i++) {
- PyObject * item = PyList_GET_ITEM(list_o, i);
- HashIntoType h;
-
- if (!convert_PyObject_to_HashIntoType(item, h, self->ksize)) {
- return NULL;
- }
- self->hashes->insert(h);
- }
- }
- }
- return (PyObject *) self;
-}
-
-/***********************************************************************/
-
-typedef struct {
- PyObject_HEAD
- khmer_HashSet_Object * parent;
- SeenSet::iterator * it;
-} _HashSet_iterobj;
-
-static
-void
-_HashSet_iter_dealloc(_HashSet_iterobj * obj)
-{
- delete obj->it;
- obj->it = NULL;
- Py_DECREF(obj->parent);
- Py_TYPE(obj)->tp_free((PyObject*)obj);
-}
-
-static PyObject * _HashSet_iter(PyObject * self)
-{
- Py_INCREF(self);
- return self;
-}
-
-static PyObject * _HashSet_iternext(PyObject * self)
-{
- _HashSet_iterobj * iter_obj = (_HashSet_iterobj *) self;
- SeenSet * hashes = iter_obj->parent->hashes;
- if (*iter_obj->it != hashes->end()) {
- PyObject * ret = nullptr;
- convert_HashIntoType_to_PyObject((**iter_obj->it), &ret);
- (*(iter_obj->it))++;
- return ret;
- }
-
- PyErr_SetString(PyExc_StopIteration, "end of HashSet");
- return NULL;
-}
-
-static PyTypeObject _HashSet_iter_Type = {
- PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
- "_khmer.HashSet_iter", /* tp_name */
- sizeof(_HashSet_iterobj), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)_HashSet_iter_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_compare */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /* tp_flags */
- "iterator object for HashSet objects.", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- _HashSet_iter, /* tp_iter */
- _HashSet_iternext, /* tp_iternext */
- 0, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
-};
-
-static PyObject * khmer_HashSet_iter(PyObject * self)
-{
- khmer_HashSet_Object * me = (khmer_HashSet_Object *) self;
- _HashSet_iterobj * iter_obj = (_HashSet_iterobj *)
- _HashSet_iter_Type.tp_alloc(&_HashSet_iter_Type, 0);
- if (iter_obj != NULL) {
- Py_INCREF(me);
- iter_obj->parent = me;
-
- iter_obj->it = new SeenSet::iterator;
- *iter_obj->it = me->hashes->begin();
- }
- return (PyObject *) iter_obj;
-}
-
-static int khmer_HashSet_len(khmer_HashSet_Object * o)
-{
- return (Py_ssize_t) o->hashes->size();
-}
-
-static PyObject * khmer_HashSet_concat(khmer_HashSet_Object * o,
- khmer_HashSet_Object * o2)
-{
- if (o->ksize != o2->ksize) {
- PyErr_SetString(PyExc_ValueError,
- "cannot add HashSets with different ksizes");
- return NULL;
- }
- khmer_HashSet_Object * no = create_HashSet_Object(new SeenSet,
- o->ksize);
- no->hashes->insert(o->hashes->begin(), o->hashes->end());
- no->hashes->insert(o2->hashes->begin(), o2->hashes->end());
-
- return (PyObject *) no;
-}
-
-static PyObject * khmer_HashSet_concat_inplace(khmer_HashSet_Object * o,
- khmer_HashSet_Object * o2)
-{
- if (o->ksize != o2->ksize) {
- PyErr_SetString(PyExc_ValueError,
- "cannot add HashSets with different ksizes");
- return NULL;
- }
- o->hashes->insert(o2->hashes->begin(), o2->hashes->end());
-
- Py_INCREF(o);
- return (PyObject *) o;
-}
-
-static int khmer_HashSet_contains(khmer_HashSet_Object * o, PyObject * val)
-{
- HashIntoType v;
-
- if (convert_PyObject_to_HashIntoType(val, v, 0)) {
- if (set_contains(*o->hashes, v)) {
- return 1;
- }
- }
- return 0;
-}
-
-static PyObject *
-hashset_add(khmer_HashSet_Object * me, PyObject * args)
-{
- PyObject * hash_obj;
- HashIntoType h;
- if (!PyArg_ParseTuple(args, "O", &hash_obj)) {
- return NULL;
- }
-
- if (!convert_PyObject_to_HashIntoType(hash_obj, h, 0)) {
- return NULL;
- }
- me->hashes->insert(h);
-
- Py_INCREF(Py_None);
- return Py_None;
-}
-
-static PyObject *
-hashset_remove(khmer_HashSet_Object * me, PyObject * args)
-{
- PyObject * hash_obj;
- HashIntoType h;
- if (!PyArg_ParseTuple(args, "O", &hash_obj)) {
- return NULL;
- }
-
- if (!convert_PyObject_to_HashIntoType(hash_obj, h, 0)) {
- return NULL;
- }
- SeenSet::iterator it = me->hashes->find(h);
- if (it == me->hashes->end()) {
- PyErr_SetString(PyExc_ValueError, "h not in list");
- return NULL;
- }
- me->hashes->erase(it);
-
- Py_INCREF(Py_None);
- return Py_None;
-}
-
-static PyObject *
-hashset_update(khmer_HashSet_Object * me, PyObject * args)
-{
- PyObject * obj;
- if (!PyArg_ParseTuple(args, "O", &obj)) {
- return NULL;
- }
-
- PyObject * iterator = PyObject_GetIter(obj);
- if (iterator == NULL) {
- return NULL;
- }
- PyObject * item = PyIter_Next(iterator);
- while(item) {
- HashIntoType h;
-
- if (!convert_PyObject_to_HashIntoType(item, h, 0)) {
- PyErr_SetString(PyExc_ValueError, "unknown item type for update");
- Py_DECREF(item);
- return NULL;
- }
- me->hashes->insert(h);
-
- Py_DECREF(item);
- item = PyIter_Next(iterator);
- }
- Py_DECREF(iterator);
- if (PyErr_Occurred()) {
- return NULL;
- }
-
- Py_INCREF(Py_None);
- return Py_None;
-}
-
-static PyMethodDef khmer_HashSet_methods[] = {
- {
- "add",
- (PyCFunction)hashset_add, METH_VARARGS,
- "Add element to the HashSet."
- },
- {
- "remove",
- (PyCFunction)hashset_remove, METH_VARARGS,
- "Remove an element from the HashSet."
- },
- {
- "update",
- (PyCFunction)hashset_update, METH_VARARGS,
- "Add a list of elements to the HashSet."
- },
- {NULL, NULL, 0, NULL} /* sentinel */
-};
-
-static PySequenceMethods khmer_HashSet_seqmethods[] = {
- (lenfunc)khmer_HashSet_len, /* sq_length */
- (binaryfunc)khmer_HashSet_concat, /* sq_concat */
- 0, /* sq_repeat */
- 0, /* sq_item */
- 0, /* sq_slice */
- 0, /* sq_ass_item */
- 0, /* sq_ass_slice */
- (objobjproc)khmer_HashSet_contains, /* sq_contains */
- (binaryfunc)khmer_HashSet_concat_inplace, /* sq_inplace_concat */
- 0 /* sq_inplace_repeat */
-};
-
-static PyTypeObject khmer_HashSet_Type = {
- PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
- "_khmer.HashSet", /* tp_name */
- sizeof(khmer_HashSet_Object), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)khmer_HashSet_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_compare */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- khmer_HashSet_seqmethods, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /* tp_flags */
- "Stores a set of hashed k-mers.", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- khmer_HashSet_iter, /* tp_iter */
- 0, /* tp_iternext */
- khmer_HashSet_methods, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- khmer_HashSet_new, /* tp_new */
-};
-
-static khmer_HashSet_Object * create_HashSet_Object(SeenSet * h, WordLength k)
-{
- khmer_HashSet_Object * self;
-
- self = (khmer_HashSet_Object *)
- khmer_HashSet_Type.tp_alloc(&khmer_HashSet_Type, 0);
- if (self != NULL) {
- self->hashes = h;
- self->ksize = k;
- }
- return self;
-}
-
-/***********************************************************************/
-
-typedef struct {
- PyObject_HEAD
- Hashtable * hashtable;
-} khmer_KHashtable_Object;
-
-typedef struct {
- khmer_KHashtable_Object khashtable;
- Hashgraph * hashgraph;
-} khmer_KHashgraph_Object;
-
-typedef struct {
- PyObject_HEAD
- SubsetPartition * subset;
-} khmer_KSubsetPartition_Object;
-
-static void khmer_subset_dealloc(khmer_KSubsetPartition_Object * obj);
-
-static PyTypeObject khmer_KSubsetPartition_Type = {
- PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
- "_khmer.KSubsetPartition", /* tp_name */
- sizeof(khmer_KSubsetPartition_Object), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)khmer_subset_dealloc, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash */
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT, /*tp_flags*/
- "subset object", /* tp_doc */
-};
-
-typedef struct {
- khmer_KHashgraph_Object khashgraph;
- Nodegraph * nodegraph;
-} khmer_KNodegraph_Object;
-
-static void khmer_nodegraph_dealloc(khmer_KNodegraph_Object * obj);
-static PyObject* khmer_nodegraph_new(PyTypeObject * type, PyObject * args,
- PyObject * kwds);
-
-static PyTypeObject khmer_KNodegraph_Type
-CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KNodegraph_Object")
-= {
- PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
- "_khmer.Nodegraph", /* tp_name */
- sizeof(khmer_KNodegraph_Object), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)khmer_nodegraph_dealloc, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash */
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
- "nodegraph object", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- 0, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- khmer_nodegraph_new, /* tp_new */
-};
-
-
-static
-PyObject *
-hashtable_ksize(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- if (!PyArg_ParseTuple(args, "")) {
- return NULL;
- }
-
- unsigned int k = hashtable->ksize();
-
- return PyLong_FromLong(k);
-}
-
-static
-PyObject *
-hashtable_hash(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- char * kmer;
- if (!PyArg_ParseTuple(args, "s", &kmer)) {
- return NULL;
- }
-
- if (strlen(kmer) != hashtable->ksize()) {
- PyErr_SetString(PyExc_ValueError,
- "provided k-mer is wrong length");
- return NULL;
- }
-
- try {
- PyObject * hash = nullptr;
- const HashIntoType h(hashtable->hash_dna(kmer));
- convert_HashIntoType_to_PyObject(h, &hash);
- return hash;
- } catch (khmer_exception &e) {
- PyErr_SetString(PyExc_ValueError, e.what());
- return NULL;
- }
-}
-
-static
-PyObject *
-hashtable_reverse_hash(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- PyObject * val_o;
- HashIntoType val;
- if (!PyArg_ParseTuple(args, "O", &val_o)) {
- return NULL;
- }
-
- if (!ht_convert_PyObject_to_HashIntoType(val_o, val, hashtable)) {
- return NULL;
- }
-
- try {
- return PyUnicode_FromString(hashtable->unhash_dna(val).c_str());
- } catch (khmer_exception &e) {
- PyErr_SetString(PyExc_ValueError, e.what());
- return NULL;
- }
-}
-
-static
-PyObject *
-hashtable_n_occupied(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- if (!PyArg_ParseTuple(args, "")) {
- return NULL;
- }
-
- uint64_t n = hashtable->n_occupied();
-
- return PyLong_FromUnsignedLongLong(n);
-}
-
-static
-PyObject *
-hashtable_n_unique_kmers(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- uint64_t n = hashtable->n_unique_kmers();
-
- return PyLong_FromUnsignedLongLong(n);
-}
-
-static
-PyObject *
-hashtable_count(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- PyObject * v;
- if (!PyArg_ParseTuple(args, "O", &v)) {
- return NULL;
- }
-
- HashIntoType hashval;
-
- if (!ht_convert_PyObject_to_HashIntoType(v, hashval, hashtable)) {
- return NULL;
- }
-
- hashtable->count(hashval);
-
- return PyLong_FromLong(1);
-}
-
-static
-PyObject *
-hashtable_consume_seqfile(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- const char * filename;
-
- if (!PyArg_ParseTuple(args, "s", &filename)) {
- return NULL;
- }
-
- // call the C++ function, and trap signals => Python
- unsigned long long n_consumed = 0;
- unsigned int total_reads = 0;
- try {
- hashtable->consume_seqfile<FastxReader>(filename, total_reads, n_consumed);
- } catch (khmer_file_exception &exc) {
- PyErr_SetString(PyExc_OSError, exc.what());
- return NULL;
- } catch (khmer_value_exception &exc) {
- PyErr_SetString(PyExc_ValueError, exc.what());
- return NULL;
- }
-
- return Py_BuildValue("IK", total_reads, n_consumed);
-}
-
-static
-PyObject *
-hashtable_consume_seqfile_with_reads_parser(khmer_KHashtable_Object * me,
- PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- PyObject * rparser_obj = NULL;
-
- if (!PyArg_ParseTuple(args, "O", &rparser_obj)) {
- return NULL;
- }
-
- FastxParserPtr& rparser = _PyObject_to_khmer_ReadParser( rparser_obj );
-
- // call the C++ function, and trap signals => Python
- unsigned long long n_consumed = 0;
- unsigned int total_reads = 0;
- const char *value_exception = NULL;
- const char *file_exception = NULL;
- std::string exc_string;
-
- Py_BEGIN_ALLOW_THREADS
- try {
- hashtable->consume_seqfile<FastxReader>(rparser, total_reads, n_consumed);
- } catch (khmer_file_exception &exc) {
- exc_string = exc.what();
- file_exception = exc_string.c_str();
- } catch (khmer_value_exception &exc) {
- exc_string = exc.what();
- value_exception = exc_string.c_str();
- }
- Py_END_ALLOW_THREADS
-
- if (file_exception != NULL) {
- PyErr_SetString(PyExc_OSError, file_exception);
- return NULL;
- }
- if (value_exception != NULL) {
- PyErr_SetString(PyExc_ValueError, value_exception);
- return NULL;
- }
-
- return Py_BuildValue("IK", total_reads, n_consumed);
-}
-
-static
-PyObject *
-hashtable_consume(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- const char * long_str;
-
- if (!PyArg_ParseTuple(args, "s", &long_str)) {
- return NULL;
- }
-
- if (strlen(long_str) < hashtable->ksize()) {
- PyErr_SetString(PyExc_ValueError,
- "string length must >= the hashtable k-mer size");
- return NULL;
- }
-
- unsigned int n_consumed;
- n_consumed = hashtable->consume_string(long_str);
-
- return PyLong_FromLong(n_consumed);
-}
-
-static
-PyObject *
-hashtable_get(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- PyObject * arg;
-
- if (!PyArg_ParseTuple(args, "O", &arg)) {
- return NULL;
- }
-
- HashIntoType hashval;
-
- if (!ht_convert_PyObject_to_HashIntoType(arg, hashval, hashtable)) {
- return NULL;
- }
-
- unsigned int count = hashtable->get_count(hashval);
- return PyLong_FromLong(count);
-}
-
-static
-PyObject *
-hashtable_set_use_bigcount(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- PyObject * x;
- if (!PyArg_ParseTuple(args, "O", &x)) {
- return NULL;
- }
- int setme = PyObject_IsTrue(x);
- if (setme < 0) {
- return NULL;
- }
- try {
- hashtable->set_use_bigcount((bool)setme);
- } catch (khmer_exception &e) {
- PyErr_SetString(PyExc_ValueError, e.what());
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-static
-PyObject *
-hashtable_get_use_bigcount(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- if (!PyArg_ParseTuple(args, "")) {
- return NULL;
- }
-
- bool val = hashtable->get_use_bigcount();
-
- return PyBool_FromLong((int)val);
-}
-
-static
-PyObject *
-hashtable_get_min_count(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- const char * long_str;
-
- if (!PyArg_ParseTuple(args, "s", &long_str)) {
- return NULL;
- }
-
- if (strlen(long_str) < hashtable->ksize()) {
- PyErr_SetString(PyExc_ValueError,
- "string length must >= the hashtable k-mer size");
- return NULL;
- }
-
- BoundedCounterType c = hashtable->get_min_count(long_str);
- unsigned int N = c;
-
- return PyLong_FromLong(N);
-}
-
-static
-PyObject *
-hashtable_get_max_count(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- const char * long_str;
-
- if (!PyArg_ParseTuple(args, "s", &long_str)) {
- return NULL;
- }
-
- if (strlen(long_str) < hashtable->ksize()) {
- PyErr_SetString(PyExc_ValueError,
- "string length must >= the hashtable k-mer size");
- return NULL;
- }
-
- BoundedCounterType c = hashtable->get_max_count(long_str);
- unsigned int N = c;
-
- return PyLong_FromLong(N);
-}
-
-// fwd decls to replace function definitions
-static PyObject * hashtable_abundance_distribution_with_reads_parser(khmer_KHashtable_Object * me, PyObject * args);
-static PyObject * hashtable_abundance_distribution(khmer_KHashtable_Object * me, PyObject * args);
-
-static
-PyObject *
-hashtable_trim_on_abundance(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- const char * seq = NULL;
- unsigned int min_count_i = 0;
-
- if (!PyArg_ParseTuple(args, "sI", &seq, &min_count_i)) {
- return NULL;
- }
-
- unsigned long trim_at;
- Py_BEGIN_ALLOW_THREADS
-
- BoundedCounterType min_count = min_count_i;
-
- trim_at = hashtable->trim_on_abundance(seq, min_count);
-
- Py_END_ALLOW_THREADS;
-
- PyObject * trim_seq = PyUnicode_FromStringAndSize(seq, trim_at);
- if (trim_seq == NULL) {
- return NULL;
- }
- PyObject * ret = Py_BuildValue("Ok", trim_seq, trim_at);
- Py_DECREF(trim_seq);
-
- return ret;
-}
-
-static
-PyObject *
-hashtable_trim_below_abundance(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- const char * seq = NULL;
- BoundedCounterType max_count_i = 0;
-
- if (!PyArg_ParseTuple(args, "sH", &seq, &max_count_i)) {
- return NULL;
- }
-
- unsigned long trim_at;
- Py_BEGIN_ALLOW_THREADS
-
- BoundedCounterType max_count = max_count_i;
-
- trim_at = hashtable->trim_below_abundance(seq, max_count);
-
- Py_END_ALLOW_THREADS;
-
- PyObject * trim_seq = PyUnicode_FromStringAndSize(seq, trim_at);
- if (trim_seq == NULL) {
- return NULL;
- }
- PyObject * ret = Py_BuildValue("Ok", trim_seq, trim_at);
- Py_DECREF(trim_seq);
-
- return ret;
-}
-
-static
-PyObject *
-hashtable_find_spectral_error_positions(khmer_KHashtable_Object * me,
- PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- const char * seq = NULL;
- BoundedCounterType max_count = 0; // unsigned short int
-
- if (!PyArg_ParseTuple(args, "sH", &seq, &max_count)) {
- return NULL;
- }
-
- std::vector<unsigned int> posns;
-
- try {
- posns = hashtable->find_spectral_error_positions(seq, max_count);
- } catch (khmer_exception &e) {
- PyErr_SetString(PyExc_ValueError, e.what());
- return NULL;
- }
-
- Py_ssize_t posns_size = posns.size();
-
- PyObject * x = PyList_New(posns_size);
- if (x == NULL) {
- return NULL;
- }
- for (Py_ssize_t i = 0; i < posns_size; i++) {
- PyList_SET_ITEM(x, i, PyLong_FromLong(posns[i]));
- }
-
- return x;
-}
-
-static
-PyObject *
-hashtable_load(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- const char * filename = NULL;
-
- if (!PyArg_ParseTuple(args, "s", &filename)) {
- return NULL;
- }
-
- try {
- hashtable->load(filename);
- } catch (khmer_file_exception &e) {
- PyErr_SetString(PyExc_OSError, e.what());
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-static
-PyObject *
-hashtable_save(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- const char * filename = NULL;
-
- if (!PyArg_ParseTuple(args, "s", &filename)) {
- return NULL;
- }
-
- try {
- hashtable->save(filename);
- } catch (khmer_file_exception &e) {
- PyErr_SetString(PyExc_OSError, e.what());
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-static
-PyObject *
-hashtable_get_hashsizes(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
-
- if (!PyArg_ParseTuple(args, "")) {
- return NULL;
- }
-
- std::vector<uint64_t> ts = hashtable->get_tablesizes();
-
- PyObject * x = PyList_New(ts.size());
- for (size_t i = 0; i < ts.size(); i++) {
- PyList_SET_ITEM(x, i, PyLong_FromUnsignedLongLong(ts[i]));
- }
-
- return x;
-}
-
-static
-PyObject *
-hashtable_get_median_count(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- const char * long_str;
-
- if (!PyArg_ParseTuple(args, "s", &long_str)) {
- return NULL;
- }
-
- if (strlen(long_str) < hashtable->ksize()) {
- PyErr_SetString(PyExc_ValueError,
- "string length must >= the hashtable k-mer size");
- return NULL;
- }
-
- BoundedCounterType med = 0;
- float average = 0, stddev = 0;
-
- hashtable->get_median_count(long_str, med, average, stddev);
-
- return Py_BuildValue("iff", med, average, stddev);
-}
-
-static
-PyObject *
-hashtable_median_at_least(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- const char * long_str;
- unsigned int cutoff;
-
- if (!PyArg_ParseTuple(args, "sI", &long_str, &cutoff)) {
- return NULL;
- }
-
- if (strlen(long_str) < hashtable->ksize()) {
- PyErr_SetString(PyExc_ValueError,
- "string length must >= the hashtable k-mer size");
- return NULL;
- }
-
- if (hashtable->median_at_least(long_str, cutoff)) {
- Py_RETURN_TRUE;
- }
- Py_RETURN_FALSE;
-
-}
-
-static
-PyObject *
-hashtable_get_kmers(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
- const char * sequence;
-
- if (!PyArg_ParseTuple(args, "s", &sequence)) {
- return NULL;
- }
-
- std::vector<std::string> kmers;
-
- hashtable->get_kmers(sequence, kmers);
-
- PyObject * x = PyList_New(kmers.size());
- for (unsigned int i = 0; i < kmers.size(); i++) {
- PyObject * obj = PyUnicode_FromString(kmers[i].c_str());
- PyList_SET_ITEM(x, i, obj);
- }
-
- return x;
-}
-
-static
-PyObject *
-hashtable_get_kmer_counts(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
- const char * sequence;
-
- if (!PyArg_ParseTuple(args, "s", &sequence)) {
- return NULL;
- }
-
- std::vector<BoundedCounterType> counts;
- try {
- hashtable->get_kmer_counts(sequence, counts);
- } catch (khmer_exception &e) {
- PyErr_SetString(PyExc_ValueError, e.what());
- return NULL;
- }
-
- PyObject * x = PyList_New(counts.size());
- for (unsigned int i = 0; i <counts.size(); i++) {
- PyObject * obj = PyInt_FromLong(counts[i]);
- PyList_SET_ITEM(x, i, obj);
- }
-
- return x;
-}
-
-
-static
-PyObject *
-hashtable_get_kmer_hashes(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
- const char * sequence;
-
- if (!PyArg_ParseTuple(args, "s", &sequence)) {
- return NULL;
- }
-
- std::vector<HashIntoType> hashes;
- try {
- hashtable->get_kmer_hashes(sequence, hashes);
- } catch (khmer_exception &e) {
- PyErr_SetString(PyExc_ValueError, e.what());
- return NULL;
- }
-
- PyObject * x = PyList_New(hashes.size());
- for (unsigned int i = 0; i < hashes.size(); i++) {
- PyObject * obj = nullptr;
- convert_HashIntoType_to_PyObject(hashes[i], &obj);
- PyList_SET_ITEM(x, i, obj);
- }
-
- return x;
-}
-
-
-static
-PyObject *
-hashtable_get_kmer_hashes_as_hashset(khmer_KHashtable_Object * me,
- PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
- const char * sequence;
-
- if (!PyArg_ParseTuple(args, "s", &sequence)) {
- return NULL;
- }
-
- SeenSet * hashes = new SeenSet;
- try {
- hashtable->get_kmer_hashes_as_hashset(sequence, *hashes);
- } catch (khmer_exception &e) {
- PyErr_SetString(PyExc_ValueError, e.what());
- return NULL;
- }
-
- PyObject * x = (PyObject *) create_HashSet_Object(hashes,
- hashtable->ksize());
-
- return x;
-}
-
-
-static PyMethodDef khmer_hashtable_methods[] = {
- //
- // Basic methods
- //
-
- {
- "ksize",
- (PyCFunction)hashtable_ksize, METH_VARARGS,
- "Returns the k-mer size of this graph."
- },
- {
- "hash",
- (PyCFunction)hashtable_hash, METH_VARARGS,
- "Returns the hash of this k-mer. For Nodetables and Counttables, this "
- "function will fail if the supplied k-mer contains non-ACGT "
- "characters."
- },
- {
- "reverse_hash",
- (PyCFunction)hashtable_reverse_hash, METH_VARARGS,
- "Turns a k-mer hash back into a DNA k-mer, if possible."
- },
- {
- "hashsizes",
- (PyCFunction)hashtable_get_hashsizes, METH_VARARGS,
- "" },
- {
- "n_unique_kmers",
- (PyCFunction)hashtable_n_unique_kmers, METH_VARARGS,
- "Count the number of unique kmers in this graph."
- },
- {
- "n_occupied", (PyCFunction)hashtable_n_occupied, METH_VARARGS,
- "Count the number of occupied bins."
- },
- {
- "count",
- (PyCFunction)hashtable_count, METH_VARARGS,
- "Increment the count of this k-mer."
- },
- {
- "add",
- (PyCFunction)hashtable_count, METH_VARARGS,
- "Increment the count of this k-mer. (Synonym for 'count'.)"
- },
- {
- "consume",
- (PyCFunction)hashtable_consume, METH_VARARGS,
- "Increment the counts of all of the k-mers in the string."
- },
- {
- "consume_seqfile",
- (PyCFunction)hashtable_consume_seqfile, METH_VARARGS,
- "Increment the counts of all the k-mers in the sequences in the "
- "given file"
- },
- {
- "consume_seqfile_with_reads_parser",
- (PyCFunction)hashtable_consume_seqfile_with_reads_parser, METH_VARARGS,
- "Count all k-mers retrieved with this reads parser object."
- },
- {
- "get",
- (PyCFunction)hashtable_get, METH_VARARGS,
- "Retrieve the count for the given k-mer. For Nodetables and "
- "Counttables, this function will fail if the supplied k-mer contains "
- "non-ACGT characters."
- },
- {
- "load",
- (PyCFunction)hashtable_load, METH_VARARGS,
- "Load the graph from the specified file."
- },
- {
- "save",
- (PyCFunction)hashtable_save, METH_VARARGS,
- "Save the graph to the specified file."
- },
- {
- "get_kmers",
- (PyCFunction)hashtable_get_kmers, METH_VARARGS,
- "Generate an ordered list of all substrings of length k in the string."
- },
- {
- "get_kmer_hashes",
- (PyCFunction)hashtable_get_kmer_hashes, METH_VARARGS,
- "Retrieve an ordered list of all hashes of all k-mers in the string."
- },
- {
- "get_kmer_hashes_as_hashset",
- (PyCFunction)hashtable_get_kmer_hashes_as_hashset, METH_VARARGS,
- "Retrieve a HashSet containing all the k-mers in the string."
- },
- {
- "get_kmer_counts",
- (PyCFunction)hashtable_get_kmer_counts, METH_VARARGS,
- "Retrieve an ordered list of the counts of all k-mers in the string."
- },
-
- {
- "set_use_bigcount",
- (PyCFunction)hashtable_set_use_bigcount, METH_VARARGS,
- "Count past maximum binsize of hashtable (set to T/F)"
- },
- {
- "get_use_bigcount",
- (PyCFunction)hashtable_get_use_bigcount, METH_VARARGS,
- "Get value of bigcount flag (T/F)"
- },
- {
- "get_min_count",
- (PyCFunction)hashtable_get_min_count, METH_VARARGS,
- "Get the smallest count of all the k-mers in the string"
- },
- {
- "get_max_count",
- (PyCFunction)hashtable_get_max_count, METH_VARARGS,
- "Get the largest count of all the k-mers in the string"
- },
- {
- "trim_on_abundance",
- (PyCFunction)hashtable_trim_on_abundance, METH_VARARGS,
- "Trim string at first k-mer below the given abundance"
- },
- {
- "trim_below_abundance",
- (PyCFunction)hashtable_trim_below_abundance, METH_VARARGS,
- "Trim string at first k-mer above the given abundance"
- },
- {
- "find_spectral_error_positions",
- (PyCFunction)hashtable_find_spectral_error_positions, METH_VARARGS,
- "Identify positions of low-abundance k-mers"
- },
- {
- "abundance_distribution",
- (PyCFunction)hashtable_abundance_distribution, METH_VARARGS,
- "Calculate the k-mer abundance distribution of the given file"
- },
- {
- "abundance_distribution_with_reads_parser",
- (PyCFunction)hashtable_abundance_distribution_with_reads_parser,
- METH_VARARGS,
- "Calculate the k-mer abundance distribution for a reads parser handle"
- },
- {
- "get_median_count",
- (PyCFunction)hashtable_get_median_count, METH_VARARGS,
- "Get the median, average, and stddev of the k-mer counts in the string"
- },
- {
- "median_at_least",
- (PyCFunction)hashtable_median_at_least, METH_VARARGS,
- "Return true if the median is at least the given cutoff"
- },
- {NULL, NULL, 0, NULL} /* sentinel */
-};
-
-static PyTypeObject khmer_KHashtable_Type
-CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KHashtable_Object")
-= {
- PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
- "_khmer.KHashtable ", /*tp_name*/
- sizeof(khmer_KHashtable_Object), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- 0, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash */
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT, /*tp_flags*/
- "base hashtable object", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- khmer_hashtable_methods, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
-};
-
-#include "_cpy_nodetable.hh"
-#include "_cpy_counttable.hh"
-#include "_cpy_smallcounttable.hh"
-#include "_cpy_hashgraph.hh"
-#include "_cpy_smallcountgraph.hh"
-
-//
-// KCountgraph object
-//
-
-typedef struct {
- khmer_KHashgraph_Object khashgraph;
- Countgraph * countgraph;
-} khmer_KCountgraph_Object;
-
-typedef struct {
- PyObject_HEAD
- ReadAligner * aligner;
-} khmer_ReadAligner_Object;
-
-static void khmer_countgraph_dealloc(khmer_KCountgraph_Object * obj);
-
-static
-PyObject *
-count_get_raw_tables(khmer_KCountgraph_Object * self, PyObject * args)
-{
- Countgraph * countgraph = self->countgraph;
-
- khmer::Byte ** table_ptrs = countgraph->get_raw_tables();
- std::vector<uint64_t> sizes = countgraph->get_tablesizes();
-
- PyObject * raw_tables = PyList_New(sizes.size());
- for (unsigned int i=0; i<sizes.size(); ++i) {
- Py_buffer buffer;
- int res = PyBuffer_FillInfo(&buffer, NULL, table_ptrs[i], sizes[i], 0,
- PyBUF_FULL_RO);
- if (res == -1) {
- return NULL;
- }
- PyObject * buf = PyMemoryView_FromBuffer(&buffer);
- if(!PyMemoryView_Check(buf)) {
- return NULL;
- }
- PyList_SET_ITEM(raw_tables, i, buf);
- }
-
- return raw_tables;
-}
-
-static
-PyObject *
-count_do_subset_partition_with_abundance(khmer_KCountgraph_Object * me,
- PyObject * args)
-{
- Countgraph * countgraph = me->countgraph;
-
- HashIntoType start_kmer = 0, end_kmer = 0;
- PyObject * break_on_stop_tags_o = NULL;
- PyObject * stop_big_traversals_o = NULL;
- BoundedCounterType min_count, max_count;
-
- if (!PyArg_ParseTuple(args, "HH|KKOO",
- &min_count, &max_count,
- &start_kmer, &end_kmer,
- &break_on_stop_tags_o,
- &stop_big_traversals_o)) {
- return NULL;
- }
-
- bool break_on_stop_tags = false;
- if (break_on_stop_tags_o && PyObject_IsTrue(break_on_stop_tags_o)) {
- break_on_stop_tags = true;
- }
- bool stop_big_traversals = false;
- if (stop_big_traversals_o && PyObject_IsTrue(stop_big_traversals_o)) {
- stop_big_traversals = true;
- }
-
- SubsetPartition * subset_p = NULL;
- try {
- Py_BEGIN_ALLOW_THREADS
- subset_p = new SubsetPartition(countgraph);
- subset_p->do_partition_with_abundance(start_kmer, end_kmer,
- min_count, max_count,
- break_on_stop_tags,
- stop_big_traversals);
- Py_END_ALLOW_THREADS
- } catch (std::bad_alloc &e) {
- return PyErr_NoMemory();
- }
-
- khmer_KSubsetPartition_Object * subset_obj = (khmer_KSubsetPartition_Object *)\
- PyObject_New(khmer_KSubsetPartition_Object, &khmer_KSubsetPartition_Type);
-
- if (subset_obj == NULL) {
- delete subset_p;
- return NULL;
- }
-
- subset_obj->subset = subset_p;
-
- return (PyObject *) subset_obj;
-}
-
-static PyMethodDef khmer_countgraph_methods[] = {
- {
- "get_raw_tables",
- (PyCFunction)count_get_raw_tables, METH_VARARGS,
- "Get a list of the raw storage tables as memoryview objects."
- },
- { "do_subset_partition_with_abundance", (PyCFunction)count_do_subset_partition_with_abundance, METH_VARARGS, "" },
- {NULL, NULL, 0, NULL} /* sentinel */
-};
-
-static PyObject* khmer_countgraph_new(PyTypeObject * type, PyObject * args,
- PyObject * kwds);
-
-static PyTypeObject khmer_KCountgraph_Type
-CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KCountgraph_Object")
-= {
- PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
- "_khmer.Countgraph", /*tp_name*/
- sizeof(khmer_KCountgraph_Object), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- (destructor)khmer_countgraph_dealloc, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash */
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
- "countgraph hash object", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- khmer_countgraph_methods, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- khmer_countgraph_new, /* tp_new */
-};
-
-//
-// khmer_countgraph_new
-//
-
-static PyObject* khmer_countgraph_new(PyTypeObject * type, PyObject * args,
- PyObject * kwds)
-{
- khmer_KCountgraph_Object * self;
-
- self = (khmer_KCountgraph_Object *)type->tp_alloc(type, 0);
-
- if (self != NULL) {
- WordLength k = 0;
- PyListObject * sizes_list_o = NULL;
-
- if (!PyArg_ParseTuple(args, "bO!", &k, &PyList_Type, &sizes_list_o)) {
- Py_DECREF(self);
- return NULL;
- }
-
- std::vector<uint64_t> sizes;
- if (!convert_Pytablesizes_to_vector(sizes_list_o, sizes)) {
- Py_DECREF(self);
- return NULL;
- }
-
- try {
- self->countgraph = new Countgraph(k, sizes);
- } catch (std::bad_alloc &e) {
- Py_DECREF(self);
- return PyErr_NoMemory();
- }
- self->khashgraph.khashtable.hashtable =
- dynamic_cast<Hashtable*>(self->countgraph);
- self->khashgraph.hashgraph = dynamic_cast<Hashgraph*>(self->countgraph);
- }
-
- return (PyObject *) self;
-}
-
-static
-PyObject *
-nodegraph_update(khmer_KNodegraph_Object * me, PyObject * args)
-{
- Nodegraph * nodegraph = me->nodegraph;
- Nodegraph * other;
- khmer_KNodegraph_Object * other_o;
-
- if (!PyArg_ParseTuple(args, "O!", &khmer_KNodegraph_Type, &other_o)) {
- return NULL;
- }
-
- other = other_o->nodegraph;
-
- try {
- nodegraph->update_from(*other);
- } catch (khmer_exception &e) {
- PyErr_SetString(PyExc_ValueError, e.what());
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-static
-PyObject *
-nodegraph_get_raw_tables(khmer_KNodegraph_Object * self, PyObject * args)
-{
- Nodegraph * countgraph = self->nodegraph;
-
- khmer::Byte ** table_ptrs = countgraph->get_raw_tables();
- std::vector<uint64_t> sizes = countgraph->get_tablesizes();
-
- PyObject * raw_tables = PyList_New(sizes.size());
- for (unsigned int i=0; i<sizes.size(); ++i) {
- Py_buffer buffer;
- int res = PyBuffer_FillInfo(&buffer, NULL, table_ptrs[i], sizes[i], 0,
- PyBUF_FULL_RO);
- if (res == -1) {
- return NULL;
- }
- PyObject * buf = PyMemoryView_FromBuffer(&buffer);
- if(!PyMemoryView_Check(buf)) {
- return NULL;
- }
- PyList_SET_ITEM(raw_tables, i, buf);
- }
-
- return raw_tables;
-}
-
-static PyMethodDef khmer_nodegraph_methods[] = {
- {
- "update",
- (PyCFunction) nodegraph_update, METH_VARARGS,
- "a set update: update this nodegraph with all the entries from the other"
- },
- {
- "get_raw_tables",
- (PyCFunction) nodegraph_get_raw_tables, METH_VARARGS,
- "Get a list of the raw tables as memoryview objects"
- },
- {NULL, NULL, 0, NULL} /* sentinel */
-};
-
-// __new__ for nodegraph; necessary for proper subclassing
-// This will essentially do what the old factory function did. Unlike many __new__
-// methods, we take our arguments here, because there's no "uninitialized" nodegraph
-// object; we have to have k and the table sizes before creating the new objects
-static PyObject* khmer_nodegraph_new(PyTypeObject * type, PyObject * args,
- PyObject * kwds)
-{
- khmer_KNodegraph_Object * self;
- self = (khmer_KNodegraph_Object *)type->tp_alloc(type, 0);
-
- if (self != NULL) {
- WordLength k = 0;
- PyListObject* sizes_list_o = NULL;
-
- if (!PyArg_ParseTuple(args, "bO!", &k, &PyList_Type, &sizes_list_o)) {
- Py_DECREF(self);
- return NULL;
- }
-
- std::vector<uint64_t> sizes;
- if (!convert_Pytablesizes_to_vector(sizes_list_o, sizes)) {
- Py_DECREF(self);
- return NULL;
- }
-
- try {
- self->nodegraph = new Nodegraph(k, sizes);
- } catch (std::bad_alloc &e) {
- Py_DECREF(self);
- return PyErr_NoMemory();
- }
- self->khashgraph.khashtable.hashtable =
- dynamic_cast<Hashtable*>(self->nodegraph);
- self->khashgraph.hashgraph = dynamic_cast<Hashgraph*>(self->nodegraph);
- }
- return (PyObject *) self;
-}
-
-////////////////////////////////////////////////////////////////////////////
-
-static
-PyObject *
-subset_count_partitions(khmer_KSubsetPartition_Object * me, PyObject * args)
-{
- SubsetPartition * subset_p = me->subset;
-
- if (!PyArg_ParseTuple(args, "")) {
- return NULL;
- }
-
- size_t n_partitions = 0, n_unassigned = 0;
- subset_p->count_partitions(n_partitions, n_unassigned);
-
- return Py_BuildValue("nn", (Py_ssize_t) n_partitions,
- (Py_ssize_t) n_unassigned);
-}
-
-static
-PyObject *
-subset_report_on_partitions(khmer_KSubsetPartition_Object * me, PyObject * args)
-{
- SubsetPartition * subset_p = me->subset;
-
- if (!PyArg_ParseTuple(args, "")) {
- return NULL;
- }
-
- subset_p->report_on_partitions();
-
- Py_RETURN_NONE;
-}
-
-static
-PyObject *
-subset_partition_size_distribution(khmer_KSubsetPartition_Object * me,
- PyObject * args)
-{
- SubsetPartition * subset_p = me->subset;
-
- if (!PyArg_ParseTuple(args, "")) {
- return NULL;
- }
-
- PartitionCountDistribution d;
-
- unsigned int n_unassigned = 0;
- subset_p->partition_size_distribution(d, n_unassigned);
-
- PyObject * x = PyList_New(d.size());
- if (x == NULL) {
- return NULL;
- }
- PartitionCountDistribution::iterator di;
-
- unsigned int i;
- for (i = 0, di = d.begin(); di != d.end(); ++di, i++) {
- PyObject * tup = Py_BuildValue("KK", di->first, di->second);
- if (tup != NULL) {
- PyList_SET_ITEM(x, i, tup);
- }
- Py_XDECREF(tup);
- }
- if (!(i == d.size())) {
- throw khmer_exception();
- }
-
- PyObject * ret = Py_BuildValue("OI", x, n_unassigned);
- Py_DECREF(x);
- return ret;
-}
-
-static
-PyObject *
-subset_partition_sizes(khmer_KSubsetPartition_Object * me, PyObject * args)
-{
- SubsetPartition * subset_p = me->subset;
-
- unsigned int min_size = 0;
-
- if (!PyArg_ParseTuple(args, "|I", &min_size)) {
- return NULL;
- }
-
- PartitionCountMap cm;
- unsigned int n_unassigned = 0;
- subset_p->partition_sizes(cm, n_unassigned);
-
- unsigned int i = 0;
- PartitionCountMap::const_iterator mi;
- for (mi = cm.begin(); mi != cm.end(); ++mi) {
- if (mi->second >= min_size) {
- i++;
- }
- }
-
- PyObject * x = PyList_New(i);
- if (x == NULL) {
- return NULL;
- }
-
- // this should probably be a dict. @CTB
- for (i = 0, mi = cm.begin(); mi != cm.end(); ++mi) {
- if (mi->second >= min_size) {
- PyObject * tup = Py_BuildValue("II", mi->first, mi->second);
- if (tup != NULL) {
- PyList_SET_ITEM(x, i, tup);
- }
- i++;
- }
- }
-
- PyObject * ret = Py_BuildValue("OI", x, n_unassigned);
- Py_DECREF(x);
-
- return ret;
-}
-
-static
-PyObject *
-subset_partition_average_coverages(khmer_KSubsetPartition_Object * me,
- PyObject * args)
-{
- SubsetPartition * subset_p = me->subset;
-
- khmer_KCountgraph_Object * countgraph_o;
-
- if (!PyArg_ParseTuple(args, "O!", &khmer_KCountgraph_Type, &countgraph_o)) {
- return NULL;
- }
-
- PartitionCountMap cm;
- subset_p->partition_average_coverages(cm, countgraph_o -> countgraph);
-
- unsigned int i;
- PartitionCountMap::iterator mi;
-
- PyObject * x = PyList_New(cm.size());
- if (x == NULL) {
- return NULL;
- }
-
- // this should probably be a dict. @CTB
- for (i = 0, mi = cm.begin(); mi != cm.end(); ++mi, i++) {
- PyObject * tup = Py_BuildValue("II", mi->first, mi->second);
- if (tup != NULL) {
- PyList_SET_ITEM(x, i, tup);
- }
- }
-
- return x;
-}
-
-static PyMethodDef khmer_subset_methods[] = {
- {
- "count_partitions",
- (PyCFunction)subset_count_partitions,
- METH_VARARGS,
- ""
- },
- {
- "report_on_partitions",
- (PyCFunction)subset_report_on_partitions,
- METH_VARARGS,
- ""
- },
- {
- "partition_size_distribution",
- (PyCFunction)subset_partition_size_distribution,
- METH_VARARGS,
- ""
- },
- {
- "partition_sizes",
- (PyCFunction)subset_partition_sizes,
- METH_VARARGS,
- ""
- },
- {
- "partition_average_coverages",
- (PyCFunction)subset_partition_average_coverages,
- METH_VARARGS,
- ""
- },
- {NULL, NULL, 0, NULL} /* sentinel */
-};
-
-typedef struct {
- PyObject_HEAD
- LabelHash * labelhash;
-} khmer_KGraphLabels_Object;
-
-static PyObject * khmer_graphlabels_new(PyTypeObject * type, PyObject *args,
- PyObject *kwds);
-
-static void khmer_graphlabels_dealloc(khmer_KGraphLabels_Object * obj)
-{
- delete obj->labelhash;
- obj->labelhash = NULL;
-
- Py_TYPE(obj)->tp_free((PyObject*)obj);
-}
-
-static PyObject * khmer_graphlabels_new(PyTypeObject *type, PyObject *args,
- PyObject *kwds)
-{
- khmer_KGraphLabels_Object *self;
- self = (khmer_KGraphLabels_Object*)type->tp_alloc(type, 0);
-
- if (self != NULL) {
- PyObject * hashgraph_o;
- khmer::Hashgraph * hashgraph = NULL; // @CTB
-
- if (!PyArg_ParseTuple(args, "O", &hashgraph_o)) {
- Py_DECREF(self);
- return NULL;
- }
-
- if (PyObject_TypeCheck(hashgraph_o, &khmer_KNodegraph_Type)) {
- khmer_KNodegraph_Object * kho = (khmer_KNodegraph_Object *) hashgraph_o;
- hashgraph = kho->nodegraph;
- } else if (PyObject_TypeCheck(hashgraph_o, &khmer_KCountgraph_Type)) {
- khmer_KCountgraph_Object * cho = (khmer_KCountgraph_Object *) hashgraph_o;
- hashgraph = cho->countgraph;
- } else {
- PyErr_SetString(PyExc_ValueError,
- "graph object must be a NodeGraph or CountGraph");
- Py_DECREF(self);
- return NULL;
- }
-
- try {
- self->labelhash = new LabelHash(hashgraph);
- } catch (std::bad_alloc &e) {
- Py_DECREF(self);
- return PyErr_NoMemory();
- }
- }
-
- return (PyObject *) self;
-}
-
-static
-PyObject *
-labelhash_get_all_labels(khmer_KGraphLabels_Object * me, PyObject * args)
-{
- LabelHash * hb = me->labelhash;
-
- PyObject * d = PyList_New(hb->all_labels.size());
- if (d == NULL) {
- return NULL;
- }
- LabelSet::iterator it;
-
- unsigned long long i = 0;
- for (it = hb->all_labels.begin(); it != hb->all_labels.end(); ++it) {
- PyObject * val = Py_BuildValue("K", *it);
- if (val != NULL) {
- PyList_SetItem(d, i, val);
- }
- i++;
- }
-
- return d;
-}
-
-static
-PyObject *
-labelhash_consume_seqfile_and_tag_with_labels(khmer_KGraphLabels_Object * me,
- PyObject * args)
-{
- LabelHash * hb = me->labelhash;
-
- const char * filename;
-
- if (!PyArg_ParseTuple(args, "s", &filename)) {
- return NULL;
- }
-
- const char *value_exception = NULL;
- const char *file_exception = NULL;
- unsigned long long n_consumed = 0;
- unsigned int total_reads = 0;
- std::string exc_string;
-
- //Py_BEGIN_ALLOW_THREADS
- try {
- hb->consume_seqfile_and_tag_with_labels<FastxReader>(filename, total_reads,
- n_consumed);
- } catch (khmer_file_exception &exc) {
- exc_string = exc.what();
- file_exception = exc_string.c_str();
- } catch (khmer_value_exception &exc) {
- exc_string = exc.what();
- value_exception = exc_string.c_str();
- }
- //Py_END_ALLOW_THREADS
-
- if (file_exception != NULL) {
- PyErr_SetString(PyExc_OSError, file_exception);
- return NULL;
- }
- if (value_exception != NULL) {
- PyErr_SetString(PyExc_ValueError, value_exception);
- return NULL;
- }
-
- return Py_BuildValue("IK", total_reads, n_consumed);
-}
-
-static
-PyObject *
-labelhash_consume_partitioned_fasta_and_tag_with_labels(
- khmer_KGraphLabels_Object * me, PyObject * args)
-{
- LabelHash * labelhash = me->labelhash;
-
- const char * filename;
-
- if (!PyArg_ParseTuple(args, "s", &filename)) {
- return NULL;
- }
-
- // call the C++ function, and trap signals => Python
-
- unsigned long long n_consumed = 0;
- unsigned int total_reads = 0;
-
- try {
- labelhash->consume_partitioned_fasta_and_tag_with_labels<FastxReader>(filename,
- total_reads, n_consumed);
- } catch (khmer_file_exception &exc) {
- PyErr_SetString(PyExc_OSError, exc.what());
- return NULL;
- } catch (khmer_value_exception &exc) {
- PyErr_SetString(PyExc_ValueError, exc.what());
- return NULL;
- }
-
- return Py_BuildValue("IK", total_reads, n_consumed);
-}
-
-static
-PyObject *
-labelhash_consume_sequence_and_tag_with_labels(khmer_KGraphLabels_Object * me,
- PyObject * args)
-{
- LabelHash * hb = me->labelhash;
- const char * seq = NULL;
- unsigned long long c = 0;
- if (!PyArg_ParseTuple(args, "sK", &seq, &c)) {
- return NULL;
- }
- unsigned long long n_consumed = 0;
-
- hb->consume_sequence_and_tag_with_labels(seq, n_consumed, c);
- return Py_BuildValue("K", n_consumed);
-}
-
-static
-PyObject *
-labelhash_sweep_label_neighborhood(khmer_KGraphLabels_Object * me,
- PyObject * args)
-{
- LabelHash * hb = me->labelhash;
-
- const char * seq = NULL;
- int r = 0;
- PyObject * break_on_stop_tags_o = NULL;
- PyObject * stop_big_traversals_o = NULL;
-
- if (!PyArg_ParseTuple(args, "s|iOO", &seq, &r,
- &break_on_stop_tags_o,
- &stop_big_traversals_o)) {
- return NULL;
- }
-
- unsigned int range = (2 * hb->graph->_get_tag_density()) + 1;
- if (r >= 0) {
- range = r;
- }
-
- bool break_on_stop_tags = false;
- if (break_on_stop_tags_o && PyObject_IsTrue(break_on_stop_tags_o)) {
- break_on_stop_tags = true;
- }
- bool stop_big_traversals = false;
- if (stop_big_traversals_o && PyObject_IsTrue(stop_big_traversals_o)) {
- stop_big_traversals = true;
- }
-
- if (strlen(seq) < hb->graph->ksize()) {
- PyErr_SetString(PyExc_ValueError,
- "string length must >= the hashtable k-mer size");
- return NULL;
- }
-
- //std::pair<TagLabelPair::iterator, TagLabelPair::iterator> ret;
- LabelSet found_labels;
-
- //unsigned int num_traversed = 0;
- //Py_BEGIN_ALLOW_THREADS
- hb->sweep_label_neighborhood(seq, found_labels, range, break_on_stop_tags,
- stop_big_traversals);
- //Py_END_ALLOW_THREADS
-
- //printf("...%u kmers traversed\n", num_traversed);
-
- PyObject * x = PyList_New(found_labels.size());
- LabelSet::const_iterator si;
- unsigned long long i = 0;
- for (si = found_labels.begin(); si != found_labels.end(); ++si) {
- PyList_SET_ITEM(x, i, Py_BuildValue("K", *si));
- i++;
- }
-
- return x;
-}
-
-// Similar to find_all_tags, but returns tags in a way actually usable by python
-// need a tags_in_sequence iterator or function in c++ land for reuse in all
-// these functions
-
-static
-PyObject *
-labelhash_sweep_tag_neighborhood(khmer_KGraphLabels_Object * me,
- PyObject * args)
-{
- LabelHash * labelhash = me->labelhash;
-
- const char * seq = NULL;
- int r = 0;
- PyObject * break_on_stop_tags_o = NULL;
- PyObject * stop_big_traversals_o = NULL;
-
- if (!PyArg_ParseTuple(args, "s|iOO", &seq, &r,
- &break_on_stop_tags_o,
- &stop_big_traversals_o)) {
- return NULL;
- }
-
- unsigned int range = (2 * labelhash->graph->_get_tag_density()) + 1;
- if (r >= 0) {
- range = r;
- }
-
- bool break_on_stop_tags = false;
- if (break_on_stop_tags_o && PyObject_IsTrue(break_on_stop_tags_o)) {
- break_on_stop_tags = true;
- }
- bool stop_big_traversals = false;
- if (stop_big_traversals_o && PyObject_IsTrue(stop_big_traversals_o)) {
- stop_big_traversals = true;
- }
-
- if (strlen(seq) < labelhash->graph->ksize()) {
- PyErr_SetString(PyExc_ValueError,
- "string length must >= the hashtable k-mer size");
- return NULL;
- }
-
- SeenSet * tagged_kmers = new SeenSet;
-
- //Py_BEGIN_ALLOW_THREADS
-
- labelhash->graph->partition->sweep_for_tags(seq, *tagged_kmers,
- labelhash->graph->all_tags,
- range, break_on_stop_tags,
- stop_big_traversals);
-
- //Py_END_ALLOW_THREADS
-
- PyObject * x = (PyObject *) create_HashSet_Object(tagged_kmers,
- labelhash->graph->ksize());
- return x;
-}
-
-static
-PyObject *
-labelhash_get_tag_labels(khmer_KGraphLabels_Object * me, PyObject * args)
-{
- LabelHash * labelhash = me->labelhash;
-
- PyObject * tag_o;
- HashIntoType tag;
-
- if (!PyArg_ParseTuple(args, "O", &tag_o)) {
- return NULL;
- }
- if (!ht_convert_PyObject_to_HashIntoType(tag_o, tag,
- labelhash->graph)) {
- return NULL;
- }
-
- LabelSet labels;
- labelhash->get_tag_labels(tag, labels);
-
- PyObject * x = PyList_New(labels.size());
- LabelSet::const_iterator si;
- unsigned long long i = 0;
- for (si = labels.begin(); si != labels.end(); ++si) {
- PyList_SET_ITEM(x, i, Py_BuildValue("K", *si));
- i++;
- }
-
- return x;
-}
-
-static
-PyObject *
-labelhash_n_labels(khmer_KGraphLabels_Object * me, PyObject * args)
-{
- LabelHash * labelhash = me->labelhash;
-
- if (!PyArg_ParseTuple(args, "")) {
- return NULL;
- }
-
- return PyLong_FromSize_t(labelhash->n_labels());
-}
-
-static
-PyObject *
-labelhash_label_across_high_degree_nodes(khmer_KGraphLabels_Object * me,
- PyObject * args)
-{
- LabelHash * labelhash = me->labelhash;
-
- const char * long_str;
- khmer_HashSet_Object * hdn_o = NULL;
- Label label;
-
- if (!PyArg_ParseTuple(args, "sO!K", &long_str,
- &khmer_HashSet_Type, &hdn_o, &label)) {
- return NULL;
- }
-
- if (strlen(long_str) < labelhash->graph->ksize()) {
- Py_INCREF(Py_None);
- return Py_None;
- }
-
- labelhash->label_across_high_degree_nodes(long_str, *hdn_o->hashes, label);
-
- Py_INCREF(Py_None);
- return Py_None;
-}
-
-static
-PyObject *
-labelhash_assemble_labeled_path(khmer_KGraphLabels_Object * me,
- PyObject * args)
-{
- LabelHash* labelhash = me->labelhash;
-
- PyObject * val_o;
- khmer_KNodegraph_Object * nodegraph_o = NULL;
- Nodegraph * stop_bf = NULL;
-
- if (!PyArg_ParseTuple(args, "O|O!", &val_o,
- &khmer_KNodegraph_Type, &nodegraph_o)) {
- return NULL;
- }
-
- Kmer start_kmer;
- if (!ht_convert_PyObject_to_Kmer(val_o, start_kmer, labelhash->graph)) {
- return NULL;
- }
-
- if (nodegraph_o) {
- stop_bf = nodegraph_o->nodegraph;
- }
-
- SimpleLabeledAssembler assembler(labelhash);
- std::vector<std::string> contigs = assembler.assemble(start_kmer, stop_bf);
-
- PyObject * ret = PyList_New(contigs.size());
- for (unsigned int i = 0; i < contigs.size(); i++) {
- PyList_SET_ITEM(ret, i, PyUnicode_FromString(contigs[i].c_str()));
- }
-
- return ret;
-}
-
-static
-PyObject *
-labelhash_save_labels_and_tags(khmer_KGraphLabels_Object * me, PyObject * args)
-{
- const char * filename = NULL;
- LabelHash * labelhash = me->labelhash;
-
- if (!PyArg_ParseTuple(args, "s", &filename)) {
- return NULL;
- }
-
- try {
- labelhash->save_labels_and_tags(filename);
- } catch (khmer_file_exception &e) {
- PyErr_SetString(PyExc_OSError, e.what());
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-static
-PyObject *
-labelhash_load_labels_and_tags(khmer_KGraphLabels_Object * me, PyObject * args)
-{
- const char * filename = NULL;
- LabelHash * labelhash = me->labelhash;
-
- if (!PyArg_ParseTuple(args, "s", &filename)) {
- return NULL;
- }
-
- try {
- labelhash->load_labels_and_tags(filename);
- } catch (khmer_file_exception &e) {
- PyErr_SetString(PyExc_OSError, e.what());
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-static PyMethodDef khmer_graphlabels_methods[] = {
- { "consume_seqfile_and_tag_with_labels", (PyCFunction)labelhash_consume_seqfile_and_tag_with_labels, METH_VARARGS, "" },
- { "sweep_label_neighborhood", (PyCFunction)labelhash_sweep_label_neighborhood, METH_VARARGS, "" },
- {"consume_partitioned_fasta_and_tag_with_labels", (PyCFunction)labelhash_consume_partitioned_fasta_and_tag_with_labels, METH_VARARGS, "" },
- {"sweep_tag_neighborhood", (PyCFunction)labelhash_sweep_tag_neighborhood, METH_VARARGS, "" },
- {"get_tag_labels", (PyCFunction)labelhash_get_tag_labels, METH_VARARGS, ""},
- {"consume_sequence_and_tag_with_labels", (PyCFunction)labelhash_consume_sequence_and_tag_with_labels, METH_VARARGS, "" },
- {"n_labels", (PyCFunction)labelhash_n_labels, METH_VARARGS, ""},
- {"get_all_labels", (PyCFunction)labelhash_get_all_labels, METH_VARARGS, "" },
- {
- "label_across_high_degree_nodes",
- (PyCFunction)labelhash_label_across_high_degree_nodes, METH_VARARGS,
- "Connect graph across high degree nodes using labels.",
- },
- {
- "assemble_labeled_path",
- (PyCFunction)labelhash_assemble_labeled_path, METH_VARARGS,
- "Assemble all paths, using labels to negotiate tricky bits."
- },
- { "save_labels_and_tags", (PyCFunction)labelhash_save_labels_and_tags, METH_VARARGS, "" },
- { "load_labels_and_tags", (PyCFunction)labelhash_load_labels_and_tags, METH_VARARGS, "" }, {NULL, NULL, 0, NULL} /* sentinel */
-};
-
-static PyTypeObject khmer_KGraphLabels_Type = {
- PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
- "_khmer.LabelHash", /* tp_name */
- sizeof(khmer_KGraphLabels_Object), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)khmer_graphlabels_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_compare */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- 0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- khmer_graphlabels_methods, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- khmer_graphlabels_new, /* tp_new */
-};
-
-static
-PyObject *
-hashgraph_repartition_largest_partition(khmer_KHashgraph_Object * me,
- PyObject * args)
-{
- Hashgraph * hashgraph = me->hashgraph;
- khmer_KCountgraph_Object * countgraph_o = NULL;
- PyObject * subset_o = NULL;
- SubsetPartition * subset_p;
- unsigned int distance, threshold, frequency;
-
- if (!PyArg_ParseTuple(args, "OO!III",
- &subset_o,
- &khmer_KCountgraph_Type, &countgraph_o,
- &distance, &threshold, &frequency)) {
- return NULL;
- }
-
- if (PyObject_TypeCheck(subset_o, &khmer_KSubsetPartition_Type)) {
- subset_p = ((khmer_KSubsetPartition_Object *) subset_o)->subset;
- } else {
- subset_p = hashgraph->partition;
- }
-
- Countgraph * countgraph = countgraph_o->countgraph;
-
- unsigned long next_largest;
- try {
- next_largest = subset_p->repartition_largest_partition(distance,
- threshold, frequency, *countgraph);
- } catch (khmer_exception &e) {
- PyErr_SetString(PyExc_RuntimeError, e.what());
- return NULL;
- }
-
- return PyLong_FromLong(next_largest);
-}
-
-static PyObject * readaligner_align(khmer_ReadAligner_Object * me,
- PyObject * args)
-{
- const char * read;
-
- if (!PyArg_ParseTuple(args, "s", &read)) {
- return NULL;
- }
-
- /*if (strlen(read) < (unsigned int)aligner->ksize()) {
- PyErr_SetString(PyExc_ValueError,
- "string length must >= the hashtable k-mer size");
- return NULL;
- }*/
-
- Alignment * aln = me->aligner->Align(read);
-
- const char* alignment = aln->graph_alignment.c_str();
- const char* readAlignment = aln->read_alignment.c_str();
- PyObject * ret = Py_BuildValue("dssO", aln->score, alignment,
- readAlignment, (aln->truncated)? Py_True : Py_False);
- delete aln;
-
- return ret;
-}
-
-static PyObject * readaligner_align_forward(khmer_ReadAligner_Object * me,
- PyObject * args)
-{
- ReadAligner * aligner = me->aligner;
-
- const char * read;
-
- if (!PyArg_ParseTuple(args, "s", &read)) {
- return NULL;
- }
-
- /*if (strlen(read) < (unsigned int)aligner->ksize()) {
- PyErr_SetString(PyExc_ValueError,
- "string length must >= the hashtable k-mer size");
- return NULL;
- }*/
-
- Alignment * aln;
- aln = aligner->AlignForward(read);
-
- const char* alignment = aln->graph_alignment.c_str();
- const char* readAlignment = aln->read_alignment.c_str();
- PyObject * x = PyList_New(aln->covs.size());
- for (size_t i = 0; i < aln->covs.size(); i++ ) {
- PyList_SET_ITEM(x, i, PyLong_FromLong(aln->covs[i]));
- }
-
- PyObject * ret = Py_BuildValue("dssOO", aln->score, alignment,
- readAlignment,
- (aln->truncated)? Py_True : Py_False,
- x);
- delete aln;
- Py_DECREF(x);
-
- return ret;
-}
-
-static PyObject* khmer_ReadAligner_get_scoring_matrix(
- khmer_ReadAligner_Object * me, PyObject * args)
-{
-
- if (!PyArg_ParseTuple(args, "")) {
- return NULL;
- }
- ScoringMatrix matrix = me->aligner->getScoringMatrix();
-
- return Py_BuildValue( "dddd", matrix.trusted_match, matrix.trusted_mismatch,
- matrix.untrusted_match, matrix.untrusted_mismatch);
-}
-
-static PyObject* khmer_ReadAligner_get_transition_probabilities(
- khmer_ReadAligner_Object * me, PyObject * args)
-{
-
- if (!PyArg_ParseTuple(args, "")) {
- return NULL;
- }
- ScoringMatrix matrix = me->aligner->getScoringMatrix();
-
- return Py_BuildValue( "(dddddd)(dddd)(dddd)(dddddd)(dddd)(dddd)",
- matrix.tsc[0], matrix.tsc[1], matrix.tsc[2],
- matrix.tsc[3], matrix.tsc[4], matrix.tsc[5],
- matrix.tsc[6], matrix.tsc[7], matrix.tsc[8],
- matrix.tsc[9], matrix.tsc[10], matrix.tsc[11],
- matrix.tsc[12], matrix.tsc[13], matrix.tsc[14],
- matrix.tsc[15], matrix.tsc[16], matrix.tsc[17],
- matrix.tsc[18], matrix.tsc[19], matrix.tsc[20],
- matrix.tsc[21], matrix.tsc[22], matrix.tsc[23],
- matrix.tsc[24], matrix.tsc[25], matrix.tsc[26],
- matrix.tsc[27]);
-}
-
-static PyMethodDef khmer_ReadAligner_methods[] = {
- {"align", (PyCFunction)readaligner_align, METH_VARARGS, ""},
- {"align_forward", (PyCFunction)readaligner_align_forward, METH_VARARGS, ""},
- {
- "get_scoring_matrix", (PyCFunction)khmer_ReadAligner_get_scoring_matrix,
- METH_VARARGS,
- "Get the scoring matrix in use.\n\n\
-Returns a tuple of floats: (trusted_match, trusted_mismatch, untrusted_match, \
-untrusted_mismatch)"
- },
- {
- "get_transition_probabilities",
- (PyCFunction)khmer_ReadAligner_get_transition_probabilities,
- METH_VARARGS,
- "Get the transition probabilties in use.\n\n\
-HMM state notation abbreviations:\n\
- M_t - trusted match; M_u - untrusted match\n\
- Ir_t - trusted read insert; Ir_u - untrusted read insert\n\
- Ig_t - trusted graph insert; Ig_u - untrusted graph insert\n\
-\
-Returns a sparse matrix as a tuple of six tuples.\n\
-The inner tuples contain 6, 4, 4, 6, 4, and 4 floats respectively.\n\
-Transition are notated as 'StartState-NextState':\n\
-(\n\
- ( M_t-M_t, M_t-Ir_t, M_t-Ig_t, M_t-M_u, M_t-Ir_u, M_t-Ig_u),\n\
- (Ir_t-M_t, Ir_t-Ir_t, Ir_t-M_u, Ir_t-Ir_u ),\n\
- (Ig_t-M_t, , Ig_t-Ig_t, Ig_t-M_u, Ig_t-Ig_u),\n\
- ( M_u-M_t, M_u-Ir_t, M_u-Ig_t, M_u-M_u, M_u-Ir_u, M_u-Ig_u),\n\
- (Ir_u-M_t, Ir_u-Ir_t, Ir_u-M_u, Ir_u-Ir_u ),\n\
- (Ig_u-M_t, , Ig_u-Ig_t, Ig_u-M_u, Ig_u-Ig_u)\n\
-)"
- },
- {NULL} /* Sentinel */
-};
-
-//
-// khmer_readaligner_dealloc -- clean up readaligner object
-// GRAPHALIGN addition
-//
-static void khmer_readaligner_dealloc(khmer_ReadAligner_Object* obj)
-{
- delete obj->aligner;
- obj->aligner = NULL;
- Py_TYPE(obj)->tp_free((PyObject*)obj);
-}
-
-//
-// new_readaligner
-//
-static PyObject* khmer_ReadAligner_new(PyTypeObject *type, PyObject * args,
- PyObject *kwds)
-{
- khmer_ReadAligner_Object * self;
-
- self = (khmer_ReadAligner_Object *)type->tp_alloc(type, 0);
-
- if (self != NULL) {
- khmer_KCountgraph_Object * ch = NULL;
- unsigned short int trusted_cov_cutoff = 2;
- double bits_theta = 1;
- double scoring_matrix[] = { 0, 0, 0, 0 };
- double * transitions = new double[28];
-
- if(!PyArg_ParseTuple(
- args,
- "O!Hd|(dddd)((dddddd)(dddd)(dddd)(dddddd)(dddd)(dddd))",
- &khmer_KCountgraph_Type, &ch, &trusted_cov_cutoff,
- &bits_theta, &scoring_matrix[0], &scoring_matrix[1],
- &scoring_matrix[2], &scoring_matrix[3], &transitions[0],
- &transitions[1], &transitions[2], &transitions[3],
- &transitions[4], &transitions[5], &transitions[6],
- &transitions[7], &transitions[8], &transitions[9],
- &transitions[10], &transitions[11], &transitions[12],
- &transitions[13], &transitions[14], &transitions[15],
- &transitions[16], &transitions[17], &transitions[18],
- &transitions[19], &transitions[20], &transitions[21],
- &transitions[22], &transitions[23], &transitions[24],
- &transitions[25], &transitions[26], &transitions[27])) {
- Py_DECREF(self);
- return NULL;
- }
-
- self->aligner = new ReadAligner(ch->countgraph, trusted_cov_cutoff,
- bits_theta, scoring_matrix,
- transitions);
- }
-
- return (PyObject *) self;
-}
-
-static PyTypeObject khmer_ReadAlignerType = {
- PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
- "_khmer.ReadAligner", /*tp_name*/
- sizeof(khmer_ReadAligner_Object), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- (destructor)khmer_readaligner_dealloc, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash */
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
- "ReadAligner object", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- khmer_ReadAligner_methods, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- khmer_ReadAligner_new, /* tp_new */
-};
-
-//
-// khmer_countgraph_dealloc -- clean up a countgraph hash object.
-//
-
-static void khmer_countgraph_dealloc(khmer_KCountgraph_Object * obj)
-{
- delete obj->countgraph;
- obj->countgraph = NULL;
- Py_TYPE(obj)->tp_free((PyObject*)obj);
-}
-
-//
-// khmer_nodegraph_dealloc -- clean up a nodegraph object.
-//
-static void khmer_nodegraph_dealloc(khmer_KNodegraph_Object * obj)
-{
- delete obj->nodegraph;
- obj->nodegraph = NULL;
-
- Py_TYPE(obj)->tp_free((PyObject*)obj);
-}
-
-
-//
-// khmer_subset_dealloc -- clean up a subset object.
-//
-
-static void khmer_subset_dealloc(khmer_KSubsetPartition_Object * obj)
-{
- delete obj->subset;
- obj->subset = NULL;
- Py_TYPE(obj)->tp_free((PyObject*)obj);
-}
-
-
-/***********************************************************************/
-
-//
-// KHLLCounter object
-//
-
-typedef struct {
- PyObject_HEAD
- HLLCounter * hllcounter;
-} khmer_KHLLCounter_Object;
-
-static PyObject* khmer_hllcounter_new(PyTypeObject * type, PyObject * args,
- PyObject * kwds)
-{
- khmer_KHLLCounter_Object * self;
- self = (khmer_KHLLCounter_Object *)type->tp_alloc(type, 0);
-
- if (self != NULL) {
- double error_rate = 0.01;
- WordLength ksize = 20;
-
- if (!PyArg_ParseTuple(args, "|db", &error_rate, &ksize)) {
- Py_DECREF(self);
- return NULL;
- }
-
- try {
- self->hllcounter = new HLLCounter(error_rate, ksize);
- } catch (InvalidValue &e) {
- Py_DECREF(self);
- PyErr_SetString(PyExc_ValueError, e.what());
- return NULL;
- }
- }
-
- return (PyObject *) self;
-}
-
-//
-// khmer_hllcounter_dealloc -- clean up a hllcounter object.
-//
-
-static void khmer_hllcounter_dealloc(khmer_KHLLCounter_Object * obj)
-{
- delete obj->hllcounter;
- obj->hllcounter = NULL;
-
- Py_TYPE(obj)->tp_free((PyObject*)obj);
-}
-
-static
-PyObject *
-hllcounter_add(khmer_KHLLCounter_Object * me, PyObject * args)
-{
- const char * kmer_str;
-
- if (!PyArg_ParseTuple(args, "s", &kmer_str)) {
- return NULL;
- }
-
- try {
- me->hllcounter->add(kmer_str);
- } catch (khmer_exception &e) {
- PyErr_SetString(PyExc_ValueError, e.what());
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-static
-PyObject *
-hllcounter_estimate_cardinality(khmer_KHLLCounter_Object * me, PyObject * args)
-{
- if (!PyArg_ParseTuple( args, "" )) {
- return NULL;
- }
-
- return PyLong_FromLong(me->hllcounter->estimate_cardinality());
-}
-
-static
-PyObject *
-hllcounter_consume_string(khmer_KHLLCounter_Object * me, PyObject * args)
-{
- const char * kmer_str;
- unsigned long long n_consumed;
-
- if (!PyArg_ParseTuple(args, "s", &kmer_str)) {
- return NULL;
- }
-
- try {
- n_consumed = me->hllcounter->consume_string(kmer_str);
- } catch (khmer_exception &e) {
- PyErr_SetString(PyExc_ValueError, e.what());
- return NULL;
- }
-
- return PyLong_FromLong(n_consumed);
-}
-
-static PyObject * hllcounter_consume_seqfile(khmer_KHLLCounter_Object * me,
- PyObject * args, PyObject * kwds)
-{
- const char * filename;
- PyObject * stream_records_o = NULL;
-
- static const char* const_kwlist[] = {"filename", "stream_records", NULL};
- static char** kwlist = const_cast<char**>(const_kwlist);
-
- bool stream_records = false;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|O", kwlist,
- &filename, &stream_records_o)) {
- return NULL;
- }
-
- if (stream_records_o != NULL && PyObject_IsTrue(stream_records_o)) {
- stream_records = true;
- }
-
- // call the C++ function, and trap signals => Python
- unsigned long long n_consumed = 0;
- unsigned int total_reads = 0;
- try {
- me->hllcounter->consume_seqfile<FastxReader>(filename, stream_records,
- total_reads,
- n_consumed);
- } catch (khmer_file_exception &exc) {
- PyErr_SetString(PyExc_OSError, exc.what());
- return NULL;
- } catch (khmer_value_exception &exc) {
- PyErr_SetString(PyExc_ValueError, exc.what());
- return NULL;
- }
-
- return Py_BuildValue("IK", total_reads, n_consumed);
-}
-
-static PyObject * hllcounter_merge(khmer_KHLLCounter_Object * me,
- PyObject * args);
-
-static
-PyObject *
-hllcounter_get_erate(khmer_KHLLCounter_Object * me)
-{
- return PyFloat_FromDouble(me->hllcounter->get_erate());
-}
-
-static
-PyObject *
-hllcounter_get_ksize(khmer_KHLLCounter_Object * me)
-{
- return PyLong_FromLong(me->hllcounter->get_ksize());
-}
-
-static
-int
-hllcounter_set_ksize(khmer_KHLLCounter_Object * me, PyObject *value,
- void *closure)
-{
- if (value == NULL) {
- PyErr_SetString(PyExc_TypeError, "Cannot delete attribute");
- return -1;
- }
-
- long ksize = 0;
- if (PyLong_Check(value)) {
- ksize = PyLong_AsLong(value);
- } else if (PyInt_Check(value)) {
- ksize = PyInt_AsLong(value);
- } else {
- PyErr_SetString(PyExc_TypeError,
- "Please use an integer value for k-mer size");
- return -1;
- }
-
- if (ksize <= 0) {
- PyErr_SetString(PyExc_ValueError, "Please set k-mer size to a value "
- "greater than zero");
- return -1;
- }
-
- try {
- me->hllcounter->set_ksize(ksize);
- } catch (ReadOnlyAttribute &e) {
- PyErr_SetString(PyExc_AttributeError, e.what());
- return -1;
- }
-
- return 0;
-}
-
-static
-int
-hllcounter_set_erate(khmer_KHLLCounter_Object * me, PyObject *value,
- void *closure)
-{
- if (value == NULL) {
- PyErr_SetString(PyExc_TypeError, "Cannot delete attribute");
- return -1;
- }
-
- if (!PyFloat_Check(value)) {
- PyErr_SetString(PyExc_TypeError,
- "Please use a float value for k-mer size");
- return -1;
- }
-
- double erate = PyFloat_AsDouble(value);
- try {
- me->hllcounter->set_erate(erate);
- } catch (InvalidValue &e) {
- PyErr_SetString(PyExc_ValueError, e.what());
- return -1;
- } catch (ReadOnlyAttribute &e) {
- PyErr_SetString(PyExc_AttributeError, e.what());
- return -1;
- }
-
- return 0;
-}
-
-static
-PyObject *
-hllcounter_getalpha(khmer_KHLLCounter_Object * me)
-{
- return PyFloat_FromDouble(me->hllcounter->get_alpha());
-}
-
-static
-PyObject *
-hllcounter_getcounters(khmer_KHLLCounter_Object * me)
-{
- std::vector<int> counters = me->hllcounter->get_M();
-
- PyObject * x = PyList_New(counters.size());
- for (size_t i = 0; i < counters.size(); i++) {
- PyList_SET_ITEM(x, i, PyLong_FromLong(counters[i]));
- }
-
- return x;
-}
-
-static PyMethodDef khmer_hllcounter_methods[] = {
- {
- "add", (PyCFunction)hllcounter_add,
- METH_VARARGS,
- "Add a k-mer to the counter."
- },
- {
- "estimate_cardinality", (PyCFunction)hllcounter_estimate_cardinality,
- METH_VARARGS,
- "Return the current estimation."
- },
- {
- "consume_string", (PyCFunction)hllcounter_consume_string,
- METH_VARARGS,
- "Break a sequence into k-mers and add each k-mer to the counter."
- },
- {
- "consume_seqfile", (PyCFunction)hllcounter_consume_seqfile,
- METH_VARARGS | METH_KEYWORDS,
- "Read sequences from file, break into k-mers, "
- "and add each k-mer to the counter. If optional keyword 'stream_out' "
- "is True, also prints each sequence to stdout."
- },
- {
- "merge", (PyCFunction)hllcounter_merge,
- METH_VARARGS,
- "Merge other counter into this one."
- },
- {NULL} /* Sentinel */
-};
-
-static PyGetSetDef khmer_hllcounter_getseters[] = {
- {
- (char *)"alpha",
- (getter)hllcounter_getalpha, NULL,
- (char *)"alpha constant for this HLL counter.",
- NULL
- },
- {
- (char *)"error_rate",
- (getter)hllcounter_get_erate, (setter)hllcounter_set_erate,
- (char *)"Error rate for this HLL counter. "
- "Can be changed prior to first counting, but becomes read-only after "
- "that (raising AttributeError)",
- NULL
- },
- {
- (char *)"ksize",
- (getter)hllcounter_get_ksize, (setter)hllcounter_set_ksize,
- (char *)"k-mer size for this HLL counter."
- "Can be changed prior to first counting, but becomes read-only after "
- "that (raising AttributeError)",
- NULL
- },
- {
- (char *)"counters",
- (getter)hllcounter_getcounters, NULL,
- (char *)"Read-only internal counters.",
- NULL
- },
- {NULL} /* Sentinel */
-};
-
-static PyTypeObject khmer_KHLLCounter_Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "_khmer.KHLLCounter", /* tp_name */
- sizeof(khmer_KHLLCounter_Object), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)khmer_hllcounter_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_compare */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- "HyperLogLog counter", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- khmer_hllcounter_methods, /* tp_methods */
- 0, /* tp_members */
- khmer_hllcounter_getseters, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- khmer_hllcounter_new, /* tp_new */
-};
-
-static PyObject * hllcounter_merge(khmer_KHLLCounter_Object * me,
- PyObject * args)
-{
- khmer_KHLLCounter_Object * other;
-
- if (!PyArg_ParseTuple(args, "O!", &khmer_KHLLCounter_Type, &other)) {
- return NULL;
- }
-
- try {
- me->hllcounter->merge(*(other->hllcounter));
- } catch (khmer_exception &e) {
- PyErr_SetString(PyExc_ValueError, e.what());
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-/********************************
- * Assembler classes
- ********************************/
-
-
-typedef struct {
- PyObject_HEAD
- LinearAssembler * assembler;
-} khmer_KLinearAssembler_Object;
-
-static void khmer_linearassembler_dealloc(khmer_KLinearAssembler_Object * obj)
-{
- delete obj->assembler;
- obj->assembler = NULL;
-
- Py_TYPE(obj)->tp_free((PyObject*)obj);
-}
-
-static PyObject * khmer_linearassembler_new(PyTypeObject *type, PyObject *args,
- PyObject *kwds)
-{
- khmer_KLinearAssembler_Object *self;
- self = (khmer_KLinearAssembler_Object*)type->tp_alloc(type, 0);
-
- if (self != NULL) {
- PyObject * hashgraph_o;
- Hashgraph * hashgraph = NULL;
-
- if (!PyArg_ParseTuple(args, "O", &hashgraph_o)) {
- Py_DECREF(self);
- return NULL;
- }
-
- if (PyObject_TypeCheck(hashgraph_o, &khmer_KNodegraph_Type)) {
- khmer_KNodegraph_Object * kho = (khmer_KNodegraph_Object *) hashgraph_o;
- hashgraph = kho->nodegraph;
- } else if (PyObject_TypeCheck(hashgraph_o, &khmer_KCountgraph_Type)) {
- khmer_KCountgraph_Object * cho = (khmer_KCountgraph_Object *) hashgraph_o;
- hashgraph = cho->countgraph;
- } else {
- PyErr_SetString(PyExc_ValueError,
- "graph object must be a NodeGraph or CountGraph");
- Py_DECREF(self);
- return NULL;
- }
-
- try {
- self->assembler = new LinearAssembler(hashgraph);
- } catch (std::bad_alloc &e) {
- Py_DECREF(self);
- return PyErr_NoMemory();
- }
-
- }
-
- return (PyObject *) self;
-}
-
-
-static
-PyObject *
-linearassembler_assemble(khmer_KLinearAssembler_Object * me,
- PyObject * args, PyObject *kwargs)
-{
- LinearAssembler * assembler= me->assembler;
-
- PyObject * val_o;
- khmer_KNodegraph_Object * nodegraph_o = NULL;
- Nodegraph * stop_bf = NULL;
- const char * dir_str = NULL;
- char dir = NULL;
-
- const char *kwnames[] = {"seed_kmer", "stop_filter", "direction", NULL};
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|O!s",
- const_cast<char **>(kwnames),
- &val_o, &khmer_KNodegraph_Type,
- &nodegraph_o, &dir_str)) {
- return NULL;
- }
- if (dir_str != NULL) {
- dir = dir_str[0];
- } else {
- dir = 'B';
- }
-
- Kmer start_kmer;
- if (!ht_convert_PyObject_to_Kmer(val_o, start_kmer, assembler->graph)) {
- return NULL;
- }
-
- if (nodegraph_o) {
- stop_bf = nodegraph_o->nodegraph;
- }
-
- std::string contig;
- if (dir == 'B') {
- contig = assembler->assemble(start_kmer, stop_bf);
- } else if (dir == 'L') {
- contig = assembler->assemble_left(start_kmer, stop_bf);
- } else if (dir == 'R') {
- contig = assembler->assemble_right(start_kmer, stop_bf);
- } else {
- PyErr_SetString(PyExc_ValueError, "Direction must be B (both), L (left),"
- " or R (right).");
- return NULL;
- }
-
- PyObject * ret = Py_BuildValue("s", contig.c_str());
- return ret;
-}
-
-
-static PyMethodDef khmer_linearassembler_methods[] = {
- {
- "assemble",
- (PyCFunction)linearassembler_assemble, METH_VARARGS | METH_KEYWORDS,
- "Assemble a path linearly until a branch is reached."
- },
- {NULL, NULL, 0, NULL} /* sentinel */
-};
-
-static PyTypeObject khmer_KLinearAssembler_Type = {
- PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
- "_khmer.LinearAssembler", /* tp_name */
- sizeof(khmer_KLinearAssembler_Object), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)khmer_linearassembler_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_compare */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- 0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- khmer_linearassembler_methods, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- khmer_linearassembler_new, /* tp_new */
-};
-
-
-
-typedef struct {
- PyObject_HEAD
- SimpleLabeledAssembler * assembler;
-} khmer_KSimpleLabeledAssembler_Object;
-
-
-static void khmer_simplelabeledassembler_dealloc(khmer_KLinearAssembler_Object *
- obj)
-{
- delete obj->assembler;
- obj->assembler = NULL;
-
- Py_TYPE(obj)->tp_free((PyObject*)obj);
-}
-
-static PyObject * khmer_simplelabeledassembler_new(PyTypeObject *type,
- PyObject *args,
- PyObject *kwds)
-{
- khmer_KSimpleLabeledAssembler_Object *self;
- self = (khmer_KSimpleLabeledAssembler_Object*)type->tp_alloc(type, 0);
-
- if (self != NULL) {
- PyObject * labelhash_o;
- LabelHash * labelhash = NULL;
-
- if (!PyArg_ParseTuple(args, "O", &labelhash_o)) {
- Py_DECREF(self);
- return NULL;
- }
-
- if (PyObject_TypeCheck(labelhash_o, &khmer_KGraphLabels_Type)) {
- khmer_KGraphLabels_Object * klo = (khmer_KGraphLabels_Object *) labelhash_o;
- labelhash = klo->labelhash;
- } else {
- PyErr_SetString(PyExc_ValueError,
- "SimpleLabeledAssembler needs a GraphLabels object.");
- Py_DECREF(self);
- return NULL;
- }
-
- try {
- self->assembler = new SimpleLabeledAssembler(labelhash);
- } catch (std::bad_alloc &e) {
- Py_DECREF(self);
- return PyErr_NoMemory();
- }
-
- }
-
- return (PyObject *) self;
-}
-
-
-static
-PyObject *
-simplelabeledassembler_assemble(khmer_KSimpleLabeledAssembler_Object * me,
- PyObject * args, PyObject *kwargs)
-{
- SimpleLabeledAssembler * assembler = me->assembler;
-
- PyObject * val_o;
- khmer_KNodegraph_Object * nodegraph_o = NULL;
- Nodegraph * stop_bf = NULL;
-
- const char *kwnames[] = {"seed_kmer", "stop_filter", NULL};
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|O!",
- const_cast<char **>(kwnames),
- &val_o, &khmer_KNodegraph_Type,
- &nodegraph_o)) {
- return NULL;
- }
-
-
- Kmer start_kmer;
- if (!ht_convert_PyObject_to_Kmer(val_o, start_kmer, assembler->graph)) {
- return NULL;
- }
-
- if (nodegraph_o) {
- stop_bf = nodegraph_o->nodegraph;
- }
-
- std::vector<std::string> contigs = assembler->assemble(start_kmer, stop_bf);
-
- PyObject * ret = PyList_New(contigs.size());
- for (unsigned int i = 0; i < contigs.size(); i++) {
- PyList_SET_ITEM(ret, i, PyUnicode_FromString(contigs[i].c_str()));
- }
-
- return ret;
-}
-
-
-static PyMethodDef khmer_simplelabeledassembler_methods[] = {
- {
- "assemble",
- (PyCFunction)simplelabeledassembler_assemble, METH_VARARGS | METH_KEYWORDS,
- "Assemble paths, using labels to jump branches."
- },
- {NULL, NULL, 0, NULL} /* sentinel */
-};
-
-static PyTypeObject khmer_KSimpleLabeledAssembler_Type = {
- PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
- "_khmer.SimpleLabeledAssembler", /* tp_name */
- sizeof(khmer_KSimpleLabeledAssembler_Object), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)khmer_simplelabeledassembler_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_compare */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- 0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- khmer_simplelabeledassembler_methods, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- khmer_simplelabeledassembler_new, /* tp_new */
-};
-
-
-
-/********************************
- * JunctionCountAssembler
- ********************************/
-
-
-typedef struct {
- PyObject_HEAD
- JunctionCountAssembler * assembler;
-} khmer_KJunctionCountAssembler_Object;
-
-static void khmer_junctioncountassembler_dealloc(
- khmer_KJunctionCountAssembler_Object * obj)
-{
- delete obj->assembler;
- obj->assembler = NULL;
-
- Py_TYPE(obj)->tp_free((PyObject*)obj);
-}
-
-static PyObject * khmer_junctioncountassembler_new(PyTypeObject *type,
- PyObject *args,
- PyObject *kwds)
-{
- khmer_KJunctionCountAssembler_Object *self;
- self = (khmer_KJunctionCountAssembler_Object*)type->tp_alloc(type, 0);
-
- if (self != NULL) {
- PyObject * hashgraph_o;
- Hashgraph * hashgraph = NULL;
-
- if (!PyArg_ParseTuple(args, "O", &hashgraph_o)) {
- Py_DECREF(self);
- return NULL;
- }
-
- if (PyObject_TypeCheck(hashgraph_o, &khmer_KNodegraph_Type)) {
- khmer_KNodegraph_Object * kho = (khmer_KNodegraph_Object *) hashgraph_o;
- hashgraph = kho->nodegraph;
- } else if (PyObject_TypeCheck(hashgraph_o, &khmer_KCountgraph_Type)) {
- khmer_KCountgraph_Object * cho = (khmer_KCountgraph_Object *) hashgraph_o;
- hashgraph = cho->countgraph;
- } else {
- PyErr_SetString(PyExc_ValueError,
- "graph object must be a NodeGraph or CountGraph");
- Py_DECREF(self);
- return NULL;
- }
-
- try {
- self->assembler = new JunctionCountAssembler(hashgraph);
- } catch (std::bad_alloc &e) {
- Py_DECREF(self);
- return PyErr_NoMemory();
- }
-
- }
-
- return (PyObject *) self;
-}
-
-
-static
-PyObject *
-junctioncountassembler_assemble(khmer_KJunctionCountAssembler_Object * me,
- PyObject * args, PyObject *kwargs)
-{
- JunctionCountAssembler * assembler = me->assembler;
-
- PyObject * val_o;
- khmer_KNodegraph_Object * nodegraph_o = NULL;
- Nodegraph * stop_bf = NULL;
-
- const char *kwnames[] = {"seed_kmer", "stop_filter", NULL};
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|O!",
- const_cast<char **>(kwnames),
- &val_o, &khmer_KNodegraph_Type,
- &nodegraph_o)) {
- return NULL;
- }
-
- Kmer start_kmer;
- if (!ht_convert_PyObject_to_Kmer(val_o, start_kmer, assembler->graph)) {
- return NULL;
- }
-
- if (nodegraph_o) {
- stop_bf = nodegraph_o->nodegraph;
- }
-
- std::vector<std::string> contigs = assembler->assemble(start_kmer, stop_bf);
-
- PyObject * ret = PyList_New(contigs.size());
- for (unsigned int i = 0; i < contigs.size(); i++) {
- PyList_SET_ITEM(ret, i, PyUnicode_FromString(contigs[i].c_str()));
- }
-
- return ret;
-}
-
-
-static
-PyObject *
-junctioncountassembler_consume(khmer_KJunctionCountAssembler_Object * me,
- PyObject * args)
-{
- JunctionCountAssembler * assembler = me->assembler;
- const char * long_str;
-
- if (!PyArg_ParseTuple(args, "s", &long_str)) {
- return NULL;
- }
-
- if (strlen(long_str) < assembler->_ksize) {
- PyErr_SetString(PyExc_ValueError,
- "string length must >= the hashgraph k-mer size");
- return NULL;
- }
-
- uint16_t n_junctions = assembler->consume(long_str);
-
- return PyLong_FromLong((HashIntoType) n_junctions);
-}
-
-
-static PyMethodDef khmer_junctioncountassembler_methods[] = {
- {
- "assemble",
- (PyCFunction)junctioncountassembler_assemble, METH_VARARGS | METH_KEYWORDS,
- "Assemble paths, using recorded junctions to jump branches."
- },
- {
- "consume",
- (PyCFunction)junctioncountassembler_consume, METH_VARARGS,
- "Consume a string and count its branch junctions."
- },
- {NULL, NULL, 0, NULL} /* sentinel */
-};
-
-static PyTypeObject khmer_KJunctionCountAssembler_Type = {
- PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
- "_khmer.JunctionCountAssembler", /* tp_name */
- sizeof(khmer_KJunctionCountAssembler_Object), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)khmer_junctioncountassembler_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_compare */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- 0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- khmer_junctioncountassembler_methods, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- khmer_junctioncountassembler_new, /* tp_new */
-};
-
-////
-
-static
-PyObject *
-hashtable_abundance_distribution_with_reads_parser(khmer_KHashtable_Object * me,
- PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- khmer :: python :: khmer_ReadParser_Object * rparser_obj = NULL;
- khmer_KHashtable_Object * tracking_obj = NULL;
-
- if (!PyArg_ParseTuple(args, "O!O!", &python::khmer_ReadParser_Type,
- &rparser_obj, &khmer_KHashtable_Type, &tracking_obj)) {
- return NULL;
- }
-
- FastxParserPtr& rparser = rparser_obj->parser;
- Hashtable *tracking = tracking_obj->hashtable;
- uint64_t *dist = NULL;
- const char *value_exception = NULL;
- const char *file_exception = NULL;
- std::string exc_string;
-
- Py_BEGIN_ALLOW_THREADS
- try {
- dist = hashtable->abundance_distribution<FastxReader>(rparser, tracking);
- } catch (khmer_file_exception &exc) {
- exc_string = exc.what();
- file_exception = exc_string.c_str();
- } catch (khmer_value_exception &exc) {
- exc_string = exc.what();
- value_exception = exc_string.c_str();
- }
- Py_END_ALLOW_THREADS
-
- if (file_exception != NULL) {
- PyErr_SetString(PyExc_OSError, file_exception);
- return NULL;
- }
- if (value_exception != NULL) {
- PyErr_SetString(PyExc_ValueError, value_exception);
- return NULL;
- }
-
- PyObject * x = PyList_New(MAX_BIGCOUNT + 1);
- if (x == NULL) {
- delete[] dist;
- return NULL;
- }
- for (int i = 0; i < MAX_BIGCOUNT + 1; i++) {
- PyList_SET_ITEM(x, i, PyLong_FromUnsignedLongLong(dist[i]));
- }
-
- delete[] dist;
- return x;
-}
-
-static
-PyObject *
-hashtable_abundance_distribution(khmer_KHashtable_Object * me, PyObject * args)
-{
- Hashtable * hashtable = me->hashtable;
-
- const char * filename = NULL;
- khmer_KHashtable_Object * tracking_obj = NULL;
- if (!PyArg_ParseTuple(args, "sO!", &filename, &khmer_KHashtable_Type,
- &tracking_obj)) {
- return NULL;
- }
-
- Hashtable *tracking = tracking_obj->hashtable;
- uint64_t *dist = NULL;
- const char *value_exception = NULL;
- const char *file_exception = NULL;
- std::string exc_string;
-
- Py_BEGIN_ALLOW_THREADS
- try {
- dist = hashtable->abundance_distribution<FastxReader>(filename, tracking);
- } catch (khmer_file_exception &exc) {
- exc_string = exc.what();
- file_exception = exc_string.c_str();
- } catch (khmer_value_exception &exc) {
- exc_string = exc.what();
- value_exception = exc_string.c_str();
- }
- Py_END_ALLOW_THREADS
-
- if (file_exception != NULL) {
- PyErr_SetString(PyExc_OSError, file_exception);
- if (dist != NULL) {
- delete []dist;
- }
- return NULL;
- }
- if (value_exception != NULL) {
- PyErr_SetString(PyExc_ValueError, value_exception);
- if (dist != NULL) {
- delete []dist;
- }
- return NULL;
- }
-
- PyObject * x = PyList_New(MAX_BIGCOUNT + 1);
- if (x == NULL) {
- if (dist != NULL) {
- delete []dist;
- }
- return NULL;
- }
- for (int i = 0; i < MAX_BIGCOUNT + 1; i++) {
- PyList_SET_ITEM(x, i, PyLong_FromUnsignedLongLong(dist[i]));
- }
-
- if (dist != NULL) {
- delete []dist;
- }
-
- return x;
-}
-
-//////////////////////////////
-// standalone functions
-
-static PyObject * forward_hash(PyObject * self, PyObject * args)
-{
- const char * kmer;
- WordLength ksize;
-
- if (!PyArg_ParseTuple(args, "sb", &kmer, &ksize)) {
- return NULL;
- }
-
- if (ksize > KSIZE_MAX) {
- PyErr_Format(PyExc_ValueError, "k-mer size must be <= %u", KSIZE_MAX);
- return NULL;
- }
-
- if (strlen(kmer) != ksize) {
- PyErr_Format(PyExc_ValueError, "k-mer size different from ksize");
- return NULL;
- }
-
- try {
- PyObject * hash = nullptr;
- const HashIntoType h(_hash(kmer, ksize));
- convert_HashIntoType_to_PyObject(h, &hash);
- return hash;
- } catch (khmer_exception &e) {
- PyErr_SetString(PyExc_ValueError, e.what());
- return NULL;
- }
-
-}
-
-static PyObject * forward_hash_no_rc(PyObject * self, PyObject * args)
-{
- const char * kmer;
- WordLength ksize;
-
- if (!PyArg_ParseTuple(args, "sb", &kmer, &ksize)) {
- return NULL;
- }
-
- if (ksize > KSIZE_MAX) {
- PyErr_Format(PyExc_ValueError, "k-mer size must be <= %u", KSIZE_MAX);
- return NULL;
- }
-
- if (strlen(kmer) != ksize) {
- PyErr_SetString(PyExc_ValueError,
- "k-mer length must equal the k-size");
- return NULL;
- }
-
- PyObject * hash = nullptr;
- const HashIntoType h(_hash_forward(kmer, ksize));
- convert_HashIntoType_to_PyObject(h, &hash);
- return hash;
-}
-
-static PyObject * reverse_hash(PyObject * self, PyObject * args)
-{
- PyObject * val;
- HashIntoType hash;
- WordLength ksize;
-
- if (!PyArg_ParseTuple(args, "Ob", &val, &ksize)) {
- return NULL;
- }
-
- if (PyLong_Check(val) || PyInt_Check(val)) {
- if (!convert_PyLong_to_HashIntoType(val, hash)) {
- return NULL;
- }
- } else {
- PyErr_SetString(PyExc_TypeError,
- "Hash value must be an integer.");
- return NULL;
- }
-
- if (ksize > KSIZE_MAX) {
- PyErr_Format(PyExc_ValueError, "k-mer size must be <= %u", KSIZE_MAX);
- return NULL;
- }
-
- return PyUnicode_FromString(_revhash(hash, ksize).c_str());
-}
-
-static PyObject * murmur3_forward_hash(PyObject * self, PyObject * args)
-{
- const char * kmer;
-
- if (!PyArg_ParseTuple(args, "s", &kmer)) {
- return NULL;
- }
-
- PyObject * hash = nullptr;
- const HashIntoType h(_hash_murmur(kmer, strlen(kmer)));
- convert_HashIntoType_to_PyObject(h, &hash);
- return hash;
-}
-
-static PyObject * murmur3_forward_hash_no_rc(PyObject * self, PyObject * args)
-{
- const char * kmer;
-
- if (!PyArg_ParseTuple(args, "s", &kmer)) {
- return NULL;
- }
-
- PyObject * hash = nullptr;
- const HashIntoType h(_hash_murmur_forward(kmer, strlen(kmer)));
- convert_HashIntoType_to_PyObject(h, &hash);
- return hash;
-}
-
-static PyObject * reverse_complement(PyObject * self, PyObject * args)
-{
- const char * sequence;
- if (!PyArg_ParseTuple(args, "s", &sequence)) {
- return NULL;
- }
-
- std::string s(sequence);
- try {
- s = _revcomp(s);
- } catch (khmer_exception &e) {
- PyErr_SetString(PyExc_RuntimeError, e.what());
- return NULL;
- }
- return PyUnicode_FromString(s.c_str());
-}
-
-//
-// technique for resolving literal below found here:
-// https://gcc.gnu.org/onlinedocs/gcc-4.9.1/cpp/Stringification.html
-//
-
-static
-PyObject *
-get_version_cpp( PyObject * self, PyObject * args )
-{
-#define xstr(s) str(s)
-#define str(s) #s
- std::string dVersion = xstr(VERSION);
- return PyUnicode_FromString(dVersion.c_str());
-}
-
-
-//
-// Module machinery.
-//
-
-static PyMethodDef KhmerMethods[] = {
- {
- "forward_hash", forward_hash,
- METH_VARARGS, "",
- },
- {
- "forward_hash_no_rc", forward_hash_no_rc,
- METH_VARARGS, "",
- },
- {
- "reverse_hash", reverse_hash,
- METH_VARARGS, "",
- },
- {
- "hash_murmur3",
- murmur3_forward_hash,
- METH_VARARGS,
- "Calculate the hash value of a k-mer using MurmurHash3 "
- "(with reverse complement)",
- },
- {
- "hash_no_rc_murmur3",
- murmur3_forward_hash_no_rc,
- METH_VARARGS,
- "Calculate the hash value of a k-mer using MurmurHash3 "
- "(no reverse complement)",
- },
- {
- "reverse_complement",
- reverse_complement,
- METH_VARARGS,
- "Calculate the reverse-complement of the DNA sequence "
- "with alphabet ACGT",
- },
- {
- "get_version_cpp", get_version_cpp,
- METH_VARARGS, "return the VERSION c++ compiler option"
- },
- { NULL, NULL, 0, NULL } // sentinel
-};
-
-MOD_INIT(_khmer)
-{
- using namespace python;
-
- if (PyType_Ready(&khmer_KHashtable_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- khmer_KCounttable_Type.tp_base = &khmer_KHashtable_Type;
- if (PyType_Ready(&khmer_KCounttable_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- khmer_KSmallCounttable_Type.tp_base = &khmer_KHashtable_Type;
- if (PyType_Ready(&khmer_KSmallCounttable_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- khmer_KNodetable_Type.tp_base = &khmer_KHashtable_Type;
- if (PyType_Ready(&khmer_KNodetable_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- khmer_KHashgraph_Type.tp_base = &khmer_KHashtable_Type;
- khmer_KHashgraph_Type.tp_methods = khmer_hashgraph_methods;
- if (PyType_Ready(&khmer_KHashgraph_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- khmer_KCountgraph_Type.tp_base = &khmer_KHashgraph_Type;
- if (PyType_Ready(&khmer_KCountgraph_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- khmer_KSmallCountgraph_Type.tp_base = &khmer_KHashgraph_Type;
- if (PyType_Ready(&khmer_KSmallCountgraph_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- if (PyType_Ready(&khmer_PrePartitionInfo_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- khmer_KSubsetPartition_Type.tp_methods = khmer_subset_methods;
- if (PyType_Ready(&khmer_KSubsetPartition_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- khmer_KNodegraph_Type.tp_base = &khmer_KHashgraph_Type;
- khmer_KNodegraph_Type.tp_methods = khmer_nodegraph_methods;
- if (PyType_Ready(&khmer_KNodegraph_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- if (PyType_Ready(&khmer_KLinearAssembler_Type) < 0) {
- return MOD_ERROR_VAL;
- }
- if (PyType_Ready(&khmer_KSimpleLabeledAssembler_Type) < 0) {
- return MOD_ERROR_VAL;
- }
- if (PyType_Ready(&khmer_KJunctionCountAssembler_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- khmer_KGraphLabels_Type.tp_base = &khmer_KNodegraph_Type;
- khmer_KGraphLabels_Type.tp_methods = khmer_graphlabels_methods;
- khmer_KGraphLabels_Type.tp_new = khmer_graphlabels_new;
- if (PyType_Ready(&khmer_KGraphLabels_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- if (PyType_Ready(&khmer_KHLLCounter_Type) < 0) {
- return MOD_ERROR_VAL;
- }
- if (PyType_Ready(&khmer_ReadAlignerType) < 0) {
- return MOD_ERROR_VAL;
- }
-
- _init_ReadParser_Type_constants();
- if (PyType_Ready( &khmer_ReadParser_Type ) < 0) {
- return MOD_ERROR_VAL;
- }
-
- if (PyType_Ready(&khmer_Read_Type ) < 0) {
- return MOD_ERROR_VAL;
- }
-
- if (PyType_Ready(&khmer_ReadPairIterator_Type ) < 0) {
- return MOD_ERROR_VAL;
- }
-
- PyObject * m;
-
- MOD_DEF(m, "_khmer", "interface for the khmer module low-level extensions",
- KhmerMethods);
-
- if (m == NULL) {
- return MOD_ERROR_VAL;
- }
-
- PyObject * filetype_dict = Py_BuildValue("{s,i,s,i,s,i,s,i,s,i,s,i,s,i}",
- "COUNTING_HT", SAVED_COUNTING_HT,
- "HASHBITS", SAVED_HASHBITS,
- "TAGS", SAVED_TAGS,
- "STOPTAGS", SAVED_STOPTAGS,
- "SUBSET", SAVED_SUBSET,
- "LABELSET", SAVED_LABELSET,
- "SMALLCOUNT", SAVED_SMALLCOUNT);
- if (PyModule_AddObject( m, "FILETYPES", filetype_dict ) < 0) {
- return MOD_ERROR_VAL;
- }
-
- Py_INCREF(&khmer_Read_Type);
- if (PyModule_AddObject( m, "Read",
- (PyObject *)&khmer_Read_Type ) < 0) {
- return MOD_ERROR_VAL;
- }
-
- Py_INCREF(&khmer_ReadParser_Type);
- if (PyModule_AddObject( m, "ReadParser",
- (PyObject *)&khmer_ReadParser_Type ) < 0) {
- return MOD_ERROR_VAL;
- }
-
- Py_INCREF(&khmer_KCounttable_Type);
- if (PyModule_AddObject( m, "Counttable",
- (PyObject *)&khmer_KCounttable_Type ) < 0) {
- return MOD_ERROR_VAL;
- }
-
- Py_INCREF(&khmer_KSmallCounttable_Type);
- if (PyModule_AddObject( m, "SmallCounttable",
- (PyObject *)&khmer_KSmallCounttable_Type ) < 0) {
- return MOD_ERROR_VAL;
- }
-
- Py_INCREF(&khmer_KNodetable_Type);
- if (PyModule_AddObject( m, "Nodetable",
- (PyObject *)&khmer_KNodetable_Type ) < 0) {
- return MOD_ERROR_VAL;
- }
-
- Py_INCREF(&khmer_KCountgraph_Type);
- if (PyModule_AddObject( m, "Countgraph",
- (PyObject *)&khmer_KCountgraph_Type ) < 0) {
- return MOD_ERROR_VAL;
- }
-
- Py_INCREF(&khmer_KSmallCountgraph_Type);
- if (PyModule_AddObject( m, "SmallCountgraph",
- (PyObject *)&khmer_KSmallCountgraph_Type ) < 0) {
- return MOD_ERROR_VAL;
- }
-
- Py_INCREF(&khmer_KNodegraph_Type);
- if (PyModule_AddObject(m, "Nodegraph",
- (PyObject *)&khmer_KNodegraph_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- Py_INCREF(&khmer_KGraphLabels_Type);
- if (PyModule_AddObject(m, "GraphLabels",
- (PyObject *)&khmer_KGraphLabels_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- Py_INCREF(&khmer_KLinearAssembler_Type);
- if (PyModule_AddObject(m, "LinearAssembler",
- (PyObject *)&khmer_KLinearAssembler_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- Py_INCREF(&khmer_KSimpleLabeledAssembler_Type);
- if (PyModule_AddObject(m, "SimpleLabeledAssembler",
- (PyObject *)&khmer_KSimpleLabeledAssembler_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- Py_INCREF(&khmer_KJunctionCountAssembler_Type);
- if (PyModule_AddObject(m, "JunctionCountAssembler",
- (PyObject *)&khmer_KJunctionCountAssembler_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- if (PyType_Ready(&_HashSet_iter_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- khmer_HashSet_Type.tp_new = khmer_HashSet_new;
- if (PyType_Ready(&khmer_HashSet_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- Py_INCREF(&khmer_KHLLCounter_Type);
- if (PyModule_AddObject(m, "HLLCounter",
- (PyObject *)&khmer_KHLLCounter_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- Py_INCREF(&khmer_ReadAlignerType);
- if (PyModule_AddObject(m, "ReadAligner",
- (PyObject *)&khmer_ReadAlignerType) < 0) {
- return MOD_ERROR_VAL;
- }
-
- Py_INCREF(&khmer_HashSet_Type);
- if (PyModule_AddObject(m, "HashSet",
- (PyObject *)&khmer_HashSet_Type) < 0) {
- return MOD_ERROR_VAL;
- }
-
- return MOD_SUCCESS_VAL(m);
-}
-
-// vim: set ft=cpp sts=4 sw=4 tw=79:
diff --git a/khmer/_oxli/__init__.py b/khmer/_oxli/__init__.py
new file mode 100644
index 0000000..06d02cd
--- /dev/null
+++ b/khmer/_oxli/__init__.py
@@ -0,0 +1,6 @@
+from .assembly import LinearAssembler
+from .hashing import Kmer
+from .parsing import Alphabets, Sequence, ReadBundle, UnpairedReadsError
+from .parsing import FastxParser, SanitizedFastxParser, SplitPairedReader
+from .parsing import BrokenPairedReader, _split_left_right
+from .parsing import check_is_left, check_is_right, check_is_pair
diff --git a/khmer/_oxli/assembly.pxd b/khmer/_oxli/assembly.pxd
new file mode 100644
index 0000000..7292243
--- /dev/null
+++ b/khmer/_oxli/assembly.pxd
@@ -0,0 +1,75 @@
+from libcpp.memory cimport unique_ptr
+from libcpp.string cimport string
+from libcpp.vector cimport vector
+from libc.stdint cimport uint16_t
+
+from oxli_types cimport *
+from hashing cimport CpKmer, Kmer
+from graphs cimport (CpHashgraph, CpHashtable, CpLabelHash,
+ get_hashgraph_ptr, get_labelhash_ptr)
+
+
+cdef extern from "oxli/assembler.hh" namespace "oxli":
+ cdef cppclass CpLinearAssembler "oxli::LinearAssembler":
+ CpLinearAssembler(CpHashgraph *)
+
+ string assemble(const CpKmer, const CpHashgraph *) const
+ string assemble_left(const CpKmer, const CpHashgraph *) const
+ string assemble_right(const CpKmer, const CpHashgraph *) const
+
+ string assemble(const CpKmer) const
+ string assemble_left(const CpKmer) const
+ string assemble_right(const CpKmer) const
+
+ cdef cppclass CpSimpleLabeledAssembler "oxli::SimpleLabeledAssembler":
+ CpSimpleLabeledAssembler(const CpLabelHash *)
+
+ vector[string] assemble(const CpKmer)
+ vector[string] assemble(const CpKmer, const CpHashgraph *) const
+
+ cdef cppclass CpJunctionCountAssembler "oxli::JunctionCountAssembler":
+ CpJunctionCountAssembler(CpHashgraph *)
+
+ vector[string] assemble(const CpKmer) const
+ vector[string] assemble(const CpKmer, const CpHashtable *) const
+ uint16_t consume(string)
+ void count_junction(CpKmer, CpKmer)
+ BoundedCounterType get_junction_count(CpKmer, CpKmer) const
+
+
+cdef class LinearAssembler:
+ cdef unique_ptr[CpLinearAssembler] _this
+
+ cdef public object graph
+ cdef CpHashgraph * _graph_ptr
+
+ cdef public object stop_filter
+ cdef CpHashgraph * _stop_filter_ptr
+
+ cdef str _assemble(self, Kmer start)
+ cdef str _assemble_left(self, Kmer start)
+ cdef str _assemble_right(self, Kmer start)
+
+
+cdef class SimpleLabeledAssembler:
+ cdef unique_ptr[CpSimpleLabeledAssembler] _this
+
+ cdef public object labels
+ cdef CpLabelHash * _label_ptr
+
+ cdef public object stop_filter
+ cdef CpHashgraph * _stop_filter_ptr
+
+ cdef vector[string] _assemble(self, Kmer start)
+
+
+cdef class JunctionCountAssembler:
+ cdef unique_ptr[CpJunctionCountAssembler] _this
+
+ cdef public object graph
+ cdef CpHashgraph * _graph_ptr
+
+ cdef public object stop_filter
+ cdef CpHashgraph * _stop_filter_ptr
+
+ cdef vector[string] _assemble(self, Kmer)
diff --git a/khmer/_oxli/assembly.pyx b/khmer/_oxli/assembly.pyx
new file mode 100644
index 0000000..be745e4
--- /dev/null
+++ b/khmer/_oxli/assembly.pyx
@@ -0,0 +1,134 @@
+# -*- coding: UTF-8 -*-
+# cython: c_string_type=unicode, c_string_encoding=utf8
+
+from cython.operator cimport dereference as deref
+
+from utils cimport _bstring
+
+
+cdef class LinearAssembler:
+
+ def __cinit__(self, graph, stop_filter=None):
+ self._graph_ptr = get_hashgraph_ptr(graph)
+ if self._graph_ptr == NULL:
+ raise ValueError('Must take an object with Hashgraph *')
+ self.graph = graph
+ self.set_stop_filter(stop_filter=stop_filter)
+
+ if type(self) is LinearAssembler:
+ self._this.reset(new CpLinearAssembler(self._graph_ptr))
+
+ def set_stop_filter(self, stop_filter=None):
+ self.stop_filter = stop_filter
+ if stop_filter is not None:
+ self._stop_filter_ptr = get_hashgraph_ptr(stop_filter)
+ if self._stop_filter_ptr == NULL:
+ raise ValueError('Must take an object with Hashgraph *')
+ else:
+ self._stop_filter_ptr = NULL
+
+ cdef str _assemble(self, Kmer kmer):
+ if self.stop_filter is None:
+ return deref(self._this).assemble(deref(kmer._this))
+ else:
+ return deref(self._this).assemble(deref(kmer._this), self._stop_filter_ptr)
+
+ def assemble(self, seed):
+ if isinstance(seed, Kmer):
+ return self._assemble(seed)
+ else:
+ return self._assemble(Kmer(str(seed)))
+
+
+ cdef str _assemble_left(self, Kmer kmer):
+ if self.stop_filter is None:
+ return deref(self._this).assemble_left(deref(kmer._this))
+ else:
+ return deref(self._this).assemble_left(deref(kmer._this), self._stop_filter_ptr)
+
+ def assemble_left(self, seed):
+ if isinstance(seed, Kmer):
+ return self._assemble_left(seed)
+ else:
+ return self._assemble_left(Kmer(str(seed)))
+
+
+ cdef str _assemble_right(self, Kmer kmer):
+ if self.stop_filter is None:
+ return deref(self._this).assemble_right(deref(kmer._this))
+ else:
+ return deref(self._this).assemble_right(deref(kmer._this), self._stop_filter_ptr)
+
+ def assemble_right(self, seed):
+ if isinstance(seed, Kmer):
+ return self._assemble_right(seed)
+ else:
+ return self._assemble_right(Kmer(str(seed)))
+
+
+cdef class SimpleLabeledAssembler:
+
+ def __cinit__(self, labels, stop_filter=None):
+ self._label_ptr = get_labelhash_ptr(labels)
+ self.labels = labels
+ self.set_stop_filter(stop_filter=stop_filter)
+
+ if type(self) is SimpleLabeledAssembler:
+ self._this.reset(new CpSimpleLabeledAssembler(self._label_ptr))
+
+ def set_stop_filter(self, stop_filter=None):
+ self.stop_filter = stop_filter
+ if stop_filter is not None:
+ self._stop_filter_ptr = get_hashgraph_ptr(stop_filter)
+ if self._stop_filter_ptr == NULL:
+ raise ValueError('Must take an object with Hashgraph *')
+ else:
+ self._stop_filter_ptr = NULL
+
+ cdef vector[string] _assemble(self, Kmer kmer):
+ if self.stop_filter is None:
+ return deref(self._this).assemble(deref(kmer._this))
+ else:
+ return deref(self._this).assemble(deref(kmer._this), self._stop_filter_ptr)
+
+ def assemble(self, seed):
+ if isinstance(seed, Kmer):
+ return self._assemble(seed)
+ else:
+ return self._assemble(Kmer(str(seed)))
+
+cdef class JunctionCountAssembler:
+
+ def __cinit__(self, graph, stop_filter=None):
+ self._graph_ptr = get_hashgraph_ptr(graph)
+ if self._graph_ptr == NULL:
+ raise ValueError('Must take an object with Hashgraph *')
+ self.graph = graph
+ self.set_stop_filter(stop_filter=stop_filter)
+
+ if type(self) is JunctionCountAssembler:
+ self._this.reset(new CpJunctionCountAssembler(self._graph_ptr))
+
+ def set_stop_filter(self, stop_filter=None):
+ self.stop_filter = stop_filter
+ if stop_filter is not None:
+ self._stop_filter_ptr = get_hashgraph_ptr(stop_filter)
+ if self._stop_filter_ptr == NULL:
+ raise ValueError('Must take an object with Hashgraph *')
+ else:
+ self._stop_filter_ptr = NULL
+
+ cdef vector[string] _assemble(self, Kmer kmer):
+ if self.stop_filter is None:
+ return deref(self._this).assemble(deref(kmer._this))
+ else:
+ return deref(self._this).assemble(deref(kmer._this), self._stop_filter_ptr)
+
+ def consume(self, sequence):
+ return deref(self._this).consume(_bstring(sequence))
+
+ def assemble(self, seed):
+ if isinstance(seed, Kmer):
+ return self._assemble(seed)
+ else:
+ return self._assemble(Kmer(str(seed)))
diff --git a/khmer/_oxli/graphs.pxd b/khmer/_oxli/graphs.pxd
new file mode 100644
index 0000000..0b7f49b
--- /dev/null
+++ b/khmer/_oxli/graphs.pxd
@@ -0,0 +1,182 @@
+from libcpp cimport bool
+from libcpp.string cimport string
+from libcpp.vector cimport vector
+from libcpp.set cimport set
+from libcpp.memory cimport unique_ptr
+from libc.stdint cimport uint8_t, uint32_t, uint64_t, uintptr_t
+
+from oxli_types cimport *
+from hashing cimport CpKmer, KmerSet
+from parsing cimport CpReadParser, CpSequence
+
+# All we really need are the PyObject struct definitions
+# for our extension objects.
+cdef extern from "khmer/_cpy_khmer.hh":
+
+ ctypedef struct CPyHashtable_Object "khmer::khmer_KHashtable_Object":
+ CpHashtable * hashtable
+
+ ctypedef struct CPyHashgraph_Object "khmer::khmer_KHashgraph_Object":
+ CPyHashtable_Object khashtable
+ CpHashgraph * hashgraph
+
+ ctypedef struct CPyNodegraph_Object "khmer::khmer_KNodegraph_Object":
+ CPyHashgraph_Object khashgraph
+ CpNodegraph * nodegraph
+
+ ctypedef struct CPyCountgraph_Object "khmer::khmer_KCountgraph_Object":
+ CPyHashgraph_Object khashgraph
+ CpCountgraph * countgraph
+
+ ctypedef struct CPyGraphLabels_Object "khmer::khmer_KGraphLabels_Object":
+ CpLabelHash * labelhash
+
+
+cdef extern from "oxli/hashtable.hh" namespace "oxli":
+ cdef cppclass CpHashtable "oxli::Hashtable":
+ const WordLength ksize() const
+ HashIntoType hash_dna(const char *) const
+ HashIntoType hash_dna_top_strand(const char *) const
+ HashIntoType hash_dna_bottom_strand(const char *) const
+ string unhash_dna(HashIntoType) const
+ void count(const char *)
+ void count(HashIntoType)
+ bool add(const char *)
+ bool add(HashIntoType)
+ const BoundedCounterType get_count(const char *) const
+ const BoundedCounterType get_count(HashIntoType) const
+ void save(string)
+ void load(string)
+ uint32_t consume_string(const string &)
+ bool check_and_normalize_read(string &) const
+ uint32_t check_and_process_read(string &, bool &)
+ void consume_seqfile[SeqIO](const string &, uint32_t &, uint64_t &)
+ void consume_seqfile[SeqIO](unique_ptr[CpReadParser[SeqIO]]&,
+ uint32_t &, uint64_t &)
+ void set_use_bigcount(bool)
+ bool get_use_bigcount()
+ bool median_at_least(const string &, uint32_t cutoff)
+ void get_median_count(const string &, BoundedCounterType &,
+ float &, float &)
+ const uint64_t n_unique_kmers() const
+ const uint64_t n_occupied() const
+ vector[uint64_t] get_tablesizes() const
+ const uintptr_t n_tables() const
+ void get_kmers(const string &, vector[string] &)
+ void get_kmer_hashes(const string &, vector[HashIntoType] &) const
+ void get_kmer_hashes_as_hashset(const string &,
+ set[HashIntoType]) const
+ void get_kmer_counts(const string &,
+ vector[BoundedCounterType] &) const
+ uint8_t ** get_raw_tables()
+ BoundedCounterType get_min_count(const string &)
+ BoundedCounterType get_max_count(const string &)
+ uint64_t * abundance_distribution[SeqIO](unique_ptr[CpReadParser[SeqIO]]&,
+ CpHashtable *)
+ uint64_t * abundance_distribution[SeqIO](string, CpHashtable *)
+ uint64_t trim_on_abundance(string, BoundedCounterType) const
+ uint64_t trim_below_abundance(string, BoundedCounterType) const
+ vector[uint32_t] find_spectral_error_positions(string,
+ BoundedCounterType)
+
+ cdef cppclass CpCounttable "oxli::Counttable" (CpHashtable):
+ CpCounttable(WordLength, vector[uint64_t])
+
+ cdef cppclass CpNodetable "oxli::Nodetable" (CpHashtable):
+ CpNodetable(WordLength, vector[uint64_t])
+
+
+cdef extern from "oxli/hashgraph.hh" namespace "oxli":
+ cdef cppclass CpHashgraph "oxli::Hashgraph" (CpHashtable):
+ void _set_tag_density(unsigned int)
+ unsigned int _get_tag_density() const
+ void add_tag(HashIntoType)
+ void add_stop_tag(HashIntoType)
+ uintptr_t n_tags() const
+ void divide_tags_into_subsets(unsigned int, set[HashIntoType] &)
+ void add_kmer_to_tags(HashIntoType)
+ void clear_tags()
+ void consume_seqfile_and_tag[SeqIO](unique_ptr[CpReadParser[SeqIO]]&,
+ unsigned int &,
+ unsigned long long)
+ void consume_seqfile_and_tag[SeqIO](const string &,
+ unsigned int &,
+ unsigned long long &)
+ void consume_sequence_and_tag(const string &,
+ unsigned long long &,
+ set[HashIntoType] &)
+ void consume_partitioned_fasta[SeqIO](const string &,
+ unsigned int &,
+ unsigned long long &)
+ uintptr_t trim_on_stoptags(string) const
+ unsigned int traverse_from_kmer(CpKmer,
+ uint32_t,
+ KmerSet&,
+ uint32_t) const
+ void print_tagset(string)
+ void save_tagset(string)
+ void load_tagset(string)
+ void print_stop_tags(string)
+ void save_stop_tags(string)
+ void load_stop_tags(string)
+ void load_stop_tags(string, bool)
+ void extract_unique_paths(string, uint32_t, float, vector[string])
+ void calc_connected_graph_size(CpKmer, uint64_t&, KmerSet&,
+ const uint64_t, bool) const
+ uint32_t kmer_degree(HashIntoType, HashIntoType)
+ uint32_t kmer_degree(const char *)
+ void find_high_degree_nodes(const char *, set[HashIntoType] &) const
+ unsigned int traverse_linear_path(const CpKmer,
+ set[HashIntoType] &,
+ set[HashIntoType] &,
+ CpHashtable &,
+ set[HashIntoType] &) const
+ void _validate_pmap()
+
+ cdef cppclass CpCountgraph "oxli::Countgraph" (CpHashgraph):
+ CpCountgraph(WordLength, vector[uint64_t])
+
+ cdef cppclass CpNodegraph "oxli::Nodegraph" (CpHashgraph):
+ CpNodegraph(WordLength, vector[uint64_t])
+
+
+cdef extern from "oxli/labelhash.hh" namespace "oxli":
+ cdef cppclass CpLabelHash "oxli::LabelHash":
+ CpLabelHash(CpHashgraph *)
+ uintptr_t n_labels() const
+ void consume_seqfile_and_tag_with_labels[SeqIO](const string &,
+ uint32_t &,
+ uint64_t &,
+ CallbackFn,
+ void *)
+ void consume_seqfile_and_tag_with_labels[SeqIO](const string &,
+ uint32_t &,
+ uint64_t &)
+ void consume_seqfile_and_tag_with_labels[SeqIO](
+ unique_ptr[CpReadParser[SeqIO]]&,
+ uint32_t &,
+ uint64_t &,
+ CallbackFn,
+ void *)
+ void consume_seqfile_and_tag_with_labels[SeqIO](
+ unique_ptr[CpReadParser[SeqIO]]&,
+ uint32_t &,
+ uint64_t &)
+ void get_tag_labels(const HashIntoType, LabelSet &)
+ void get_tags_from_label(const Label,
+ TagSet&)
+ void link_tag_and_label(const HashIntoType, const Label)
+ uint32_t sweep_label_neighborhood(const string &,
+ LabelSet &,
+ uint32_t,
+ bool,
+ bool)
+ void save_labels_and_tags(string)
+ void load_labels_and_tags(string)
+ void label_across_high_degree_nodes(const char *,
+ set[HashIntoType] &,
+ const Label)
+
+cdef CpHashgraph * get_hashgraph_ptr(object graph)
+cdef CpLabelHash * get_labelhash_ptr(object graph)
+
diff --git a/khmer/_oxli/graphs.pyx b/khmer/_oxli/graphs.pyx
new file mode 100644
index 0000000..2d3b02c
--- /dev/null
+++ b/khmer/_oxli/graphs.pyx
@@ -0,0 +1,20 @@
+# cython: c_string_type=unicode, c_string_encoding=utf8
+from cython.operator cimport dereference as deref
+
+from .._khmer import Countgraph, Nodegraph, GraphLabels
+
+
+cdef CpHashgraph * get_hashgraph_ptr(object graph):
+ if not (isinstance(graph, Countgraph) or isinstance(graph, Nodegraph)):
+ return NULL
+
+ cdef CPyHashgraph_Object* ptr = <CPyHashgraph_Object*> graph
+ return deref(ptr).hashgraph
+
+
+cdef CpLabelHash * get_labelhash_ptr(object labels):
+ if not isinstance(labels, GraphLabels):
+ return NULL
+
+ cdef CPyGraphLabels_Object * ptr = <CPyGraphLabels_Object*> labels
+ return deref(ptr).labelhash
diff --git a/khmer/_oxli/hashing.pxd b/khmer/_oxli/hashing.pxd
new file mode 100644
index 0000000..092d704
--- /dev/null
+++ b/khmer/_oxli/hashing.pxd
@@ -0,0 +1,67 @@
+from libcpp cimport bool
+from libcpp.memory cimport shared_ptr
+from libcpp.queue cimport queue
+from libcpp.set cimport set
+from libcpp.string cimport string
+
+from oxli_types cimport *
+
+cdef extern from "oxli/kmer_hash.hh" namespace "oxli":
+ cdef cppclass CpKmer "oxli::Kmer":
+ HashIntoType kmer_f
+ HashIntoType kmer_r
+ HashIntoType kmer_u
+
+ CpKmer(HashIntoType, HashIntoType, HashIntoType)
+ CpKmer(string, WordLength)
+ CpKmer(const CpKmer&)
+ CpKmer()
+
+ bool is_forward() const
+ void set_from_unique_hash(HashIntoType, WordLength)
+
+ cdef cppclass CpKmerFactory "oxli::KmerFactory":
+ KmerFactory(WordLength)
+
+ CpKmer build_kmer(HashIntoType) const
+ CpKmer build_kmer(HashIntoType, HashIntoType) const
+ CpKmer build_kmer(string &) const
+ CpKmer build_kmer(const char *) const
+
+ cdef cppclass CpKmerIterator "oxli::KmerIterator" (CpKmerFactory):
+ CpKmerIterator(const char *, unsigned char)
+ CpKmer first(HashIntoType &, HashIntoType &)
+ CpKmer next(HashIntoType &, HashIntoType &)
+ CpKmer first()
+ CpKmer next()
+ bool done()
+ unsigned int get_start_pos() const
+ unsigned int get_end_pos() const
+
+ HashIntoType _hash(const string, const WordLength)
+ HashIntoType _hash(const string, const WordLength,
+ HashIntoType &, HashIntoType &)
+ HashIntoType _hash(const char *, const WordLength)
+ HashIntoType _hash(const char *, const WordLength,
+ HashIntoType &, HashIntoType &)
+ HashIntoType _hash_forward(const char *, WordLength)
+ string _revhash(HashIntoType, WordLength)
+ string _revcomp(const string&)
+ HashIntoType _hash_murmur(const string&, const WordLength)
+ HashIntoType _hash_murmur(const string&,
+ HashIntoType&, HashIntoType&)
+ HashIntoType _hash_murmur_forward(const string&)
+
+
+cdef extern from "oxli/oxli.hh" namespace "oxli":
+ ctypedef queue[CpKmer] KmerQueue
+ ctypedef set[CpKmer] KmerSet
+ ctypedef bool (*KmerFilter) (CpKmer kmer)
+
+
+cdef class Kmer:
+ cdef shared_ptr[CpKmer] _this
+ cdef readonly str kmer
+
+ @staticmethod
+ cdef Kmer wrap(CpKmer * cpkmer, WordLength K)
diff --git a/khmer/_oxli/hashing.pyx b/khmer/_oxli/hashing.pyx
new file mode 100644
index 0000000..c0ef69d
--- /dev/null
+++ b/khmer/_oxli/hashing.pyx
@@ -0,0 +1,66 @@
+# -*- coding: UTF-8 -*-
+# cython: c_string_type=unicode, c_string_encoding=utf8
+
+from libcpp.string cimport string
+from libcpp.memory cimport make_shared
+from libc.stdint cimport uint64_t
+from cython.operator cimport dereference as deref
+
+from oxli_types cimport *
+
+cdef class Kmer:
+
+ def __cinit__(self, str kmer=None):
+ self.kmer = kmer
+ if self.kmer is not None:
+ self._this.reset(new CpKmer(kmer.encode('utf-8'), len(kmer)))
+ else:
+ self._this.reset(new CpKmer())
+
+ def __len__(self):
+ return len(self.kmer)
+
+ def __str__(self):
+ return self.kmer
+
+ def __hash__(self):
+ return self.kmer_u
+
+ def __repr__(self):
+ return self.kmer
+
+ @property
+ def kmer_f(self):
+ return deref(self._this).kmer_f
+
+ @property
+ def kmer_r(self):
+ return deref(self._this).kmer_r
+
+ @property
+ def kmer_u(self):
+ return deref(self._this).kmer_u
+
+ def reverse_complement(self):
+ cdef HashIntoType tmp = deref(self._this).kmer_f
+ deref(self._this).kmer_f = deref(self._this).kmer_r
+ deref(self._this).kmer_r = tmp
+ self.kmer = _revcomp(self.kmer.encode('utf-8'))
+
+ @property
+ def is_forward(self):
+ return deref(self._this).is_forward()
+
+ @staticmethod
+ cdef Kmer wrap(CpKmer * cpkmer, WordLength K):
+ cdef Kmer kmer = Kmer()
+ kmer._this.reset(cpkmer)
+ kmer.kmer = _revhash(kmer.kmer_u, K)
+ return kmer
+
+ @staticmethod
+ def create(HashIntoType tag, WordLength K):
+ cdef Kmer kmer = Kmer()
+ deref(kmer._this).set_from_unique_hash(tag, K)
+ kmer.kmer = _revhash(kmer.kmer_u, K)
+ return kmer
diff --git a/khmer/_oxli/hllcounter.pxd b/khmer/_oxli/hllcounter.pxd
new file mode 100644
index 0000000..d3a8a29
--- /dev/null
+++ b/khmer/_oxli/hllcounter.pxd
@@ -0,0 +1,38 @@
+from libcpp cimport bool
+from libcpp.memory cimport unique_ptr
+from libcpp.sting cimport string
+from libcpp.vector cimport vector
+from libc.stdint cimport uint64_t
+
+from oxli_types cimport *
+from parsing cimport CpReadParser
+
+cdef extern from "oxli/hllcounter.hh" namespace "oxli":
+ cdef cppclass CpHLLCounter "oxli::HLLCounter":
+ CpHLLCounter(double, WordLength)
+ CpHLLCounter(int, WordLength)
+
+ void add(const string &)
+ unsigned int consume_string(const string &)
+ void consume_seqfile[SeqIO](const string &,
+ bool,
+ unsigned int &,
+ unsigned long long &)
+
+ void consume_seqfile[SeqIO](unique_ptr[CpReadParser[SeqIO]]&,
+ bool,
+ unsigned int &,
+ unsigned long long &)
+ unsigned int check_and_process_read(string &, bool &)
+ bool check_and_normalize_read(string &) const
+ uint64_t estimate_cardinality()
+ void merge(CpHLLCounter &)
+ double get_alpha()
+ int get_p()
+ int get_m()
+ void set_ksize(WordLegth)
+ int get_ksize()
+ vector[int] get_M()
+ double get_erate()
+ void set_erate(double)
+
diff --git a/khmer/_oxli/oxli_types.pxd b/khmer/_oxli/oxli_types.pxd
new file mode 100644
index 0000000..bbff596
--- /dev/null
+++ b/khmer/_oxli/oxli_types.pxd
@@ -0,0 +1,19 @@
+from libcpp cimport bool
+from libcpp.set cimport set
+from libcpp.string cimport string
+
+
+cdef extern from "oxli/oxli.hh" namespace "oxli":
+
+ ctypedef unsigned long long int HashIntoType
+ ctypedef set[HashIntoType] HashIntoTypeSet
+ ctypedef unsigned char WordLength
+ ctypedef unsigned short int BoundedCounterType
+
+ ctypedef unsigned long long int Label
+ ctypedef set[Label] LabelSet
+ ctypedef set[HashIntoType] TagSet
+
+ ctypedef void (*CallbackFn)(const char *, void *, uint64_t, uint64_t)
+
+
diff --git a/khmer/_oxli/parsing.pxd b/khmer/_oxli/parsing.pxd
new file mode 100644
index 0000000..fe02565
--- /dev/null
+++ b/khmer/_oxli/parsing.pxd
@@ -0,0 +1,164 @@
+# -*- coding: UTF-8 -*-
+# cython: c_string_type=unicode, c_string_encoding=utf8
+
+from __future__ import unicode_literals
+
+from libc.stdint cimport uintptr_t
+
+from libcpp cimport bool
+from libcpp.memory cimport unique_ptr
+from libcpp.utility cimport pair
+from libcpp.string cimport string
+
+#from .wrapper cimport *
+
+'''
+extern declarations for liboxli.
+'''
+
+# C++ ostream wrapper code stolen shamelessly from stackoverflow
+# http://stackoverflow.com/questions/30984078/cython-working-with-c-streams
+# We need ostream to wrap ReadParser
+cdef extern from "<iostream>" namespace "std":
+ cdef cppclass ostream:
+ ostream& write(const char*, int) except +
+
+# obviously std::ios_base isn't a namespace, but this lets
+# Cython generate the connect C++ code
+cdef extern from "<iostream>" namespace "std::ios_base":
+ cdef cppclass open_mode:
+ pass
+ cdef open_mode binary
+ # you can define other constants as needed
+
+
+cdef extern from "<fstream>" namespace "std":
+ cdef cppclass ofstream(ostream):
+ # constructors
+ ofstream(const char*) except +
+ ofstream(const char*, open_mode) except+
+
+
+cdef extern from "oxli/read_parsers.hh" namespace "oxli::read_parsers":
+ cdef cppclass CpSequence "oxli::read_parsers::Read":
+ string name
+ string description
+ string sequence
+ string quality
+ string cleaned_seq
+
+ void reset()
+ void write_fastx(ostream&)
+ void set_cleaned_seq()
+
+ ctypedef pair[CpSequence,CpSequence] CpSequencePair \
+ "oxli::read_parsers::ReadPair"
+
+ cdef cppclass CpReadParser "oxli::read_parsers::ReadParser" [SeqIO]:
+ CpReadParser(unique_ptr[SeqIO])
+ CpReadParser(CpReadParser&)
+
+ CpSequence get_next_read()
+ CpSequencePair get_next_read_pair()
+ CpSequencePair get_next_read_pair(uint8_t)
+
+ uintptr_t get_num_reads()
+ bool is_complete()
+ void close()
+
+ cdef cppclass CpFastxReader "oxli::read_parsers::FastxReader":
+ CpFastxReader()
+ CpFastxReader(const string&)
+ CpFastxReader(CpFastxReader&)
+
+ CpSequence get_next_read()
+ bool is_complete()
+ uintptr_t get_num_reads()
+ void close()
+
+ unique_ptr[CpReadParser[SeqIO]] get_parser[SeqIO](const string&)
+ ctypedef unique_ptr[CpReadParser[CpFastxReader]] FastxParserPtr
+
+
+cdef extern from "oxli/alphabets.hh" namespace "oxli":
+ cdef string DNA_SIMPLE "oxli::alphabets::DNA_SIMPLE"
+ cdef string DNAN_SIMPLE "oxli::alphabets::DNAN_SIMPLE"
+ cdef string RNA_SIMPLE "oxli::alphabets::RNA_SIMPLE"
+ cdef string RNAN_SIMPLE "oxli::alphabets::RNAN_SIMPLE"
+ cdef string IUPAC_NUCL "oxli::alphabets::IUPAC_NUCL"
+ cdef string IUPAC_AA "oxli::alphabets::IUPAC_AA"
+
+'''
+Extension Classes wrapping liboxli.
+'''
+
+cdef class Alphabets:
+
+ @staticmethod
+ cdef string _get(string name)
+
+
+cdef class Sequence:
+ cdef CpSequence _obj
+
+ @staticmethod
+ cdef Sequence _wrap(CpSequence cseq)
+
+
+cdef class ReadBundle:
+ cdef list reads
+
+
+cdef class FastxParser:
+ cdef unique_ptr[CpReadParser[CpFastxReader]] _this
+
+ cpdef bool is_complete(self)
+ cdef Sequence _next(self)
+
+
+cdef class SanitizedFastxParser(FastxParser):
+ cdef readonly int n_bad
+ cdef readonly string _alphabet
+ cdef bool convert_n
+
+ cpdef bool is_complete(self)
+ cdef Sequence _next(self)
+
+
+cdef class SplitPairedReader:
+
+ cdef FastxParser left_parser
+ cdef FastxParser right_parser
+ cdef readonly int min_length
+ cdef readonly bool force_name_match
+
+ cdef tuple _next(self)
+
+
+cdef class BrokenPairedReader:
+
+ cdef FastxParser parser
+ cdef readonly int min_length
+ cdef readonly bool force_single
+ cdef readonly bool require_paired
+ cdef readonly Sequence record
+
+ cdef tuple _next(self)
+
+
+cpdef tuple _split_left_right(unicode s)
+
+cdef tuple _cppstring_split_left_right(string& s)
+
+cdef int _check_is_pair(Sequence first, Sequence second)
+
+cpdef bool check_is_left(s)
+
+cpdef bool check_is_right(s)
+
+cdef inline bool is_valid(const char base, string& alphabet)
+
+cdef inline bool sanitize_sequence(string& sequence,
+ string& alphabet,
+ bool convert_n)
+
diff --git a/khmer/_oxli/parsing.pyx b/khmer/_oxli/parsing.pyx
new file mode 100644
index 0000000..4936761
--- /dev/null
+++ b/khmer/_oxli/parsing.pyx
@@ -0,0 +1,532 @@
+# -*- coding: UTF-8 -*-
+# cython: c_string_type=unicode, c_string_encoding=utf8
+
+from __future__ import print_function
+from __future__ import unicode_literals
+
+from cython.operator cimport dereference as deref
+cimport cython
+from libcpp cimport bool
+from libcpp.string cimport string
+
+import sys
+
+from .utils cimport _bstring, _ustring
+
+
+cdef class Alphabets:
+
+ @staticmethod
+ def get(name):
+ cdef unicode alphabet = _ustring(Alphabets._get(_bstring(name)))
+ if not alphabet:
+ raise ValueError('No alphabet with name {0}'.format(name))
+ return alphabet
+
+ @staticmethod
+ cdef string _get(string name):
+ if name == b'DNA_SIMPLE':
+ return DNA_SIMPLE
+ elif name == b'DNAN_SIMPLE':
+ return DNAN_SIMPLE
+ elif name == b'RNA_SIMPLE':
+ return RNA_SIMPLE
+ elif name == b'RNAN_SIMPLE':
+ return RNAN_SIMPLE
+ elif name == b'IUPAC_NUCL':
+ return IUPAC_NUCL
+ elif name == b'IUPAC_AA':
+ return IUPAC_AA
+ else:
+ return string()
+
+
+ at cython.freelist(100)
+cdef class Sequence:
+
+ def __cinit__(self, name=None, sequence=None,
+ quality=None, description=None,
+ cleaned_seq=None):
+
+ if name is not None and sequence is not None:
+ self._obj.sequence = _bstring(sequence)
+ self._obj.name = _bstring(name)
+ if description is not None:
+ self._obj.description = _bstring(description)
+ if quality is not None:
+ self._obj.quality = _bstring(quality)
+ if cleaned_seq is not None:
+ self._obj.cleaned_seq = _bstring(cleaned_seq)
+ else:
+ self._obj.cleaned_seq = self._obj.sequence
+
+ def __str__(self):
+ return repr(self)
+
+ def __repr__(self):
+ return 'Sequence(name="{0}", sequence="{1}")'.format(self.name, self.sequence)
+
+ def __len__(self):
+ return self._obj.sequence.length()
+
+ def __richcmp__(x, y, op):
+ if op == 2:
+ return x.name == y.name and x.sequence == y.sequence
+ else:
+ raise NotImplementedError('Operator not available')
+
+ def kmers(self, int K):
+ cdef int i = 0
+ cdef unicode sequence = self.sequence
+ for i in range(0, len(self)-K+1):
+ yield sequence[i:i+K]
+
+ def __getitem__(self, x):
+ # Definitely optimize this.
+ return self.sequence[x]
+
+ @property
+ def name(self):
+ cdef unicode name = self._obj.name
+ return self._obj.name if name else None
+
+ @property
+ def sequence(self):
+ cdef unicode sequence = self._obj.sequence
+ return self._obj.sequence if sequence else None
+
+ @property
+ def description(self):
+ cdef unicode description = self._obj.description
+ return description if description else None
+
+ @property
+ def quality(self):
+ cdef unicode quality = self._obj.quality
+ return quality if quality else None
+
+ @property
+ def cleaned_seq(self):
+ cdef unicode cleaned_seq = self._obj.cleaned_seq
+ return cleaned_seq if cleaned_seq else None
+
+ @staticmethod
+ def from_screed_record(record):
+ cdef Sequence seq = Sequence(name=record.name,
+ sequence=record.sequence)
+ if hasattr(record, 'quality'):
+ seq._obj.quality = _bstring(record.quality)
+
+ for attr in ('annotations', 'description'):
+ if hasattr(record, attr):
+ seq._obj.description = _bstring(getattr(record, attr))
+
+ return seq
+
+ @staticmethod
+ cdef Sequence _wrap(CpSequence cseq):
+ cdef Sequence seq = Sequence()
+ seq._obj = cseq
+ return seq
+
+
+cdef class ReadBundle:
+
+ def __cinit__(self, *raw_records):
+ self.reads = [r for r in raw_records if r]
+
+ @property
+ def num_reads(self):
+ return len(self.reads)
+
+ @property
+ def total_length(self):
+ return sum([len(r.sequence) for r in self.reads])
+
+
+def print_error(msg):
+ """Print the given message to 'stderr'."""
+
+ print(msg, file=sys.stderr)
+
+
+class UnpairedReadsError(ValueError):
+ """ValueError with refs to the read pair in question."""
+
+ def __init__(self, msg, r1, r2):
+ r1_name = "<no read>"
+ r2_name = "<no read>"
+ if r1:
+ r1_name = r1.name
+ if r2:
+ r2_name = r2.name
+
+ msg = msg + '\n"{0}"\n"{1}"'.format(r1_name, r2_name)
+ ValueError.__init__(self, msg)
+ self.read1 = r1
+ self.read2 = r2
+
+
+cdef inline bool is_valid(const char base, string& alphabet):
+ cdef char b
+ for b in alphabet:
+ if b == base:
+ return True
+ return False
+
+
+cdef inline bool sanitize_sequence(string& sequence,
+ string& alphabet,
+ bool convert_n):
+ cdef int i = 0
+ for i in range(sequence.length()):
+ sequence[i] &= 0xdf
+ if not is_valid(sequence[i], alphabet):
+ return False
+ if convert_n and sequence[i] == b'N':
+ sequence[i] = b'A'
+ return True
+
+
+cdef class FastxParser:
+
+ def __cinit__(self, filename, *args, **kwargs):
+ self._this = get_parser[CpFastxReader](_bstring(filename))
+
+ cdef Sequence _next(self):
+ if not self.is_complete():
+ return Sequence._wrap(deref(self._this).get_next_read())
+ else:
+ return None
+
+ cpdef bool is_complete(self):
+ return deref(self._this).is_complete()
+
+ def __iter__(self):
+ cdef Sequence seq
+ while not self.is_complete():
+ seq = self._next()
+ yield seq
+
+
+cdef class SanitizedFastxParser(FastxParser):
+
+ def __cinit__(self, filename, alphabet='DNAN_SIMPLE',
+ bool convert_n=True):
+ self.n_bad = 0
+ self.convert_n = convert_n
+ self._alphabet = Alphabets._get(_bstring(alphabet))
+
+ cdef Sequence _next(self):
+ cdef Sequence seq
+ cdef bool good
+
+ if not self.is_complete():
+ seq = FastxParser._next(self)
+ good = sanitize_sequence(seq._obj.sequence,
+ self._alphabet,
+ self.convert_n)
+ if not good:
+ self.n_bad += 1
+ return None
+ else:
+ return seq
+ else:
+ return None
+
+ def __iter__(self):
+ cdef Sequence seq
+ while not self.is_complete():
+ seq = self._next()
+ if seq is not None:
+ yield seq
+
+
+cdef class SplitPairedReader:
+
+ def __cinit__(self, FastxParser left_parser,
+ FastxParser right_parser,
+ int min_length=-1,
+ bool force_name_match=False):
+
+ self.left_parser = left_parser
+ self.right_parser = right_parser
+ self.min_length = min_length
+ self.force_name_match = force_name_match
+
+ def __iter__(self):
+ cdef Sequence first, second
+ cdef object err
+ cdef read_num = 0
+ cdef int found
+
+ found, first, second, err = self._next()
+ while found != 0:
+ if err is not None:
+ raise err
+
+ if self.min_length > 0:
+ if len(first) >= self.min_length and \
+ len(second) >= self.min_length:
+
+ yield read_num, True, first, second
+ else:
+ yield read_num, True, first, second
+
+ read_num += found
+ found, first, second, err = self._next()
+
+ cdef tuple _next(self):
+ cdef Sequence first = self.left_parser._next()
+ cdef bool first_complete = self.left_parser.is_complete()
+
+ cdef Sequence second = self.right_parser._next()
+ cdef bool second_complete = self.right_parser.is_complete()
+
+
+ if first_complete is not second_complete:
+ err = UnpairedReadsError('Differing lengths of left '\
+ 'and right files!')
+ return -1, None, None, err
+
+ if first_complete:
+ return 0, None, None, None
+
+ if first is None or second is None:
+ return 1, first, second, None
+
+ if self.force_name_match:
+ if _check_is_pair(first, second):
+ return 2, first, second, None
+ else:
+ err = UnpairedReadsError('', first, second)
+ return -1, None, None, err
+ else:
+ return 2, first, second, None
+
+
+cdef class BrokenPairedReader:
+
+ def __cinit__(self, FastxParser parser,
+ int min_length=-1,
+ bool force_single=False,
+ bool require_paired=False):
+
+ if force_single and require_paired:
+ raise ValueError("force_single and require_paired cannot both be set!")
+
+ self.parser = parser
+ self.min_length = min_length
+ self.force_single = force_single
+ self.require_paired = require_paired
+
+ self.record = None
+
+ def __iter__(self):
+ cdef Sequence first
+ cdef Sequence second
+ cdef object err
+ cdef int found
+ cdef int read_num = 0
+
+ found, first, second, err = self._next()
+ while (found != 0):
+ if err is not None:
+ raise err
+
+ if self.min_length > 0:
+ if first is not None and len(first) < self.min_length:
+ first = None
+ found -= 1
+ if second is not None and len(second) < self.min_length:
+ second = None
+ found -= 1
+
+ if self.force_single:
+ if first is not None:
+ yield read_num, found == 2, first, None
+ read_num += found
+ if second is not None:
+ yield read_num, found == 2, second, None
+ read_num += found
+ elif self.require_paired:
+ if first is not None and second is not None:
+ yield read_num, found == 2, first, second
+ read_num += found
+ else:
+ if first is not None or second is not None:
+ yield read_num, found == 2, first, second
+ read_num += found
+ found, first, second, err = self._next()
+
+ cdef tuple _next(self):
+ cdef Sequence first, second
+ cdef int is_pair
+
+ if self.record is None:
+ first = self.parser._next()
+ if first is None:
+ if self.parser.is_complete():
+ return 0, None, None, None
+ else:
+ if self.require_paired:
+ err = UnpairedReadsError(
+ "Uneven number of reads when require_paired is set!",
+ first)
+ return -1, None, None, err
+ return 1, first, None, None
+ else:
+ first = self.record
+
+ second = self.parser._next()
+
+ # check if paired
+ if second is not None and first is not None:
+ is_pair = _check_is_pair(first, second)
+ if is_pair == -1:
+ err = ValueError("records must be same type (FASTA or FASTQ)")
+ return -1, None, None, err
+ if is_pair and not self.force_single:
+ self.record = None
+ return 2, first, second, None # found 2 proper records
+ else: # orphan.
+ if self.require_paired:
+ err = UnpairedReadsError(
+ "Unpaired reads when require_paired is set!",
+ first, second)
+ return -1, None, None, err
+ self.record = second
+ return 1, first, None, None
+ elif self.parser.is_complete():
+ # ran out of reads getting second, handle last record
+ if self.require_paired:
+ err = UnpairedReadsError("Unpaired reads when require_paired "
+ "is set!", first, None)
+ return -1, None, None, err
+ self.record = None
+ return 1, first, second, None
+ else: # one read was invalid, but that doesn't mean they were unpaired
+ return 1, first, second, None
+
+
+cpdef tuple _split_left_right(unicode s):
+ cdef string cppstr = s.encode('UTF-8')
+ return _cppstring_split_left_right(cppstr)
+
+
+cdef tuple _cppstring_split_left_right(string& s):
+ """Split record name at the first whitespace and return both parts.
+
+ RHS is set to an empty string if not present.
+ """
+ cdef unsigned int i
+ cdef const char * c_str = s.c_str()
+ cdef unicode lhs, rhs
+ lhs = u''
+ rhs = u''
+ for i in range(len(s)):
+ if lhs == u'':
+ if (c_str[i] == b' ' or c_str[i] == b'\t'):
+ lhs = _ustring(c_str[0:i])
+ else:
+ if c_str[i] != b' ' or c_str[i] != b'\t':
+ rhs = _ustring(c_str[i:len(s)])
+ break
+ lhs = _ustring(c_str[0:len(s)]) if lhs == u'' else lhs
+ return lhs, rhs
+
+
+cdef int _check_is_pair(Sequence first, Sequence second):
+ """Check if the two sequence records belong to the same fragment.
+
+ In an matching pair the records are left and right pairs
+ of each other, respectively. Returns True or False as appropriate.
+
+ Handles both Casava formats: seq/1 and seq/2, and 'seq::... 1::...'
+ and 'seq::... 2::...'.
+
+ Also handles the default format of the SRA toolkit's fastq-dump:
+ 'Accession seq/1'
+ """
+ if first.quality is None or second.quality is None:
+ if first.quality is not second.quality:
+ return -1
+
+ cdef unicode lhs1, rhs1, lhs2, rhs2
+ lhs1, rhs1 = _cppstring_split_left_right(first._obj.name)
+ lhs2, rhs2 = _cppstring_split_left_right(second._obj.name)
+
+ # handle 'name/1'
+ cdef unicode subpart1, subpart2
+ if lhs1.endswith('/1') and lhs2.endswith('/2'):
+ subpart1 = lhs1.split('/', 1)[0]
+ subpart2 = lhs2.split('/', 1)[0]
+
+ if subpart1 and subpart1 == subpart2:
+ return 1
+
+ # handle '@name 1:rst'
+ elif lhs1 == lhs2 and rhs1.startswith('1:') and rhs2.startswith('2:'):
+ return 1
+
+ # handle @name seq/1
+ elif lhs1 == lhs2 and rhs1.endswith('/1') and rhs2.endswith('/2'):
+ subpart1 = rhs1.split('/', 1)[0]
+ subpart2 = rhs2.split('/', 1)[0]
+
+ if subpart1 and subpart1 == subpart2:
+ return 1
+
+ return 0
+
+
+def check_is_pair(first, second):
+ if type(first) is not Sequence:
+ first = Sequence.from_screed_record(first)
+ if type(second) is not Sequence:
+ second = Sequence.from_screed_record(second)
+ cdef int ret = _check_is_pair(first, second)
+ if ret == -1:
+ raise ValueError("both records must be same type (FASTA or FASTQ)")
+ return ret == 1
+
+
+cpdef bool check_is_left(s):
+ """Check if the name belongs to a 'left' sequence (/1).
+
+ Returns True or False.
+
+ Handles both Casava formats: seq/1 and 'seq::... 1::...'
+ """
+ cdef unicode lhs, rhs
+ lhs, rhs = _split_left_right(_ustring(s))
+ if lhs.endswith('/1'): # handle 'name/1'
+ return True
+ elif rhs.startswith('1:'): # handle '@name 1:rst'
+ return True
+
+ elif rhs.endswith('/1'): # handles '@name seq/1'
+ return True
+
+ return False
+
+
+cpdef bool check_is_right(s):
+ """Check if the name belongs to a 'right' sequence (/2).
+
+ Returns True or False.
+
+ Handles both Casava formats: seq/2 and 'seq::... 2::...'
+ """
+ cdef unicode lhs, rhs
+ lhs, rhs = _split_left_right(_ustring(s))
+ if lhs.endswith('/2'): # handle 'name/2'
+ return True
+ elif rhs.startswith('2:'): # handle '@name 2:rst'
+ return True
+
+ elif rhs.endswith('/2'): # handles '@name seq/2'
+ return True
+
+ return False
+
diff --git a/khmer/_oxli/traversal.pxd b/khmer/_oxli/traversal.pxd
new file mode 100644
index 0000000..7417166
--- /dev/null
+++ b/khmer/_oxli/traversal.pxd
@@ -0,0 +1,19 @@
+from libc.stdint cimport uint32_t
+
+from hashing cimport CpKmer, KmerFilter, KmerQueue
+from graphs cimport CpHashgraph
+
+cdef extern from "oxli/traversal.hh" namespace "oxli":
+ cdef cppclass CpTraverser "oxli::Traverser":
+ CpTraverser(CpHashgraph *)
+
+ void push_filter(KmerFilter)
+ KmerFilter pop_filter()
+
+ uint32_t traverse(const CpKmer&, KmerQueue&) const
+ uint32_t traverse_left(const CpKmer&, KmerQueue&) const
+ uint32_t traverse_right(const CpKmer&, KmerQueue&) const
+
+ uint32_t degree(const CpKmer&) const
+ uint32_t degree_left(const CpKmer&) const
+ uint32_t degree_right(const CpKmer&) const
diff --git a/khmer/_oxli/utils.pxd b/khmer/_oxli/utils.pxd
new file mode 100644
index 0000000..885ba81
--- /dev/null
+++ b/khmer/_oxli/utils.pxd
@@ -0,0 +1,14 @@
+# -*- coding: UTF-8 -*-
+# cython: c_string_type=unicode, c_string_encoding=utf8
+from libcpp.vector cimport vector
+from libc.stdint cimport uint32_t, uint64_t
+from libcpp cimport bool
+
+
+cdef extern from "oxli/hashtable.hh" namespace "oxli":
+ cdef bool _is_prime "oxli::is_prime" (uint64_t n)
+ cdef vector[uint64_t] _get_n_primes_near_x "oxli::get_n_primes_near_x" (uint32_t, uint64_t)
+
+cdef bytes _bstring(s)
+
+cdef unicode _ustring(s)
diff --git a/khmer/_oxli/utils.pyx b/khmer/_oxli/utils.pyx
new file mode 100644
index 0000000..ad5439f
--- /dev/null
+++ b/khmer/_oxli/utils.pyx
@@ -0,0 +1,42 @@
+# -*- coding: UTF-8 -*-
+# cython: c_string_type=unicode, c_string_encoding=utf8
+
+from __future__ import unicode_literals
+from cpython.version cimport PY_MAJOR_VERSION
+
+
+def is_prime(n):
+ return _is_prime(n)
+
+
+def get_n_primes_near_x(n_primes, x):
+ primes = _get_n_primes_near_x(n_primes, x)
+ if len(primes) != n_primes:
+ msg = "unable to find {0} prime numbers < {1}".format(n_primes, x)
+ raise RuntimeError(msg)
+ return primes
+
+
+cdef bytes _bstring(s):
+ if not isinstance(s, (basestring, bytes)):
+ raise TypeError("Requires a string-like sequence")
+
+ if isinstance(s, unicode):
+ s = s.encode('utf-8')
+ return s
+
+
+cdef unicode _ustring(s):
+ if type(s) is unicode:
+ # fast path for most common case(s)
+ return <unicode>s
+ elif PY_MAJOR_VERSION < 3 and isinstance(s, bytes):
+ # only accept byte strings in Python 2.x, not in Py3
+ return (<bytes>s).decode('UTF-8')
+ elif isinstance(s, unicode):
+ # an evil cast to <unicode> might work here in some(!) cases,
+ # depending on what the further processing does. to be safe,
+ # we can always create a copy instead
+ return unicode(s)
+ else:
+ raise TypeError(...)
diff --git a/khmer/_version.py b/khmer/_version.py
index 67a9eed..adebb45 100644
--- a/khmer/_version.py
+++ b/khmer/_version.py
@@ -23,9 +23,9 @@ def get_keywords():
# setup.py/versioneer.py will grep for the variable names, so they must
# each be defined on a line of their own. _version.py will just call
# get_keywords().
- git_refnames = " (tag: v2.1.1)"
- git_full = "c46dbedecb2e9789501d5f68601ac72aac0cd74b"
- git_date = "2017-05-25 17:10:21 -0700"
+ git_refnames = " (tag: v2.1.2)"
+ git_full = "024abc378212c75fc25d1798f63e805dfe289284"
+ git_date = "2017-07-03 14:55:34 +0200"
keywords = {"refnames": git_refnames, "full": git_full, "date": git_date}
return keywords
diff --git a/khmer/khmer_args.py b/khmer/khmer_args.py
index e9b8d1c..c072984 100644
--- a/khmer/khmer_args.py
+++ b/khmer/khmer_args.py
@@ -569,7 +569,10 @@ def create_countgraph(args, ksize=None, multiplier=1.0, fp_rate=0.1):
else:
tablesize = calculate_graphsize(args, 'countgraph',
multiplier=multiplier)
- return khmer.Countgraph(ksize, tablesize, args.n_tables)
+ cg = khmer.Countgraph(ksize, tablesize, args.n_tables)
+ if hasattr(args, 'bigcount'):
+ cg.set_use_bigcount(args.bigcount)
+ return cg
def create_matching_nodegraph(countgraph):
diff --git a/khmer/thread_utils.py b/khmer/thread_utils.py
index 63b8e8d..55c15ea 100644
--- a/khmer/thread_utils.py
+++ b/khmer/thread_utils.py
@@ -60,6 +60,7 @@ def verbose_loader(filename):
log_info('... filtering {num}', num=num)
yield record
+
verbose_fasta_iter = verbose_loader # pylint: disable=invalid-name
diff --git a/khmer/utils.py b/khmer/utils.py
index d318417..cee1704 100644
--- a/khmer/utils.py
+++ b/khmer/utils.py
@@ -34,6 +34,9 @@
# Contact: khmer-project at idyll.org
"""Helpful methods for performing common argument-checking tasks in scripts."""
from __future__ import print_function, unicode_literals
+from khmer._oxli.parsing import (check_is_left, check_is_right, check_is_pair,
+ UnpairedReadsError, _split_left_right)
+import itertools
def print_error(msg):
@@ -43,113 +46,6 @@ def print_error(msg):
print(msg, file=sys.stderr)
-def _split_left_right(name):
- """Split record name at the first whitespace and return both parts.
-
- RHS is set to an empty string if not present.
- """
- parts = name.split(None, 1)
- lhs, rhs = [parts[0], parts[1] if len(parts) > 1 else '']
- return lhs, rhs
-
-
-def check_is_pair(record1, record2):
- """Check if the two sequence records belong to the same fragment.
-
- In an matching pair the records are left and right pairs
- of each other, respectively. Returns True or False as appropriate.
-
- Handles both Casava formats: seq/1 and seq/2, and 'seq::... 1::...'
- and 'seq::... 2::...'.
-
- Also handles the default format of the SRA toolkit's fastq-dump:
- 'Accession seq/1'
- """
- if hasattr(record1, 'quality') or hasattr(record2, 'quality'):
- if not (hasattr(record1, 'quality') and hasattr(record2, 'quality')):
- raise ValueError("both records must be same type (FASTA or FASTQ)")
-
- lhs1, rhs1 = _split_left_right(record1.name)
- lhs2, rhs2 = _split_left_right(record2.name)
-
- # handle 'name/1'
- if lhs1.endswith('/1') and lhs2.endswith('/2'):
- subpart1 = lhs1.split('/', 1)[0]
- subpart2 = lhs2.split('/', 1)[0]
-
- if subpart1 and subpart1 == subpart2:
- return True
-
- # handle '@name 1:rst'
- elif lhs1 == lhs2 and rhs1.startswith('1:') and rhs2.startswith('2:'):
- return True
-
- # handle @name seq/1
- elif lhs1 == lhs2 and rhs1.endswith('/1') and rhs2.endswith('/2'):
- subpart1 = rhs1.split('/', 1)[0]
- subpart2 = rhs2.split('/', 1)[0]
-
- if subpart1 and subpart1 == subpart2:
- return True
-
- return False
-
-
-def check_is_left(name):
- """Check if the name belongs to a 'left' sequence (/1).
-
- Returns True or False.
-
- Handles both Casava formats: seq/1 and 'seq::... 1::...'
- """
- lhs, rhs = _split_left_right(name)
- if lhs.endswith('/1'): # handle 'name/1'
- return True
- elif rhs.startswith('1:'): # handle '@name 1:rst'
- return True
-
- elif rhs.endswith('/1'): # handles '@name seq/1'
- return True
-
- return False
-
-
-def check_is_right(name):
- """Check if the name belongs to a 'right' sequence (/2).
-
- Returns True or False.
-
- Handles both Casava formats: seq/2 and 'seq::... 2::...'
- """
- lhs, rhs = _split_left_right(name)
- if lhs.endswith('/2'): # handle 'name/2'
- return True
- elif rhs.startswith('2:'): # handle '@name 2:rst'
- return True
-
- elif rhs.endswith('/2'): # handles '@name seq/2'
- return True
-
- return False
-
-
-class UnpairedReadsError(ValueError):
- """ValueError with refs to the read pair in question."""
-
- def __init__(self, msg, r1, r2):
- r1_name = "<no read>"
- r2_name = "<no read>"
- if r1:
- r1_name = r1.name
- if r2:
- r2_name = r2.name
-
- msg = msg + '\n"{0}"\n"{1}"'.format(r1_name, r2_name)
- ValueError.__init__(self, msg)
- self.read1 = r1
- self.read2 = r2
-
-
def broken_paired_reader(screed_iter, min_length=None,
force_single=False, require_paired=False):
"""Read pairs from a stream.
@@ -224,7 +120,7 @@ def broken_paired_reader(screed_iter, min_length=None,
def write_record(record, fileobj):
"""Write sequence record to 'fileobj' in FASTA/FASTQ format."""
- if hasattr(record, 'quality'):
+ if hasattr(record, 'quality') and record.quality is not None:
recstr = '@{name}\n{sequence}\n+\n{quality}\n'.format(
name=record.name,
sequence=record.sequence,
@@ -245,7 +141,7 @@ def write_record_pair(read1, read2, fileobj):
_rec_pair = '@%s\n%s\n+\n%s\n' * 2
_rec_pair_no_qual = '>%s\n%s\n' * 2
- if hasattr(read1, 'quality'):
+ if hasattr(read1, 'quality') and read1.quality is not None:
assert hasattr(read2, 'quality')
recstr = _rec_pair % (read1.name, read1.sequence, read1.quality,
read2.name, read2.sequence, read2.quality)
@@ -293,5 +189,10 @@ class ReadBundle(object):
return sum([len(r.sequence) for r in self.reads])
+def grouper(n, iterable):
+ iterable = iter(iterable)
+ return iter(lambda: list(itertools.islice(iterable, n)), [])
+
+
# vim: set filetype=python tabstop=4 softtabstop=4 shiftwidth=4 expandtab:
# vim: set textwidth=79:
diff --git a/oxli/__init__.py b/oxli/__init__.py
index caf0e99..f998575 100755
--- a/oxli/__init__.py
+++ b/oxli/__init__.py
@@ -73,5 +73,6 @@ def main():
args = get_parser().parse_args()
args.func(args)
+
if __name__ == '__main__':
main()
diff --git a/oxli/build_graph.py b/oxli/build_graph.py
index 2cd12df..5867419 100755
--- a/oxli/build_graph.py
+++ b/oxli/build_graph.py
@@ -129,6 +129,7 @@ def main(args):
sys.exit(0)
+
if __name__ == '__main__':
main(None)
diff --git a/pytest.ini b/pytest.ini
index 81ba721..2d83ca1 100644
--- a/pytest.ini
+++ b/pytest.ini
@@ -2,3 +2,7 @@
addopts = -m "not known_failing and not jenkins and not huge" -v
norecursedirs = third-party
testpaths = tests
+# ignore all warnings, once khmer stops supporting python2 we can change
+# this to the more specific "ignore::ResourceWarning" to ignore only that
+# one as it is the only one known to be a false positive
+filterwarnings = ignore
diff --git a/scripts/abundance-dist-single.py b/scripts/abundance-dist-single.py
index 3cf77e8..56278cb 100755
--- a/scripts/abundance-dist-single.py
+++ b/scripts/abundance-dist-single.py
@@ -131,8 +131,7 @@ def main(): # pylint: disable=too-many-locals,too-many-branches
# In case the user specified a maximum memory usage, use 8/(9+eps) of that
# for the countgraph and 1/(9+eps) for the tracking nodegraph
# `eps` is used to account for the memory used by the python interpreter
- countgraph = khmer_args.create_countgraph(args, multiplier=8/(9. + 0.3))
- countgraph.set_use_bigcount(args.bigcount)
+ countgraph = khmer_args.create_countgraph(args, multiplier=8 / (9. + 0.3))
log_info('building k-mer tracking graph')
tracking = khmer_args.create_matching_nodegraph(countgraph)
diff --git a/scripts/annotate-partitions.py b/scripts/annotate-partitions.py
index fd2b41e..91f9996 100755
--- a/scripts/annotate-partitions.py
+++ b/scripts/annotate-partitions.py
@@ -111,5 +111,6 @@ def main():
part_count, infile), file=sys.stderr)
print('partitions are in', outfile, file=sys.stderr)
+
if __name__ == '__main__':
main()
diff --git a/scripts/count-median.py b/scripts/count-median.py
index ab3a4cc..b99f934 100755
--- a/scripts/count-median.py
+++ b/scripts/count-median.py
@@ -125,5 +125,6 @@ def main():
ave, stdev = [round(x, 9) for x in (ave, stdev)]
output.writerow([record.name, medn, ave, stdev, len(seq)])
+
if __name__ == '__main__':
main()
diff --git a/scripts/do-partition.py b/scripts/do-partition.py
index 4dfa7e8..231c0bb 100755
--- a/scripts/do-partition.py
+++ b/scripts/do-partition.py
@@ -225,6 +225,7 @@ def main(): # pylint: disable=too-many-locals,too-many-statements
part_count, infile), file=sys.stderr)
print('partitions are in', outfile, file=sys.stderr)
+
if __name__ == '__main__':
main()
diff --git a/scripts/extract-partitions.py b/scripts/extract-partitions.py
index a918489..48e8240 100755
--- a/scripts/extract-partitions.py
+++ b/scripts/extract-partitions.py
@@ -352,5 +352,6 @@ def main():
args.prefix,
suffix), file=sys.stderr)
+
if __name__ == '__main__':
main()
diff --git a/scripts/fastq-to-fasta.py b/scripts/fastq-to-fasta.py
index 6e61b37..36ab823 100755
--- a/scripts/fastq-to-fasta.py
+++ b/scripts/fastq-to-fasta.py
@@ -102,5 +102,6 @@ def main():
print('Wrote output to', describe_file_handle(args.output),
file=sys.stderr)
+
if __name__ == '__main__':
main()
diff --git a/scripts/filter-abund-single.py b/scripts/filter-abund-single.py
index efc3547..a2e44c3 100755
--- a/scripts/filter-abund-single.py
+++ b/scripts/filter-abund-single.py
@@ -176,7 +176,6 @@ def main():
args.variable_coverage,
args.normalize_to)
if trimmed_record:
- print((trimmed_record,))
write_record(trimmed_record, outfp)
log_info('output in {outfile}', outfile=outfile)
@@ -186,5 +185,6 @@ def main():
graph=args.savegraph)
graph.save(args.savegraph)
+
if __name__ == '__main__':
main()
diff --git a/scripts/filter-stoptags.py b/scripts/filter-stoptags.py
index ee37fea..7d0f744 100755
--- a/scripts/filter-stoptags.py
+++ b/scripts/filter-stoptags.py
@@ -116,5 +116,6 @@ def main():
print('output in', outfile, file=sys.stderr)
+
if __name__ == '__main__':
main()
diff --git a/scripts/find-knots.py b/scripts/find-knots.py
index 59495c6..c695dc5 100755
--- a/scripts/find-knots.py
+++ b/scripts/find-knots.py
@@ -182,5 +182,6 @@ def main():
print('done!', file=sys.stderr)
+
if __name__ == '__main__':
main()
diff --git a/scripts/interleave-reads.py b/scripts/interleave-reads.py
index ece85e8..fdecd7c 100755
--- a/scripts/interleave-reads.py
+++ b/scripts/interleave-reads.py
@@ -147,5 +147,6 @@ def main():
print('final: interleaved %d pairs' % counter, file=sys.stderr)
print('output written to', describe_file_handle(outfp), file=sys.stderr)
+
if __name__ == '__main__':
main()
diff --git a/scripts/load-into-counting.py b/scripts/load-into-counting.py
index 3e3502b..8164f4e 100755
--- a/scripts/load-into-counting.py
+++ b/scripts/load-into-counting.py
@@ -136,7 +136,6 @@ def main():
log_info('making countgraph')
countgraph = khmer_args.create_countgraph(args)
- countgraph.set_use_bigcount(args.bigcount)
filename = None
@@ -217,6 +216,7 @@ def main():
log_info('DONE.')
log_info('wrote to: {filename}', filename=info_filename)
+
if __name__ == '__main__':
main()
diff --git a/scripts/make-initial-stoptags.py b/scripts/make-initial-stoptags.py
index 2e63517..a766043 100755
--- a/scripts/make-initial-stoptags.py
+++ b/scripts/make-initial-stoptags.py
@@ -149,5 +149,6 @@ def main():
nodegraph.save_stop_tags(graphbase + '.stoptags')
print('wrote to:', graphbase + '.stoptags', file=sys.stderr)
+
if __name__ == '__main__':
main()
diff --git a/scripts/partition-graph.py b/scripts/partition-graph.py
index 2780a21..61b957c 100755
--- a/scripts/partition-graph.py
+++ b/scripts/partition-graph.py
@@ -171,5 +171,6 @@ def main():
print('done making subsets! see %s.subset.*.pmap' %
(basename,), file=sys.stderr)
+
if __name__ == '__main__':
main()
diff --git a/scripts/sample-reads-randomly.py b/scripts/sample-reads-randomly.py
index 5d1fa6e..5ec2fbb 100755
--- a/scripts/sample-reads-randomly.py
+++ b/scripts/sample-reads-randomly.py
@@ -223,5 +223,6 @@ def main():
if records[1] is not None:
write_record(records[1], output_file)
+
if __name__ == '__main__':
main()
diff --git a/scripts/split-paired-reads.py b/scripts/split-paired-reads.py
index 6efa4f9..22d99ee 100755
--- a/scripts/split-paired-reads.py
+++ b/scripts/split-paired-reads.py
@@ -197,5 +197,6 @@ def main():
if args.output_orphaned:
print("orphans in %s" % out0, file=sys.stderr)
+
if __name__ == '__main__':
main()
diff --git a/scripts/unique-kmers.py b/scripts/unique-kmers.py
index 263a313..61b07c2 100755
--- a/scripts/unique-kmers.py
+++ b/scripts/unique-kmers.py
@@ -161,5 +161,6 @@ def main():
print(to_print, file=report_fp)
report_fp.flush()
+
if __name__ == "__main__":
main()
diff --git a/setup.cfg b/setup.cfg
index 2293a7d..a82c22c 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -3,7 +3,7 @@ define = SEQAN_HAS_BZIP2,SEQAN_HAS_ZLIB
undef = NO_UNIQUE_RC
# libraries = z,bz2
## if using system libraries
-include-dirs = lib:third-party/zlib:third-party/bzip2:third-party/seqan/core/include:third-party/smhasher
+include-dirs = include:third-party/zlib:third-party/bzip2:third-party/seqan/core/include:third-party/smhasher
# include-dirs = lib
## if using system libraries (broken)
@@ -31,4 +31,4 @@ parentdir_prefix = .
[pep8]
exclude = _version.py
-ignore = E309,E226
+ignore = E309,E226,E402
diff --git a/setup.py b/setup.py
index 7c59116..ef9b6c1 100755
--- a/setup.py
+++ b/setup.py
@@ -38,12 +38,16 @@
import ez_setup
+import glob
import os
import sys
from os import listdir as os_listdir
from os.path import join as path_join
+from os.path import splitext
import shutil
import subprocess
+import sys
+import sysconfig
import tempfile
import csv
@@ -60,6 +64,14 @@ ez_setup.use_setuptools(version="3.4.1")
CMDCLASS = versioneer.get_cmdclass()
+HAS_CYTHON = False
+try:
+ import Cython
+ HAS_CYTHON = True
+except ImportError:
+ pass
+cy_ext = 'pyx' if HAS_CYTHON else 'cpp'
+
# strip out -Wstrict-prototypes; a hack suggested by
# http://stackoverflow.com/a/9740721
# proper fix coming in http://bugs.python.org/issue1222585
@@ -119,24 +131,34 @@ def check_for_openmp():
return exit_code == 0
+
+def distutils_dir_name(dname):
+ """Returns the name of a distutils build directory"""
+ f = "{dirname}.{platform}-{version[0]}.{version[1]}"
+ return f.format(dirname=dname,
+ platform=sysconfig.get_platform(),
+ version=sys.version_info)
+
+
+def build_dir():
+ return path_join("build", distutils_dir_name("temp"))
+
# We bundle tested versions of zlib & bzip2. To use the system zlib and bzip2
# change setup.cfg or use the `--libraries z,bz2` parameter which will make our
# custom build_ext command strip out the bundled versions.
+
ZLIBDIR = 'third-party/zlib'
BZIP2DIR = 'third-party/bzip2'
-BUILD_DEPENDS = []
-BUILD_DEPENDS.extend(path_join("lib", bn + ".hh") for bn in [
+BUILD_DEPENDS = glob.glob(path_join("include", "khmer", "_cpy_*.hh"))
+BUILD_DEPENDS.extend(path_join("include", "oxli", bn + ".hh") for bn in [
"khmer", "kmer_hash", "hashtable", "labelhash", "hashgraph",
"hllcounter", "khmer_exception", "read_aligner", "subset", "read_parsers",
"kmer_filters", "traversal", "assembler", "alphabets", "storage"])
-BUILD_DEPENDS.extend(path_join("khmer", bn + ".hh") for bn in [
- "_cpy_counttable", "_cpy_hashgraph", "_cpy_nodetable",
- "_cpy_smallcounttable", "_cpy_smallcountgraph"])
-SOURCES = ["khmer/_khmer.cc"]
-SOURCES.extend(path_join("lib", bn + ".cc") for bn in [
+SOURCES = glob.glob(path_join("src", "khmer", "_cpy_*.cc"))
+SOURCES.extend(path_join("src", "oxli", bn + ".cc") for bn in [
"read_parsers", "kmer_hash", "hashtable", "hashgraph",
"labelhash", "subset", "read_aligner",
"hllcounter", "traversal", "kmer_filters", "assembler", "alphabets",
@@ -153,22 +175,45 @@ if sys.platform == 'darwin':
# force 64bit only builds
EXTRA_COMPILE_ARGS.extend(['-arch', 'x86_64', '-mmacosx-version-min=10.7',
'-stdlib=libc++'])
+ EXTRA_LINK_ARGS.append('-mmacosx-version-min=10.7')
if check_for_openmp():
EXTRA_COMPILE_ARGS.extend(['-fopenmp'])
EXTRA_LINK_ARGS.extend(['-fopenmp'])
-EXTENSION_MOD_DICT = \
+CP_EXTENSION_MOD_DICT = \
{
"sources": SOURCES,
"extra_compile_args": EXTRA_COMPILE_ARGS,
"extra_link_args": EXTRA_LINK_ARGS,
"depends": BUILD_DEPENDS,
+ "include_dirs": ["include", "."],
"language": "c++",
"define_macros": [("VERSION", versioneer.get_version()), ],
}
-EXTENSION_MOD = Extension("khmer._khmer", ** EXTENSION_MOD_DICT)
+EXTENSION_MODS = [Extension("khmer._khmer", ** CP_EXTENSION_MOD_DICT)]
+
+for cython_ext in glob.glob(os.path.join("khmer", "_oxli",
+ "*.{0}".format(cy_ext))):
+
+ CY_EXTENSION_MOD_DICT = \
+ {
+ "sources": [cython_ext],
+ "extra_compile_args": EXTRA_COMPILE_ARGS,
+ "extra_link_args": EXTRA_LINK_ARGS,
+ "extra_objects": [path_join(build_dir(), splitext(p)[0] + '.o')
+ for p in SOURCES],
+ "depends": [],
+ "include_dirs": ["include", "."],
+ "language": "c++",
+ "define_macros": [("VERSION", versioneer.get_version()), ],
+ }
+
+ ext_name = "khmer._oxli.{0}".format(
+ splitext(os.path.basename(cython_ext))[0])
+ EXTENSION_MODS.append(Extension(ext_name, ** CY_EXTENSION_MOD_DICT))
+
SCRIPTS = []
SCRIPTS.extend([path_join("scripts", script)
for script in os_listdir("scripts")
@@ -218,10 +263,11 @@ SETUP_METADATA = \
# http://docs.python.org/2/distutils/setupscript.html
# additional-meta-data note #3
"url": 'https://khmer.readthedocs.io/',
- "packages": ['khmer', 'khmer.tests', 'oxli'],
+ "packages": ['khmer', 'khmer.tests', 'oxli', 'khmer._oxli'],
+ "package_data": {'khmer/_oxli': ['*.pxd']},
"package_dir": {'khmer.tests': 'tests'},
- "install_requires": ['screed >= 1.0', 'bz2file'],
- "setup_requires": ["pytest-runner>=2.0,<3dev"],
+ "install_requires": ['screed >= 1.0', 'bz2file', 'Cython>=0.25.2'],
+ "setup_requires": ["pytest-runner>=2.0,<3dev", "setuptools>=18.0"],
"extras_require": {':python_version=="2.6"': ['argparse>=1.2.1'],
'docs': ['sphinx', 'sphinxcontrib-autoprogram'],
'tests': ['pytest>=2.9'],
@@ -232,7 +278,7 @@ SETUP_METADATA = \
# "oxli = oxli:main"
# ]
# },
- "ext_modules": [EXTENSION_MOD, ],
+ "ext_modules": EXTENSION_MODS,
# "platforms": '', # empty as is conveyed by the classifiers below
# "license": '', # empty as is conveyed by the classifier below
"include_package_data": True,
@@ -264,21 +310,26 @@ class KhmerBuildExt(_build_ext): # pylint: disable=R0904
' configure || bash ./configure --static ) && make -f '
'Makefile.pic PIC']
spawn(cmd=zcmd, dry_run=self.dry_run)
- self.extensions[0].extra_objects.extend(
- path_join("third-party", "zlib", bn + ".lo") for bn in [
- "adler32", "compress", "crc32", "deflate", "gzclose",
- "gzlib", "gzread", "gzwrite", "infback", "inffast",
- "inflate", "inftrees", "trees", "uncompr", "zutil"])
+ # self.extensions[0].extra_objects.extend(
+ for ext in self.extensions:
+ ext.extra_objects.extend(
+ path_join("third-party", "zlib", bn + ".lo") for bn in [
+ "adler32", "compress", "crc32", "deflate", "gzclose",
+ "gzlib", "gzread", "gzwrite", "infback", "inffast",
+ "inflate", "inftrees", "trees", "uncompr", "zutil"])
if "bz2" not in self.libraries:
bz2cmd = ['bash', '-c', 'cd ' + BZIP2DIR + ' && make -f '
'Makefile-libbz2_so all']
spawn(cmd=bz2cmd, dry_run=self.dry_run)
- self.extensions[0].extra_objects.extend(
- path_join("third-party", "bzip2", bn + ".o") for bn in [
- "blocksort", "huffman", "crctable", "randtable",
- "compress", "decompress", "bzlib"])
+ # self.extensions[0].extra_objects.extend(
+ for ext in self.extensions:
+ ext.extra_objects.extend(
+ path_join("third-party", "bzip2", bn + ".o") for bn in [
+ "blocksort", "huffman", "crctable", "randtable",
+ "compress", "decompress", "bzlib"])
_build_ext.run(self)
+
CMDCLASS.update({'build_ext': KhmerBuildExt})
_DISTUTILS_REINIT = Distribution.reinitialize_command
@@ -298,6 +349,8 @@ def reinitialize_command(self, command, reinit_subcommands):
self._set_command_options( # pylint: disable=protected-access
cmd_obj, options)
return cmd_obj
+
+
Distribution.reinitialize_command = reinitialize_command
diff --git a/lib/.gitignore b/src/khmer/.gitignore
similarity index 100%
copy from lib/.gitignore
copy to src/khmer/.gitignore
diff --git a/khmer/_cpy_smallcountgraph.hh b/src/khmer/_cpy_countgraph.cc
similarity index 51%
copy from khmer/_cpy_smallcountgraph.hh
copy to src/khmer/_cpy_countgraph.cc
index 40c18f3..7b805db 100644
--- a/khmer/_cpy_smallcountgraph.hh
+++ b/src/khmer/_cpy_countgraph.cc
@@ -1,99 +1,20 @@
-/*
-This file is part of khmer, https://github.com/dib-lab/khmer/, and is
-Copyright (C) 2016, The Regents of the University of California.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
-
- * Neither the name of the Michigan State University nor the names
- of its contributors may be used to endorse or promote products
- derived from this software without specific prior written
- permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-LICENSE (END)
-
-Contact: khmer-project at idyll.org
-*/
+#include "khmer/_cpy_countgraph.hh"
+#include "khmer/_cpy_subsetpartition.hh"
+#include "oxli/oxli.hh"
+#include "oxli/hashgraph.hh"
-//
-// KSmallCountgraph object
-//
-
-typedef struct {
- khmer_KHashgraph_Object khashgraph;
- SmallCountgraph * countgraph;
-} khmer_KSmallCountgraph_Object;
+using namespace oxli;
-static void khmer_smallcountgraph_dealloc(khmer_KSmallCountgraph_Object * obj);
-
-static
-PyObject *
-smallcount_get_raw_tables(khmer_KSmallCountgraph_Object * self, PyObject * args)
-{
- SmallCountgraph * countgraph = self->countgraph;
-
- khmer::Byte ** table_ptrs = countgraph->get_raw_tables();
- std::vector<uint64_t> sizes = countgraph->get_tablesizes();
-
- PyObject * raw_tables = PyList_New(sizes.size());
- for (unsigned int i=0; i<sizes.size(); ++i) {
- Py_buffer buffer;
- int res = PyBuffer_FillInfo(&buffer, NULL, table_ptrs[i],
- sizes[i] / 2 +1, 0,
- PyBUF_FULL_RO);
- if (res == -1) {
- return NULL;
- }
- PyObject * buf = PyMemoryView_FromBuffer(&buffer);
- if(!PyMemoryView_Check(buf)) {
- return NULL;
- }
- PyList_SET_ITEM(raw_tables, i, buf);
- }
+namespace khmer {
- return raw_tables;
-}
-
-static PyMethodDef khmer_smallcountgraph_methods[] = {
- {
- "get_raw_tables",
- (PyCFunction)smallcount_get_raw_tables, METH_VARARGS,
- "Get a list of the raw storage tables as memoryview objects."
- },
- {NULL, NULL, 0, NULL} /* sentinel */
-};
-
-static PyObject* khmer_smallcountgraph_new(PyTypeObject * type, PyObject * args,
- PyObject * kwds);
-
-static PyTypeObject khmer_KSmallCountgraph_Type
-CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KSmallCountgraph_Object")
+PyTypeObject khmer_KCountgraph_Type
+CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KCountgraph_Object")
= {
PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
- "_khmer.SmallCountgraph", /*tp_name*/
- sizeof(khmer_KSmallCountgraph_Object), /*tp_basicsize*/
+ "_khmer.Countgraph", /*tp_name*/
+ sizeof(khmer_KCountgraph_Object), /*tp_basicsize*/
0, /*tp_itemsize*/
- (destructor)khmer_smallcountgraph_dealloc, /*tp_dealloc*/
+ (destructor)khmer_countgraph_dealloc, /*tp_dealloc*/
0, /*tp_print*/
0, /*tp_getattr*/
0, /*tp_setattr*/
@@ -109,14 +30,14 @@ CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KSmallCountgraph_Object")
0, /*tp_setattro*/
0, /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
- "SmallCountgraph hash object", /* tp_doc */
+ "countgraph hash object", /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
- khmer_smallcountgraph_methods, /* tp_methods */
+ khmer_countgraph_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -126,30 +47,121 @@ CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KSmallCountgraph_Object")
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
- khmer_smallcountgraph_new, /* tp_new */
+ khmer_countgraph_new, /* tp_new */
+};
+
+
+PyMethodDef khmer_countgraph_methods[] = {
+ {
+ "get_raw_tables",
+ (PyCFunction)count_get_raw_tables, METH_VARARGS,
+ "Get a list of the raw storage tables as memoryview objects."
+ },
+ { "do_subset_partition_with_abundance", (PyCFunction)count_do_subset_partition_with_abundance, METH_VARARGS, "" },
+ {NULL, NULL, 0, NULL} /* sentinel */
};
-//
-// khmer_smallcountgraph_dealloc -- clean up a countgraph hash object.
-//
-static void khmer_smallcountgraph_dealloc(khmer_KSmallCountgraph_Object * obj)
+void khmer_countgraph_dealloc(khmer_KCountgraph_Object * obj)
{
delete obj->countgraph;
obj->countgraph = NULL;
Py_TYPE(obj)->tp_free((PyObject*)obj);
}
+
+PyObject *
+count_get_raw_tables(khmer_KCountgraph_Object * self, PyObject * args)
+{
+ Countgraph * countgraph = self->countgraph;
+
+ Byte ** table_ptrs = countgraph->get_raw_tables();
+ std::vector<uint64_t> sizes = countgraph->get_tablesizes();
+
+ PyObject * raw_tables = PyList_New(sizes.size());
+ for (unsigned int i=0; i<sizes.size(); ++i) {
+ Py_buffer buffer;
+ int res = PyBuffer_FillInfo(&buffer, NULL, table_ptrs[i], sizes[i], 0,
+ PyBUF_FULL_RO);
+ if (res == -1) {
+ return NULL;
+ }
+ PyObject * buf = PyMemoryView_FromBuffer(&buffer);
+ if(!PyMemoryView_Check(buf)) {
+ return NULL;
+ }
+ PyList_SET_ITEM(raw_tables, i, buf);
+ }
+
+ return raw_tables;
+}
+
+
+PyObject *
+count_do_subset_partition_with_abundance(khmer_KCountgraph_Object * me,
+ PyObject * args)
+{
+ Countgraph * countgraph = me->countgraph;
+
+ HashIntoType start_kmer = 0, end_kmer = 0;
+ PyObject * break_on_stop_tags_o = NULL;
+ PyObject * stop_big_traversals_o = NULL;
+ BoundedCounterType min_count, max_count;
+
+ if (!PyArg_ParseTuple(args, "HH|KKOO",
+ &min_count, &max_count,
+ &start_kmer, &end_kmer,
+ &break_on_stop_tags_o,
+ &stop_big_traversals_o)) {
+ return NULL;
+ }
+
+ bool break_on_stop_tags = false;
+ if (break_on_stop_tags_o && PyObject_IsTrue(break_on_stop_tags_o)) {
+ break_on_stop_tags = true;
+ }
+ bool stop_big_traversals = false;
+ if (stop_big_traversals_o && PyObject_IsTrue(stop_big_traversals_o)) {
+ stop_big_traversals = true;
+ }
+
+ SubsetPartition * subset_p = NULL;
+ try {
+ Py_BEGIN_ALLOW_THREADS
+ subset_p = new SubsetPartition(countgraph);
+ subset_p->do_partition_with_abundance(start_kmer, end_kmer,
+ min_count, max_count,
+ break_on_stop_tags,
+ stop_big_traversals);
+ Py_END_ALLOW_THREADS
+ } catch (std::bad_alloc &e) {
+ return PyErr_NoMemory();
+ }
+
+ khmer_KSubsetPartition_Object * subset_obj = (khmer_KSubsetPartition_Object *)\
+ PyObject_New(khmer_KSubsetPartition_Object, &khmer_KSubsetPartition_Type);
+
+ if (subset_obj == NULL) {
+ delete subset_p;
+ return NULL;
+ }
+
+ subset_obj->subset = subset_p;
+
+ return (PyObject *) subset_obj;
+}
+
+
//
-// khmer_smallcountgraph_new
+// khmer_countgraph_new
//
-static PyObject* khmer_smallcountgraph_new(PyTypeObject * type, PyObject * args,
- PyObject * kwds)
+ PyObject* khmer_countgraph_new(PyTypeObject * type, PyObject * args,
+ PyObject * kwds)
{
- khmer_KSmallCountgraph_Object * self;
+ khmer_KCountgraph_Object * self;
- self = (khmer_KSmallCountgraph_Object *)type->tp_alloc(type, 0);
+ self = (khmer_KCountgraph_Object *)type->tp_alloc(type, 0);
if (self != NULL) {
WordLength k = 0;
@@ -167,7 +179,7 @@ static PyObject* khmer_smallcountgraph_new(PyTypeObject * type, PyObject * args,
}
try {
- self->countgraph = new SmallCountgraph(k, sizes);
+ self->countgraph = new Countgraph(k, sizes);
} catch (std::bad_alloc &e) {
Py_DECREF(self);
return PyErr_NoMemory();
@@ -179,3 +191,5 @@ static PyObject* khmer_smallcountgraph_new(PyTypeObject * type, PyObject * args,
return (PyObject *) self;
}
+
+}
diff --git a/khmer/_cpy_counttable.hh b/src/khmer/_cpy_counttable.cc
similarity index 55%
rename from khmer/_cpy_counttable.hh
rename to src/khmer/_cpy_counttable.cc
index 429e95e..8473ebc 100644
--- a/khmer/_cpy_counttable.hh
+++ b/src/khmer/_cpy_counttable.cc
@@ -1,50 +1,10 @@
-/*
-This file is part of khmer, https://github.com/dib-lab/khmer/, and is
-Copyright (C) 2010-2015, Michigan State University.
-Copyright (C) 2015-2016, The Regents of the University of California.
+#include "khmer/_cpy_counttable.hh"
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
+using namespace oxli;
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
+namespace khmer {
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
-
- * Neither the name of the Michigan State University nor the names
- of its contributors may be used to endorse or promote products
- derived from this software without specific prior written
- permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-LICENSE (END)
-
-Contact: khmer-project at idyll.org
-*/
-
-typedef struct {
- khmer_KHashtable_Object khashtable;
- Counttable * counttable;
-} khmer_KCounttable_Object;
-
-static PyObject* khmer_counttable_new(PyTypeObject * type, PyObject * args,
- PyObject * kwds);
-
-static PyTypeObject khmer_KCounttable_Type
+PyTypeObject khmer_KCounttable_Type
CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KCounttable_Object")
= {
PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
@@ -88,11 +48,7 @@ CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KCounttable_Object")
};
-//
-// khmer_counttable_new
-//
-
-static PyObject* khmer_counttable_new(PyTypeObject * type, PyObject * args,
+PyObject* khmer_counttable_new(PyTypeObject * type, PyObject * args,
PyObject * kwds)
{
khmer_KCounttable_Object * self;
@@ -126,3 +82,5 @@ static PyObject* khmer_counttable_new(PyTypeObject * type, PyObject * args,
return (PyObject *) self;
}
+
+}
diff --git a/src/khmer/_cpy_graphlabels.cc b/src/khmer/_cpy_graphlabels.cc
new file mode 100644
index 0000000..84142ba
--- /dev/null
+++ b/src/khmer/_cpy_graphlabels.cc
@@ -0,0 +1,510 @@
+#include "khmer/_cpy_graphlabels.hh"
+#include "khmer/_cpy_nodegraph.hh"
+#include "khmer/_cpy_countgraph.hh"
+#include "khmer/_cpy_hashset.hh"
+#include "oxli/oxli.hh"
+#include "oxli/assembler.hh"
+
+using namespace oxli;
+using namespace oxli::read_parsers;
+
+namespace khmer {
+
+PyTypeObject khmer_KGraphLabels_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
+ "_khmer.LabelHash", /* tp_name */
+ sizeof(khmer_KGraphLabels_Object), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)khmer_graphlabels_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ 0, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ khmer_graphlabels_methods, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ khmer_graphlabels_new, /* tp_new */
+};
+
+
+PyMethodDef khmer_graphlabels_methods[] = {
+ { "consume_seqfile_and_tag_with_labels", (PyCFunction)labelhash_consume_seqfile_and_tag_with_labels, METH_VARARGS, "" },
+ { "sweep_label_neighborhood", (PyCFunction)labelhash_sweep_label_neighborhood, METH_VARARGS, "" },
+ {"consume_partitioned_fasta_and_tag_with_labels", (PyCFunction)labelhash_consume_partitioned_fasta_and_tag_with_labels, METH_VARARGS, "" },
+ {"sweep_tag_neighborhood", (PyCFunction)labelhash_sweep_tag_neighborhood, METH_VARARGS, "" },
+ {"get_tag_labels", (PyCFunction)labelhash_get_tag_labels, METH_VARARGS, ""},
+ {"consume_sequence_and_tag_with_labels", (PyCFunction)labelhash_consume_sequence_and_tag_with_labels, METH_VARARGS, "" },
+ {"n_labels", (PyCFunction)labelhash_n_labels, METH_VARARGS, ""},
+ {"get_all_labels", (PyCFunction)labelhash_get_all_labels, METH_VARARGS, "" },
+ {
+ "label_across_high_degree_nodes",
+ (PyCFunction)labelhash_label_across_high_degree_nodes, METH_VARARGS,
+ "Connect graph across high degree nodes using labels.",
+ },
+ {
+ "assemble_labeled_path",
+ (PyCFunction)labelhash_assemble_labeled_path, METH_VARARGS,
+ "Assemble all paths, using labels to negotiate tricky bits."
+ },
+ { "save_labels_and_tags", (PyCFunction)labelhash_save_labels_and_tags, METH_VARARGS, "" },
+ { "load_labels_and_tags", (PyCFunction)labelhash_load_labels_and_tags, METH_VARARGS, "" }, {NULL, NULL, 0, NULL} /* sentinel */
+};
+
+
+void khmer_graphlabels_dealloc(khmer_KGraphLabels_Object * obj)
+{
+ delete obj->labelhash;
+ obj->labelhash = NULL;
+
+ Py_TYPE(obj)->tp_free((PyObject*)obj);
+}
+
+ PyObject * khmer_graphlabels_new(PyTypeObject *type, PyObject *args,
+ PyObject *kwds)
+{
+ khmer_KGraphLabels_Object *self;
+ self = (khmer_KGraphLabels_Object*)type->tp_alloc(type, 0);
+
+ if (self != NULL) {
+ PyObject * hashgraph_o;
+ Hashgraph * hashgraph = NULL; // @CTB
+
+ if (!PyArg_ParseTuple(args, "O", &hashgraph_o)) {
+ Py_DECREF(self);
+ return NULL;
+ }
+
+ if (PyObject_TypeCheck(hashgraph_o, &khmer_KNodegraph_Type)) {
+ khmer_KNodegraph_Object * kho = (khmer_KNodegraph_Object *) hashgraph_o;
+ hashgraph = kho->nodegraph;
+ } else if (PyObject_TypeCheck(hashgraph_o, &khmer_KCountgraph_Type)) {
+ khmer_KCountgraph_Object * cho = (khmer_KCountgraph_Object *) hashgraph_o;
+ hashgraph = cho->countgraph;
+ } else {
+ PyErr_SetString(PyExc_ValueError,
+ "graph object must be a NodeGraph or CountGraph");
+ Py_DECREF(self);
+ return NULL;
+ }
+
+ try {
+ self->labelhash = new LabelHash(hashgraph);
+ } catch (std::bad_alloc &e) {
+ Py_DECREF(self);
+ return PyErr_NoMemory();
+ }
+ }
+
+ return (PyObject *) self;
+}
+
+
+PyObject *
+labelhash_get_all_labels(khmer_KGraphLabels_Object * me, PyObject * args)
+{
+ LabelHash * hb = me->labelhash;
+
+ PyObject * d = PyList_New(hb->all_labels.size());
+ if (d == NULL) {
+ return NULL;
+ }
+ LabelSet::iterator it;
+
+ unsigned long long i = 0;
+ for (it = hb->all_labels.begin(); it != hb->all_labels.end(); ++it) {
+ PyObject * val = Py_BuildValue("K", *it);
+ if (val != NULL) {
+ PyList_SetItem(d, i, val);
+ }
+ i++;
+ }
+
+ return d;
+}
+
+
+PyObject *
+labelhash_consume_seqfile_and_tag_with_labels(khmer_KGraphLabels_Object * me,
+ PyObject * args)
+{
+ LabelHash * hb = me->labelhash;
+
+ const char * filename;
+
+ if (!PyArg_ParseTuple(args, "s", &filename)) {
+ return NULL;
+ }
+
+ const char *value_exception = NULL;
+ const char *file_exception = NULL;
+ unsigned long long n_consumed = 0;
+ unsigned int total_reads = 0;
+ std::string exc_string;
+
+ //Py_BEGIN_ALLOW_THREADS
+ try {
+ hb->consume_seqfile_and_tag_with_labels<FastxReader>(filename, total_reads,
+ n_consumed);
+ } catch (oxli_file_exception &exc) {
+ exc_string = exc.what();
+ file_exception = exc_string.c_str();
+ } catch (oxli_value_exception &exc) {
+ exc_string = exc.what();
+ value_exception = exc_string.c_str();
+ }
+ //Py_END_ALLOW_THREADS
+
+ if (file_exception != NULL) {
+ PyErr_SetString(PyExc_OSError, file_exception);
+ return NULL;
+ }
+ if (value_exception != NULL) {
+ PyErr_SetString(PyExc_ValueError, value_exception);
+ return NULL;
+ }
+
+ return Py_BuildValue("IK", total_reads, n_consumed);
+}
+
+
+PyObject *
+labelhash_consume_partitioned_fasta_and_tag_with_labels(
+ khmer_KGraphLabels_Object * me, PyObject * args)
+{
+ LabelHash * labelhash = me->labelhash;
+
+ const char * filename;
+
+ if (!PyArg_ParseTuple(args, "s", &filename)) {
+ return NULL;
+ }
+
+ // call the C++ function, and trap signals => Python
+
+ unsigned long long n_consumed = 0;
+ unsigned int total_reads = 0;
+
+ try {
+ labelhash->consume_partitioned_fasta_and_tag_with_labels<FastxReader>(filename,
+ total_reads, n_consumed);
+ } catch (oxli_file_exception &exc) {
+ PyErr_SetString(PyExc_OSError, exc.what());
+ return NULL;
+ } catch (oxli_value_exception &exc) {
+ PyErr_SetString(PyExc_ValueError, exc.what());
+ return NULL;
+ }
+
+ return Py_BuildValue("IK", total_reads, n_consumed);
+}
+
+
+PyObject *
+labelhash_consume_sequence_and_tag_with_labels(khmer_KGraphLabels_Object * me,
+ PyObject * args)
+{
+ LabelHash * hb = me->labelhash;
+ const char * seq = NULL;
+ unsigned long long c = 0;
+ if (!PyArg_ParseTuple(args, "sK", &seq, &c)) {
+ return NULL;
+ }
+ unsigned long long n_consumed = 0;
+
+ hb->consume_sequence_and_tag_with_labels(seq, n_consumed, c);
+ return Py_BuildValue("K", n_consumed);
+}
+
+
+PyObject *
+labelhash_sweep_label_neighborhood(khmer_KGraphLabels_Object * me,
+ PyObject * args)
+{
+ LabelHash * hb = me->labelhash;
+
+ const char * seq = NULL;
+ int r = 0;
+ PyObject * break_on_stop_tags_o = NULL;
+ PyObject * stop_big_traversals_o = NULL;
+
+ if (!PyArg_ParseTuple(args, "s|iOO", &seq, &r,
+ &break_on_stop_tags_o,
+ &stop_big_traversals_o)) {
+ return NULL;
+ }
+
+ unsigned int range = (2 * hb->graph->_get_tag_density()) + 1;
+ if (r >= 0) {
+ range = r;
+ }
+
+ bool break_on_stop_tags = false;
+ if (break_on_stop_tags_o && PyObject_IsTrue(break_on_stop_tags_o)) {
+ break_on_stop_tags = true;
+ }
+ bool stop_big_traversals = false;
+ if (stop_big_traversals_o && PyObject_IsTrue(stop_big_traversals_o)) {
+ stop_big_traversals = true;
+ }
+
+ if (strlen(seq) < hb->graph->ksize()) {
+ PyErr_SetString(PyExc_ValueError,
+ "string length must >= the hashtable k-mer size");
+ return NULL;
+ }
+
+ //std::pair<TagLabelPair::iterator, TagLabelPair::iterator> ret;
+ LabelSet found_labels;
+
+ //unsigned int num_traversed = 0;
+ //Py_BEGIN_ALLOW_THREADS
+ hb->sweep_label_neighborhood(seq, found_labels, range, break_on_stop_tags,
+ stop_big_traversals);
+ //Py_END_ALLOW_THREADS
+
+ //printf("...%u kmers traversed\n", num_traversed);
+
+ PyObject * x = PyList_New(found_labels.size());
+ LabelSet::const_iterator si;
+ unsigned long long i = 0;
+ for (si = found_labels.begin(); si != found_labels.end(); ++si) {
+ PyList_SET_ITEM(x, i, Py_BuildValue("K", *si));
+ i++;
+ }
+
+ return x;
+}
+
+// Similar to find_all_tags, but returns tags in a way actually usable by python
+// need a tags_in_sequence iterator or function in c++ land for reuse in all
+// these functions
+
+
+PyObject *
+labelhash_sweep_tag_neighborhood(khmer_KGraphLabels_Object * me,
+ PyObject * args)
+{
+ LabelHash * labelhash = me->labelhash;
+
+ const char * seq = NULL;
+ int r = 0;
+ PyObject * break_on_stop_tags_o = NULL;
+ PyObject * stop_big_traversals_o = NULL;
+
+ if (!PyArg_ParseTuple(args, "s|iOO", &seq, &r,
+ &break_on_stop_tags_o,
+ &stop_big_traversals_o)) {
+ return NULL;
+ }
+
+ unsigned int range = (2 * labelhash->graph->_get_tag_density()) + 1;
+ if (r >= 0) {
+ range = r;
+ }
+
+ bool break_on_stop_tags = false;
+ if (break_on_stop_tags_o && PyObject_IsTrue(break_on_stop_tags_o)) {
+ break_on_stop_tags = true;
+ }
+ bool stop_big_traversals = false;
+ if (stop_big_traversals_o && PyObject_IsTrue(stop_big_traversals_o)) {
+ stop_big_traversals = true;
+ }
+
+ if (strlen(seq) < labelhash->graph->ksize()) {
+ PyErr_SetString(PyExc_ValueError,
+ "string length must >= the hashtable k-mer size");
+ return NULL;
+ }
+
+ SeenSet * tagged_kmers = new SeenSet;
+
+ //Py_BEGIN_ALLOW_THREADS
+
+ labelhash->graph->partition->sweep_for_tags(seq, *tagged_kmers,
+ labelhash->graph->all_tags,
+ range, break_on_stop_tags,
+ stop_big_traversals);
+
+ //Py_END_ALLOW_THREADS
+
+ PyObject * x = (PyObject *) create_HashSet_Object(tagged_kmers,
+ labelhash->graph->ksize());
+ return x;
+}
+
+
+PyObject *
+labelhash_get_tag_labels(khmer_KGraphLabels_Object * me, PyObject * args)
+{
+ LabelHash * labelhash = me->labelhash;
+
+ PyObject * tag_o;
+ HashIntoType tag;
+
+ if (!PyArg_ParseTuple(args, "O", &tag_o)) {
+ return NULL;
+ }
+ if (!ht_convert_PyObject_to_HashIntoType(tag_o, tag,
+ labelhash->graph)) {
+ return NULL;
+ }
+
+ LabelSet labels;
+ labelhash->get_tag_labels(tag, labels);
+
+ PyObject * x = PyList_New(labels.size());
+ LabelSet::const_iterator si;
+ unsigned long long i = 0;
+ for (si = labels.begin(); si != labels.end(); ++si) {
+ PyList_SET_ITEM(x, i, Py_BuildValue("K", *si));
+ i++;
+ }
+
+ return x;
+}
+
+
+PyObject *
+labelhash_n_labels(khmer_KGraphLabels_Object * me, PyObject * args)
+{
+ LabelHash * labelhash = me->labelhash;
+
+ if (!PyArg_ParseTuple(args, "")) {
+ return NULL;
+ }
+
+ return PyLong_FromSize_t(labelhash->n_labels());
+}
+
+
+PyObject *
+labelhash_label_across_high_degree_nodes(khmer_KGraphLabels_Object * me,
+ PyObject * args)
+{
+ LabelHash * labelhash = me->labelhash;
+
+ const char * long_str;
+ khmer_HashSet_Object * hdn_o = NULL;
+ Label label;
+
+ if (!PyArg_ParseTuple(args, "sO!K", &long_str,
+ &khmer_HashSet_Type, &hdn_o, &label)) {
+ return NULL;
+ }
+
+ if (strlen(long_str) < labelhash->graph->ksize()) {
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+
+ labelhash->label_across_high_degree_nodes(long_str, *hdn_o->hashes, label);
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+
+PyObject *
+labelhash_assemble_labeled_path(khmer_KGraphLabels_Object * me,
+ PyObject * args)
+{
+ LabelHash* labelhash = me->labelhash;
+
+ PyObject * val_o;
+ khmer_KNodegraph_Object * nodegraph_o = NULL;
+ Nodegraph * stop_bf = NULL;
+
+ if (!PyArg_ParseTuple(args, "O|O!", &val_o,
+ &khmer_KNodegraph_Type, &nodegraph_o)) {
+ return NULL;
+ }
+
+ Kmer start_kmer;
+ if (!ht_convert_PyObject_to_Kmer(val_o, start_kmer, labelhash->graph)) {
+ return NULL;
+ }
+
+ if (nodegraph_o) {
+ stop_bf = nodegraph_o->nodegraph;
+ }
+
+ SimpleLabeledAssembler assembler(labelhash);
+ std::vector<std::string> contigs = assembler.assemble(start_kmer, stop_bf);
+
+ PyObject * ret = PyList_New(contigs.size());
+ for (unsigned int i = 0; i < contigs.size(); i++) {
+ PyList_SET_ITEM(ret, i, PyUnicode_FromString(contigs[i].c_str()));
+ }
+
+ return ret;
+}
+
+
+PyObject *
+labelhash_save_labels_and_tags(khmer_KGraphLabels_Object * me, PyObject * args)
+{
+ const char * filename = NULL;
+ LabelHash * labelhash = me->labelhash;
+
+ if (!PyArg_ParseTuple(args, "s", &filename)) {
+ return NULL;
+ }
+
+ try {
+ labelhash->save_labels_and_tags(filename);
+ } catch (oxli_file_exception &e) {
+ PyErr_SetString(PyExc_OSError, e.what());
+ return NULL;
+ }
+
+ Py_RETURN_NONE;
+}
+
+
+PyObject *
+labelhash_load_labels_and_tags(khmer_KGraphLabels_Object * me, PyObject * args)
+{
+ const char * filename = NULL;
+ LabelHash * labelhash = me->labelhash;
+
+ if (!PyArg_ParseTuple(args, "s", &filename)) {
+ return NULL;
+ }
+
+ try {
+ labelhash->load_labels_and_tags(filename);
+ } catch (oxli_file_exception &e) {
+ PyErr_SetString(PyExc_OSError, e.what());
+ return NULL;
+ }
+
+ Py_RETURN_NONE;
+}
+
+}
diff --git a/khmer/_cpy_hashgraph.hh b/src/khmer/_cpy_hashgraph.cc
similarity index 92%
rename from khmer/_cpy_hashgraph.hh
rename to src/khmer/_cpy_hashgraph.cc
index ea5ba1a..b9ee9f8 100644
--- a/khmer/_cpy_hashgraph.hh
+++ b/src/khmer/_cpy_hashgraph.cc
@@ -1,42 +1,23 @@
-/*
-This file is part of khmer, https://github.com/dib-lab/khmer/, and is
-Copyright (C) 2010-2015, Michigan State University.
-Copyright (C) 2015-2016, The Regents of the University of California.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
-
- * Neither the name of the Michigan State University nor the names
- of its contributors may be used to endorse or promote products
- derived from this software without specific prior written
- permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-LICENSE (END)
-
-Contact: khmer-project at idyll.org
-*/
-
-static PyTypeObject khmer_KHashgraph_Type
+#include "khmer/_cpy_hashset.hh"
+#include "khmer/_cpy_hashgraph.hh"
+#include "khmer/_cpy_nodegraph.hh"
+#include "khmer/_cpy_countgraph.hh"
+#include "khmer/_cpy_subsetpartition.hh"
+#include "khmer/_cpy_readparsers.hh"
+
+#include <vector>
+#include "oxli/oxli.hh"
+#include "oxli/kmer_hash.hh"
+#include "oxli/read_parsers.hh"
+#include "oxli/assembler.hh"
+#include "oxli/traversal.hh"
+
+using namespace oxli;
+using namespace oxli::read_parsers;
+
+namespace khmer {
+
+PyTypeObject khmer_KHashgraph_Type
CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KHashgraph_Object")
= {
PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
@@ -62,45 +43,311 @@ CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KHashgraph_Object")
"hashgraph object" /* tp_doc */
};
-//
-// Method definitions
-//
-static
-PyObject *
-hashgraph_find_high_degree_nodes(khmer_KHashgraph_Object * me, PyObject * args)
-{
- Hashgraph * hashgraph = me->hashgraph;
-
- const char * long_str;
-
- if (!PyArg_ParseTuple(args, "s", &long_str)) {
- return NULL;
- }
-
- if (strlen(long_str) < hashgraph->ksize()) {
- PyErr_SetString(PyExc_ValueError,
- "string length must >= the hashgraph k-mer size");
- return NULL;
- }
+PyMethodDef khmer_hashgraph_methods[] = {
+ //
+ // graph/traversal functionality
+ //
- SeenSet * hashes = new SeenSet;
- hashgraph->find_high_degree_nodes(long_str, *hashes);
+ {
+ "neighbors",
+ (PyCFunction)hashgraph_neighbors, METH_VARARGS,
+ "Get a list of neighbor nodes for this k-mer.",
+ },
+ {
+ "calc_connected_graph_size",
+ (PyCFunction)hashgraph_calc_connected_graph_size, METH_VARARGS, ""
+ },
+ {
+ "kmer_degree",
+ (PyCFunction)hashgraph_kmer_degree, METH_VARARGS,
+ "Calculate the number of immediate neighbors this k-mer has in "
+ "the graph."
+ },
+ {
+ "count_kmers_within_radius",
+ (PyCFunction)hashgraph_count_kmers_within_radius, METH_VARARGS,
+ "Calculate the number of neighbors with given radius in the graph."
+ },
+ {
+ "find_high_degree_nodes",
+ (PyCFunction)hashgraph_find_high_degree_nodes, METH_VARARGS,
+ "Examine the given sequence for degree > 2 nodes and add to "
+ "list; used in graph contraction.",
+ },
+ {
+ "traverse_linear_path",
+ (PyCFunction)hashgraph_traverse_linear_path, METH_VARARGS,
+ "Traverse the path through the graph starting with the given "
+ "k-mer and avoiding high-degree nodes, finding (and returning) "
+ "traversed k-mers and any encountered high-degree nodes.",
+ },
+ {
+ "assemble_linear_path",
+ (PyCFunction)hashgraph_assemble_linear_path, METH_VARARGS,
+ "Assemble a purely linear path starting with the given "
+ "k-mer, returning traversed k-mers and any encountered high-degree "
+ "nodes.",
+ },
- khmer_HashSet_Object * o;
- o = create_HashSet_Object(hashes, hashgraph->ksize());
+ //
+ // tagging / sparse graph functionality
+ //
- return (PyObject *) o;
-}
+ {
+ "consume_and_tag",
+ (PyCFunction)hashgraph_consume_and_tag, METH_VARARGS,
+ "Consume a sequence and tag it."
+ },
+ {
+ "get_tags_and_positions",
+ (PyCFunction)hashgraph_get_tags_and_positions, METH_VARARGS,
+ "Retrieve tags and their positions in a sequence."
+ },
+ {
+ "find_all_tags_list",
+ (PyCFunction)hashgraph_find_all_tags_list, METH_VARARGS,
+ "Find all tags within range of the given k-mer, return as list"
+ },
+ {
+ "consume_seqfile_and_tag",
+ (PyCFunction)hashgraph_consume_seqfile_and_tag, METH_VARARGS,
+ "Consume all sequences in a FASTA/FASTQ file and tag the resulting "
+ "graph."
+ },
+ {
+ "extract_unique_paths",
+ (PyCFunction)hashgraph_extract_unique_paths, METH_VARARGS,
+ "@CTB remove."
+ },
+ {
+ "print_tagset",
+ (PyCFunction)hashgraph_print_tagset, METH_VARARGS,
+ "Print out all of the tags."
+ },
+ {
+ "add_tag",
+ (PyCFunction)hashgraph_add_tag, METH_VARARGS,
+ "Add a k-mer to the tagset."
+ },
+ {
+ "get_tagset",
+ (PyCFunction)hashgraph_get_tagset, METH_VARARGS,
+ "Get all tagged k-mers as DNA strings."
+ },
+ {
+ "load_tagset",
+ (PyCFunction)hashgraph_load_tagset, METH_VARARGS,
+ "Load tags from a file."
+ },
+ {
+ "save_tagset",
+ (PyCFunction)hashgraph_save_tagset, METH_VARARGS,
+ "Save tags to a file."
+ },
+ {
+ "n_tags",
+ (PyCFunction)hashgraph_n_tags, METH_VARARGS,
+ "Return the count of all tags."
+ },
+ {
+ "divide_tags_into_subsets",
+ (PyCFunction)hashgraph_divide_tags_into_subsets, METH_VARARGS,
+ "Divide tags equally up into subsets of given size."
+ },
+ {
+ "_get_tag_density",
+ (PyCFunction)hashgraph__get_tag_density, METH_VARARGS,
+ "Get the tagging density."
+ },
+ {
+ "_set_tag_density",
+ (PyCFunction)hashgraph__set_tag_density, METH_VARARGS,
+ "Set the tagging density."
+ },
-static
-PyObject *
-hashgraph_neighbors(khmer_KHashgraph_Object * me, PyObject * args)
-{
- Hashgraph * hashgraph = me->hashgraph;
- PyObject * val_obj;
+ //
+ // partitioning
+ //
+ {
+ "do_subset_partition",
+ (PyCFunction)hashgraph_do_subset_partition, METH_VARARGS,
+ "Partition the graph starting from a given subset of tags."
+ },
+ {
+ "find_all_tags",
+ (PyCFunction)hashgraph_find_all_tags, METH_VARARGS,
+ "Starting from the given k-mer, find all closely connected tags."
+ },
+ {
+ "assign_partition_id",
+ (PyCFunction)hashgraph_assign_partition_id, METH_VARARGS,
+ "Assign a partition ID to a given tag."
+ },
+ {
+ "output_partitions",
+ (PyCFunction)hashgraph_output_partitions, METH_VARARGS,
+ "Write out sequences in given filename to another file, annotating "
+ "with partition IDs."
+ },
+ {
+ "load_partitionmap",
+ (PyCFunction)hashgraph_load_partitionmap, METH_VARARGS,
+ "Load a partitionmap for a given subset."
+ },
+ {
+ "save_partitionmap",
+ (PyCFunction)hashgraph_save_partitionmap, METH_VARARGS,
+ "Save a partitionmap for the given subset."
+ },
+ {
+ "_validate_partitionmap",
+ (PyCFunction)hashgraph__validate_partitionmap, METH_VARARGS,
+ "Run internal validation checks."
+ },
+ {
+ "consume_seqfile_and_tag_with_reads_parser",
+ (PyCFunction)hashgraph_consume_seqfile_and_tag_with_reads_parser,
+ METH_VARARGS,
+ "Count all k-mers using the given reads parser"
+ },
+ {
+ "consume_partitioned_fasta",
+ (PyCFunction)hashgraph_consume_partitioned_fasta, METH_VARARGS,
+ "Count all k-mers in a given file"
+ },
+ {
+ "merge_subset",
+ (PyCFunction)hashgraph_merge_subset, METH_VARARGS,
+ "Merge the given subset into this one."
+ },
+ {
+ "merge_subset_from_disk",
+ (PyCFunction)hashgraph_merge_from_disk, METH_VARARGS,
+ "Merge the given subset (filename) into this one."
+ },
+ {
+ "count_partitions",
+ (PyCFunction)hashgraph_count_partitions, METH_VARARGS,
+ "Count the number of partitions in the master partitionmap."
+ },
+ {
+ "subset_count_partitions",
+ (PyCFunction)hashgraph_subset_count_partitions, METH_VARARGS,
+ "Count the number of partitions in this subset partitionmap."
+ },
+ {
+ "subset_partition_size_distribution",
+ (PyCFunction)hashgraph_subset_partition_size_distribution,
+ METH_VARARGS,
+ "Get the size distribution of partitions in this subset."
+ },
+ {
+ "save_subset_partitionmap",
+ (PyCFunction)hashgraph_save_subset_partitionmap, METH_VARARGS,
+ "Save the partition map for this subset."
+ },
+ {
+ "load_subset_partitionmap",
+ (PyCFunction)hashgraph_load_subset_partitionmap, METH_VARARGS,
+ "Save the partition map for this subset."
+ },
+ {
+ "_validate_subset_partitionmap",
+ (PyCFunction)hashgraph__validate_subset_partitionmap, METH_VARARGS,
+ "Run internal validation checks on this subset."
+ },
+ {
+ "set_partition_id",
+ (PyCFunction)hashgraph_set_partition_id, METH_VARARGS,
+ "Set the partition ID for this tag."
+ },
+ {
+ "join_partitions",
+ (PyCFunction)hashgraph_join_partitions, METH_VARARGS,
+ "Join the partitions of these two tags."
+ },
+ {
+ "get_partition_id",
+ (PyCFunction)hashgraph_get_partition_id, METH_VARARGS,
+ "Get the partition ID of this tag."
+ },
+ {
+ "repartition_largest_partition",
+ (PyCFunction)hashgraph_repartition_largest_partition, METH_VARARGS,
+ "Repartition the largest partition (in the face of stop tags)."
+ },
- if (!PyArg_ParseTuple(args, "O", &val_obj)) {
+ // stop tags
+ {
+ "load_stop_tags",
+ (PyCFunction)hashgraph_load_stop_tags, METH_VARARGS,
+ "Load the set of stop tags."
+ },
+ {
+ "save_stop_tags",
+ (PyCFunction)hashgraph_save_stop_tags, METH_VARARGS,
+ "Save the set of stop tags."
+ },
+ {
+ "print_stop_tags",
+ (PyCFunction)hashgraph_print_stop_tags, METH_VARARGS,
+ "Print out the set of stop tags."
+ },
+ {
+ "trim_on_stoptags",
+ (PyCFunction)hashgraph_trim_on_stoptags, METH_VARARGS,
+ "Trim the reads on the given stop tags."
+ },
+ {
+ "add_stop_tag",
+ (PyCFunction)hashgraph_add_stop_tag, METH_VARARGS,
+ "Add this k-mer as a stop tag."
+ },
+ {
+ "get_stop_tags",
+ (PyCFunction)hashgraph_get_stop_tags, METH_VARARGS,
+ "Return a DNA list of all of the stop tags."
+ },
+ {NULL, NULL, 0, NULL} /* sentinel */
+};
+
+
+
+PyObject *
+hashgraph_find_high_degree_nodes(khmer_KHashgraph_Object * me, PyObject * args)
+{
+ Hashgraph * hashgraph = me->hashgraph;
+
+ const char * long_str;
+
+ if (!PyArg_ParseTuple(args, "s", &long_str)) {
+ return NULL;
+ }
+
+ if (strlen(long_str) < hashgraph->ksize()) {
+ PyErr_SetString(PyExc_ValueError,
+ "string length must >= the hashgraph k-mer size");
+ return NULL;
+ }
+
+ SeenSet * hashes = new SeenSet;
+ hashgraph->find_high_degree_nodes(long_str, *hashes);
+
+ khmer_HashSet_Object * o;
+ o = create_HashSet_Object(hashes, hashgraph->ksize());
+
+ return (PyObject *) o;
+}
+
+
+PyObject *
+hashgraph_neighbors(khmer_KHashgraph_Object * me, PyObject * args)
+{
+ Hashgraph * hashgraph = me->hashgraph;
+ PyObject * val_obj;
+
+ if (!PyArg_ParseTuple(args, "O", &val_obj)) {
return NULL;
}
@@ -131,7 +378,7 @@ hashgraph_neighbors(khmer_KHashgraph_Object * me, PyObject * args)
return x;
}
-static
+
PyObject *
hashgraph_traverse_linear_path(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -171,7 +418,7 @@ hashgraph_traverse_linear_path(khmer_KHashgraph_Object * me, PyObject * args)
return ret;
}
-static
+
PyObject *
hashgraph_assemble_linear_path(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -203,7 +450,7 @@ hashgraph_assemble_linear_path(khmer_KHashgraph_Object * me, PyObject * args)
return ret;
}
-static
+
PyObject *
hashgraph_n_tags(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -216,7 +463,7 @@ hashgraph_n_tags(khmer_KHashgraph_Object * me, PyObject * args)
return PyLong_FromSize_t(hashgraph->n_tags());
}
-static
+
PyObject *
hashgraph_print_stop_tags(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -233,7 +480,7 @@ hashgraph_print_stop_tags(khmer_KHashgraph_Object * me, PyObject * args)
Py_RETURN_NONE;
}
-static
+
PyObject *
hashgraph_print_tagset(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -250,7 +497,7 @@ hashgraph_print_tagset(khmer_KHashgraph_Object * me, PyObject * args)
Py_RETURN_NONE;
}
-static
+
PyObject *
hashgraph_load_stop_tags(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -271,7 +518,7 @@ hashgraph_load_stop_tags(khmer_KHashgraph_Object * me, PyObject * args)
try {
hashgraph->load_stop_tags(filename, clear_tags);
- } catch (khmer_file_exception &e) {
+ } catch (oxli_file_exception &e) {
PyErr_SetString(PyExc_OSError, e.what());
return NULL;
}
@@ -280,7 +527,7 @@ hashgraph_load_stop_tags(khmer_KHashgraph_Object * me, PyObject * args)
}
-static
+
PyObject *
hashgraph_save_stop_tags(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -294,7 +541,7 @@ hashgraph_save_stop_tags(khmer_KHashgraph_Object * me, PyObject * args)
try {
hashgraph->save_stop_tags(filename);
- } catch (khmer_file_exception &e) {
+ } catch (oxli_file_exception &e) {
PyErr_SetString(PyExc_OSError, e.what());
return NULL;
}
@@ -302,11 +549,49 @@ hashgraph_save_stop_tags(khmer_KHashgraph_Object * me, PyObject * args)
Py_RETURN_NONE;
}
-static PyObject * hashgraph_repartition_largest_partition(
- khmer_KHashgraph_Object * me,
- PyObject * args);
+// PyObject * hashgraph_repartition_largest_partition(
+// khmer_KHashgraph_Object * me,
+// PyObject * args);
+
+
+PyObject *
+hashgraph_repartition_largest_partition(khmer_KHashgraph_Object * me,
+ PyObject * args)
+{
+ Hashgraph * hashgraph = me->hashgraph;
+ khmer_KCountgraph_Object * countgraph_o = NULL;
+ PyObject * subset_o = NULL;
+ SubsetPartition * subset_p;
+ unsigned int distance, threshold, frequency;
+
+ if (!PyArg_ParseTuple(args, "OO!III",
+ &subset_o,
+ &khmer_KCountgraph_Type, &countgraph_o,
+ &distance, &threshold, &frequency)) {
+ return NULL;
+ }
+
+ if (PyObject_TypeCheck(subset_o, &khmer_KSubsetPartition_Type)) {
+ subset_p = ((khmer_KSubsetPartition_Object *) subset_o)->subset;
+ } else {
+ subset_p = hashgraph->partition;
+ }
+
+ Countgraph * countgraph = countgraph_o->countgraph;
+
+ unsigned long next_largest;
+ try {
+ next_largest = subset_p->repartition_largest_partition(distance,
+ threshold, frequency, *countgraph);
+ } catch (oxli_exception &e) {
+ PyErr_SetString(PyExc_RuntimeError, e.what());
+ return NULL;
+ }
+
+ return PyLong_FromLong(next_largest);
+}
+
-static
PyObject *
hashgraph_calc_connected_graph_size(khmer_KHashgraph_Object * me,
PyObject * args)
@@ -337,7 +622,7 @@ hashgraph_calc_connected_graph_size(khmer_KHashgraph_Object * me,
return PyLong_FromUnsignedLongLong(size);
}
-static
+
PyObject *
hashgraph_kmer_degree(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -352,7 +637,7 @@ hashgraph_kmer_degree(khmer_KHashgraph_Object * me, PyObject * args)
return PyLong_FromLong(hashgraph->kmer_degree(kmer_s));
}
-static
+
PyObject *
hashgraph_trim_on_stoptags(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -381,7 +666,7 @@ hashgraph_trim_on_stoptags(khmer_KHashgraph_Object * me, PyObject * args)
return ret;
}
-static
+
PyObject *
hashgraph_do_subset_partition(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -441,7 +726,7 @@ hashgraph_do_subset_partition(khmer_KHashgraph_Object * me, PyObject * args)
}
-static
+
PyObject *
hashgraph_merge_subset(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -460,7 +745,7 @@ hashgraph_merge_subset(khmer_KHashgraph_Object * me, PyObject * args)
Py_RETURN_NONE;
}
-static
+
PyObject *
hashgraph_merge_from_disk(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -473,7 +758,7 @@ hashgraph_merge_from_disk(khmer_KHashgraph_Object * me, PyObject * args)
try {
hashgraph->partition->merge_from_disk(filename);
- } catch (khmer_file_exception &e) {
+ } catch (oxli_file_exception &e) {
PyErr_SetString(PyExc_OSError, e.what());
return NULL;
}
@@ -481,16 +766,16 @@ hashgraph_merge_from_disk(khmer_KHashgraph_Object * me, PyObject * args)
Py_RETURN_NONE;
}
-static
+
PyObject *
hashgraph_consume_seqfile_and_tag_with_reads_parser(khmer_KHashgraph_Object * me,
PyObject * args)
{
Hashgraph * hashgraph = me->hashgraph;
- python::khmer_ReadParser_Object * rparser_obj = NULL;
+ khmer_ReadParser_Object * rparser_obj = NULL;
- if (!PyArg_ParseTuple( args, "O!", &python::khmer_ReadParser_Type,
+ if (!PyArg_ParseTuple( args, "O!", &khmer_ReadParser_Type,
&rparser_obj)) {
return NULL;
}
@@ -507,10 +792,10 @@ hashgraph_consume_seqfile_and_tag_with_reads_parser(khmer_KHashgraph_Object * me
Py_BEGIN_ALLOW_THREADS
try {
hashgraph->consume_seqfile_and_tag<FastxReader>(rparser, total_reads, n_consumed);
- } catch (khmer_file_exception &exc) {
+ } catch (oxli_file_exception &exc) {
exc_string = exc.what();
file_exception = exc_string.c_str();
- } catch (khmer_value_exception &exc) {
+ } catch (oxli_value_exception &exc) {
exc_string = exc.what();
value_exception = exc_string.c_str();
}
@@ -527,7 +812,7 @@ hashgraph_consume_seqfile_and_tag_with_reads_parser(khmer_KHashgraph_Object * me
return Py_BuildValue("IK", total_reads, n_consumed);
}
-static
+
PyObject *
hashgraph_consume_partitioned_fasta(khmer_KHashgraph_Object * me,
PyObject * args)
@@ -547,10 +832,10 @@ hashgraph_consume_partitioned_fasta(khmer_KHashgraph_Object * me,
try {
hashgraph->consume_partitioned_fasta<FastxReader>(filename, total_reads, n_consumed);
- } catch (khmer_file_exception &exc) {
+ } catch (oxli_file_exception &exc) {
PyErr_SetString(PyExc_OSError, exc.what());
return NULL;
- } catch (khmer_value_exception &exc) {
+ } catch (oxli_value_exception &exc) {
PyErr_SetString(PyExc_ValueError, exc.what());
return NULL;
}
@@ -558,7 +843,7 @@ hashgraph_consume_partitioned_fasta(khmer_KHashgraph_Object * me,
return Py_BuildValue("IK", total_reads, n_consumed);
}
-static
+
PyObject *
hashgraph_find_all_tags(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -601,7 +886,7 @@ hashgraph_find_all_tags(khmer_KHashgraph_Object * me, PyObject * args)
return (PyObject*)ppi_obj;
}
-static
+
PyObject *
hashgraph_assign_partition_id(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -622,7 +907,7 @@ hashgraph_assign_partition_id(khmer_KHashgraph_Object * me, PyObject * args)
return PyLong_FromLong(p);
}
-static
+
PyObject *
hashgraph_add_tag(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -639,7 +924,7 @@ hashgraph_add_tag(khmer_KHashgraph_Object * me, PyObject * args)
Py_RETURN_NONE;
}
-static
+
PyObject *
hashgraph_add_stop_tag(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -656,7 +941,7 @@ hashgraph_add_stop_tag(khmer_KHashgraph_Object * me, PyObject * args)
Py_RETURN_NONE;
}
-static
+
PyObject *
hashgraph_get_stop_tags(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -680,7 +965,7 @@ hashgraph_get_stop_tags(khmer_KHashgraph_Object * me, PyObject * args)
return x;
}
-static
+
PyObject *
hashgraph_get_tagset(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -704,7 +989,7 @@ hashgraph_get_tagset(khmer_KHashgraph_Object * me, PyObject * args)
return x;
}
-static
+
PyObject *
hashgraph_output_partitions(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -731,10 +1016,10 @@ hashgraph_output_partitions(khmer_KHashgraph_Object * me, PyObject * args)
n_partitions = subset_p->output_partitioned_file(filename,
output,
output_unassigned);
- } catch (khmer_file_exception &e) {
+ } catch (oxli_file_exception &e) {
PyErr_SetString(PyExc_OSError, e.what());
return NULL;
- } catch (khmer_value_exception &exc) {
+ } catch (oxli_value_exception &exc) {
PyErr_SetString(PyExc_ValueError, exc.what());
return NULL;
}
@@ -742,7 +1027,7 @@ hashgraph_output_partitions(khmer_KHashgraph_Object * me, PyObject * args)
return PyLong_FromLong(n_partitions);
}
-static
+
PyObject *
hashgraph_save_partitionmap(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -756,7 +1041,7 @@ hashgraph_save_partitionmap(khmer_KHashgraph_Object * me, PyObject * args)
try {
hashgraph->partition->save_partitionmap(filename);
- } catch (khmer_file_exception &e) {
+ } catch (oxli_file_exception &e) {
PyErr_SetString(PyExc_OSError, e.what());
return NULL;
}
@@ -764,7 +1049,7 @@ hashgraph_save_partitionmap(khmer_KHashgraph_Object * me, PyObject * args)
Py_RETURN_NONE;
}
-static
+
PyObject *
hashgraph_load_partitionmap(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -778,7 +1063,7 @@ hashgraph_load_partitionmap(khmer_KHashgraph_Object * me, PyObject * args)
try {
hashgraph->partition->load_partitionmap(filename);
- } catch (khmer_file_exception &e) {
+ } catch (oxli_file_exception &e) {
PyErr_SetString(PyExc_OSError, e.what());
return NULL;
}
@@ -786,7 +1071,7 @@ hashgraph_load_partitionmap(khmer_KHashgraph_Object * me, PyObject * args)
Py_RETURN_NONE;
}
-static
+
PyObject *
hashgraph__validate_partitionmap(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -801,7 +1086,7 @@ hashgraph__validate_partitionmap(khmer_KHashgraph_Object * me, PyObject * args)
Py_RETURN_NONE;
}
-static
+
PyObject *
hashgraph_count_partitions(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -818,7 +1103,7 @@ hashgraph_count_partitions(khmer_KHashgraph_Object * me, PyObject * args)
(Py_ssize_t) n_unassigned);
}
-static
+
PyObject *
hashgraph_subset_count_partitions(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -837,7 +1122,7 @@ hashgraph_subset_count_partitions(khmer_KHashgraph_Object * me, PyObject * args)
(Py_ssize_t) n_unassigned);
}
-static
+
PyObject *
hashgraph_subset_partition_size_distribution(khmer_KHashgraph_Object * me,
PyObject * args)
@@ -871,7 +1156,7 @@ hashgraph_subset_partition_size_distribution(khmer_KHashgraph_Object * me,
PyList_SET_ITEM(x, i, value);
}
if (!(i == d.size())) {
- throw khmer_exception();
+ throw oxli_exception();
}
PyObject * returnValue = Py_BuildValue("NI", x, n_unassigned);
@@ -882,7 +1167,7 @@ hashgraph_subset_partition_size_distribution(khmer_KHashgraph_Object * me,
return returnValue;
}
-static
+
PyObject *
hashgraph_load_tagset(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -902,7 +1187,7 @@ hashgraph_load_tagset(khmer_KHashgraph_Object * me, PyObject * args)
try {
hashgraph->load_tagset(filename, clear_tags);
- } catch (khmer_file_exception &e) {
+ } catch (oxli_file_exception &e) {
PyErr_SetString(PyExc_OSError, e.what());
return NULL;
}
@@ -910,7 +1195,7 @@ hashgraph_load_tagset(khmer_KHashgraph_Object * me, PyObject * args)
Py_RETURN_NONE;
}
-static
+
PyObject *
hashgraph_save_tagset(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -924,7 +1209,7 @@ hashgraph_save_tagset(khmer_KHashgraph_Object * me, PyObject * args)
try {
hashgraph->save_tagset(filename);
- } catch (khmer_file_exception &e) {
+ } catch (oxli_file_exception &e) {
PyErr_SetString(PyExc_OSError, e.what());
return NULL;
}
@@ -932,7 +1217,7 @@ hashgraph_save_tagset(khmer_KHashgraph_Object * me, PyObject * args)
Py_RETURN_NONE;
}
-static
+
PyObject *
hashgraph_save_subset_partitionmap(khmer_KHashgraph_Object * me,
PyObject * args)
@@ -951,7 +1236,7 @@ hashgraph_save_subset_partitionmap(khmer_KHashgraph_Object * me,
try {
subset_p->save_partitionmap(filename);
- } catch (khmer_file_exception &e) {
+ } catch (oxli_file_exception &e) {
PyErr_SetString(PyExc_OSError, e.what());
return NULL;
}
@@ -961,7 +1246,7 @@ hashgraph_save_subset_partitionmap(khmer_KHashgraph_Object * me,
Py_RETURN_NONE;
}
-static
+
PyObject *
hashgraph_load_subset_partitionmap(khmer_KHashgraph_Object * me,
PyObject * args)
@@ -987,7 +1272,7 @@ hashgraph_load_subset_partitionmap(khmer_KHashgraph_Object * me,
Py_BEGIN_ALLOW_THREADS
try {
subset_p->load_partitionmap(filename);
- } catch (khmer_file_exception &exc) {
+ } catch (oxli_file_exception &exc) {
exc_string = exc.what();
file_exception = exc_string.c_str();
}
@@ -1012,7 +1297,7 @@ hashgraph_load_subset_partitionmap(khmer_KHashgraph_Object * me,
return (PyObject *) subset_obj;
}
-static
+
PyObject *
hashgraph__set_tag_density(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -1028,7 +1313,7 @@ hashgraph__set_tag_density(khmer_KHashgraph_Object * me, PyObject * args)
Py_RETURN_NONE;
}
-static
+
PyObject *
hashgraph__get_tag_density(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -1043,7 +1328,7 @@ hashgraph__get_tag_density(khmer_KHashgraph_Object * me, PyObject * args)
return PyLong_FromLong(d);
}
-static
+
PyObject *
hashgraph__validate_subset_partitionmap(khmer_KHashgraph_Object * me,
PyObject * args)
@@ -1062,7 +1347,7 @@ hashgraph__validate_subset_partitionmap(khmer_KHashgraph_Object * me,
Py_RETURN_NONE;
}
-static
+
PyObject *
hashgraph_set_partition_id(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -1080,7 +1365,7 @@ hashgraph_set_partition_id(khmer_KHashgraph_Object * me, PyObject * args)
Py_RETURN_NONE;
}
-static
+
PyObject *
hashgraph_join_partitions(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -1097,7 +1382,7 @@ hashgraph_join_partitions(khmer_KHashgraph_Object * me, PyObject * args)
return PyLong_FromLong(p1);
}
-static
+
PyObject *
hashgraph_get_partition_id(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -1115,7 +1400,7 @@ hashgraph_get_partition_id(khmer_KHashgraph_Object * me, PyObject * args)
return PyLong_FromLong(partition_id);
}
-static
+
PyObject *
hashgraph_divide_tags_into_subsets(khmer_KHashgraph_Object * me,
PyObject * args)
@@ -1136,7 +1421,7 @@ hashgraph_divide_tags_into_subsets(khmer_KHashgraph_Object * me,
return x;
}
-static
+
PyObject *
hashgraph_count_kmers_within_radius(khmer_KHashgraph_Object * me,
PyObject * args)
@@ -1164,7 +1449,7 @@ hashgraph_count_kmers_within_radius(khmer_KHashgraph_Object * me,
return PyLong_FromUnsignedLong(n);
}
-static
+
PyObject *
hashgraph_extract_unique_paths(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -1192,7 +1477,7 @@ hashgraph_extract_unique_paths(khmer_KHashgraph_Object * me, PyObject * args)
return x;
}
-static
+
PyObject *
hashgraph_consume_and_tag(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -1214,7 +1499,7 @@ hashgraph_consume_and_tag(khmer_KHashgraph_Object * me, PyObject * args)
return Py_BuildValue("K", n_consumed);
}
-static
+
PyObject *
hashgraph_get_tags_and_positions(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -1254,7 +1539,7 @@ hashgraph_get_tags_and_positions(khmer_KHashgraph_Object * me, PyObject * args)
return posns_list;
}
-static
+
PyObject *
hashgraph_find_all_tags_list(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -1288,7 +1573,7 @@ hashgraph_find_all_tags_list(khmer_KHashgraph_Object * me, PyObject * args)
return x;
}
-static
+
PyObject *
hashgraph_consume_seqfile_and_tag(khmer_KHashgraph_Object * me, PyObject * args)
{
@@ -1307,10 +1592,10 @@ hashgraph_consume_seqfile_and_tag(khmer_KHashgraph_Object * me, PyObject * args)
try {
hashgraph->consume_seqfile_and_tag<FastxReader>(filename, total_reads, n_consumed);
- } catch (khmer_file_exception &exc) {
+ } catch (oxli_file_exception &exc) {
PyErr_SetString(PyExc_OSError, exc.what());
return NULL;
- } catch (khmer_value_exception &exc) {
+ } catch (oxli_value_exception &exc) {
PyErr_SetString(PyExc_ValueError, exc.what());
return NULL;
}
@@ -1318,270 +1603,4 @@ hashgraph_consume_seqfile_and_tag(khmer_KHashgraph_Object * me, PyObject * args)
return Py_BuildValue("IK", total_reads, n_consumed);
}
-static PyMethodDef khmer_hashgraph_methods[] = {
- //
- // graph/traversal functionality
- //
-
- {
- "neighbors",
- (PyCFunction)hashgraph_neighbors, METH_VARARGS,
- "Get a list of neighbor nodes for this k-mer.",
- },
- {
- "calc_connected_graph_size",
- (PyCFunction)hashgraph_calc_connected_graph_size, METH_VARARGS, ""
- },
- {
- "kmer_degree",
- (PyCFunction)hashgraph_kmer_degree, METH_VARARGS,
- "Calculate the number of immediate neighbors this k-mer has in "
- "the graph."
- },
- {
- "count_kmers_within_radius",
- (PyCFunction)hashgraph_count_kmers_within_radius, METH_VARARGS,
- "Calculate the number of neighbors with given radius in the graph."
- },
- {
- "find_high_degree_nodes",
- (PyCFunction)hashgraph_find_high_degree_nodes, METH_VARARGS,
- "Examine the given sequence for degree > 2 nodes and add to "
- "list; used in graph contraction.",
- },
- {
- "traverse_linear_path",
- (PyCFunction)hashgraph_traverse_linear_path, METH_VARARGS,
- "Traverse the path through the graph starting with the given "
- "k-mer and avoiding high-degree nodes, finding (and returning) "
- "traversed k-mers and any encountered high-degree nodes.",
- },
- {
- "assemble_linear_path",
- (PyCFunction)hashgraph_assemble_linear_path, METH_VARARGS,
- "Assemble a purely linear path starting with the given "
- "k-mer, returning traversed k-mers and any encountered high-degree "
- "nodes.",
- },
-
- //
- // tagging / sparse graph functionality
- //
-
- {
- "consume_and_tag",
- (PyCFunction)hashgraph_consume_and_tag, METH_VARARGS,
- "Consume a sequence and tag it."
- },
- {
- "get_tags_and_positions",
- (PyCFunction)hashgraph_get_tags_and_positions, METH_VARARGS,
- "Retrieve tags and their positions in a sequence."
- },
- {
- "find_all_tags_list",
- (PyCFunction)hashgraph_find_all_tags_list, METH_VARARGS,
- "Find all tags within range of the given k-mer, return as list"
- },
- {
- "consume_seqfile_and_tag",
- (PyCFunction)hashgraph_consume_seqfile_and_tag, METH_VARARGS,
- "Consume all sequences in a FASTA/FASTQ file and tag the resulting "
- "graph."
- },
- {
- "extract_unique_paths",
- (PyCFunction)hashgraph_extract_unique_paths, METH_VARARGS,
- "@CTB remove."
- },
- {
- "print_tagset",
- (PyCFunction)hashgraph_print_tagset, METH_VARARGS,
- "Print out all of the tags."
- },
- {
- "add_tag",
- (PyCFunction)hashgraph_add_tag, METH_VARARGS,
- "Add a k-mer to the tagset."
- },
- {
- "get_tagset",
- (PyCFunction)hashgraph_get_tagset, METH_VARARGS,
- "Get all tagged k-mers as DNA strings."
- },
- {
- "load_tagset",
- (PyCFunction)hashgraph_load_tagset, METH_VARARGS,
- "Load tags from a file."
- },
- {
- "save_tagset",
- (PyCFunction)hashgraph_save_tagset, METH_VARARGS,
- "Save tags to a file."
- },
- {
- "n_tags",
- (PyCFunction)hashgraph_n_tags, METH_VARARGS,
- "Return the count of all tags."
- },
- {
- "divide_tags_into_subsets",
- (PyCFunction)hashgraph_divide_tags_into_subsets, METH_VARARGS,
- "Divide tags equally up into subsets of given size."
- },
- {
- "_get_tag_density",
- (PyCFunction)hashgraph__get_tag_density, METH_VARARGS,
- "Get the tagging density."
- },
- {
- "_set_tag_density",
- (PyCFunction)hashgraph__set_tag_density, METH_VARARGS,
- "Set the tagging density."
- },
-
- //
- // partitioning
- //
- {
- "do_subset_partition",
- (PyCFunction)hashgraph_do_subset_partition, METH_VARARGS,
- "Partition the graph starting from a given subset of tags."
- },
- {
- "find_all_tags",
- (PyCFunction)hashgraph_find_all_tags, METH_VARARGS,
- "Starting from the given k-mer, find all closely connected tags."
- },
- {
- "assign_partition_id",
- (PyCFunction)hashgraph_assign_partition_id, METH_VARARGS,
- "Assign a partition ID to a given tag."
- },
- {
- "output_partitions",
- (PyCFunction)hashgraph_output_partitions, METH_VARARGS,
- "Write out sequences in given filename to another file, annotating "
- "with partition IDs."
- },
- {
- "load_partitionmap",
- (PyCFunction)hashgraph_load_partitionmap, METH_VARARGS,
- "Load a partitionmap for a given subset."
- },
- {
- "save_partitionmap",
- (PyCFunction)hashgraph_save_partitionmap, METH_VARARGS,
- "Save a partitionmap for the given subset."
- },
- {
- "_validate_partitionmap",
- (PyCFunction)hashgraph__validate_partitionmap, METH_VARARGS,
- "Run internal validation checks."
- },
- {
- "consume_seqfile_and_tag_with_reads_parser",
- (PyCFunction)hashgraph_consume_seqfile_and_tag_with_reads_parser,
- METH_VARARGS,
- "Count all k-mers using the given reads parser"
- },
- {
- "consume_partitioned_fasta",
- (PyCFunction)hashgraph_consume_partitioned_fasta, METH_VARARGS,
- "Count all k-mers in a given file"
- },
- {
- "merge_subset",
- (PyCFunction)hashgraph_merge_subset, METH_VARARGS,
- "Merge the given subset into this one."
- },
- {
- "merge_subset_from_disk",
- (PyCFunction)hashgraph_merge_from_disk, METH_VARARGS,
- "Merge the given subset (filename) into this one."
- },
- {
- "count_partitions",
- (PyCFunction)hashgraph_count_partitions, METH_VARARGS,
- "Count the number of partitions in the master partitionmap."
- },
- {
- "subset_count_partitions",
- (PyCFunction)hashgraph_subset_count_partitions, METH_VARARGS,
- "Count the number of partitions in this subset partitionmap."
- },
- {
- "subset_partition_size_distribution",
- (PyCFunction)hashgraph_subset_partition_size_distribution,
- METH_VARARGS,
- "Get the size distribution of partitions in this subset."
- },
- {
- "save_subset_partitionmap",
- (PyCFunction)hashgraph_save_subset_partitionmap, METH_VARARGS,
- "Save the partition map for this subset."
- },
- {
- "load_subset_partitionmap",
- (PyCFunction)hashgraph_load_subset_partitionmap, METH_VARARGS,
- "Save the partition map for this subset."
- },
- {
- "_validate_subset_partitionmap",
- (PyCFunction)hashgraph__validate_subset_partitionmap, METH_VARARGS,
- "Run internal validation checks on this subset."
- },
- {
- "set_partition_id",
- (PyCFunction)hashgraph_set_partition_id, METH_VARARGS,
- "Set the partition ID for this tag."
- },
- {
- "join_partitions",
- (PyCFunction)hashgraph_join_partitions, METH_VARARGS,
- "Join the partitions of these two tags."
- },
- {
- "get_partition_id",
- (PyCFunction)hashgraph_get_partition_id, METH_VARARGS,
- "Get the partition ID of this tag."
- },
- {
- "repartition_largest_partition",
- (PyCFunction)hashgraph_repartition_largest_partition, METH_VARARGS,
- "Repartition the largest partition (in the face of stop tags)."
- },
-
- // stop tags
- {
- "load_stop_tags",
- (PyCFunction)hashgraph_load_stop_tags, METH_VARARGS,
- "Load the set of stop tags."
- },
- {
- "save_stop_tags",
- (PyCFunction)hashgraph_save_stop_tags, METH_VARARGS,
- "Save the set of stop tags."
- },
- {
- "print_stop_tags",
- (PyCFunction)hashgraph_print_stop_tags, METH_VARARGS,
- "Print out the set of stop tags."
- },
- {
- "trim_on_stoptags",
- (PyCFunction)hashgraph_trim_on_stoptags, METH_VARARGS,
- "Trim the reads on the given stop tags."
- },
- {
- "add_stop_tag",
- (PyCFunction)hashgraph_add_stop_tag, METH_VARARGS,
- "Add this k-mer as a stop tag."
- },
- {
- "get_stop_tags",
- (PyCFunction)hashgraph_get_stop_tags, METH_VARARGS,
- "Return a DNA list of all of the stop tags."
- },
- {NULL, NULL, 0, NULL} /* sentinel */
-};
+}
diff --git a/src/khmer/_cpy_hashset.cc b/src/khmer/_cpy_hashset.cc
new file mode 100644
index 0000000..a41eaa3
--- /dev/null
+++ b/src/khmer/_cpy_hashset.cc
@@ -0,0 +1,355 @@
+#include "khmer/_cpy_hashset.hh"
+#include "oxli/hashgraph.hh"
+
+using namespace oxli;
+
+namespace khmer {
+
+
+PyTypeObject _HashSet_iter_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
+ "_khmer.HashSet_iter", /* tp_name */
+ sizeof(_HashSet_iterobj), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)_HashSet_iter_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /* tp_flags */
+ "iterator object for HashSet objects.", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ _HashSet_iter, /* tp_iter */
+ _HashSet_iternext, /* tp_iternext */
+ 0, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ 0, /* tp_new */
+};
+
+PyTypeObject khmer_HashSet_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
+ "_khmer.HashSet", /* tp_name */
+ sizeof(khmer_HashSet_Object), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)khmer_HashSet_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ khmer_HashSet_seqmethods, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /* tp_flags */
+ "Stores a set of hashed k-mers.", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ khmer_HashSet_iter, /* tp_iter */
+ 0, /* tp_iternext */
+ khmer_HashSet_methods, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ khmer_HashSet_new, /* tp_new */
+};
+
+PyMethodDef khmer_HashSet_methods[] = {
+ {
+ "add",
+ (PyCFunction)hashset_add, METH_VARARGS,
+ "Add element to the HashSet."
+ },
+ {
+ "remove",
+ (PyCFunction)hashset_remove, METH_VARARGS,
+ "Remove an element from the HashSet."
+ },
+ {
+ "update",
+ (PyCFunction)hashset_update, METH_VARARGS,
+ "Add a list of elements to the HashSet."
+ },
+ {NULL, NULL, 0, NULL} /* sentinel */
+};
+
+PySequenceMethods khmer_HashSet_seqmethods[] = {
+ (lenfunc)khmer_HashSet_len, /* sq_length */
+ (binaryfunc)khmer_HashSet_concat, /* sq_concat */
+ 0, /* sq_repeat */
+ 0, /* sq_item */
+ 0, /* sq_slice */
+ 0, /* sq_ass_item */
+ 0, /* sq_ass_slice */
+ (objobjproc)khmer_HashSet_contains, /* sq_contains */
+ (binaryfunc)khmer_HashSet_concat_inplace, /* sq_inplace_concat */
+ 0 /* sq_inplace_repeat */
+};
+
+
+void khmer_HashSet_dealloc(khmer_HashSet_Object * obj)
+{
+ delete obj->hashes;
+ obj->hashes = NULL;
+ obj->ksize = 0;
+ Py_TYPE(obj)->tp_free((PyObject*)obj);
+}
+
+PyObject* khmer_HashSet_new(PyTypeObject * type, PyObject * args,
+ PyObject * kwds)
+{
+ khmer_HashSet_Object * self;
+
+ self = (khmer_HashSet_Object *)type->tp_alloc(type, 0);
+
+ if (self != NULL) {
+ PyObject * list_o = NULL;
+ WordLength k;
+ if (!PyArg_ParseTuple(args, "b|O!", &k, &PyList_Type, &list_o)) {
+ Py_DECREF(self);
+ return NULL;
+ }
+
+ try {
+ self->hashes = new SeenSet;
+ self->ksize = k;
+ } catch (std::bad_alloc &e) {
+ Py_DECREF(self);
+ return PyErr_NoMemory();
+ }
+
+ if (list_o) {
+ Py_ssize_t size = PyList_Size(list_o);
+ for (Py_ssize_t i = 0; i < size; i++) {
+ PyObject * item = PyList_GET_ITEM(list_o, i);
+ HashIntoType h;
+
+ if (!convert_PyObject_to_HashIntoType(item, h, self->ksize)) {
+ return NULL;
+ }
+ self->hashes->insert(h);
+ }
+ }
+ }
+ return (PyObject *) self;
+}
+
+
+void
+_HashSet_iter_dealloc(_HashSet_iterobj * obj)
+{
+ delete obj->it;
+ obj->it = NULL;
+ Py_DECREF(obj->parent);
+ Py_TYPE(obj)->tp_free((PyObject*)obj);
+}
+
+PyObject * _HashSet_iter(PyObject * self)
+{
+ Py_INCREF(self);
+ return self;
+}
+
+PyObject * _HashSet_iternext(PyObject * self)
+{
+ _HashSet_iterobj * iter_obj = (_HashSet_iterobj *) self;
+ SeenSet * hashes = iter_obj->parent->hashes;
+ if (*iter_obj->it != hashes->end()) {
+ PyObject * ret = nullptr;
+ convert_HashIntoType_to_PyObject((**iter_obj->it), &ret);
+ (*(iter_obj->it))++;
+ return ret;
+ }
+
+ PyErr_SetString(PyExc_StopIteration, "end of HashSet");
+ return NULL;
+}
+
+
+PyObject * khmer_HashSet_iter(PyObject * self)
+{
+ khmer_HashSet_Object * me = (khmer_HashSet_Object *) self;
+ _HashSet_iterobj * iter_obj = (_HashSet_iterobj *)
+ _HashSet_iter_Type.tp_alloc(&_HashSet_iter_Type, 0);
+ if (iter_obj != NULL) {
+ Py_INCREF(me);
+ iter_obj->parent = me;
+
+ iter_obj->it = new SeenSet::iterator;
+ *iter_obj->it = me->hashes->begin();
+ }
+ return (PyObject *) iter_obj;
+}
+
+int khmer_HashSet_len(khmer_HashSet_Object * o)
+{
+ return (Py_ssize_t) o->hashes->size();
+}
+
+PyObject * khmer_HashSet_concat(khmer_HashSet_Object * o,
+ khmer_HashSet_Object * o2)
+{
+ if (o->ksize != o2->ksize) {
+ PyErr_SetString(PyExc_ValueError,
+ "cannot add HashSets with different ksizes");
+ return NULL;
+ }
+ khmer_HashSet_Object * no = create_HashSet_Object(new SeenSet,
+ o->ksize);
+ no->hashes->insert(o->hashes->begin(), o->hashes->end());
+ no->hashes->insert(o2->hashes->begin(), o2->hashes->end());
+
+ return (PyObject *) no;
+}
+
+PyObject * khmer_HashSet_concat_inplace(khmer_HashSet_Object * o,
+ khmer_HashSet_Object * o2)
+{
+ if (o->ksize != o2->ksize) {
+ PyErr_SetString(PyExc_ValueError,
+ "cannot add HashSets with different ksizes");
+ return NULL;
+ }
+ o->hashes->insert(o2->hashes->begin(), o2->hashes->end());
+
+ Py_INCREF(o);
+ return (PyObject *) o;
+}
+
+int khmer_HashSet_contains(khmer_HashSet_Object * o, PyObject * val)
+{
+ HashIntoType v;
+
+ if (convert_PyObject_to_HashIntoType(val, v, 0)) {
+ if (set_contains(*o->hashes, v)) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+PyObject *
+hashset_add(khmer_HashSet_Object * me, PyObject * args)
+{
+ PyObject * hash_obj;
+ HashIntoType h;
+ if (!PyArg_ParseTuple(args, "O", &hash_obj)) {
+ return NULL;
+ }
+
+ if (!convert_PyObject_to_HashIntoType(hash_obj, h, 0)) {
+ return NULL;
+ }
+ me->hashes->insert(h);
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+PyObject *
+hashset_remove(khmer_HashSet_Object * me, PyObject * args)
+{
+ PyObject * hash_obj;
+ HashIntoType h;
+ if (!PyArg_ParseTuple(args, "O", &hash_obj)) {
+ return NULL;
+ }
+
+ if (!convert_PyObject_to_HashIntoType(hash_obj, h, 0)) {
+ return NULL;
+ }
+ SeenSet::iterator it = me->hashes->find(h);
+ if (it == me->hashes->end()) {
+ PyErr_SetString(PyExc_ValueError, "h not in list");
+ return NULL;
+ }
+ me->hashes->erase(it);
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+PyObject *
+hashset_update(khmer_HashSet_Object * me, PyObject * args)
+{
+ PyObject * obj;
+ if (!PyArg_ParseTuple(args, "O", &obj)) {
+ return NULL;
+ }
+
+ PyObject * iterator = PyObject_GetIter(obj);
+ if (iterator == NULL) {
+ return NULL;
+ }
+ PyObject * item = PyIter_Next(iterator);
+ while(item) {
+ HashIntoType h;
+
+ if (!convert_PyObject_to_HashIntoType(item, h, 0)) {
+ PyErr_SetString(PyExc_ValueError, "unknown item type for update");
+ Py_DECREF(item);
+ return NULL;
+ }
+ me->hashes->insert(h);
+
+ Py_DECREF(item);
+ item = PyIter_Next(iterator);
+ }
+ Py_DECREF(iterator);
+ if (PyErr_Occurred()) {
+ return NULL;
+ }
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+
+khmer_HashSet_Object * create_HashSet_Object(SeenSet * h, WordLength k)
+{
+ khmer_HashSet_Object * self;
+
+ self = (khmer_HashSet_Object *)
+ khmer_HashSet_Type.tp_alloc(&khmer_HashSet_Type, 0);
+ if (self != NULL) {
+ self->hashes = h;
+ self->ksize = k;
+ }
+ return self;
+}
+
+}
diff --git a/src/khmer/_cpy_hashtable.cc b/src/khmer/_cpy_hashtable.cc
new file mode 100644
index 0000000..053a20b
--- /dev/null
+++ b/src/khmer/_cpy_hashtable.cc
@@ -0,0 +1,1016 @@
+#include "khmer/_cpy_hashtable.hh"
+#include "khmer/_cpy_nodegraph.hh"
+#include "khmer/_cpy_countgraph.hh"
+#include "khmer/_cpy_hashset.hh"
+#include "khmer/_cpy_readparsers.hh"
+
+using namespace oxli;
+using namespace oxli::read_parsers;
+
+namespace khmer {
+
+PyTypeObject khmer_KHashtable_Type
+CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KHashtable_Object")
+= {
+ PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
+ "_khmer.KHashtable ", /*tp_name*/
+ sizeof(khmer_KHashtable_Object), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ 0, /*tp_dealloc*/
+ 0, /*tp_print*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ 0, /*tp_compare*/
+ 0, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
+ 0, /*tp_hash */
+ 0, /*tp_call*/
+ 0, /*tp_str*/
+ 0, /*tp_getattro*/
+ 0, /*tp_setattro*/
+ 0, /*tp_as_buffer*/
+ Py_TPFLAGS_DEFAULT, /*tp_flags*/
+ "base hashtable object", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ khmer_hashtable_methods, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ 0, /* tp_new */
+};
+
+
+PyMethodDef khmer_hashtable_methods[] = {
+ //
+ // Basic methods
+ //
+
+ {
+ "ksize",
+ (PyCFunction)hashtable_ksize, METH_VARARGS,
+ "Returns the k-mer size of this graph."
+ },
+ {
+ "hash",
+ (PyCFunction)hashtable_hash, METH_VARARGS,
+ "Returns the hash of this k-mer. For Nodetables and Counttables, this "
+ "function will fail if the supplied k-mer contains non-ACGT "
+ "characters."
+ },
+ {
+ "reverse_hash",
+ (PyCFunction)hashtable_reverse_hash, METH_VARARGS,
+ "Turns a k-mer hash back into a DNA k-mer, if possible."
+ },
+ {
+ "hashsizes",
+ (PyCFunction)hashtable_get_hashsizes, METH_VARARGS,
+ "" },
+ {
+ "n_unique_kmers",
+ (PyCFunction)hashtable_n_unique_kmers, METH_VARARGS,
+ "Count the number of unique kmers in this graph."
+ },
+ {
+ "n_occupied", (PyCFunction)hashtable_n_occupied, METH_VARARGS,
+ "Count the number of occupied bins."
+ },
+ {
+ "count",
+ (PyCFunction)hashtable_count, METH_VARARGS,
+ "Increment the count of this k-mer."
+ },
+ {
+ "add",
+ (PyCFunction)hashtable_count, METH_VARARGS,
+ "Increment the count of this k-mer. (Synonym for 'count'.)"
+ },
+ {
+ "consume",
+ (PyCFunction)hashtable_consume, METH_VARARGS,
+ "Increment the counts of all of the k-mers in the string."
+ },
+ {
+ "consume_seqfile",
+ (PyCFunction)hashtable_consume_seqfile, METH_VARARGS,
+ "Increment the counts of all the k-mers in the sequences in the "
+ "given file"
+ },
+ {
+ "consume_seqfile_banding",
+ (PyCFunction)hashtable_consume_seqfile_banding, METH_VARARGS,
+ "Consume sequences in k-mer banding mode"
+ },
+ {
+ "consume_seqfile_with_reads_parser",
+ (PyCFunction)hashtable_consume_seqfile_with_reads_parser, METH_VARARGS,
+ "Count all k-mers retrieved with this reads parser object."
+ },
+ {
+ "get",
+ (PyCFunction)hashtable_get, METH_VARARGS,
+ "Retrieve the count for the given k-mer. For Nodetables and "
+ "Counttables, this function will fail if the supplied k-mer contains "
+ "non-ACGT characters."
+ },
+ {
+ "load",
+ (PyCFunction)hashtable_load, METH_VARARGS,
+ "Load the graph from the specified file."
+ },
+ {
+ "save",
+ (PyCFunction)hashtable_save, METH_VARARGS,
+ "Save the graph to the specified file."
+ },
+ {
+ "get_kmers",
+ (PyCFunction)hashtable_get_kmers, METH_VARARGS,
+ "Generate an ordered list of all substrings of length k in the string."
+ },
+ {
+ "get_kmer_hashes",
+ (PyCFunction)hashtable_get_kmer_hashes, METH_VARARGS,
+ "Retrieve an ordered list of all hashes of all k-mers in the string."
+ },
+ {
+ "get_kmer_hashes_as_hashset",
+ (PyCFunction)hashtable_get_kmer_hashes_as_hashset, METH_VARARGS,
+ "Retrieve a HashSet containing all the k-mers in the string."
+ },
+ {
+ "get_kmer_counts",
+ (PyCFunction)hashtable_get_kmer_counts, METH_VARARGS,
+ "Retrieve an ordered list of the counts of all k-mers in the string."
+ },
+
+ {
+ "set_use_bigcount",
+ (PyCFunction)hashtable_set_use_bigcount, METH_VARARGS,
+ "Count past maximum binsize of hashtable (set to T/F)"
+ },
+ {
+ "get_use_bigcount",
+ (PyCFunction)hashtable_get_use_bigcount, METH_VARARGS,
+ "Get value of bigcount flag (T/F)"
+ },
+ {
+ "get_min_count",
+ (PyCFunction)hashtable_get_min_count, METH_VARARGS,
+ "Get the smallest count of all the k-mers in the string"
+ },
+ {
+ "get_max_count",
+ (PyCFunction)hashtable_get_max_count, METH_VARARGS,
+ "Get the largest count of all the k-mers in the string"
+ },
+ {
+ "trim_on_abundance",
+ (PyCFunction)hashtable_trim_on_abundance, METH_VARARGS,
+ "Trim string at first k-mer below the given abundance"
+ },
+ {
+ "trim_below_abundance",
+ (PyCFunction)hashtable_trim_below_abundance, METH_VARARGS,
+ "Trim string at first k-mer above the given abundance"
+ },
+ {
+ "find_spectral_error_positions",
+ (PyCFunction)hashtable_find_spectral_error_positions, METH_VARARGS,
+ "Identify positions of low-abundance k-mers"
+ },
+ {
+ "abundance_distribution",
+ (PyCFunction)hashtable_abundance_distribution, METH_VARARGS,
+ "Calculate the k-mer abundance distribution of the given file"
+ },
+ {
+ "abundance_distribution_with_reads_parser",
+ (PyCFunction)hashtable_abundance_distribution_with_reads_parser,
+ METH_VARARGS,
+ "Calculate the k-mer abundance distribution for a reads parser handle"
+ },
+ {
+ "get_median_count",
+ (PyCFunction)hashtable_get_median_count, METH_VARARGS,
+ "Get the median, average, and stddev of the k-mer counts in the string"
+ },
+ {
+ "median_at_least",
+ (PyCFunction)hashtable_median_at_least, METH_VARARGS,
+ "Return true if the median is at least the given cutoff"
+ },
+ {NULL, NULL, 0, NULL} /* sentinel */
+};
+
+
+
+PyObject *
+hashtable_ksize(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ if (!PyArg_ParseTuple(args, "")) {
+ return NULL;
+ }
+
+ unsigned int k = hashtable->ksize();
+
+ return PyLong_FromLong(k);
+}
+
+
+PyObject *
+hashtable_hash(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ char * kmer;
+ if (!PyArg_ParseTuple(args, "s", &kmer)) {
+ return NULL;
+ }
+
+ if (strlen(kmer) != hashtable->ksize()) {
+ PyErr_SetString(PyExc_ValueError,
+ "provided k-mer is wrong length");
+ return NULL;
+ }
+
+ try {
+ PyObject * hash = nullptr;
+ const HashIntoType h(hashtable->hash_dna(kmer));
+ convert_HashIntoType_to_PyObject(h, &hash);
+ return hash;
+ } catch (oxli_exception &e) {
+ PyErr_SetString(PyExc_ValueError, e.what());
+ return NULL;
+ }
+}
+
+
+PyObject *
+hashtable_reverse_hash(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ PyObject * val_o;
+ HashIntoType val;
+ if (!PyArg_ParseTuple(args, "O", &val_o)) {
+ return NULL;
+ }
+
+ if (!ht_convert_PyObject_to_HashIntoType(val_o, val, hashtable)) {
+ return NULL;
+ }
+
+ try {
+ return PyUnicode_FromString(hashtable->unhash_dna(val).c_str());
+ } catch (oxli_exception &e) {
+ PyErr_SetString(PyExc_ValueError, e.what());
+ return NULL;
+ }
+}
+
+
+PyObject *
+hashtable_n_occupied(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ if (!PyArg_ParseTuple(args, "")) {
+ return NULL;
+ }
+
+ uint64_t n = hashtable->n_occupied();
+
+ return PyLong_FromUnsignedLongLong(n);
+}
+
+
+PyObject *
+hashtable_n_unique_kmers(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ uint64_t n = hashtable->n_unique_kmers();
+
+ return PyLong_FromUnsignedLongLong(n);
+}
+
+
+PyObject *
+hashtable_count(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ PyObject * v;
+ if (!PyArg_ParseTuple(args, "O", &v)) {
+ return NULL;
+ }
+
+ HashIntoType hashval;
+
+ if (!ht_convert_PyObject_to_HashIntoType(v, hashval, hashtable)) {
+ return NULL;
+ }
+
+ hashtable->count(hashval);
+
+ return PyLong_FromLong(1);
+}
+
+PyObject *
+hashtable_consume_seqfile(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ const char * filename;
+
+ if (!PyArg_ParseTuple(args, "s", &filename)) {
+ return NULL;
+ }
+
+ // call the C++ function, and trap signals => Python
+ unsigned long long n_consumed = 0;
+ unsigned int total_reads = 0;
+ try {
+ hashtable->consume_seqfile<FastxReader>(filename, total_reads, n_consumed);
+ } catch (oxli_file_exception &exc) {
+ PyErr_SetString(PyExc_OSError, exc.what());
+ return NULL;
+ } catch (oxli_value_exception &exc) {
+ PyErr_SetString(PyExc_ValueError, exc.what());
+ return NULL;
+ }
+
+ return Py_BuildValue("IK", total_reads, n_consumed);
+}
+
+PyObject *
+hashtable_consume_seqfile_banding(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ const char * filename;
+ unsigned int num_bands;
+ unsigned int band;
+
+ if (!PyArg_ParseTuple(args, "sII", &filename, &num_bands, &band)) {
+ return NULL;
+ }
+
+ // call the C++ function, and trap signals => Python
+ unsigned long long n_consumed = 0;
+ unsigned int total_reads = 0;
+ try {
+ hashtable->consume_seqfile_banding<FastxReader>(filename, num_bands, band, total_reads, n_consumed);
+ } catch (oxli_file_exception &exc) {
+ PyErr_SetString(PyExc_OSError, exc.what());
+ return NULL;
+ } catch (oxli_value_exception &exc) {
+ PyErr_SetString(PyExc_ValueError, exc.what());
+ return NULL;
+ }
+
+ return Py_BuildValue("IK", total_reads, n_consumed);
+}
+
+PyObject *
+hashtable_consume_seqfile_with_reads_parser(khmer_KHashtable_Object * me,
+ PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ PyObject * rparser_obj = NULL;
+
+ if (!PyArg_ParseTuple(args, "O", &rparser_obj)) {
+ return NULL;
+ }
+
+ FastxParserPtr& rparser = _PyObject_to_khmer_ReadParser( rparser_obj );
+
+ // call the C++ function, and trap signals => Python
+ unsigned long long n_consumed = 0;
+ unsigned int total_reads = 0;
+ const char *value_exception = NULL;
+ const char *file_exception = NULL;
+ std::string exc_string;
+
+ Py_BEGIN_ALLOW_THREADS
+ try {
+ hashtable->consume_seqfile<FastxReader>(rparser, total_reads, n_consumed);
+ } catch (oxli_file_exception &exc) {
+ exc_string = exc.what();
+ file_exception = exc_string.c_str();
+ } catch (oxli_value_exception &exc) {
+ exc_string = exc.what();
+ value_exception = exc_string.c_str();
+ }
+ Py_END_ALLOW_THREADS
+
+ if (file_exception != NULL) {
+ PyErr_SetString(PyExc_OSError, file_exception);
+ return NULL;
+ }
+ if (value_exception != NULL) {
+ PyErr_SetString(PyExc_ValueError, value_exception);
+ return NULL;
+ }
+
+ return Py_BuildValue("IK", total_reads, n_consumed);
+}
+
+
+
+PyObject *
+hashtable_consume(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ const char * long_str;
+
+ if (!PyArg_ParseTuple(args, "s", &long_str)) {
+ return NULL;
+ }
+
+ if (strlen(long_str) < hashtable->ksize()) {
+ PyErr_SetString(PyExc_ValueError,
+ "string length must >= the hashtable k-mer size");
+ return NULL;
+ }
+
+ unsigned int n_consumed;
+ n_consumed = hashtable->consume_string(long_str);
+
+ return PyLong_FromLong(n_consumed);
+}
+
+
+PyObject *
+hashtable_get(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ PyObject * arg;
+
+ if (!PyArg_ParseTuple(args, "O", &arg)) {
+ return NULL;
+ }
+
+ HashIntoType hashval;
+
+ if (!ht_convert_PyObject_to_HashIntoType(arg, hashval, hashtable)) {
+ return NULL;
+ }
+
+ unsigned int count = hashtable->get_count(hashval);
+ return PyLong_FromLong(count);
+}
+
+
+PyObject *
+hashtable_set_use_bigcount(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ PyObject * x;
+ if (!PyArg_ParseTuple(args, "O", &x)) {
+ return NULL;
+ }
+ int setme = PyObject_IsTrue(x);
+ if (setme < 0) {
+ return NULL;
+ }
+ try {
+ hashtable->set_use_bigcount((bool)setme);
+ } catch (oxli_exception &e) {
+ PyErr_SetString(PyExc_ValueError, e.what());
+ return NULL;
+ }
+
+ Py_RETURN_NONE;
+}
+
+
+PyObject *
+hashtable_get_use_bigcount(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ if (!PyArg_ParseTuple(args, "")) {
+ return NULL;
+ }
+
+ bool val = hashtable->get_use_bigcount();
+
+ return PyBool_FromLong((int)val);
+}
+
+
+PyObject *
+hashtable_get_min_count(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ const char * long_str;
+
+ if (!PyArg_ParseTuple(args, "s", &long_str)) {
+ return NULL;
+ }
+
+ if (strlen(long_str) < hashtable->ksize()) {
+ PyErr_SetString(PyExc_ValueError,
+ "string length must >= the hashtable k-mer size");
+ return NULL;
+ }
+
+ BoundedCounterType c = hashtable->get_min_count(long_str);
+ unsigned int N = c;
+
+ return PyLong_FromLong(N);
+}
+
+
+PyObject *
+hashtable_get_max_count(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ const char * long_str;
+
+ if (!PyArg_ParseTuple(args, "s", &long_str)) {
+ return NULL;
+ }
+
+ if (strlen(long_str) < hashtable->ksize()) {
+ PyErr_SetString(PyExc_ValueError,
+ "string length must >= the hashtable k-mer size");
+ return NULL;
+ }
+
+ BoundedCounterType c = hashtable->get_max_count(long_str);
+ unsigned int N = c;
+
+ return PyLong_FromLong(N);
+}
+
+
+PyObject *
+hashtable_abundance_distribution_with_reads_parser(khmer_KHashtable_Object * me,
+ PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ khmer :: khmer_ReadParser_Object * rparser_obj = NULL;
+ khmer_KHashtable_Object * tracking_obj = NULL;
+
+ if (!PyArg_ParseTuple(args, "O!O!", &khmer_ReadParser_Type,
+ &rparser_obj, &khmer_KHashtable_Type, &tracking_obj)) {
+ return NULL;
+ }
+
+ FastxParserPtr& rparser = rparser_obj->parser;
+ Hashtable *tracking = tracking_obj->hashtable;
+ uint64_t *dist = NULL;
+ const char *value_exception = NULL;
+ const char *file_exception = NULL;
+ std::string exc_string;
+
+ Py_BEGIN_ALLOW_THREADS
+ try {
+ dist = hashtable->abundance_distribution<FastxReader>(rparser, tracking);
+ } catch (oxli_file_exception &exc) {
+ exc_string = exc.what();
+ file_exception = exc_string.c_str();
+ } catch (oxli_value_exception &exc) {
+ exc_string = exc.what();
+ value_exception = exc_string.c_str();
+ }
+ Py_END_ALLOW_THREADS
+
+ if (file_exception != NULL) {
+ PyErr_SetString(PyExc_OSError, file_exception);
+ return NULL;
+ }
+ if (value_exception != NULL) {
+ PyErr_SetString(PyExc_ValueError, value_exception);
+ return NULL;
+ }
+
+ PyObject * x = PyList_New(MAX_BIGCOUNT + 1);
+ if (x == NULL) {
+ delete[] dist;
+ return NULL;
+ }
+ for (int i = 0; i < MAX_BIGCOUNT + 1; i++) {
+ PyList_SET_ITEM(x, i, PyLong_FromUnsignedLongLong(dist[i]));
+ }
+
+ delete[] dist;
+ return x;
+}
+
+
+PyObject *
+hashtable_trim_on_abundance(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ const char * seq = NULL;
+ unsigned int min_count_i = 0;
+
+ if (!PyArg_ParseTuple(args, "sI", &seq, &min_count_i)) {
+ return NULL;
+ }
+
+ unsigned long trim_at;
+ Py_BEGIN_ALLOW_THREADS
+
+ BoundedCounterType min_count = min_count_i;
+
+ trim_at = hashtable->trim_on_abundance(seq, min_count);
+
+ Py_END_ALLOW_THREADS;
+
+ PyObject * trim_seq = PyUnicode_FromStringAndSize(seq, trim_at);
+ if (trim_seq == NULL) {
+ return NULL;
+ }
+ PyObject * ret = Py_BuildValue("Ok", trim_seq, trim_at);
+ Py_DECREF(trim_seq);
+
+ return ret;
+}
+
+
+PyObject *
+hashtable_trim_below_abundance(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ const char * seq = NULL;
+ BoundedCounterType max_count_i = 0;
+
+ if (!PyArg_ParseTuple(args, "sH", &seq, &max_count_i)) {
+ return NULL;
+ }
+
+ unsigned long trim_at;
+ Py_BEGIN_ALLOW_THREADS
+
+ BoundedCounterType max_count = max_count_i;
+
+ trim_at = hashtable->trim_below_abundance(seq, max_count);
+
+ Py_END_ALLOW_THREADS;
+
+ PyObject * trim_seq = PyUnicode_FromStringAndSize(seq, trim_at);
+ if (trim_seq == NULL) {
+ return NULL;
+ }
+ PyObject * ret = Py_BuildValue("Ok", trim_seq, trim_at);
+ Py_DECREF(trim_seq);
+
+ return ret;
+}
+
+
+PyObject *
+hashtable_find_spectral_error_positions(khmer_KHashtable_Object * me,
+ PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ const char * seq = NULL;
+ BoundedCounterType max_count = 0; // unsigned short int
+
+ if (!PyArg_ParseTuple(args, "sH", &seq, &max_count)) {
+ return NULL;
+ }
+
+ std::vector<unsigned int> posns;
+
+ try {
+ posns = hashtable->find_spectral_error_positions(seq, max_count);
+ } catch (oxli_exception &e) {
+ PyErr_SetString(PyExc_ValueError, e.what());
+ return NULL;
+ }
+
+ Py_ssize_t posns_size = posns.size();
+
+ PyObject * x = PyList_New(posns_size);
+ if (x == NULL) {
+ return NULL;
+ }
+ for (Py_ssize_t i = 0; i < posns_size; i++) {
+ PyList_SET_ITEM(x, i, PyLong_FromLong(posns[i]));
+ }
+
+ return x;
+}
+
+
+PyObject *
+hashtable_abundance_distribution(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ const char * filename = NULL;
+ khmer_KHashtable_Object * tracking_obj = NULL;
+ if (!PyArg_ParseTuple(args, "sO!", &filename, &khmer_KHashtable_Type,
+ &tracking_obj)) {
+ return NULL;
+ }
+
+ Hashtable *tracking = tracking_obj->hashtable;
+ uint64_t *dist = NULL;
+ const char *value_exception = NULL;
+ const char *file_exception = NULL;
+ std::string exc_string;
+
+ Py_BEGIN_ALLOW_THREADS
+ try {
+ dist = hashtable->abundance_distribution<FastxReader>(filename, tracking);
+ } catch (oxli_file_exception &exc) {
+ exc_string = exc.what();
+ file_exception = exc_string.c_str();
+ } catch (oxli_value_exception &exc) {
+ exc_string = exc.what();
+ value_exception = exc_string.c_str();
+ }
+ Py_END_ALLOW_THREADS
+
+ if (file_exception != NULL) {
+ PyErr_SetString(PyExc_OSError, file_exception);
+ if (dist != NULL) {
+ delete []dist;
+ }
+ return NULL;
+ }
+ if (value_exception != NULL) {
+ PyErr_SetString(PyExc_ValueError, value_exception);
+ if (dist != NULL) {
+ delete []dist;
+ }
+ return NULL;
+ }
+
+ PyObject * x = PyList_New(MAX_BIGCOUNT + 1);
+ if (x == NULL) {
+ if (dist != NULL) {
+ delete []dist;
+ }
+ return NULL;
+ }
+ for (int i = 0; i < MAX_BIGCOUNT + 1; i++) {
+ PyList_SET_ITEM(x, i, PyLong_FromUnsignedLongLong(dist[i]));
+ }
+
+ if (dist != NULL) {
+ delete []dist;
+ }
+
+ return x;
+}
+
+
+PyObject *
+hashtable_load(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ const char * filename = NULL;
+
+ if (!PyArg_ParseTuple(args, "s", &filename)) {
+ return NULL;
+ }
+
+ try {
+ hashtable->load(filename);
+ } catch (oxli_file_exception &e) {
+ PyErr_SetString(PyExc_OSError, e.what());
+ return NULL;
+ }
+
+ Py_RETURN_NONE;
+}
+
+
+PyObject *
+hashtable_save(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ const char * filename = NULL;
+
+ if (!PyArg_ParseTuple(args, "s", &filename)) {
+ return NULL;
+ }
+
+ try {
+ hashtable->save(filename);
+ } catch (oxli_file_exception &e) {
+ PyErr_SetString(PyExc_OSError, e.what());
+ return NULL;
+ }
+
+ Py_RETURN_NONE;
+}
+
+
+PyObject *
+hashtable_get_hashsizes(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+
+ if (!PyArg_ParseTuple(args, "")) {
+ return NULL;
+ }
+
+ std::vector<uint64_t> ts = hashtable->get_tablesizes();
+
+ PyObject * x = PyList_New(ts.size());
+ for (size_t i = 0; i < ts.size(); i++) {
+ PyList_SET_ITEM(x, i, PyLong_FromUnsignedLongLong(ts[i]));
+ }
+
+ return x;
+}
+
+
+PyObject *
+hashtable_get_median_count(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ const char * long_str;
+
+ if (!PyArg_ParseTuple(args, "s", &long_str)) {
+ return NULL;
+ }
+
+ if (strlen(long_str) < hashtable->ksize()) {
+ PyErr_SetString(PyExc_ValueError,
+ "string length must >= the hashtable k-mer size");
+ return NULL;
+ }
+
+ BoundedCounterType med = 0;
+ float average = 0, stddev = 0;
+
+ hashtable->get_median_count(long_str, med, average, stddev);
+
+ return Py_BuildValue("iff", med, average, stddev);
+}
+
+
+PyObject *
+hashtable_median_at_least(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+
+ const char * long_str;
+ unsigned int cutoff;
+
+ if (!PyArg_ParseTuple(args, "sI", &long_str, &cutoff)) {
+ return NULL;
+ }
+
+ if (strlen(long_str) < hashtable->ksize()) {
+ PyErr_SetString(PyExc_ValueError,
+ "string length must >= the hashtable k-mer size");
+ return NULL;
+ }
+
+ if (hashtable->median_at_least(long_str, cutoff)) {
+ Py_RETURN_TRUE;
+ }
+ Py_RETURN_FALSE;
+
+}
+
+
+PyObject *
+hashtable_get_kmers(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+ const char * sequence;
+
+ if (!PyArg_ParseTuple(args, "s", &sequence)) {
+ return NULL;
+ }
+
+ std::vector<std::string> kmers;
+
+ hashtable->get_kmers(sequence, kmers);
+
+ PyObject * x = PyList_New(kmers.size());
+ for (unsigned int i = 0; i < kmers.size(); i++) {
+ PyObject * obj = PyUnicode_FromString(kmers[i].c_str());
+ PyList_SET_ITEM(x, i, obj);
+ }
+
+ return x;
+}
+
+
+PyObject *
+hashtable_get_kmer_counts(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+ const char * sequence;
+
+ if (!PyArg_ParseTuple(args, "s", &sequence)) {
+ return NULL;
+ }
+
+ std::vector<BoundedCounterType> counts;
+ try {
+ hashtable->get_kmer_counts(sequence, counts);
+ } catch (oxli_exception &e) {
+ PyErr_SetString(PyExc_ValueError, e.what());
+ return NULL;
+ }
+
+ PyObject * x = PyList_New(counts.size());
+ for (unsigned int i = 0; i <counts.size(); i++) {
+ PyObject * obj = PyInt_FromLong(counts[i]);
+ PyList_SET_ITEM(x, i, obj);
+ }
+
+ return x;
+}
+
+
+
+PyObject *
+hashtable_get_kmer_hashes(khmer_KHashtable_Object * me, PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+ const char * sequence;
+
+ if (!PyArg_ParseTuple(args, "s", &sequence)) {
+ return NULL;
+ }
+
+ std::vector<HashIntoType> hashes;
+ try {
+ hashtable->get_kmer_hashes(sequence, hashes);
+ } catch (oxli_exception &e) {
+ PyErr_SetString(PyExc_ValueError, e.what());
+ return NULL;
+ }
+
+ PyObject * x = PyList_New(hashes.size());
+ for (unsigned int i = 0; i < hashes.size(); i++) {
+ PyObject * obj = nullptr;
+ convert_HashIntoType_to_PyObject(hashes[i], &obj);
+ PyList_SET_ITEM(x, i, obj);
+ }
+
+ return x;
+}
+
+
+
+PyObject *
+hashtable_get_kmer_hashes_as_hashset(khmer_KHashtable_Object * me,
+ PyObject * args)
+{
+ Hashtable * hashtable = me->hashtable;
+ const char * sequence;
+
+ if (!PyArg_ParseTuple(args, "s", &sequence)) {
+ return NULL;
+ }
+
+ SeenSet * hashes = new SeenSet;
+ try {
+ hashtable->get_kmer_hashes_as_hashset(sequence, *hashes);
+ } catch (oxli_exception &e) {
+ PyErr_SetString(PyExc_ValueError, e.what());
+ return NULL;
+ }
+
+ PyObject * x = (PyObject *) create_HashSet_Object(hashes,
+ hashtable->ksize());
+
+ return x;
+}
+
+}
diff --git a/src/khmer/_cpy_hllcounter.cc b/src/khmer/_cpy_hllcounter.cc
new file mode 100644
index 0000000..de793c5
--- /dev/null
+++ b/src/khmer/_cpy_hllcounter.cc
@@ -0,0 +1,364 @@
+#include "khmer/_cpy_hllcounter.hh"
+
+using namespace oxli;
+using namespace oxli::read_parsers;
+
+namespace khmer {
+
+
+PyTypeObject khmer_KHLLCounter_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "_khmer.KHLLCounter", /* tp_name */
+ sizeof(khmer_KHLLCounter_Object), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)khmer_hllcounter_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ "HyperLogLog counter", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ khmer_hllcounter_methods, /* tp_methods */
+ 0, /* tp_members */
+ khmer_hllcounter_getseters, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ khmer_hllcounter_new, /* tp_new */
+};
+
+
+PyMethodDef khmer_hllcounter_methods[] = {
+ {
+ "add", (PyCFunction)hllcounter_add,
+ METH_VARARGS,
+ "Add a k-mer to the counter."
+ },
+ {
+ "estimate_cardinality", (PyCFunction)hllcounter_estimate_cardinality,
+ METH_VARARGS,
+ "Return the current estimation."
+ },
+ {
+ "consume_string", (PyCFunction)hllcounter_consume_string,
+ METH_VARARGS,
+ "Break a sequence into k-mers and add each k-mer to the counter."
+ },
+ {
+ "consume_seqfile", (PyCFunction)hllcounter_consume_seqfile,
+ METH_VARARGS | METH_KEYWORDS,
+ "Read sequences from file, break into k-mers, "
+ "and add each k-mer to the counter. If optional keyword 'stream_out' "
+ "is True, also prints each sequence to stdout."
+ },
+ {
+ "merge", (PyCFunction)hllcounter_merge,
+ METH_VARARGS,
+ "Merge other counter into this one."
+ },
+ {NULL} /* Sentinel */
+};
+
+PyGetSetDef khmer_hllcounter_getseters[] = {
+ {
+ (char *)"alpha",
+ (getter)hllcounter_getalpha, NULL,
+ (char *)"alpha constant for this HLL counter.",
+ NULL
+ },
+ {
+ (char *)"error_rate",
+ (getter)hllcounter_get_erate, (setter)hllcounter_set_erate,
+ (char *)"Error rate for this HLL counter. "
+ "Can be changed prior to first counting, but becomes read-only after "
+ "that (raising AttributeError)",
+ NULL
+ },
+ {
+ (char *)"ksize",
+ (getter)hllcounter_get_ksize, (setter)hllcounter_set_ksize,
+ (char *)"k-mer size for this HLL counter."
+ "Can be changed prior to first counting, but becomes read-only after "
+ "that (raising AttributeError)",
+ NULL
+ },
+ {
+ (char *)"counters",
+ (getter)hllcounter_getcounters, NULL,
+ (char *)"Read-only internal counters.",
+ NULL
+ },
+ {NULL} /* Sentinel */
+};
+
+
+PyObject* khmer_hllcounter_new(PyTypeObject * type, PyObject * args,
+ PyObject * kwds)
+{
+ khmer_KHLLCounter_Object * self;
+ self = (khmer_KHLLCounter_Object *)type->tp_alloc(type, 0);
+
+ if (self != NULL) {
+ double error_rate = 0.01;
+ WordLength ksize = 20;
+
+ if (!PyArg_ParseTuple(args, "|db", &error_rate, &ksize)) {
+ Py_DECREF(self);
+ return NULL;
+ }
+
+ try {
+ self->hllcounter = new HLLCounter(error_rate, ksize);
+ } catch (InvalidValue &e) {
+ Py_DECREF(self);
+ PyErr_SetString(PyExc_ValueError, e.what());
+ return NULL;
+ }
+ }
+
+ return (PyObject *) self;
+}
+
+
+void khmer_hllcounter_dealloc(khmer_KHLLCounter_Object * obj)
+{
+ delete obj->hllcounter;
+ obj->hllcounter = NULL;
+
+ Py_TYPE(obj)->tp_free((PyObject*)obj);
+}
+
+
+PyObject *
+hllcounter_add(khmer_KHLLCounter_Object * me, PyObject * args)
+{
+ const char * kmer_str;
+
+ if (!PyArg_ParseTuple(args, "s", &kmer_str)) {
+ return NULL;
+ }
+
+ try {
+ me->hllcounter->add(kmer_str);
+ } catch (oxli_exception &e) {
+ PyErr_SetString(PyExc_ValueError, e.what());
+ return NULL;
+ }
+
+ Py_RETURN_NONE;
+}
+
+
+PyObject *
+hllcounter_estimate_cardinality(khmer_KHLLCounter_Object * me, PyObject * args)
+{
+ if (!PyArg_ParseTuple( args, "" )) {
+ return NULL;
+ }
+
+ return PyLong_FromLong(me->hllcounter->estimate_cardinality());
+}
+
+
+PyObject *
+hllcounter_consume_string(khmer_KHLLCounter_Object * me, PyObject * args)
+{
+ const char * kmer_str;
+ unsigned long long n_consumed;
+
+ if (!PyArg_ParseTuple(args, "s", &kmer_str)) {
+ return NULL;
+ }
+
+ try {
+ n_consumed = me->hllcounter->consume_string(kmer_str);
+ } catch (oxli_exception &e) {
+ PyErr_SetString(PyExc_ValueError, e.what());
+ return NULL;
+ }
+
+ return PyLong_FromLong(n_consumed);
+}
+
+PyObject * hllcounter_consume_seqfile(khmer_KHLLCounter_Object * me,
+ PyObject * args, PyObject * kwds)
+{
+ const char * filename;
+ PyObject * stream_records_o = NULL;
+
+ static const char* const_kwlist[] = {"filename", "stream_records", NULL};
+ static char** kwlist = const_cast<char**>(const_kwlist);
+
+ bool stream_records = false;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|O", kwlist,
+ &filename, &stream_records_o)) {
+ return NULL;
+ }
+
+ if (stream_records_o != NULL && PyObject_IsTrue(stream_records_o)) {
+ stream_records = true;
+ }
+
+ // call the C++ function, and trap signals => Python
+ unsigned long long n_consumed = 0;
+ unsigned int total_reads = 0;
+ try {
+ me->hllcounter->consume_seqfile<FastxReader>(filename, stream_records,
+ total_reads,
+ n_consumed);
+ } catch (oxli_file_exception &exc) {
+ PyErr_SetString(PyExc_OSError, exc.what());
+ return NULL;
+ } catch (oxli_value_exception &exc) {
+ PyErr_SetString(PyExc_ValueError, exc.what());
+ return NULL;
+ }
+
+ return Py_BuildValue("IK", total_reads, n_consumed);
+}
+
+ PyObject * hllcounter_merge(khmer_KHLLCounter_Object * me,
+ PyObject * args);
+
+
+PyObject *
+hllcounter_get_erate(khmer_KHLLCounter_Object * me)
+{
+ return PyFloat_FromDouble(me->hllcounter->get_erate());
+}
+
+
+PyObject *
+hllcounter_get_ksize(khmer_KHLLCounter_Object * me)
+{
+ return PyLong_FromLong(me->hllcounter->get_ksize());
+}
+
+
+int hllcounter_set_ksize(khmer_KHLLCounter_Object * me, PyObject *value,
+ void *closure)
+{
+ if (value == NULL) {
+ PyErr_SetString(PyExc_TypeError, "Cannot delete attribute");
+ return -1;
+ }
+
+ long ksize = 0;
+ if (PyLong_Check(value)) {
+ ksize = PyLong_AsLong(value);
+ } else if (PyInt_Check(value)) {
+ ksize = PyInt_AsLong(value);
+ } else {
+ PyErr_SetString(PyExc_TypeError,
+ "Please use an integer value for k-mer size");
+ return -1;
+ }
+
+ if (ksize <= 0) {
+ PyErr_SetString(PyExc_ValueError, "Please set k-mer size to a value "
+ "greater than zero");
+ return -1;
+ }
+
+ try {
+ me->hllcounter->set_ksize(ksize);
+ } catch (ReadOnlyAttribute &e) {
+ PyErr_SetString(PyExc_AttributeError, e.what());
+ return -1;
+ }
+
+ return 0;
+}
+
+
+int hllcounter_set_erate(khmer_KHLLCounter_Object * me, PyObject *value,
+ void *closure)
+{
+ if (value == NULL) {
+ PyErr_SetString(PyExc_TypeError, "Cannot delete attribute");
+ return -1;
+ }
+
+ if (!PyFloat_Check(value)) {
+ PyErr_SetString(PyExc_TypeError,
+ "Please use a float value for k-mer size");
+ return -1;
+ }
+
+ double erate = PyFloat_AsDouble(value);
+ try {
+ me->hllcounter->set_erate(erate);
+ } catch (InvalidValue &e) {
+ PyErr_SetString(PyExc_ValueError, e.what());
+ return -1;
+ } catch (ReadOnlyAttribute &e) {
+ PyErr_SetString(PyExc_AttributeError, e.what());
+ return -1;
+ }
+
+ return 0;
+}
+
+
+PyObject *
+hllcounter_getalpha(khmer_KHLLCounter_Object * me)
+{
+ return PyFloat_FromDouble(me->hllcounter->get_alpha());
+}
+
+
+PyObject *
+hllcounter_getcounters(khmer_KHLLCounter_Object * me)
+{
+ std::vector<int> counters = me->hllcounter->get_M();
+
+ PyObject * x = PyList_New(counters.size());
+ for (size_t i = 0; i < counters.size(); i++) {
+ PyList_SET_ITEM(x, i, PyLong_FromLong(counters[i]));
+ }
+
+ return x;
+}
+
+
+PyObject * hllcounter_merge(khmer_KHLLCounter_Object * me,
+ PyObject * args)
+{
+ khmer_KHLLCounter_Object * other;
+
+ if (!PyArg_ParseTuple(args, "O!", &khmer_KHLLCounter_Type, &other)) {
+ return NULL;
+ }
+
+ try {
+ me->hllcounter->merge(*(other->hllcounter));
+ } catch (oxli_exception &e) {
+ PyErr_SetString(PyExc_ValueError, e.what());
+ return NULL;
+ }
+
+ Py_RETURN_NONE;
+}
+
+}
diff --git a/src/khmer/_cpy_khmer.cc b/src/khmer/_cpy_khmer.cc
new file mode 100644
index 0000000..c573a3f
--- /dev/null
+++ b/src/khmer/_cpy_khmer.cc
@@ -0,0 +1,441 @@
+/*
+This file is part of khmer, https://github.com/dib-lab/khmer/, and is
+Copyright (C) 2010-2015, Michigan State University.
+Copyright (C) 2015-2016, The Regents of the University of California.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+ * Neither the name of the Michigan State University nor the names
+ of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+LICENSE (END)
+
+Contact: khmer-project at idyll.org
+*/
+
+//
+// A module for Python that exports khmer C++ library functions.
+//
+
+// Must be first.
+#include <Python.h>
+#include <string>
+
+#include "khmer/_cpy_khmer.hh"
+#include "khmer/_cpy_utils.hh"
+
+using namespace oxli;
+
+
+//
+// Function necessary for Python loading:
+//
+
+extern "C" {
+ MOD_INIT(_khmer);
+}
+
+namespace khmer {
+
+PyObject * forward_hash(PyObject * self, PyObject * args)
+{
+ const char * kmer;
+ WordLength ksize;
+
+ if (!PyArg_ParseTuple(args, "sb", &kmer, &ksize)) {
+ return NULL;
+ }
+
+ if (ksize > KSIZE_MAX) {
+ PyErr_Format(PyExc_ValueError, "k-mer size must be <= %u", KSIZE_MAX);
+ return NULL;
+ }
+
+ if (strlen(kmer) != ksize) {
+ PyErr_Format(PyExc_ValueError, "k-mer size different from ksize");
+ return NULL;
+ }
+
+ try {
+ PyObject * hash = nullptr;
+ const HashIntoType h(_hash(kmer, ksize));
+ convert_HashIntoType_to_PyObject(h, &hash);
+ return hash;
+ } catch (oxli_exception &e) {
+ PyErr_SetString(PyExc_ValueError, e.what());
+ return NULL;
+ }
+}
+
+PyObject * forward_hash_no_rc(PyObject * self, PyObject * args)
+{
+ const char * kmer;
+ WordLength ksize;
+
+ if (!PyArg_ParseTuple(args, "sb", &kmer, &ksize)) {
+ return NULL;
+ }
+
+ if (ksize > KSIZE_MAX) {
+ PyErr_Format(PyExc_ValueError, "k-mer size must be <= %u", KSIZE_MAX);
+ return NULL;
+ }
+
+ if (strlen(kmer) != ksize) {
+ PyErr_SetString(PyExc_ValueError,
+ "k-mer length must equal the k-size");
+ return NULL;
+ }
+
+ PyObject * hash = nullptr;
+ const HashIntoType h(_hash_forward(kmer, ksize));
+ convert_HashIntoType_to_PyObject(h, &hash);
+ return hash;
+}
+
+PyObject * reverse_hash(PyObject * self, PyObject * args)
+{
+ PyObject * val;
+ HashIntoType hash;
+ WordLength ksize;
+
+ if (!PyArg_ParseTuple(args, "Ob", &val, &ksize)) {
+ return NULL;
+ }
+
+ if (PyLong_Check(val) || PyInt_Check(val)) {
+ if (!convert_PyLong_to_HashIntoType(val, hash)) {
+ return NULL;
+ }
+ } else {
+ PyErr_SetString(PyExc_TypeError,
+ "Hash value must be an integer.");
+ return NULL;
+ }
+
+ if (ksize > KSIZE_MAX) {
+ PyErr_Format(PyExc_ValueError, "k-mer size must be <= %u", KSIZE_MAX);
+ return NULL;
+ }
+
+ return PyUnicode_FromString(_revhash(hash, ksize).c_str());
+}
+
+PyObject * murmur3_forward_hash(PyObject * self, PyObject * args)
+{
+ const char * kmer;
+
+ if (!PyArg_ParseTuple(args, "s", &kmer)) {
+ return NULL;
+ }
+
+ PyObject * hash = nullptr;
+ const HashIntoType h(_hash_murmur(kmer, strlen(kmer)));
+ convert_HashIntoType_to_PyObject(h, &hash);
+ return hash;
+}
+
+PyObject * murmur3_forward_hash_no_rc(PyObject * self, PyObject * args)
+{
+ const char * kmer;
+
+ if (!PyArg_ParseTuple(args, "s", &kmer)) {
+ return NULL;
+ }
+
+ PyObject * hash = nullptr;
+ const HashIntoType h(_hash_murmur_forward(kmer, strlen(kmer)));
+ convert_HashIntoType_to_PyObject(h, &hash);
+ return hash;
+}
+
+PyObject * reverse_complement(PyObject * self, PyObject * args)
+{
+ const char * sequence;
+ if (!PyArg_ParseTuple(args, "s", &sequence)) {
+ return NULL;
+ }
+
+ std::string s(sequence);
+ try {
+ s = _revcomp(s);
+ } catch (oxli_exception &e) {
+ PyErr_SetString(PyExc_RuntimeError, e.what());
+ return NULL;
+ }
+ return PyUnicode_FromString(s.c_str());
+}
+
+//
+// technique for resolving literal below found here:
+// https://gcc.gnu.org/onlinedocs/gcc-4.9.1/cpp/Stringification.html
+//
+
+PyObject *
+get_version_cpp( PyObject * self, PyObject * args )
+{
+#define xstr(s) str(s)
+#define str(s) #s
+ std::string dVersion = xstr(VERSION);
+ return PyUnicode_FromString(dVersion.c_str());
+}
+
+PyMethodDef KhmerMethods[] = {
+ {
+ "forward_hash", forward_hash,
+ METH_VARARGS, "",
+ },
+ {
+ "forward_hash_no_rc", forward_hash_no_rc,
+ METH_VARARGS, "",
+ },
+ {
+ "reverse_hash", reverse_hash,
+ METH_VARARGS, "",
+ },
+ {
+ "hash_murmur3",
+ murmur3_forward_hash,
+ METH_VARARGS,
+ "Calculate the hash value of a k-mer using MurmurHash3 "
+ "(with reverse complement)",
+ },
+ {
+ "hash_no_rc_murmur3",
+ murmur3_forward_hash_no_rc,
+ METH_VARARGS,
+ "Calculate the hash value of a k-mer using MurmurHash3 "
+ "(no reverse complement)",
+ },
+ {
+ "reverse_complement",
+ reverse_complement,
+ METH_VARARGS,
+ "Calculate the reverse-complement of the DNA sequence "
+ "with alphabet ACGT",
+ },
+ {
+ "get_version_cpp", get_version_cpp,
+ METH_VARARGS, "return the VERSION c++ compiler option"
+ },
+ { NULL, NULL, 0, NULL } // sentinel
+};
+
+} // namespace khmer
+
+//
+// Module machinery.
+//
+
+MOD_INIT(_khmer)
+{
+ using namespace khmer;
+ using namespace oxli;
+ using namespace oxli::read_parsers;
+
+ if (PyType_Ready(&khmer_KHashtable_Type) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ khmer_KCounttable_Type.tp_base = &khmer_KHashtable_Type;
+ if (PyType_Ready(&khmer_KCounttable_Type) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ khmer_KSmallCounttable_Type.tp_base = &khmer_KHashtable_Type;
+ if (PyType_Ready(&khmer_KSmallCounttable_Type) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ khmer_KNodetable_Type.tp_base = &khmer_KHashtable_Type;
+ if (PyType_Ready(&khmer_KNodetable_Type) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ khmer_KHashgraph_Type.tp_base = &khmer_KHashtable_Type;
+ khmer_KHashgraph_Type.tp_methods = khmer_hashgraph_methods;
+ if (PyType_Ready(&khmer_KHashgraph_Type) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ khmer_KCountgraph_Type.tp_base = &khmer_KHashgraph_Type;
+ if (PyType_Ready(&khmer_KCountgraph_Type) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ khmer_KSmallCountgraph_Type.tp_base = &khmer_KHashgraph_Type;
+ if (PyType_Ready(&khmer_KSmallCountgraph_Type) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ if (PyType_Ready(&khmer_PrePartitionInfo_Type) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ khmer_KSubsetPartition_Type.tp_methods = khmer_subset_methods;
+ if (PyType_Ready(&khmer_KSubsetPartition_Type) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ khmer_KNodegraph_Type.tp_base = &khmer_KHashgraph_Type;
+ khmer_KNodegraph_Type.tp_methods = khmer_nodegraph_methods;
+ if (PyType_Ready(&khmer_KNodegraph_Type) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ khmer_KGraphLabels_Type.tp_base = &khmer_KNodegraph_Type;
+ khmer_KGraphLabels_Type.tp_methods = khmer_graphlabels_methods;
+ khmer_KGraphLabels_Type.tp_new = khmer_graphlabels_new;
+ if (PyType_Ready(&khmer_KGraphLabels_Type) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ if (PyType_Ready(&khmer_KHLLCounter_Type) < 0) {
+ return MOD_ERROR_VAL;
+ }
+ if (PyType_Ready(&khmer_ReadAlignerType) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ _init_ReadParser_Type_constants();
+ if (PyType_Ready( &khmer_ReadParser_Type ) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ if (PyType_Ready(&khmer_Read_Type ) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ if (PyType_Ready(&khmer_ReadPairIterator_Type ) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ PyObject * m;
+
+ MOD_DEF(m, "_khmer", "interface for the khmer module low-level extensions",
+ KhmerMethods);
+
+ if (m == NULL) {
+ return MOD_ERROR_VAL;
+ }
+
+ PyObject * filetype_dict = Py_BuildValue("{s,i,s,i,s,i,s,i,s,i,s,i,s,i}",
+ "COUNTING_HT", SAVED_COUNTING_HT,
+ "HASHBITS", SAVED_HASHBITS,
+ "TAGS", SAVED_TAGS,
+ "STOPTAGS", SAVED_STOPTAGS,
+ "SUBSET", SAVED_SUBSET,
+ "LABELSET", SAVED_LABELSET,
+ "SMALLCOUNT", SAVED_SMALLCOUNT);
+ if (PyModule_AddObject( m, "FILETYPES", filetype_dict ) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ Py_INCREF(&khmer_Read_Type);
+ if (PyModule_AddObject( m, "Read",
+ (PyObject *)&khmer_Read_Type ) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ Py_INCREF(&khmer_ReadParser_Type);
+ if (PyModule_AddObject( m, "ReadParser",
+ (PyObject *)&khmer_ReadParser_Type ) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ Py_INCREF(&khmer_KCounttable_Type);
+ if (PyModule_AddObject( m, "Counttable",
+ (PyObject *)&khmer_KCounttable_Type ) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ Py_INCREF(&khmer_KSmallCounttable_Type);
+ if (PyModule_AddObject( m, "SmallCounttable",
+ (PyObject *)&khmer_KSmallCounttable_Type ) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ Py_INCREF(&khmer_KNodetable_Type);
+ if (PyModule_AddObject( m, "Nodetable",
+ (PyObject *)&khmer_KNodetable_Type ) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ Py_INCREF(&khmer_KCountgraph_Type);
+ if (PyModule_AddObject( m, "Countgraph",
+ (PyObject *)&khmer_KCountgraph_Type ) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ Py_INCREF(&khmer_KSmallCountgraph_Type);
+ if (PyModule_AddObject( m, "SmallCountgraph",
+ (PyObject *)&khmer_KSmallCountgraph_Type ) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ Py_INCREF(&khmer_KNodegraph_Type);
+ if (PyModule_AddObject(m, "Nodegraph",
+ (PyObject *)&khmer_KNodegraph_Type) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ Py_INCREF(&khmer_KGraphLabels_Type);
+ if (PyModule_AddObject(m, "GraphLabels",
+ (PyObject *)&khmer_KGraphLabels_Type) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ if (PyType_Ready(&_HashSet_iter_Type) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ khmer_HashSet_Type.tp_new = khmer_HashSet_new;
+ if (PyType_Ready(&khmer_HashSet_Type) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ Py_INCREF(&khmer_KHLLCounter_Type);
+ if (PyModule_AddObject(m, "HLLCounter",
+ (PyObject *)&khmer_KHLLCounter_Type) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ Py_INCREF(&khmer_ReadAlignerType);
+ if (PyModule_AddObject(m, "ReadAligner",
+ (PyObject *)&khmer_ReadAlignerType) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ Py_INCREF(&khmer_HashSet_Type);
+ if (PyModule_AddObject(m, "HashSet",
+ (PyObject *)&khmer_HashSet_Type) < 0) {
+ return MOD_ERROR_VAL;
+ }
+
+ return MOD_SUCCESS_VAL(m);
+}
+
+// vim: set ft=cpp sts=4 sw=4 tw=79:
diff --git a/src/khmer/_cpy_nodegraph.cc b/src/khmer/_cpy_nodegraph.cc
new file mode 100644
index 0000000..e8f446f
--- /dev/null
+++ b/src/khmer/_cpy_nodegraph.cc
@@ -0,0 +1,162 @@
+#include "khmer/_cpy_nodegraph.hh"
+#include "oxli/hashgraph.hh"
+
+using namespace oxli;
+
+namespace khmer {
+
+PyTypeObject khmer_KNodegraph_Type
+CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KNodegraph_Object")
+= {
+ PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
+ "_khmer.Nodegraph", /* tp_name */
+ sizeof(khmer_KNodegraph_Object), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)khmer_nodegraph_dealloc, /*tp_dealloc*/
+ 0, /*tp_print*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ 0, /*tp_compare*/
+ 0, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
+ 0, /*tp_hash */
+ 0, /*tp_call*/
+ 0, /*tp_str*/
+ 0, /*tp_getattro*/
+ 0, /*tp_setattro*/
+ 0, /*tp_as_buffer*/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+ "nodegraph object", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ 0, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ khmer_nodegraph_new, /* tp_new */
+};
+
+PyMethodDef khmer_nodegraph_methods[] = {
+ {
+ "update",
+ (PyCFunction) nodegraph_update, METH_VARARGS,
+ "a set update: update this nodegraph with all the entries from the other"
+ },
+ {
+ "get_raw_tables",
+ (PyCFunction) nodegraph_get_raw_tables, METH_VARARGS,
+ "Get a list of the raw tables as memoryview objects"
+ },
+ {NULL, NULL, 0, NULL} /* sentinel */
+};
+
+void khmer_nodegraph_dealloc(khmer_KNodegraph_Object * obj)
+{
+ delete obj->nodegraph;
+ obj->nodegraph = NULL;
+
+ Py_TYPE(obj)->tp_free((PyObject*)obj);
+}
+
+
+PyObject *
+nodegraph_update(khmer_KNodegraph_Object * me, PyObject * args)
+{
+ Nodegraph * nodegraph = me->nodegraph;
+ Nodegraph * other;
+ khmer_KNodegraph_Object * other_o;
+
+ if (!PyArg_ParseTuple(args, "O!", &khmer_KNodegraph_Type, &other_o)) {
+ return NULL;
+ }
+
+ other = other_o->nodegraph;
+
+ try {
+ nodegraph->update_from(*other);
+ } catch (oxli_exception &e) {
+ PyErr_SetString(PyExc_ValueError, e.what());
+ return NULL;
+ }
+
+ Py_RETURN_NONE;
+}
+
+PyObject *
+nodegraph_get_raw_tables(khmer_KNodegraph_Object * self, PyObject * args)
+{
+ Nodegraph * countgraph = self->nodegraph;
+
+ Byte ** table_ptrs = countgraph->get_raw_tables();
+ std::vector<uint64_t> sizes = countgraph->get_tablesizes();
+
+ PyObject * raw_tables = PyList_New(sizes.size());
+ for (unsigned int i=0; i<sizes.size(); ++i) {
+ Py_buffer buffer;
+ int res = PyBuffer_FillInfo(&buffer, NULL, table_ptrs[i], sizes[i], 0,
+ PyBUF_FULL_RO);
+ if (res == -1) {
+ return NULL;
+ }
+ PyObject * buf = PyMemoryView_FromBuffer(&buffer);
+ if(!PyMemoryView_Check(buf)) {
+ return NULL;
+ }
+ PyList_SET_ITEM(raw_tables, i, buf);
+ }
+
+ return raw_tables;
+}
+
+
+// __new__ for nodegraph; necessary for proper subclassing
+// This will essentially do what the old factory function did. Unlike many __new__
+// methods, we take our arguments here, because there's no "uninitialized" nodegraph
+// object; we have to have k and the table sizes before creating the new objects
+PyObject* khmer_nodegraph_new(PyTypeObject * type, PyObject * args,
+ PyObject * kwds)
+{
+ khmer_KNodegraph_Object * self;
+ self = (khmer_KNodegraph_Object *)type->tp_alloc(type, 0);
+
+ if (self != NULL) {
+ WordLength k = 0;
+ PyListObject* sizes_list_o = NULL;
+
+ if (!PyArg_ParseTuple(args, "bO!", &k, &PyList_Type, &sizes_list_o)) {
+ Py_DECREF(self);
+ return NULL;
+ }
+
+ std::vector<uint64_t> sizes;
+ if (!convert_Pytablesizes_to_vector(sizes_list_o, sizes)) {
+ Py_DECREF(self);
+ return NULL;
+ }
+
+ try {
+ self->nodegraph = new Nodegraph(k, sizes);
+ } catch (std::bad_alloc &e) {
+ Py_DECREF(self);
+ return PyErr_NoMemory();
+ }
+ self->khashgraph.khashtable.hashtable =
+ dynamic_cast<Hashtable*>(self->nodegraph);
+ self->khashgraph.hashgraph = dynamic_cast<Hashgraph*>(self->nodegraph);
+ }
+ return (PyObject *) self;
+}
+
+}
diff --git a/khmer/_cpy_nodetable.hh b/src/khmer/_cpy_nodetable.cc
similarity index 55%
rename from khmer/_cpy_nodetable.hh
rename to src/khmer/_cpy_nodetable.cc
index 64956d5..53a1c59 100644
--- a/khmer/_cpy_nodetable.hh
+++ b/src/khmer/_cpy_nodetable.cc
@@ -1,54 +1,11 @@
-/*
-This file is part of khmer, https://github.com/dib-lab/khmer/, and is
-Copyright (C) 2010-2015, Michigan State University.
-Copyright (C) 2015-2016, The Regents of the University of California.
+#include "khmer/_cpy_nodetable.hh"
+#include <vector>
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
+using namespace oxli;
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
+namespace khmer {
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
-
- * Neither the name of the Michigan State University nor the names
- of its contributors may be used to endorse or promote products
- derived from this software without specific prior written
- permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-LICENSE (END)
-
-Contact: khmer-project at idyll.org
-*/
-
-typedef struct {
- khmer_KHashtable_Object khashtable;
- Nodetable * nodetable;
-} khmer_KNodetable_Object;
-
-static PyMethodDef khmer_nodetable_methods[] = {
- {NULL, NULL, 0, NULL} /* sentinel */
-};
-
-static PyObject* khmer_nodetable_new(PyTypeObject * type, PyObject * args,
- PyObject * kwds);
-
-static PyTypeObject khmer_KNodetable_Type
+PyTypeObject khmer_KNodetable_Type
CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KNodetable_Object")
= {
PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
@@ -91,11 +48,12 @@ CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KNodetable_Object")
khmer_nodetable_new, /* tp_new */
};
-//
-// khmer_nodetable_new
-//
-static PyObject* khmer_nodetable_new(PyTypeObject * type, PyObject * args,
+PyMethodDef khmer_nodetable_methods[] = {
+ {NULL, NULL, 0, NULL} /* sentinel */
+};
+
+PyObject* khmer_nodetable_new(PyTypeObject * type, PyObject * args,
PyObject * kwds)
{
khmer_KNodetable_Object * self;
@@ -128,4 +86,7 @@ static PyObject* khmer_nodetable_new(PyTypeObject * type, PyObject * args,
}
return (PyObject *) self;
+
+}
+
}
diff --git a/src/khmer/_cpy_readaligner.cc b/src/khmer/_cpy_readaligner.cc
new file mode 100644
index 0000000..5c6ad0b
--- /dev/null
+++ b/src/khmer/_cpy_readaligner.cc
@@ -0,0 +1,242 @@
+#include "khmer/_cpy_countgraph.hh"
+#include "khmer/_cpy_readaligner.hh"
+#include <string>
+
+using namespace oxli;
+
+namespace khmer {
+
+PyTypeObject khmer_ReadAlignerType = {
+ PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
+ "_khmer.ReadAligner", /*tp_name*/
+ sizeof(khmer_ReadAligner_Object), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ (destructor)khmer_readaligner_dealloc, /*tp_dealloc*/
+ 0, /*tp_print*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ 0, /*tp_compare*/
+ 0, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
+ 0, /*tp_hash */
+ 0, /*tp_call*/
+ 0, /*tp_str*/
+ 0, /*tp_getattro*/
+ 0, /*tp_setattro*/
+ 0, /*tp_as_buffer*/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+ "ReadAligner object", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ khmer_ReadAligner_methods, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ khmer_ReadAligner_new, /* tp_new */
+};
+
+
+
+PyMethodDef khmer_ReadAligner_methods[] = {
+ {"align", (PyCFunction)readaligner_align, METH_VARARGS, ""},
+ {"align_forward", (PyCFunction)readaligner_align_forward, METH_VARARGS, ""},
+ {
+ "get_scoring_matrix", (PyCFunction)khmer_ReadAligner_get_scoring_matrix,
+ METH_VARARGS,
+ "Get the scoring matrix in use.\n\n\
+Returns a tuple of floats: (trusted_match, trusted_mismatch, untrusted_match, \
+untrusted_mismatch)"
+ },
+ {
+ "get_transition_probabilities",
+ (PyCFunction)khmer_ReadAligner_get_transition_probabilities,
+ METH_VARARGS,
+ "Get the transition probabilties in use.\n\n\
+HMM state notation abbreviations:\n\
+ M_t - trusted match; M_u - untrusted match\n\
+ Ir_t - trusted read insert; Ir_u - untrusted read insert\n\
+ Ig_t - trusted graph insert; Ig_u - untrusted graph insert\n\
+\
+Returns a sparse matrix as a tuple of six tuples.\n\
+The inner tuples contain 6, 4, 4, 6, 4, and 4 floats respectively.\n\
+Transition are notated as 'StartState-NextState':\n\
+(\n\
+ ( M_t-M_t, M_t-Ir_t, M_t-Ig_t, M_t-M_u, M_t-Ir_u, M_t-Ig_u),\n\
+ (Ir_t-M_t, Ir_t-Ir_t, Ir_t-M_u, Ir_t-Ir_u ),\n\
+ (Ig_t-M_t, , Ig_t-Ig_t, Ig_t-M_u, Ig_t-Ig_u),\n\
+ ( M_u-M_t, M_u-Ir_t, M_u-Ig_t, M_u-M_u, M_u-Ir_u, M_u-Ig_u),\n\
+ (Ir_u-M_t, Ir_u-Ir_t, Ir_u-M_u, Ir_u-Ir_u ),\n\
+ (Ig_u-M_t, , Ig_u-Ig_t, Ig_u-M_u, Ig_u-Ig_u)\n\
+)"
+ },
+ {NULL} /* Sentinel */
+};
+
+PyObject * readaligner_align(khmer_ReadAligner_Object * me,
+ PyObject * args)
+{
+ const char * read;
+
+ if (!PyArg_ParseTuple(args, "s", &read)) {
+ return NULL;
+ }
+
+ /*if (strlen(read) < (unsigned int)aligner->ksize()) {
+ PyErr_SetString(PyExc_ValueError,
+ "string length must >= the hashtable k-mer size");
+ return NULL;
+ }*/
+
+ Alignment * aln = me->aligner->Align(read);
+
+ const char* alignment = aln->graph_alignment.c_str();
+ const char* readAlignment = aln->read_alignment.c_str();
+ PyObject * ret = Py_BuildValue("dssO", aln->score, alignment,
+ readAlignment, (aln->truncated)? Py_True : Py_False);
+ delete aln;
+
+ return ret;
+}
+
+PyObject * readaligner_align_forward(khmer_ReadAligner_Object * me,
+ PyObject * args)
+{
+ ReadAligner * aligner = me->aligner;
+
+ const char * read;
+
+ if (!PyArg_ParseTuple(args, "s", &read)) {
+ return NULL;
+ }
+
+ /*if (strlen(read) < (unsigned int)aligner->ksize()) {
+ PyErr_SetString(PyExc_ValueError,
+ "string length must >= the hashtable k-mer size");
+ return NULL;
+ }*/
+
+ Alignment * aln;
+ aln = aligner->AlignForward(read);
+
+ const char* alignment = aln->graph_alignment.c_str();
+ const char* readAlignment = aln->read_alignment.c_str();
+ PyObject * x = PyList_New(aln->covs.size());
+ for (size_t i = 0; i < aln->covs.size(); i++ ) {
+ PyList_SET_ITEM(x, i, PyLong_FromLong(aln->covs[i]));
+ }
+
+ PyObject * ret = Py_BuildValue("dssOO", aln->score, alignment,
+ readAlignment,
+ (aln->truncated)? Py_True : Py_False,
+ x);
+ delete aln;
+ Py_DECREF(x);
+
+ return ret;
+}
+
+PyObject* khmer_ReadAligner_get_scoring_matrix(
+ khmer_ReadAligner_Object * me, PyObject * args)
+{
+
+ if (!PyArg_ParseTuple(args, "")) {
+ return NULL;
+ }
+ ScoringMatrix matrix = me->aligner->getScoringMatrix();
+
+ return Py_BuildValue( "dddd", matrix.trusted_match, matrix.trusted_mismatch,
+ matrix.untrusted_match, matrix.untrusted_mismatch);
+}
+
+PyObject* khmer_ReadAligner_get_transition_probabilities(
+ khmer_ReadAligner_Object * me, PyObject * args)
+{
+
+ if (!PyArg_ParseTuple(args, "")) {
+ return NULL;
+ }
+ ScoringMatrix matrix = me->aligner->getScoringMatrix();
+
+ return Py_BuildValue( "(dddddd)(dddd)(dddd)(dddddd)(dddd)(dddd)",
+ matrix.tsc[0], matrix.tsc[1], matrix.tsc[2],
+ matrix.tsc[3], matrix.tsc[4], matrix.tsc[5],
+ matrix.tsc[6], matrix.tsc[7], matrix.tsc[8],
+ matrix.tsc[9], matrix.tsc[10], matrix.tsc[11],
+ matrix.tsc[12], matrix.tsc[13], matrix.tsc[14],
+ matrix.tsc[15], matrix.tsc[16], matrix.tsc[17],
+ matrix.tsc[18], matrix.tsc[19], matrix.tsc[20],
+ matrix.tsc[21], matrix.tsc[22], matrix.tsc[23],
+ matrix.tsc[24], matrix.tsc[25], matrix.tsc[26],
+ matrix.tsc[27]);
+}
+
+
+
+//
+// khmer_readaligner_dealloc -- clean up readaligner object
+// GRAPHALIGN addition
+//
+void khmer_readaligner_dealloc(khmer_ReadAligner_Object* obj)
+{
+ delete obj->aligner;
+ obj->aligner = NULL;
+ Py_TYPE(obj)->tp_free((PyObject*)obj);
+}
+
+//
+// new_readaligner
+//
+PyObject* khmer_ReadAligner_new(PyTypeObject *type, PyObject * args,
+ PyObject *kwds)
+{
+ khmer_ReadAligner_Object * self;
+
+ self = (khmer_ReadAligner_Object *)type->tp_alloc(type, 0);
+
+ if (self != NULL) {
+ khmer_KCountgraph_Object * ch = NULL;
+ unsigned short int trusted_cov_cutoff = 2;
+ double bits_theta = 1;
+ double scoring_matrix[] = { 0, 0, 0, 0 };
+ double * transitions = new double[28];
+
+ if(!PyArg_ParseTuple(
+ args,
+ "O!Hd|(dddd)((dddddd)(dddd)(dddd)(dddddd)(dddd)(dddd))",
+ &khmer_KCountgraph_Type, &ch, &trusted_cov_cutoff,
+ &bits_theta, &scoring_matrix[0], &scoring_matrix[1],
+ &scoring_matrix[2], &scoring_matrix[3], &transitions[0],
+ &transitions[1], &transitions[2], &transitions[3],
+ &transitions[4], &transitions[5], &transitions[6],
+ &transitions[7], &transitions[8], &transitions[9],
+ &transitions[10], &transitions[11], &transitions[12],
+ &transitions[13], &transitions[14], &transitions[15],
+ &transitions[16], &transitions[17], &transitions[18],
+ &transitions[19], &transitions[20], &transitions[21],
+ &transitions[22], &transitions[23], &transitions[24],
+ &transitions[25], &transitions[26], &transitions[27])) {
+ Py_DECREF(self);
+ return NULL;
+ }
+
+ self->aligner = new ReadAligner(ch->countgraph, trusted_cov_cutoff,
+ bits_theta, scoring_matrix,
+ transitions);
+ }
+
+ return (PyObject *) self;
+}
+
+}
diff --git a/src/khmer/_cpy_readparsers.cc b/src/khmer/_cpy_readparsers.cc
new file mode 100644
index 0000000..d80dd28
--- /dev/null
+++ b/src/khmer/_cpy_readparsers.cc
@@ -0,0 +1,639 @@
+#include "khmer/_cpy_readparsers.hh"
+#include <string>
+
+using namespace oxli;
+using namespace oxli::read_parsers;
+
+namespace khmer {
+
+PyTypeObject khmer_Read_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
+ "khmer.Read", /* tp_name */
+ sizeof(khmer_Read_Object), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)khmer_Read_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ &khmer_Read_sequence_methods, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ "A FASTQ record plus some metadata.", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ 0, /* tp_methods */
+ 0, /* tp_members */
+ (PyGetSetDef *)khmer_Read_accessors, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)khmer_Read_init, /* tp_init */
+ 0, /* tp_alloc */
+ khmer_Read_new, /* tp_new */
+};
+
+PyGetSetDef khmer_Read_accessors [ ] = {
+ {
+ (char *)"name",
+ (getter)Read_get_name, (setter)NULL,
+ (char *)"Read identifier.", NULL
+ },
+ {
+ (char *)"sequence",
+ (getter)Read_get_sequence, (setter)NULL,
+ (char *)"Genomic sequence.", NULL
+ },
+ {
+ (char *)"quality",
+ (getter)Read_get_quality, (setter)NULL,
+ (char *)"Quality scores.", NULL
+ },
+ {
+ (char *)"description",
+ (getter)Read_get_description, (setter)NULL,
+ (char *)"Description.", NULL
+ },
+ {
+ (char *)"cleaned_seq",
+ (getter)Read_get_cleaned_seq, (setter)NULL,
+ (char *)"Cleaned sequence.", NULL
+ },
+
+ { NULL, NULL, NULL, NULL, NULL } // sentinel
+};
+
+
+PySequenceMethods khmer_Read_sequence_methods = {
+ (lenfunc)khmer_Read_len, /* sq_length */
+};
+
+
+PyTypeObject khmer_ReadPairIterator_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
+ "_khmer.ReadPairIterator", /* tp_name */
+ sizeof(khmer_ReadPairIterator_Object), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)khmer_ReadPairIterator_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ "Iterates over 'ReadParser' objects and returns read pairs.", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ PyObject_SelfIter, /* tp_iter */
+ (iternextfunc)_ReadPairIterator_iternext, /* tp_iternext */
+};
+
+PyMethodDef _ReadParser_methods [ ] = {
+ {
+ "iter_reads", (PyCFunction)ReadParser_iter_reads,
+ METH_NOARGS, "Iterates over reads."
+ },
+ {
+ "iter_read_pairs", (PyCFunction)ReadParser_iter_read_pairs,
+ METH_VARARGS, "Iterates over paired reads as pairs."
+ },
+ {
+ "close", (PyCFunction)ReadParser_close,
+ METH_NOARGS, "Close associated files."
+ },
+ { NULL, NULL, 0, NULL } // sentinel
+};
+
+
+PyGetSetDef khmer_ReadParser_accessors[] = {
+ {
+ (char *)"num_reads",
+ (getter)ReadParser_get_num_reads, NULL,
+ (char *)"count of reads processed thus far.",
+ NULL
+ },
+ {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+
+PyTypeObject khmer_ReadParser_Type
+CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_ReadParser_Object")
+= {
+ PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
+ "_khmer.ReadParser", /* tp_name */
+ sizeof(khmer_ReadParser_Object), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)_ReadParser_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ "Parses streams from various file formats, " \
+ "such as FASTA and FASTQ.", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ PyObject_SelfIter, /* tp_iter */
+ (iternextfunc)_ReadParser_iternext, /* tp_iternext */
+ _ReadParser_methods, /* tp_methods */
+ 0, /* tp_members */
+ khmer_ReadParser_accessors, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ _ReadParser_new, /* tp_new */
+};
+
+
+
+/***********************************************************************/
+
+//
+// Read object -- name, sequence, and FASTQ stuff
+//
+
+PyObject*
+khmer_Read_new(PyTypeObject * type, PyObject * args, PyObject * kwds)
+{
+ khmer_Read_Object * self;
+ self = (khmer_Read_Object *)type->tp_alloc(type, 0);
+ if (self != NULL) {
+ try {
+ self->read = new Read;
+ } catch (std::bad_alloc &exc) {
+ Py_DECREF(self);
+ return PyErr_NoMemory();
+ }
+ }
+ return (PyObject *)self;
+}
+
+int
+khmer_Read_init(khmer_Read_Object *self, PyObject *args, PyObject *kwds)
+{
+ const char * name{};
+ const char * description{};
+ const char * sequence{};
+ const char * quality{};
+ char *kwlist[5] = {
+ const_cast<char *>("name"), const_cast<char *>("sequence"),
+ const_cast<char *>("quality"), const_cast<char *>("description"), NULL
+ };
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "ss|zz", kwlist,
+ &name, &sequence, &quality, &description)) {
+ return -1;
+ }
+
+ if (name != NULL) {
+ self->read->name = name;
+ }
+ if (sequence != NULL) {
+ self->read->sequence = sequence;
+ self->read->set_clean_seq();
+ }
+ if (quality != NULL) {
+ self->read->quality = quality;
+ }
+ if (description != NULL) {
+ self->read->description = description;
+ }
+ return 0;
+}
+
+void
+khmer_Read_dealloc(khmer_Read_Object * obj)
+{
+ delete obj->read;
+ obj->read = NULL;
+ Py_TYPE(obj)->tp_free((PyObject*)obj);
+}
+
+
+Py_ssize_t
+khmer_Read_len(khmer_Read_Object* obj)
+{
+ return obj->read->sequence.size();
+}
+
+
+PyObject *
+Read_get_name(khmer_Read_Object * obj, void * closure )
+{
+ if (obj->read->name.size() > 0) {
+ return PyUnicode_FromString(obj->read->name.c_str());
+ } else {
+ PyErr_SetString(PyExc_AttributeError,
+ "'Read' object has no attribute 'name'.");
+ return NULL;
+ }
+}
+
+
+PyObject *
+Read_get_sequence(khmer_Read_Object * obj, void * closure)
+{
+ if (obj->read->sequence.size() > 0) {
+ return PyUnicode_FromString(obj->read->sequence.c_str());
+ } else {
+ PyErr_SetString(PyExc_AttributeError,
+ "'Read' object has no attribute 'sequence'.");
+ return NULL;
+ }
+}
+
+
+PyObject *
+Read_get_quality(khmer_Read_Object * obj, void * closure)
+{
+ if (obj->read->quality.size() > 0) {
+ return PyUnicode_FromString(obj->read->quality.c_str());
+ } else {
+ PyErr_SetString(PyExc_AttributeError,
+ "'Read' object has no attribute 'quality'.");
+ return NULL;
+ }
+}
+
+
+PyObject *
+Read_get_description(khmer_Read_Object * obj, void * closure)
+{
+ if (obj->read->description.size() > 0) {
+ return PyUnicode_FromString(obj->read->description.c_str());
+ } else {
+ PyErr_SetString(PyExc_AttributeError,
+ "'Read' object has no attribute 'description'.");
+ return NULL;
+ }
+}
+
+
+PyObject *
+Read_get_cleaned_seq(khmer_Read_Object * obj, void * closure)
+{
+ if (obj->read->cleaned_seq.size() > 0) {
+ return PyUnicode_FromString(obj->read->cleaned_seq.c_str());
+ } else if (obj->read->sequence.size() > 0) {
+ obj->read->set_clean_seq();
+ return PyUnicode_FromString(obj->read->cleaned_seq.c_str());
+ } else {
+ PyErr_SetString(PyExc_AttributeError,
+ "'Read' object has no attribute 'cleaned_seq'.");
+ return NULL;
+ }
+}
+
+
+int
+Read_set_cleaned_seq(khmer_Read_Object *obj, PyObject *value, void *closure)
+{
+ if (value == NULL) {
+ obj->read->cleaned_seq = "";
+ return 0;
+ }
+
+ if (! (PyUnicode_Check(value) | PyBytes_Check(value))) {
+ PyErr_SetString(PyExc_TypeError,
+ "The 'cleaned_seq' attribute value must be a string");
+ return -1;
+ }
+
+ if (PyUnicode_Check(value)) {
+ PyObject* temp = PyUnicode_AsASCIIString(value);
+ if (temp == NULL) {
+ PyErr_SetString(PyExc_TypeError,
+ "Could not encode 'cleaned_seq' as ASCII.");
+ return -1;
+ }
+
+ obj->read->cleaned_seq = std::string(PyBytes_AS_STRING(temp));
+ Py_DECREF(temp);
+ }
+ // in python2 not everything is a unicode object
+ else {
+ obj->read->cleaned_seq = std::string(PyBytes_AS_STRING(value));
+ }
+
+ return 0;
+}
+
+
+// TODO? Implement setters.
+
+
+
+/***********************************************************************/
+
+//
+// ReadParser object -- parse reads directly from streams
+// ReadPairIterator -- return pairs of Read objects
+//
+
+
+void
+_ReadParser_dealloc(khmer_ReadParser_Object * obj)
+{
+ Py_TYPE(obj)->tp_free((PyObject*)obj);
+}
+
+
+void
+khmer_ReadPairIterator_dealloc(khmer_ReadPairIterator_Object * obj)
+{
+ Py_DECREF(obj->parent);
+ obj->parent = NULL;
+ Py_TYPE(obj)->tp_free((PyObject*)obj);
+}
+
+
+PyObject *
+_ReadParser_new( PyTypeObject * subtype, PyObject * args, PyObject * kwds )
+{
+ const char * ifile_name_CSTR;
+
+ if (!PyArg_ParseTuple(args, "s", &ifile_name_CSTR )) {
+ return NULL;
+ }
+ std:: string ifile_name( ifile_name_CSTR );
+
+ PyObject * self = subtype->tp_alloc( subtype, 1 );
+ if (self == NULL) {
+ return NULL;
+ }
+ khmer_ReadParser_Object * myself = (khmer_ReadParser_Object *)self;
+
+ // Wrap the low-level parser object.
+ try {
+ myself->parser = get_parser<FastxReader>(ifile_name);
+ } catch (oxli_file_exception &exc) {
+ PyErr_SetString( PyExc_OSError, exc.what() );
+ return NULL;
+ }
+ return self;
+}
+
+PyObject *
+_ReadParser_iternext( PyObject * self )
+{
+ khmer_ReadParser_Object * myself = (khmer_ReadParser_Object *)self;
+ FastxParserPtr& parser = myself->parser;
+ std::string exc_string;
+
+ bool stop_iteration = false;
+ const char *value_exception = NULL;
+ const char *file_exception = NULL;
+ Read *the_read_PTR = NULL;
+ try {
+ the_read_PTR = new Read( );
+ } catch (std::bad_alloc &exc) {
+ return PyErr_NoMemory();
+ }
+
+ Py_BEGIN_ALLOW_THREADS
+ stop_iteration = parser->is_complete( );
+ if (!stop_iteration) {
+ try {
+ *the_read_PTR = parser->get_next_read();
+ } catch (NoMoreReadsAvailable &exc) {
+ stop_iteration = true;
+ } catch (oxli_file_exception &exc) {
+ exc_string = exc.what();
+ file_exception = exc_string.c_str();
+ } catch (oxli_value_exception &exc) {
+ exc_string = exc.what();
+ value_exception = exc_string.c_str();
+ }
+ }
+ Py_END_ALLOW_THREADS
+
+ // Note: Can simply return NULL instead of setting the StopIteration
+ // exception.
+ if (stop_iteration) {
+ delete the_read_PTR;
+ return NULL;
+ }
+
+ if (file_exception != NULL) {
+ delete the_read_PTR;
+ PyErr_SetString(PyExc_OSError, file_exception);
+ return NULL;
+ }
+ if (value_exception != NULL) {
+ delete the_read_PTR;
+ PyErr_SetString(PyExc_ValueError, value_exception);
+ return NULL;
+ }
+
+ PyObject * the_read_OBJECT = khmer_Read_Type.tp_alloc( &khmer_Read_Type, 1 );
+ ((khmer_Read_Object *)the_read_OBJECT)->read = the_read_PTR;
+ return the_read_OBJECT;
+}
+
+
+PyObject *
+_ReadPairIterator_iternext(khmer_ReadPairIterator_Object * myself)
+{
+ khmer_ReadParser_Object * parent = (khmer_ReadParser_Object*)myself->parent;
+ FastxParserPtr& parser = parent->parser;
+ uint8_t pair_mode = myself->pair_mode;
+
+ ReadPair the_read_pair;
+ bool stop_iteration = false;
+ const char *value_exception = NULL;
+ const char *file_exception = NULL;
+ std::string exc_string;
+
+ Py_BEGIN_ALLOW_THREADS
+ stop_iteration = parser->is_complete( );
+ if (!stop_iteration) {
+ try {
+ the_read_pair = parser->get_next_read_pair(pair_mode);
+ } catch (NoMoreReadsAvailable &exc) {
+ stop_iteration = true;
+ } catch (oxli_file_exception &exc) {
+ exc_string = exc.what();
+ file_exception = exc_string.c_str();
+ } catch (oxli_value_exception &exc) {
+ exc_string = exc.what();
+ value_exception = exc_string.c_str();
+ }
+ }
+ Py_END_ALLOW_THREADS
+
+ // Note: Can return NULL instead of setting the StopIteration exception.
+ if (stop_iteration) {
+ return NULL;
+ }
+ if (file_exception != NULL) {
+ PyErr_SetString(PyExc_OSError, file_exception);
+ return NULL;
+ }
+ if (value_exception != NULL) {
+ PyErr_SetString(PyExc_ValueError, value_exception);
+ return NULL;
+ }
+
+ // Copy elements of 'ReadPair' object into Python tuple.
+ // TODO? Replace dummy reads with 'None' object.
+ PyObject * read_1_OBJECT = khmer_Read_Type.tp_alloc( &khmer_Read_Type, 1 );
+ try {
+ ((khmer_Read_Object *)read_1_OBJECT)->read = new Read( the_read_pair.first );
+ } catch (std::bad_alloc &e) {
+ return PyErr_NoMemory();
+ }
+ PyObject * read_2_OBJECT = khmer_Read_Type.tp_alloc( &khmer_Read_Type, 1 );
+ try {
+ ((khmer_Read_Object *)read_2_OBJECT)->read = new Read( the_read_pair.second );
+ } catch (std::bad_alloc &e) {
+ delete ((khmer_Read_Object *)read_1_OBJECT)->read;
+ return PyErr_NoMemory();
+ }
+ PyObject * tup = PyTuple_Pack( 2, read_1_OBJECT, read_2_OBJECT );
+ Py_XDECREF(read_1_OBJECT);
+ Py_XDECREF(read_2_OBJECT);
+ return tup;
+}
+
+
+PyObject *
+ReadParser_iter_reads(PyObject * self, PyObject * args )
+{
+ return PyObject_SelfIter( self );
+}
+
+PyObject *
+ReadParser_get_num_reads(khmer_ReadParser_Object * me)
+{
+ return PyLong_FromLong(me->parser->get_num_reads());
+}
+
+PyObject *
+ReadParser_iter_read_pairs(PyObject * self, PyObject * args )
+{
+ int pair_mode = ReadParser<FastxReader>::PAIR_MODE_ERROR_ON_UNPAIRED;
+
+ if (!PyArg_ParseTuple( args, "|i", &pair_mode )) {
+ return NULL;
+ }
+
+ // Capture existing read parser.
+ PyObject * obj = khmer_ReadPairIterator_Type.tp_alloc(
+ &khmer_ReadPairIterator_Type, 1
+ );
+ if (obj == NULL) {
+ return NULL;
+ }
+ khmer_ReadPairIterator_Object * rpi = (khmer_ReadPairIterator_Object *)obj;
+ rpi->parent = self;
+ rpi->pair_mode = pair_mode;
+
+ // Increment reference count on existing ReadParser object so that it
+ // will not go away until all ReadPairIterator instances have gone away.
+ Py_INCREF( self );
+
+ return obj;
+}
+
+
+PyObject *
+ReadParser_close(PyObject * self, PyObject * args)
+{
+ FastxParserPtr& rparser = _PyObject_to_khmer_ReadParser(self);
+ rparser->close();
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+
+void _init_ReadParser_Type_constants()
+{
+ PyObject * cls_attrs_DICT = PyDict_New( );
+ if (cls_attrs_DICT == NULL) {
+ return;
+ }
+
+ // Place pair mode constants into class dictionary.
+ int result;
+ PyObject *value = PyLong_FromLong(
+ ReadParser<FastxReader>::PAIR_MODE_IGNORE_UNPAIRED);
+ if (value == NULL) {
+ Py_DECREF(cls_attrs_DICT);
+ return;
+ }
+ result = PyDict_SetItemString(cls_attrs_DICT,
+ "PAIR_MODE_IGNORE_UNPAIRED", value );
+ Py_XDECREF(value);
+ if (!result) {
+ Py_DECREF(cls_attrs_DICT);
+ return;
+ }
+
+ value = PyLong_FromLong(ReadParser<FastxReader>::PAIR_MODE_ERROR_ON_UNPAIRED);
+ if (value == NULL) {
+ Py_DECREF(cls_attrs_DICT);
+ return;
+ }
+ result = PyDict_SetItemString(cls_attrs_DICT,
+ "PAIR_MODE_ERROR_ON_UNPAIRED", value);
+ Py_XDECREF(value);
+ if (!result) {
+ Py_DECREF(cls_attrs_DICT);
+ return;
+ }
+
+ khmer_ReadParser_Type.tp_dict = cls_attrs_DICT;
+}
+
+
+FastxParserPtr& _PyObject_to_khmer_ReadParser(PyObject * py_object)
+{
+ // TODO: Add type-checking.
+
+ return ((khmer_ReadParser_Object *)py_object)->parser;
+}
+
+
+}
diff --git a/khmer/_cpy_smallcountgraph.hh b/src/khmer/_cpy_smallcountgraph.cc
similarity index 65%
rename from khmer/_cpy_smallcountgraph.hh
rename to src/khmer/_cpy_smallcountgraph.cc
index 40c18f3..275e33b 100644
--- a/khmer/_cpy_smallcountgraph.hh
+++ b/src/khmer/_cpy_smallcountgraph.cc
@@ -1,92 +1,12 @@
-/*
-This file is part of khmer, https://github.com/dib-lab/khmer/, and is
-Copyright (C) 2016, The Regents of the University of California.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
-
- * Neither the name of the Michigan State University nor the names
- of its contributors may be used to endorse or promote products
- derived from this software without specific prior written
- permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-LICENSE (END)
-
-Contact: khmer-project at idyll.org
-*/
+#include "khmer/_cpy_smallcountgraph.hh"
+#include "oxli/hashgraph.hh"
-//
-// KSmallCountgraph object
-//
-
-typedef struct {
- khmer_KHashgraph_Object khashgraph;
- SmallCountgraph * countgraph;
-} khmer_KSmallCountgraph_Object;
-
-static void khmer_smallcountgraph_dealloc(khmer_KSmallCountgraph_Object * obj);
-
-static
-PyObject *
-smallcount_get_raw_tables(khmer_KSmallCountgraph_Object * self, PyObject * args)
-{
- SmallCountgraph * countgraph = self->countgraph;
+using namespace oxli;
- khmer::Byte ** table_ptrs = countgraph->get_raw_tables();
- std::vector<uint64_t> sizes = countgraph->get_tablesizes();
-
- PyObject * raw_tables = PyList_New(sizes.size());
- for (unsigned int i=0; i<sizes.size(); ++i) {
- Py_buffer buffer;
- int res = PyBuffer_FillInfo(&buffer, NULL, table_ptrs[i],
- sizes[i] / 2 +1, 0,
- PyBUF_FULL_RO);
- if (res == -1) {
- return NULL;
- }
- PyObject * buf = PyMemoryView_FromBuffer(&buffer);
- if(!PyMemoryView_Check(buf)) {
- return NULL;
- }
- PyList_SET_ITEM(raw_tables, i, buf);
- }
-
- return raw_tables;
-}
-
-static PyMethodDef khmer_smallcountgraph_methods[] = {
- {
- "get_raw_tables",
- (PyCFunction)smallcount_get_raw_tables, METH_VARARGS,
- "Get a list of the raw storage tables as memoryview objects."
- },
- {NULL, NULL, 0, NULL} /* sentinel */
-};
-static PyObject* khmer_smallcountgraph_new(PyTypeObject * type, PyObject * args,
- PyObject * kwds);
+namespace khmer {
-static PyTypeObject khmer_KSmallCountgraph_Type
+PyTypeObject khmer_KSmallCountgraph_Type
CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KSmallCountgraph_Object")
= {
PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
@@ -129,11 +49,48 @@ CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KSmallCountgraph_Object")
khmer_smallcountgraph_new, /* tp_new */
};
+PyMethodDef khmer_smallcountgraph_methods[] = {
+ {
+ "get_raw_tables",
+ (PyCFunction)smallcount_get_raw_tables, METH_VARARGS,
+ "Get a list of the raw storage tables as memoryview objects."
+ },
+ {NULL, NULL, 0, NULL} /* sentinel */
+};
+
+PyObject *
+smallcount_get_raw_tables(khmer_KSmallCountgraph_Object * self, PyObject * args)
+{
+ SmallCountgraph * countgraph = self->countgraph;
+
+ oxli::Byte ** table_ptrs = countgraph->get_raw_tables();
+ std::vector<uint64_t> sizes = countgraph->get_tablesizes();
+
+ PyObject * raw_tables = PyList_New(sizes.size());
+ for (unsigned int i=0; i<sizes.size(); ++i) {
+ Py_buffer buffer;
+ int res = PyBuffer_FillInfo(&buffer, NULL, table_ptrs[i],
+ sizes[i] / 2 +1, 0,
+ PyBUF_FULL_RO);
+ if (res == -1) {
+ return NULL;
+ }
+ PyObject * buf = PyMemoryView_FromBuffer(&buffer);
+ if(!PyMemoryView_Check(buf)) {
+ return NULL;
+ }
+ PyList_SET_ITEM(raw_tables, i, buf);
+ }
+
+ return raw_tables;
+}
+
+
//
// khmer_smallcountgraph_dealloc -- clean up a countgraph hash object.
//
-static void khmer_smallcountgraph_dealloc(khmer_KSmallCountgraph_Object * obj)
+void khmer_smallcountgraph_dealloc(khmer_KSmallCountgraph_Object * obj)
{
delete obj->countgraph;
obj->countgraph = NULL;
@@ -144,7 +101,7 @@ static void khmer_smallcountgraph_dealloc(khmer_KSmallCountgraph_Object * obj)
// khmer_smallcountgraph_new
//
-static PyObject* khmer_smallcountgraph_new(PyTypeObject * type, PyObject * args,
+PyObject* khmer_smallcountgraph_new(PyTypeObject * type, PyObject * args,
PyObject * kwds)
{
khmer_KSmallCountgraph_Object * self;
@@ -179,3 +136,5 @@ static PyObject* khmer_smallcountgraph_new(PyTypeObject * type, PyObject * args,
return (PyObject *) self;
}
+
+}
diff --git a/khmer/_cpy_smallcounttable.hh b/src/khmer/_cpy_smallcounttable.cc
similarity index 56%
rename from khmer/_cpy_smallcounttable.hh
rename to src/khmer/_cpy_smallcounttable.cc
index decef6c..ffdd2d2 100644
--- a/khmer/_cpy_smallcounttable.hh
+++ b/src/khmer/_cpy_smallcounttable.cc
@@ -1,49 +1,11 @@
-/*
-This file is part of khmer, https://github.com/dib-lab/khmer/, and is
-Copyright (C) 2016, The Regents of the University of California.
+#include "khmer/_cpy_smallcounttable.hh"
+#include "oxli/hashtable.hh"
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
+using namespace oxli;
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
+namespace khmer {
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
-
- * Neither the name of the Michigan State University nor the names
- of its contributors may be used to endorse or promote products
- derived from this software without specific prior written
- permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-LICENSE (END)
-
-Contact: khmer-project at idyll.org
-*/
-
-typedef struct {
- khmer_KHashtable_Object khashtable;
- SmallCounttable * counttable;
-} khmer_KSmallCounttable_Object;
-
-static PyObject* khmer_smallcounttable_new(PyTypeObject * type, PyObject * args,
- PyObject * kwds);
-
-static PyTypeObject khmer_KSmallCounttable_Type
+PyTypeObject khmer_KSmallCounttable_Type
CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KSmallCounttable_Object")
= {
PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
@@ -91,7 +53,7 @@ CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("khmer_KSmallCounttable_Object")
// khmer_smallcounttable_new
//
-static PyObject* khmer_smallcounttable_new(PyTypeObject * type, PyObject * args,
+PyObject* khmer_smallcounttable_new(PyTypeObject * type, PyObject * args,
PyObject * kwds)
{
khmer_KSmallCounttable_Object * self;
@@ -125,3 +87,5 @@ static PyObject* khmer_smallcounttable_new(PyTypeObject * type, PyObject * args,
return (PyObject *) self;
}
+
+}
diff --git a/src/khmer/_cpy_subsetpartition.cc b/src/khmer/_cpy_subsetpartition.cc
new file mode 100644
index 0000000..5b51d52
--- /dev/null
+++ b/src/khmer/_cpy_subsetpartition.cc
@@ -0,0 +1,263 @@
+#include "khmer/_cpy_subsetpartition.hh"
+#include "khmer/_cpy_countgraph.hh"
+
+using namespace oxli;
+
+namespace khmer {
+
+
+PyTypeObject khmer_PrePartitionInfo_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
+ "_khmer.PrePartitionInfo", /* tp_name */
+ sizeof(khmer_PrePartitionInfo_Object),/* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)khmer_PrePartitionInfo_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ "Stores a k-kmer and a set of tagged seen k-mers.", /* tp_doc */
+};
+
+void
+khmer_PrePartitionInfo_dealloc(khmer_PrePartitionInfo_Object * obj)
+{
+ delete obj->PrePartitionInfo;
+ obj->PrePartitionInfo = NULL;
+ Py_TYPE(obj)->tp_free((PyObject*)obj);
+}
+
+
+
+PyTypeObject khmer_KSubsetPartition_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0) /* init & ob_size */
+ "_khmer.KSubsetPartition", /* tp_name */
+ sizeof(khmer_KSubsetPartition_Object), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)khmer_subset_dealloc, /*tp_dealloc*/
+ 0, /*tp_print*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ 0, /*tp_compare*/
+ 0, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
+ 0, /*tp_hash */
+ 0, /*tp_call*/
+ 0, /*tp_str*/
+ 0, /*tp_getattro*/
+ 0, /*tp_setattro*/
+ 0, /*tp_as_buffer*/
+ Py_TPFLAGS_DEFAULT, /*tp_flags*/
+ "subset object", /* tp_doc */
+};
+
+PyMethodDef khmer_subset_methods[] = {
+ {
+ "count_partitions",
+ (PyCFunction)subset_count_partitions,
+ METH_VARARGS,
+ ""
+ },
+ {
+ "report_on_partitions",
+ (PyCFunction)subset_report_on_partitions,
+ METH_VARARGS,
+ ""
+ },
+ {
+ "partition_size_distribution",
+ (PyCFunction)subset_partition_size_distribution,
+ METH_VARARGS,
+ ""
+ },
+ {
+ "partition_sizes",
+ (PyCFunction)subset_partition_sizes,
+ METH_VARARGS,
+ ""
+ },
+ {
+ "partition_average_coverages",
+ (PyCFunction)subset_partition_average_coverages,
+ METH_VARARGS,
+ ""
+ },
+ {NULL, NULL, 0, NULL} /* sentinel */
+};
+
+void khmer_subset_dealloc(khmer_KSubsetPartition_Object * obj)
+{
+ delete obj->subset;
+ obj->subset = NULL;
+ Py_TYPE(obj)->tp_free((PyObject*)obj);
+}
+
+
+
+PyObject *
+subset_count_partitions(khmer_KSubsetPartition_Object * me, PyObject * args)
+{
+ SubsetPartition * subset_p = me->subset;
+
+ if (!PyArg_ParseTuple(args, "")) {
+ return NULL;
+ }
+
+ size_t n_partitions = 0, n_unassigned = 0;
+ subset_p->count_partitions(n_partitions, n_unassigned);
+
+ return Py_BuildValue("nn", (Py_ssize_t) n_partitions,
+ (Py_ssize_t) n_unassigned);
+}
+
+
+PyObject *
+subset_report_on_partitions(khmer_KSubsetPartition_Object * me, PyObject * args)
+{
+ SubsetPartition * subset_p = me->subset;
+
+ if (!PyArg_ParseTuple(args, "")) {
+ return NULL;
+ }
+
+ subset_p->report_on_partitions();
+
+ Py_RETURN_NONE;
+}
+
+
+PyObject *
+subset_partition_size_distribution(khmer_KSubsetPartition_Object * me,
+ PyObject * args)
+{
+ SubsetPartition * subset_p = me->subset;
+
+ if (!PyArg_ParseTuple(args, "")) {
+ return NULL;
+ }
+
+ PartitionCountDistribution d;
+
+ unsigned int n_unassigned = 0;
+ subset_p->partition_size_distribution(d, n_unassigned);
+
+ PyObject * x = PyList_New(d.size());
+ if (x == NULL) {
+ return NULL;
+ }
+ PartitionCountDistribution::iterator di;
+
+ unsigned int i;
+ for (i = 0, di = d.begin(); di != d.end(); ++di, i++) {
+ PyObject * tup = Py_BuildValue("KK", di->first, di->second);
+ if (tup != NULL) {
+ PyList_SET_ITEM(x, i, tup);
+ }
+ Py_XDECREF(tup);
+ }
+ if (!(i == d.size())) {
+ throw oxli_exception();
+ }
+
+ PyObject * ret = Py_BuildValue("OI", x, n_unassigned);
+ Py_DECREF(x);
+ return ret;
+}
+
+
+PyObject *
+subset_partition_sizes(khmer_KSubsetPartition_Object * me, PyObject * args)
+{
+ SubsetPartition * subset_p = me->subset;
+
+ unsigned int min_size = 0;
+
+ if (!PyArg_ParseTuple(args, "|I", &min_size)) {
+ return NULL;
+ }
+
+ PartitionCountMap cm;
+ unsigned int n_unassigned = 0;
+ subset_p->partition_sizes(cm, n_unassigned);
+
+ unsigned int i = 0;
+ PartitionCountMap::const_iterator mi;
+ for (mi = cm.begin(); mi != cm.end(); ++mi) {
+ if (mi->second >= min_size) {
+ i++;
+ }
+ }
+
+ PyObject * x = PyList_New(i);
+ if (x == NULL) {
+ return NULL;
+ }
+
+ // this should probably be a dict. @CTB
+ for (i = 0, mi = cm.begin(); mi != cm.end(); ++mi) {
+ if (mi->second >= min_size) {
+ PyObject * tup = Py_BuildValue("II", mi->first, mi->second);
+ if (tup != NULL) {
+ PyList_SET_ITEM(x, i, tup);
+ }
+ i++;
+ }
+ }
+
+ PyObject * ret = Py_BuildValue("OI", x, n_unassigned);
+ Py_DECREF(x);
+
+ return ret;
+}
+
+
+PyObject *
+subset_partition_average_coverages(khmer_KSubsetPartition_Object * me,
+ PyObject * args)
+{
+ SubsetPartition * subset_p = me->subset;
+
+ khmer_KCountgraph_Object * countgraph_o;
+
+ if (!PyArg_ParseTuple(args, "O!", &khmer_KCountgraph_Type, &countgraph_o)) {
+ return NULL;
+ }
+
+ PartitionCountMap cm;
+ subset_p->partition_average_coverages(cm, countgraph_o -> countgraph);
+
+ unsigned int i;
+ PartitionCountMap::iterator mi;
+
+ PyObject * x = PyList_New(cm.size());
+ if (x == NULL) {
+ return NULL;
+ }
+
+ // this should probably be a dict. @CTB
+ for (i = 0, mi = cm.begin(); mi != cm.end(); ++mi, i++) {
+ PyObject * tup = Py_BuildValue("II", mi->first, mi->second);
+ if (tup != NULL) {
+ PyList_SET_ITEM(x, i, tup);
+ }
+ }
+
+ return x;
+}
+
+
+
+}
diff --git a/src/khmer/_cpy_utils.cc b/src/khmer/_cpy_utils.cc
new file mode 100644
index 0000000..cc6cdfe
--- /dev/null
+++ b/src/khmer/_cpy_utils.cc
@@ -0,0 +1,177 @@
+#include "khmer/_cpy_utils.hh"
+#include "oxli/oxli.hh"
+
+using namespace oxli;
+using namespace oxli::read_parsers;
+
+namespace khmer {
+
+// Convert a hash to a python long object.
+bool convert_HashIntoType_to_PyObject(const HashIntoType &hashval,
+ PyObject **value)
+{
+ *value = PyLong_FromUnsignedLongLong(hashval);
+ return true;
+}
+
+
+// Convert a python long to a hash
+bool convert_PyLong_to_HashIntoType(PyObject * value, HashIntoType &hashval)
+{
+ if (PyLong_Check(value)) {
+ //(PyLongObject *)
+ hashval = PyLong_AsUnsignedLongLong(value);
+ return true;
+ } else if (PyInt_Check(value)) {
+ hashval = PyInt_AsLong(value);
+ return true;
+ } else {
+ PyErr_SetString(PyExc_ValueError, "could not convert to hash");
+ return false;
+ }
+}
+
+
+// Take a Python object and (try to) convert it to a HashIntoType.
+// Note: will set error condition and return false if cannot do.
+
+bool convert_PyObject_to_HashIntoType(PyObject * value,
+ HashIntoType& hashval,
+ WordLength ksize)
+{
+ if (PyInt_Check(value) || PyLong_Check(value)) {
+ return convert_PyLong_to_HashIntoType(value, hashval);
+ } else {
+ PyErr_SetString(PyExc_ValueError,
+ "must use a hash");
+ return false;
+ }
+}
+
+// Take a Python object and (try to) convert it to a HashIntoType.
+// Note: will set error condition and return false if cannot do.
+// Further note: the main difference between this and
+// ht_convert_PyObject_to_Kmer is that this will not pass HashIntoType
+// numbers through the Kmer class, which means reverse complements
+// will not be calculated. There is a test in test_nodegraph.py
+// that checks this.
+
+bool ht_convert_PyObject_to_HashIntoType(PyObject * value,
+ HashIntoType& hashval,
+ const Hashtable * ht)
+{
+ if (PyInt_Check(value) || PyLong_Check(value)) {
+ return convert_PyLong_to_HashIntoType(value, hashval);
+ } else if (PyUnicode_Check(value)) {
+ PyObject* val_as_str = PyUnicode_AsEncodedString(value,
+ "utf-8", "strict");
+ std::string s = PyBytes_AsString(val_as_str);
+ if (strlen(s.c_str()) != ht->ksize()) {
+ Py_DECREF(val_as_str);
+ PyErr_SetString(PyExc_ValueError,
+ "k-mer length must equal the k-mer size");
+ return false;
+ }
+
+ try {
+ hashval = ht->hash_dna(s.c_str());
+ } catch (oxli_exception &e) {
+ PyErr_SetString(PyExc_ValueError, e.what());
+ Py_DECREF(val_as_str);
+ return false;
+ }
+
+ Py_DECREF(val_as_str);
+ return true;
+
+ } else if (PyBytes_Check(value)) {
+ std::string s = PyBytes_AsString(value);
+ if (strlen(s.c_str()) != ht->ksize()) {
+ PyErr_SetString(PyExc_ValueError,
+ "k-mer length must equal the k-mer size");
+ return false;
+ }
+ try {
+ hashval = ht->hash_dna(s.c_str());
+ } catch (oxli_exception &e) {
+ PyErr_SetString(PyExc_ValueError, e.what());
+ return false;
+ }
+ return true;
+ } else {
+ PyErr_SetString(PyExc_ValueError,
+ "k-mers must be either a hash or a string");
+ return false;
+ }
+}
+
+// Take a Python object and (try to) convert it to a oxli::Kmer.
+// Note: will set error condition and return false if cannot do.
+
+bool ht_convert_PyObject_to_Kmer(PyObject * value,
+ Kmer& kmer, const Hashtable * ht)
+{
+ if (PyInt_Check(value) || PyLong_Check(value)) {
+ HashIntoType h;
+ if (!convert_PyLong_to_HashIntoType(value, h)) {
+ return false;
+ }
+ kmer.set_from_unique_hash(h, ht->ksize());
+ return true;
+ } else if (PyUnicode_Check(value)) {
+ std::string s = PyBytes_AsString(PyUnicode_AsEncodedString(
+ value, "utf-8", "strict"));
+ if (strlen(s.c_str()) != ht->ksize()) {
+ PyErr_SetString(PyExc_ValueError,
+ "k-mer length must equal the k-mer size");
+ return false;
+ }
+ kmer = Kmer(s, ht->ksize());
+ return true;
+
+ } else if (PyBytes_Check(value)) {
+ std::string s = PyBytes_AsString(value);
+ if (strlen(s.c_str()) != ht->ksize()) {
+ PyErr_SetString(PyExc_ValueError,
+ "k-mer length must equal the k-mer size");
+ return false;
+ }
+ kmer = Kmer(s, ht->ksize());
+ return true;
+ } else {
+ PyErr_SetString(PyExc_ValueError,
+ "k-mers must be either a hash or a string");
+ return false;
+ }
+}
+
+
+bool convert_Pytablesizes_to_vector(PyListObject * sizes_list_o,
+ std::vector<uint64_t>& sizes)
+{
+ Py_ssize_t sizes_list_o_length = PyList_GET_SIZE(sizes_list_o);
+ if (sizes_list_o_length < 1) {
+ PyErr_SetString(PyExc_ValueError,
+ "tablesizes needs to be one or more numbers");
+ return false;
+ }
+ for (Py_ssize_t i = 0; i < sizes_list_o_length; i++) {
+ PyObject * size_o = PyList_GET_ITEM(sizes_list_o, i);
+ if (PyLong_Check(size_o)) {
+ sizes.push_back(PyLong_AsUnsignedLongLong(size_o));
+ } else if (PyInt_Check(size_o)) {
+ sizes.push_back(PyInt_AsLong(size_o));
+ } else if (PyFloat_Check(size_o)) {
+ sizes.push_back(PyFloat_AS_DOUBLE(size_o));
+ } else {
+ PyErr_SetString(PyExc_TypeError,
+ "2nd argument must be a list of ints, longs, or floats");
+ return false;
+ }
+ }
+ return true;
+}
+
+FastxParserPtr& _PyObject_to_khmer_ReadParser(PyObject * py_object);
+
+}
diff --git a/lib/.check_openmp.cc b/src/oxli/.check_openmp.cc
similarity index 100%
rename from lib/.check_openmp.cc
rename to src/oxli/.check_openmp.cc
diff --git a/lib/.gitignore b/src/oxli/.gitignore
similarity index 100%
rename from lib/.gitignore
rename to src/oxli/.gitignore
diff --git a/lib/Makefile b/src/oxli/Makefile
similarity index 86%
rename from lib/Makefile
rename to src/oxli/Makefile
index d05c18c..681d5be 100644
--- a/lib/Makefile
+++ b/src/oxli/Makefile
@@ -67,15 +67,15 @@ PREFIX=/usr/local
### NOTE: No user-serviceable parts below this line! ###
-INCLUDES= -I ../third-party/seqan/core/include/ \
- -I ../third-party/smhasher/
+INCLUDES= -I ../../include/ -I ../../third-party/seqan/core/include/ \
+ -I ../../third-party/smhasher/
ifeq ($(USE_SYSTEM_ZLIB), false)
-INCLUDES += -I ../third-party/zlib/
+INCLUDES += -I ../../third-party/zlib/
endif
ifeq ($(USE_SYSTEM_LIBBZ2), false)
-INCLUDES += -I ../third-party/bzip2/
+INCLUDES += -I ../../third-party/bzip2/
endif
# Warnings in common to C and C++
@@ -115,9 +115,9 @@ CFLAGS += $(DEBUG_FLAGS)
endif
ifeq ($(WANT_EXTRA_SANITY_CHECKING), true)
-DEFINE_KHMER_EXTRA_SANITY_CHECKS=-DKHMER_EXTRA_SANITY_CHECKS
-CXXFLAGS += $(DEFINE_KHMER_EXTRA_SANITY_CHECKS)
-CFLAGS += $(DEFINE_KHMER_EXTRA_SANITY_CHECKS)
+DEFINE_OXLI_EXTRA_SANITY_CHECKS=-DOXLI_EXTRA_SANITY_CHECKS
+CXXFLAGS += $(DEFINE_OXLI_EXTRA_SANITY_CHECKS)
+CFLAGS += $(DEFINE_OXLI_EXTRA_SANITY_CHECKS)
endif
ifeq ($(WANT_PROFILING), true)
@@ -168,7 +168,7 @@ SONAME = liboxli.$(SHARED_EXT).$(LIB_VERSION)
SONAME_FLAGS = -Wl,-soname=$(SONAME)
endif
-LIBKHMERSO=$(SONAME)
+LIBOXLISO=$(SONAME)
CXXFLAGS += -DVERSION=$(VERSION)
@@ -185,7 +185,7 @@ export VERSION
#### Third party dependencies ####
# ZLIB, use .lo not .o, so we get -fPIC and other library-related flags
-ZLIB_DIR=../third-party/zlib
+ZLIB_DIR=../../third-party/zlib
ZLIB_OBJS_BASE=\
adler32.lo \
crc32.lo \
@@ -206,7 +206,7 @@ ZLIB_OBJS_BASE=\
ZLIB_OBJS=$(addprefix $(ZLIB_DIR)/, $(ZLIB_OBJS_BASE))
# BZ2
-BZIP2_DIR=../third-party/bzip2
+BZIP2_DIR=../../third-party/bzip2
BZIP2_OBJS_BASE= \
blocksort.o \
huffman.o \
@@ -221,7 +221,7 @@ BZIP2_OBJS=$(addprefix $(BZIP2_DIR)/, $(BZIP2_OBJS_BASE))
#### oxli proper below here ####
-LIBKHMER_OBJS= \
+LIBOXLI_OBJS= \
hashtable.o \
hashgraph.o \
hllcounter.o \
@@ -241,22 +241,23 @@ PRECOMILE_OBJS ?=
PRECLEAN_TARGS ?=
ifeq ($(USE_SYSTEM_ZLIB), false)
-LIBKHMER_OBJS += $(ZLIB_OBJS)
+LIBOXLI_OBJS += $(ZLIB_OBJS)
PRECOMILE_OBJS += $(ZLIB_OBJS)
PRECLEAN_TARGS += zlibclean
endif
ifeq ($(USE_SYSTEM_LIBBZ2), false)
-LIBKHMER_OBJS += $(BZIP2_OBJS)
+LIBOXLI_OBJS += $(BZIP2_OBJS)
PRECOMILE_OBJS += $(BZIP2_OBJS)
PRECLEAN_TARGS += libbz2clean
endif
-KHMER_HEADERS= \
+HEADERS= \
hashtable.hh \
+ hashgraph.hh \
hllcounter.hh \
- khmer_exception.hh \
- khmer.hh \
+ oxli_exception.hh \
+ oxli.hh \
kmer_hash.hh \
labelhash.hh \
traversal.hh \
@@ -267,11 +268,12 @@ KHMER_HEADERS= \
assembler.hh \
alphabets.hh \
storage.hh
+OXLI_HEADERS = $(addprefix ../../include/oxli/,$(HEADERS))
# START OF RULES #
# The all rule comes first!
-all: $(LIBKHMERSO) liboxli.a oxli.pc
+all: $(LIBOXLISO) liboxli.a oxli.pc
zlibclean:
(cd $(ZLIB_DIR) && make distclean)
@@ -281,14 +283,15 @@ libbz2clean:
clean: $(PRECLEAN_TARGS)
rm -f *.o *.a *.$(SHARED_EXT)* oxli.pc $(TEST_PROGS)
-install: $(LIBKHMERSO) liboxli.a oxli.pc $(KHMER_HEADERS)
+install: $(LIBOXLISO) liboxli.a oxli.pc $(OXLI_HEADERS)
+ rm -rf $(PREFIX)/include/oxli $(PREFIX)/include/khmer
mkdir -p $(PREFIX)/lib $(PREFIX)/lib/pkgconfig $(PREFIX)/include/oxli
- cp -r $(KHMER_HEADERS) \
- ../third-party/smhasher/MurmurHash3.h \
+ cp -r $(OXLI_HEADERS) \
+ ../../third-party/smhasher/MurmurHash3.h \
$(PREFIX)/include/oxli/
cp oxli.pc $(PREFIX)/lib/pkgconfig/
- cp $(LIBKHMERSO) liboxli.a $(PREFIX)/lib
- ln -sf $(PREFIX)/lib/$(LIBKHMERSO) $(PREFIX)/lib/liboxli.$(SHARED_EXT)
+ cp $(LIBOXLISO) liboxli.a $(PREFIX)/lib/
+ ln -sf $(PREFIX)/lib/$(LIBOXLISO) $(PREFIX)/lib/liboxli.$(SHARED_EXT)
oxli.pc: oxli.pc.in
sed -e 's, at prefix@,$(PREFIX),' -e 's, at VERSION@,$(VERSION),' $< >$@
@@ -300,16 +303,16 @@ $(BZIP2_OBJS):
(cd $(BZIP2_DIR) && make -f Makefile-libbz2_so $(BZIP2_OBJS_BASE))
# MurMur3
-murmur3.o: ../third-party/smhasher/MurmurHash3.cc
+murmur3.o: ../../third-party/smhasher/MurmurHash3.cc
$(CXX) $(CXXFLAGS) -c -o $@ $<
-%.o: %.cc $(PRECOMILE_OBJS) $(KHMER_HEADERS)
+%.o: %.cc $(PRECOMILE_OBJS) $(OXLI_HEADERS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) -c -o $@ $<
-$(LIBKHMERSO): $(LIBKHMER_OBJS)
+$(LIBOXLISO): $(LIBOXLI_OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(SONAME_FLAGS) -shared -o $@ $^
ln -sf $(SONAME) liboxli.$(SHARED_EXT)
-liboxli.a: $(LIBKHMER_OBJS)
+liboxli.a: $(LIBOXLI_OBJS)
ar rcs $@ $^
ranlib $@
diff --git a/lib/alphabets.cc b/src/oxli/alphabets.cc
similarity index 95%
rename from lib/alphabets.cc
rename to src/oxli/alphabets.cc
index 8b0a2c0..e1a3a05 100644
--- a/lib/alphabets.cc
+++ b/src/oxli/alphabets.cc
@@ -37,13 +37,15 @@ Contact: khmer-project at idyll.org
#include <string>
-namespace khmer
+namespace oxli
{
namespace alphabets
{
std::string DNA_SIMPLE = "ACGT";
std::string DNAN_SIMPLE = "ACGTN";
+std::string RNA_SIMPLE = "ACGUT";
+std::string RNAN_SIMPLE = "ACGUTN";
std::string IUPAC_NUCL = "ACGTURYSWKMBDHVN.-";
std::string IUPAC_AA = "ACDEFGHIKLMNPQRSTVWY";
diff --git a/lib/assembler.cc b/src/oxli/assembler.cc
similarity index 99%
rename from lib/assembler.cc
rename to src/oxli/assembler.cc
index 11f4fff..cf79c6d 100644
--- a/lib/assembler.cc
+++ b/src/oxli/assembler.cc
@@ -35,14 +35,14 @@ LICENSE (END)
Contact: khmer-project at idyll.org
*/
-#include "assembler.hh"
+#include "oxli/assembler.hh"
#include <algorithm>
#include <iostream>
using namespace std;
-namespace khmer
+namespace oxli
{
/********************************
diff --git a/lib/hashgraph.cc b/src/oxli/hashgraph.cc
similarity index 91%
rename from lib/hashgraph.cc
rename to src/oxli/hashgraph.cc
index 888b8f6..418ba01 100644
--- a/lib/hashgraph.cc
+++ b/src/oxli/hashgraph.cc
@@ -44,13 +44,13 @@ Contact: khmer-project at idyll.org
#include <queue>
#include <set>
-#include "hashgraph.hh"
-#include "khmer.hh"
-#include "read_parsers.hh"
+#include "oxli/hashgraph.hh"
+#include "oxli/oxli.hh"
+#include "oxli/read_parsers.hh"
using namespace std;
-using namespace khmer;
-using namespace khmer:: read_parsers;
+using namespace oxli;
+using namespace oxli:: read_parsers;
void Hashgraph::save_tagset(std::string outfilename)
{
@@ -80,7 +80,7 @@ void Hashgraph::save_tagset(std::string outfilename)
outfile.write((const char *) buf, sizeof(HashIntoType) * tagset_size);
if (outfile.fail()) {
delete[] buf;
- throw khmer_file_exception(strerror(errno));
+ throw oxli_file_exception(strerror(errno));
}
outfile.close();
@@ -104,13 +104,13 @@ void Hashgraph::load_tagset(std::string infilename, bool clear_tags)
} else {
err = "Unknown error in opening file: " + infilename;
}
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
} catch (const std::exception &e) {
// Catching std::exception is a stopgap for
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66145
std::string err = "Unknown error opening file: " + infilename + " "
+ strerror(errno);
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
if (clear_tags) {
@@ -136,18 +136,18 @@ void Hashgraph::load_tagset(std::string infilename, bool clear_tags)
}
err << " while reading tagset from " << infilename
<< "; should be " << SAVED_SIGNATURE;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
} else if (!(version == SAVED_FORMAT_VERSION)) {
std::ostringstream err;
err << "Incorrect file format version " << (int) version
<< " while reading tagset from " << infilename
<< "; should be " << (int) SAVED_FORMAT_VERSION;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
} else if (!(ht_type == SAVED_TAGS)) {
std::ostringstream err;
err << "Incorrect file format type " << (int) ht_type
<< " while reading tagset from " << infilename;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
}
infile.read((char *) &save_ksize, sizeof(save_ksize));
@@ -155,7 +155,7 @@ void Hashgraph::load_tagset(std::string infilename, bool clear_tags)
std::ostringstream err;
err << "Incorrect k-mer size " << save_ksize
<< " while reading tagset from " << infilename;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
}
infile.read((char *) &tagset_size, sizeof(tagset_size));
@@ -175,25 +175,25 @@ void Hashgraph::load_tagset(std::string infilename, bool clear_tags)
if (buf != NULL) {
delete[] buf;
}
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
/* Yes, this is boneheaded. Unfortunately, there is a bug in gcc > 5
* regarding the basic_ios::failure that makes it impossible to catch
* with more specificty. So, we catch *all* exceptions after trying to
* get the ifstream::failure, and assume it must have been the buggy one.
* Unfortunately, this would also cause us to catch the
- * khmer_file_exceptions thrown above, so we catch them again first and
+ * oxli_file_exceptions thrown above, so we catch them again first and
* rethrow them :) If this is understandably irritating to you, please
* bother the gcc devs at:
* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66145
*
* See also: http://media4.giphy.com/media/3o6UBpHgaXFDNAuttm/giphy.gif
*/
- } catch (khmer_file_exception &e) {
+ } catch (oxli_file_exception &e) {
throw e;
} catch (const std::exception &e) {
std::string err = "Unknown error opening file: " + infilename + " "
+ strerror(errno);
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
}
@@ -309,13 +309,12 @@ void Hashgraph::consume_seqfile_and_tag(
break;
}
- if (check_and_normalize_read( read.sequence )) {
- unsigned long long this_n_consumed = 0;
- consume_sequence_and_tag( read.sequence, this_n_consumed );
+ read.set_clean_seq();
+ unsigned long long this_n_consumed = 0;
+ consume_sequence_and_tag(read.cleaned_seq, this_n_consumed);
- __sync_add_and_fetch( &n_consumed, this_n_consumed );
- __sync_add_and_fetch( &total_reads, 1 );
- }
+ __sync_add_and_fetch(&n_consumed, this_n_consumed);
+ __sync_add_and_fetch(&total_reads, 1);
} // while reads left for parser
}
@@ -373,21 +372,20 @@ void Hashgraph::consume_partitioned_fasta(
} catch (NoMoreReadsAvailable &exc) {
break;
}
- seq = read.sequence;
+ read.set_clean_seq();
+ seq = read.cleaned_seq;
- if (check_and_normalize_read(seq)) {
- // First, figure out what the partition is (if non-zero), and save that.
- PartitionID p = _parse_partition_id(read.name);
+ // First, figure out what the partition is (if non-zero), and save that.
+ PartitionID p = _parse_partition_id(read.name);
- // Then consume the sequence
- n_consumed += consume_string(seq); // @CTB why are we doing this?
+ // Then consume the sequence
+ n_consumed += consume_string(seq); // @CTB why are we doing this?
- // Next, compute the tag & set the partition, if nonzero
- HashIntoType kmer = hash_dna(seq.c_str());
- all_tags.insert(kmer);
- if (p > 0) {
- partition->set_partition_id(kmer, p);
- }
+ // Next, compute the tag & set the partition, if nonzero
+ HashIntoType kmer = hash_dna(seq.c_str());
+ all_tags.insert(kmer);
+ if (p > 0) {
+ partition->set_partition_id(kmer, p);
}
// reset the sequence info, increment read number
@@ -467,10 +465,6 @@ unsigned int Hashgraph::kmer_degree(const char * kmer_s)
size_t Hashgraph::trim_on_stoptags(std::string seq) const
{
- if (!check_and_normalize_read(seq)) {
- return 0;
- }
-
KmerIterator kmers(seq.c_str(), _ksize);
size_t i = _ksize - 2;
@@ -534,7 +528,7 @@ const
total++;
if (!(breadth >= cur_breadth)) { // keep track of watermark, for debugging.
- throw khmer_exception();
+ throw oxli_exception();
}
if (breadth > cur_breadth) {
cur_breadth = breadth;
@@ -571,13 +565,13 @@ void Hashgraph::load_stop_tags(std::string infilename, bool clear_tags)
} else {
err = "Unknown error in opening file: " + infilename;
}
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
} catch (const std::exception &e) {
// Catching std::exception is a stopgap for
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66145
std::string err = "Unknown error opening file: " + infilename + " "
+ strerror(errno);
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
if (clear_tags) {
@@ -602,18 +596,18 @@ void Hashgraph::load_stop_tags(std::string infilename, bool clear_tags)
}
err << " while reading stoptags from " << infilename
<< "; should be " << SAVED_SIGNATURE;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
} else if (!(version == SAVED_FORMAT_VERSION)) {
std::ostringstream err;
err << "Incorrect file format version " << (int) version
<< " while reading stoptags from " << infilename
<< "; should be " << (int) SAVED_FORMAT_VERSION;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
} else if (!(ht_type == SAVED_STOPTAGS)) {
std::ostringstream err;
err << "Incorrect file format type " << (int) ht_type
<< " while reading stoptags from " << infilename;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
}
infile.read((char *) &save_ksize, sizeof(save_ksize));
@@ -621,7 +615,7 @@ void Hashgraph::load_stop_tags(std::string infilename, bool clear_tags)
std::ostringstream err;
err << "Incorrect k-mer size " << save_ksize
<< " while reading stoptags from " << infilename;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
}
infile.read((char *) &tagset_size, sizeof(tagset_size));
@@ -635,15 +629,15 @@ void Hashgraph::load_stop_tags(std::string infilename, bool clear_tags)
delete[] buf;
} catch (std::ifstream::failure &e) {
std::string err = "Error reading stoptags from: " + infilename;
- throw khmer_file_exception(err);
- } catch (khmer_file_exception &e) {
+ throw oxli_file_exception(err);
+ } catch (oxli_file_exception &e) {
throw e;
} catch (const std::exception &e) {
// Catching std::exception is a stopgap for
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66145
std::string err = "Unknown error opening file: " + infilename + " "
+ strerror(errno);
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
}
@@ -759,7 +753,7 @@ void Hashgraph::extract_unique_paths(std::string seq,
// then extract.
if (!(j == min_length)) {
- throw khmer_exception();
+ throw oxli_exception();
}
if ( ((float)seen_counter / (float) j) <= max_seen) {
unsigned int start = i;
@@ -875,7 +869,7 @@ const
void Nodegraph::update_from(const Nodegraph &otherBASE)
{
if (_ksize != otherBASE._ksize) {
- throw khmer_exception("both nodegraphs must have same k size");
+ throw oxli_exception("both nodegraphs must have same k size");
}
BitStorage * myself = dynamic_cast<BitStorage *>(this->store);
const BitStorage * other;
@@ -885,7 +879,7 @@ void Nodegraph::update_from(const Nodegraph &otherBASE)
if (myself && other) {
myself->update_from(*other);
} else {
- throw khmer_exception("update_from failed with incompatible objects");
+ throw oxli_exception("update_from failed with incompatible objects");
}
}
diff --git a/lib/hashtable.cc b/src/oxli/hashtable.cc
similarity index 80%
rename from lib/hashtable.cc
rename to src/oxli/hashtable.cc
index c8d30b8..aac2240 100644
--- a/lib/hashtable.cc
+++ b/src/oxli/hashtable.cc
@@ -46,63 +46,16 @@ Contact: khmer-project at idyll.org
#include <set>
#include <memory>
-#include "hashtable.hh"
-#include "khmer.hh"
-#include "traversal.hh"
-#include "read_parsers.hh"
-#include "kmer_hash.hh"
+#include "oxli/hashtable.hh"
+#include "oxli/oxli.hh"
+#include "oxli/traversal.hh"
+#include "oxli/read_parsers.hh"
+#include "oxli/kmer_hash.hh"
using namespace std;
-using namespace khmer;
-using namespace khmer::read_parsers;
+using namespace oxli;
+using namespace oxli:: read_parsers;
-namespace khmer
-{
-
-//
-// check_and_process_read: checks for non-ACGT characters before consuming
-//
-
-unsigned int Hashtable::check_and_process_read(std::string &read,
- bool &is_valid)
-{
- is_valid = check_and_normalize_read(read);
-
- if (!is_valid) {
- return 0;
- }
-
- return consume_string(read);
-}
-
-//
-// check_and_normalize_read: checks for non-ACGT characters
-// converts lowercase characters to uppercase one
-// Note: Usually it is desirable to keep checks and mutations separate.
-// However, in the interests of efficiency (we are potentially working
-// with TB of data), a check and mutation have been placed inside the
-// same loop. Potentially trillions fewer fetches from memory would
-// seem to be a worthwhile goal.
-//
-
-bool Hashtable::check_and_normalize_read(std::string &read) const
-{
- bool rc = true;
-
- if (read.length() < _ksize) {
- return false;
- }
-
- for (unsigned int i = 0; i < read.length(); i++) {
- read[ i ] &= 0xdf; // toupper - knock out the "lowercase bit"
- if (!is_valid_dna( read[ i ] )) {
- rc = false;
- break;
- }
- }
-
- return rc;
-}
//
// consume_seqfile: consume a file of reads
@@ -121,6 +74,20 @@ void Hashtable::consume_seqfile(
}
template<typename SeqIO>
+void Hashtable::consume_seqfile_banding(
+ std::string const &filename,
+ unsigned int num_bands,
+ unsigned int band,
+ unsigned int &total_reads,
+ unsigned long long &n_consumed
+)
+{
+ ReadParserPtr<SeqIO> parser = get_parser<SeqIO>(filename);
+ consume_seqfile_banding<SeqIO>(parser, num_bands, band, total_reads,
+ n_consumed);
+}
+
+template<typename SeqIO>
void Hashtable::consume_seqfile(
ReadParserPtr<SeqIO>& parser,
unsigned int &total_reads,
@@ -131,15 +98,14 @@ void Hashtable::consume_seqfile(
// Iterate through the reads and consume their k-mers.
while (!parser->is_complete( )) {
- bool is_valid;
try {
read = parser->get_next_read( );
} catch (NoMoreReadsAvailable) {
break;
}
- unsigned int this_n_consumed =
- check_and_process_read(read.sequence, is_valid);
+ read.set_clean_seq();
+ unsigned int this_n_consumed = consume_string(read.cleaned_seq);
__sync_add_and_fetch( &n_consumed, this_n_consumed );
__sync_add_and_fetch( &total_reads, 1 );
@@ -148,6 +114,44 @@ void Hashtable::consume_seqfile(
} // consume_seqfile
+template<typename SeqIO>
+void Hashtable::consume_seqfile_banding(
+ ReadParserPtr<SeqIO>& parser,
+ unsigned int num_bands,
+ unsigned int band,
+ unsigned int &total_reads,
+ unsigned long long &n_consumed
+)
+{
+ Read read;
+ std::pair<uint64_t, uint64_t> interval = compute_band_interval(num_bands,
+ band);
+
+ while (!parser->is_complete()) {
+ try {
+ read = parser->get_next_read( );
+ } catch (NoMoreReadsAvailable) {
+ break;
+ }
+
+ read.set_clean_seq();
+ unsigned int this_n_consumed = 0;
+ KmerHashIteratorPtr kmers = new_kmer_iterator(read.cleaned_seq);
+ while(!kmers->done()) {
+ HashIntoType kmer = kmers->next();
+ if (kmer >= interval.first && kmer < interval.second) {
+ count(kmer);
+ this_n_consumed++;
+ }
+ }
+
+ __sync_add_and_fetch( &n_consumed, this_n_consumed );
+ __sync_add_and_fetch( &total_reads, 1 );
+
+ } // while reads left for parser
+
+} // consume_seqfile_banding
+
//
// consume_string: run through every k-mer in the given string, & hash it.
//
@@ -180,7 +184,7 @@ void Hashtable::get_median_count(const std::string &s,
this->get_kmer_counts(s, counts);
if (!counts.size()) {
- throw khmer_exception("no k-mer counts for this string; too short?");
+ throw oxli_exception("no k-mer counts for this string; too short?");
}
average = 0;
@@ -343,7 +347,7 @@ uint64_t * Hashtable::abundance_distribution(
// if not, could lead to overflow.
if (sizeof(BoundedCounterType) != 2) {
delete[] dist;
- throw khmer_exception();
+ throw oxli_exception();
}
while(!parser->is_complete()) {
@@ -352,20 +356,19 @@ uint64_t * Hashtable::abundance_distribution(
} catch (NoMoreReadsAvailable &exc) {
break;
}
- seq = read.sequence;
+ read.set_clean_seq();
+ seq = read.cleaned_seq;
- if (check_and_normalize_read(seq)) {
- KmerHashIteratorPtr kmers = new_kmer_iterator(seq);
+ KmerHashIteratorPtr kmers = new_kmer_iterator(seq);
- while(!kmers->done()) {
- HashIntoType kmer = kmers->next();
+ while(!kmers->done()) {
+ HashIntoType kmer = kmers->next();
- if (!tracking->get_count(kmer)) {
- tracking->count(kmer);
+ if (!tracking->get_count(kmer)) {
+ tracking->count(kmer);
- BoundedCounterType n = get_count(kmer);
- dist[n]++;
- }
+ BoundedCounterType n = get_count(kmer);
+ dist[n]++;
}
name.clear();
@@ -389,10 +392,6 @@ unsigned long Hashtable::trim_on_abundance(
BoundedCounterType min_abund)
const
{
- if (!check_and_normalize_read(seq)) {
- return 0;
- }
-
KmerHashIteratorPtr kmers = new_kmer_iterator(seq);
HashIntoType kmer;
@@ -424,12 +423,7 @@ unsigned long Hashtable::trim_below_abundance(
BoundedCounterType max_abund)
const
{
- if (!check_and_normalize_read(seq)) {
- return 0;
- }
-
KmerHashIteratorPtr kmers = new_kmer_iterator(seq);
-
HashIntoType kmer;
if (kmers->done()) {
@@ -460,10 +454,6 @@ std::vector<unsigned int> Hashtable::find_spectral_error_positions(
const
{
std::vector<unsigned int> posns;
- if (!check_and_normalize_read(seq)) {
- throw khmer_exception("invalid read");
- }
-
KmerHashIteratorPtr kmers = new_kmer_iterator(seq);
HashIntoType kmer = kmers->next();
@@ -513,18 +503,39 @@ template void Hashtable::consume_seqfile<FastxReader>(
unsigned int &total_reads,
unsigned long long &n_consumed
);
+
+
template void Hashtable::consume_seqfile<FastxReader>(
ReadParserPtr<FastxReader>& parser,
unsigned int &total_reads,
unsigned long long &n_consumed
);
+
+template void Hashtable::consume_seqfile_banding<FastxReader>(
+ std::string const &filename,
+ unsigned int num_bands,
+ unsigned int bands,
+ unsigned int &total_reads,
+ unsigned long long &n_consumed
+);
+
+
+template void Hashtable::consume_seqfile_banding<FastxReader>(
+ ReadParserPtr<FastxReader>& parser,
+ unsigned int num_bands,
+ unsigned int bands,
+ unsigned int &total_reads,
+ unsigned long long &n_consumed
+);
+
+
template uint64_t * Hashtable::abundance_distribution<FastxReader>(
ReadParserPtr<FastxReader>& parser,
Hashtable * tracking
);
+
+
template uint64_t * Hashtable::abundance_distribution<FastxReader>(
std::string filename,
Hashtable * tracking
);
-
-} // namespace khmer
diff --git a/lib/hllcounter.cc b/src/oxli/hllcounter.cc
similarity index 97%
rename from lib/hllcounter.cc
rename to src/oxli/hllcounter.cc
index 176c195..bb4962a 100644
--- a/lib/hllcounter.cc
+++ b/src/oxli/hllcounter.cc
@@ -42,11 +42,11 @@ Contact: khmer-project at idyll.org
#include <numeric>
#include <utility>
-#include "hllcounter.hh"
-#include "khmer.hh"
-#include "khmer_exception.hh"
-#include "kmer_hash.hh"
-#include "read_parsers.hh"
+#include "oxli/hllcounter.hh"
+#include "oxli/oxli.hh"
+#include "oxli/oxli_exception.hh"
+#include "oxli/kmer_hash.hh"
+#include "oxli/read_parsers.hh"
#ifdef _OPENMP
#include <omp.h>
@@ -57,8 +57,9 @@ Contact: khmer-project at idyll.org
#define arr_len(a) (a + sizeof a / sizeof a[0])
-using namespace khmer;
-using namespace khmer::read_parsers;
+using namespace oxli;
+using namespace oxli::read_parsers;
+
std::map<int, std::vector<double> > rawEstimateData;
std::map<int, std::vector<double> > biasData;
@@ -348,7 +349,7 @@ uint64_t HLLCounter::estimate_cardinality()
void HLLCounter::add(const std::string &value)
{
- HashIntoType x = khmer::_hash_murmur(value, value.length());
+ HashIntoType x = oxli::_hash_murmur(value, value.length());
uint64_t j = x & (this->m - 1);
this->M[j] = std::max(this->M[j], get_rho(x >> this->p, 64 - this->p));
}
@@ -502,7 +503,7 @@ bool HLLCounter::check_and_normalize_read(std::string &read) const
void HLLCounter::merge(HLLCounter &other)
{
if (this->p != other.p || this->_ksize != other._ksize) {
- throw khmer_exception("HLLCounters to be merged must be created with same parameters");
+ throw oxli_exception("HLLCounters to be merged must be created with same parameters");
}
for(unsigned int i=0; i < this->M.size(); ++i) {
this->M[i] = std::max(other.M[i], this->M[i]);
diff --git a/lib/kmer_filters.cc b/src/oxli/kmer_filters.cc
similarity index 97%
rename from lib/kmer_filters.cc
rename to src/oxli/kmer_filters.cc
index 34a3fea..987ec32 100644
--- a/lib/kmer_filters.cc
+++ b/src/oxli/kmer_filters.cc
@@ -36,13 +36,13 @@ Contact: khmer-project at idyll.org
*/
#include <algorithm>
-#include "khmer.hh"
-#include "hashtable.hh"
-#include "labelhash.hh"
-#include "kmer_filters.hh"
+#include "oxli/oxli.hh"
+#include "oxli/hashtable.hh"
+#include "oxli/labelhash.hh"
+#include "oxli/kmer_filters.hh"
-namespace khmer
+namespace oxli
{
bool apply_kmer_filters(const Kmer& node, const std::list<KmerFilter>& filters)
diff --git a/lib/kmer_hash.cc b/src/oxli/kmer_hash.cc
similarity index 83%
rename from lib/kmer_hash.cc
rename to src/oxli/kmer_hash.cc
index c94016c..28e19ee 100644
--- a/lib/kmer_hash.cc
+++ b/src/oxli/kmer_hash.cc
@@ -43,9 +43,9 @@ Contact: khmer-project at idyll.org
#include <assert.h>
#include "MurmurHash3.h"
-#include "khmer.hh"
-#include "khmer_exception.hh"
-#include "kmer_hash.hh"
+#include "oxli/oxli.hh"
+#include "oxli/oxli_exception.hh"
+#include "oxli/kmer_hash.hh"
using namespace std;
@@ -53,19 +53,20 @@ using namespace std;
// _hash: hash a k-length DNA sequence into a 64-bit number.
//
-namespace khmer
+namespace oxli
{
HashIntoType _hash(const char * kmer, const WordLength k,
HashIntoType& _h, HashIntoType& _r)
{
// sizeof(HashIntoType) * 8 bits / 2 bits/base
+
if (k > sizeof(HashIntoType)*4) {
- throw khmer_exception("Supplied kmer string doesn't match the underlying k-size.");
+ throw oxli_exception("Supplied kmer string doesn't match the underlying k-size.");
}
if (strlen(kmer) < k) {
- throw khmer_exception("k-mer is too short to hash.");
+ throw oxli_exception("k-mer is too short to hash.");
}
HashIntoType h = 0, r = 0;
@@ -94,7 +95,7 @@ HashIntoType _hash(const char * kmer, const WordLength k)
HashIntoType h = 0;
HashIntoType r = 0;
- return khmer::_hash(kmer, k, h, r);
+ return oxli::_hash(kmer, k, h, r);
}
// _hash_forward: return the hash from the forward direction only.
@@ -105,7 +106,7 @@ HashIntoType _hash_forward(const char * kmer, WordLength k)
HashIntoType r = 0;
- khmer::_hash(kmer, k, h, r);
+ oxli::_hash(kmer, k, h, r);
return h; // return forward only
}
@@ -177,7 +178,8 @@ HashIntoType _hash_murmur(const std::string& kmer, const WordLength k)
HashIntoType h = 0;
HashIntoType r = 0;
- return khmer::_hash_murmur(kmer, k, h, r);
+ return oxli::_hash_murmur(kmer, k, h, r);
+
}
HashIntoType _hash_murmur(const std::string& kmer, const WordLength k,
@@ -189,7 +191,7 @@ HashIntoType _hash_murmur(const std::string& kmer, const WordLength k,
h = out[0];
assert(kmer.length() == k); // an assumption of the below code
- std::string rev = khmer::_revcomp(kmer);
+ std::string rev = oxli::_revcomp(kmer);
if (rev == kmer) {
// self complement kmer, can't use bitwise XOR
r = out[0];
@@ -207,10 +209,27 @@ HashIntoType _hash_murmur_forward(const std::string& kmer, const WordLength k)
HashIntoType h = 0;
HashIntoType r = 0;
- khmer::_hash_murmur(kmer, k, h, r);
+ oxli::_hash_murmur(kmer, k, h, r);
+
return h;
}
+std::pair<uint64_t, uint64_t> compute_band_interval(unsigned int num_bands,
+ unsigned int band)
+{
+ if (band > num_bands) {
+ std::string message = "'band' must be in the interval [0, 'num_bands')";
+ message += ", " + std::to_string(band) + " not in [0, " +
+ std::to_string(num_bands) + ")";
+ throw InvalidValue(message);
+ }
+ uint64_t band_size = std::numeric_limits<uint64_t>::max() / num_bands;
+ uint64_t min = band_size * band;
+ uint64_t max = band_size * (band + 1);
+ std::pair<uint64_t, uint64_t> interval (min, max);
+ return interval;
+}
+
KmerIterator::KmerIterator(const char * seq,
unsigned char k) :
KmerFactory(k), _seq(seq)
@@ -245,7 +264,7 @@ Kmer KmerIterator::first(HashIntoType& f, HashIntoType& r)
Kmer KmerIterator::next(HashIntoType& f, HashIntoType& r)
{
if (done()) {
- throw khmer_exception();
+ throw oxli_exception("KmerIterator done.");
}
if (!initialized) {
@@ -256,7 +275,7 @@ Kmer KmerIterator::next(HashIntoType& f, HashIntoType& r)
unsigned char ch = _seq[index];
index++;
if (!(index <= length)) {
- throw khmer_exception();
+ throw oxli_exception("KmerIterator index <= length; should have finished.");
}
// left-shift the previous hash over
diff --git a/lib/labelhash.cc b/src/oxli/labelhash.cc
similarity index 89%
rename from lib/labelhash.cc
rename to src/oxli/labelhash.cc
index 3fad2ab..4e6da50 100644
--- a/lib/labelhash.cc
+++ b/src/oxli/labelhash.cc
@@ -41,11 +41,11 @@ Contact: khmer-project at idyll.org
#include <sstream> // IWYU pragma: keep
#include <set>
-#include "hashgraph.hh"
-#include "khmer_exception.hh"
-#include "labelhash.hh"
-#include "read_parsers.hh"
-#include "subset.hh"
+#include "oxli/hashgraph.hh"
+#include "oxli/oxli_exception.hh"
+#include "oxli/labelhash.hh"
+#include "oxli/read_parsers.hh"
+#include "oxli/subset.hh"
#define IO_BUF_SIZE 250*1000*1000
@@ -55,11 +55,9 @@ Contact: khmer-project at idyll.org
#define DEBUG 0
using namespace std;
-using namespace khmer;
-using namespace khmer::read_parsers;
+using namespace oxli;
+using namespace oxli:: read_parsers;
-namespace khmer
-{
/*
* @camillescott
@@ -108,21 +106,21 @@ void LabelHash::consume_seqfile_and_tag_with_labels(
break;
}
- if (graph->check_and_normalize_read( read.sequence )) {
- // TODO: make threadsafe!
- unsigned long long this_n_consumed = 0;
- consume_sequence_and_tag_with_labels( read.sequence,
- this_n_consumed,
- the_label );
- the_label++;
+ read.set_clean_seq();
+
+ // TODO: make threadsafe!
+ unsigned long long this_n_consumed = 0;
+ consume_sequence_and_tag_with_labels( read.cleaned_seq,
+ this_n_consumed,
+ the_label );
+ the_label++;
#if (0) // Note: Used with callback - currently disabled.
- n_consumed_LOCAL = __sync_add_and_fetch( &n_consumed, this_n_consumed );
+ n_consumed_LOCAL = __sync_add_and_fetch( &n_consumed, this_n_consumed );
#else
- __sync_add_and_fetch( &n_consumed, this_n_consumed );
+ __sync_add_and_fetch( &n_consumed, this_n_consumed );
#endif
- __sync_add_and_fetch( &total_reads, 1 );
- }
+ __sync_add_and_fetch( &total_reads, 1 );
// TODO: Figure out alternative to callback into Python VM
// Cannot use in multi-threaded operation.
@@ -171,19 +169,19 @@ void LabelHash::consume_partitioned_fasta_and_tag_with_labels(
PartitionID p;
while(!parser->is_complete()) {
read = parser->get_next_read();
- seq = read.sequence;
-
- if (graph->check_and_normalize_read(seq)) {
- // First, figure out what the partition is (if non-zero), and
- // save that.
- printdbg(parsing partition id)
- p = _parse_partition_id(read.name);
- printdbg(consuming sequence and tagging)
- consume_sequence_and_tag_with_labels( seq,
- n_consumed,
- p );
- printdbg(back in consume_partitioned)
- }
+
+ read.set_clean_seq();
+ seq = read.cleaned_seq;
+
+ // First, figure out what the partition is (if non-zero), and
+ // save that.
+ printdbg(parsing partition id)
+ p = _parse_partition_id(read.name);
+ printdbg(consuming sequence and tagging)
+ consume_sequence_and_tag_with_labels( seq,
+ n_consumed,
+ p );
+ printdbg(back in consume_partitioned)
// reset the sequence info, increment read number
total_reads++;
@@ -322,7 +320,7 @@ unsigned int LabelHash::sweep_label_neighborhood(const std::string& seq,
//printf("range=%u ", range);
if (range == 0) {
if (!(num_traversed == seq.length()-graph->ksize()+1)) {
- throw khmer_exception();
+ throw oxli_exception();
}
}
tagged_kmers.clear();
@@ -418,7 +416,7 @@ void LabelHash::save_labels_and_tags(std::string filename)
if (outfile.fail()) {
delete[] buf;
- throw khmer_file_exception(strerror(errno));
+ throw oxli_file_exception(strerror(errno));
}
outfile.close();
@@ -441,13 +439,13 @@ void LabelHash::load_labels_and_tags(std::string filename)
} else {
err = "Unknown error in opening file: " + filename;
}
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
} catch (const std::exception &e) {
// Catching std::exception is a stopgap for
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66145
std::string err = "Unknown error opening file: " + filename + " "
+ strerror(errno);
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
unsigned long n_labeltags = 1;
@@ -467,17 +465,17 @@ void LabelHash::load_labels_and_tags(std::string filename)
}
err << " while reading labels/tags from " << filename
<< " Should be: " << SAVED_SIGNATURE;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
} else if (!(version == SAVED_FORMAT_VERSION)) {
std::ostringstream err;
err << "Incorrect file format version " << (int) version
<< " while reading labels/tags from " << filename;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
} else if (!(ht_type == SAVED_LABELSET)) {
std::ostringstream err;
err << "Incorrect file format type " << (int) ht_type
<< " while reading labels/tags from " << filename;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
}
infile.read((char *) &save_ksize, sizeof(save_ksize));
@@ -485,20 +483,20 @@ void LabelHash::load_labels_and_tags(std::string filename)
std::ostringstream err;
err << "Incorrect k-mer size " << save_ksize
<< " while reading labels/tags from " << filename;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
}
infile.read((char *) &n_labeltags, sizeof(n_labeltags));
} catch (std::ifstream::failure &e) {
std::string err;
err = "Unknown error reading header info from: " + filename;
- throw khmer_file_exception(err);
- } catch (khmer_file_exception &e) {
+ throw oxli_file_exception(err);
+ } catch (oxli_file_exception &e) {
throw e;
} catch (const std::exception &e) {
std::string err = "Unknown error opening file: " + filename + " "
+ strerror(errno);
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
char * buf = new char[IO_BUF_SIZE];
@@ -528,7 +526,7 @@ void LabelHash::load_labels_and_tags(std::string filename)
std::string err;
err = "Unknown error reading data from: " + filename;
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
}
@@ -553,19 +551,19 @@ void LabelHash::load_labels_and_tags(std::string filename)
}
if (!(i == n_bytes)) {
delete[] buf;
- throw khmer_file_exception("unknown error reading labels and tags");
+ throw oxli_file_exception("unknown error reading labels and tags");
}
memcpy(buf, buf + n_bytes, remainder);
}
if (remainder != 0) {
delete[] buf;
- throw khmer_file_exception("unknown error reading labels and tags");
+ throw oxli_file_exception("unknown error reading labels and tags");
}
if (loaded != n_labeltags) {
delete[] buf;
- throw khmer_file_exception("error loading labels: too few loaded");
+ throw oxli_file_exception("error loading labels: too few loaded");
}
delete[] buf;
@@ -634,4 +632,3 @@ template void LabelHash::consume_partitioned_fasta_and_tag_with_labels<FastxRead
void * callback_datac = NULL
);
-} // namespace khmer
diff --git a/lib/oxli.pc.in b/src/oxli/oxli.pc.in
similarity index 100%
rename from lib/oxli.pc.in
rename to src/oxli/oxli.pc.in
diff --git a/lib/read_aligner.cc b/src/oxli/read_aligner.cc
similarity index 99%
rename from lib/read_aligner.cc
rename to src/oxli/read_aligner.cc
index db44109..e337848 100644
--- a/lib/read_aligner.cc
+++ b/src/oxli/read_aligner.cc
@@ -43,11 +43,11 @@ Contact: khmer-project at idyll.org
#include <set>
#include <utility>
-#include "hashtable.hh"
-#include "khmer_exception.hh"
-#include "read_aligner.hh"
+#include "oxli/hashtable.hh"
+#include "oxli/oxli_exception.hh"
+#include "oxli/read_aligner.hh"
-namespace khmer
+namespace oxli
{
Alignment * _empty_alignment()
@@ -417,7 +417,7 @@ Alignment* ReadAligner::ExtractAlignment(AlignmentNode* node,
if (!(node->seq_idx < read.length())) {
delete ret;
- throw khmer_exception();
+ throw oxli_exception();
}
std::string read_alignment = "";
std::string graph_alignment = "";
diff --git a/lib/read_parsers.cc b/src/oxli/read_parsers.cc
similarity index 91%
rename from lib/read_parsers.cc
rename to src/oxli/read_parsers.cc
index 1a44c60..749ecc4 100644
--- a/lib/read_parsers.cc
+++ b/src/oxli/read_parsers.cc
@@ -36,10 +36,14 @@ LICENSE (END)
Contact: khmer-project at idyll.org
*/
#include <fstream>
-#include "khmer_exception.hh"
-#include "read_parsers.hh"
+#include "seqan/seq_io.h" // IWYU pragma: keep
+#include "seqan/sequence.h" // IWYU pragma: keep
+#include "seqan/stream.h" // IWYU pragma: keep
+#include "oxli/oxli_exception.hh"
+#include "oxli/read_parsers.hh"
-namespace khmer
+
+namespace oxli
{
namespace read_parsers
@@ -74,7 +78,7 @@ void ReadParser<SeqIO>::_init()
REG_EXTENDED | REG_NOSUB
);
if (regex_rc) {
- throw khmer_exception("Could not compile R2 nosub regex");
+ throw oxli_exception("Could not compile R2 nosub regex");
}
regex_rc =
regcomp(
@@ -82,7 +86,7 @@ void ReadParser<SeqIO>::_init()
"^.+(/1| 1:[YN]:[[:digit:]]+:[[:alpha:]]+).{0}", REG_EXTENDED
);
if (regex_rc) {
- throw khmer_exception("Could not compile R1 regex");
+ throw oxli_exception("Could not compile R1 regex");
}
regex_rc =
regcomp(
@@ -90,7 +94,7 @@ void ReadParser<SeqIO>::_init()
"^.+(/2| 2:[YN]:[[:digit:]]+:[[:alpha:]]+).{0}", REG_EXTENDED
);
if (regex_rc) {
- throw khmer_exception("Could not compile R2 regex");
+ throw oxli_exception("Could not compile R2 regex");
}
}
@@ -238,13 +242,14 @@ void ReadParser<SeqIO>::close()
void FastxReader::_init()
{
- seqan::open(_stream, _filename.c_str());
- if (!seqan::isGood(_stream)) {
+ _stream = std::unique_ptr<seqan::SequenceStream>(new seqan::SequenceStream());
+ seqan::open(*_stream, _filename.c_str());
+ if (!seqan::isGood(*_stream)) {
std::string message = "File ";
message = message + _filename + " contains badly formatted sequence";
message = message + " or does not exist.";
throw InvalidStream(message);
- } else if (seqan::atEnd(_stream)) {
+ } else if (seqan::atEnd(*_stream)) {
std::string message = "File ";
message = message + _filename + " does not contain any sequences!";
throw InvalidStream(message);
@@ -278,12 +283,12 @@ FastxReader::FastxReader(FastxReader& other)
FastxReader::~FastxReader()
{
- seqan::close(_stream);
+ seqan::close(*_stream);
}
bool FastxReader::is_complete()
{
- return !seqan::isGood(_stream) || seqan::atEnd(_stream);
+ return !seqan::isGood(*_stream) || seqan::atEnd(*_stream);
}
size_t FastxReader::get_num_reads()
@@ -293,7 +298,7 @@ size_t FastxReader::get_num_reads()
void FastxReader::close()
{
- seqan::close(_stream);
+ seqan::close(*_stream);
}
Read FastxReader::get_next_read()
@@ -302,9 +307,9 @@ Read FastxReader::get_next_read()
int ret = -1;
const char *invalid_read_exc = NULL;
while (!__sync_bool_compare_and_swap(&_spin_lock, 0, 1));
- bool atEnd = seqan::atEnd(_stream);
+ bool atEnd = seqan::atEnd(*_stream);
if (!atEnd) {
- ret = seqan::readRecord(read.name, read.sequence, read.quality, _stream);
+ ret = seqan::readRecord(read.name, read.sequence, read.quality, *_stream);
if (ret == 0) {
// Detect if we're parsing something w/ qualities on the first read
// only
@@ -357,4 +362,7 @@ template FastxParserPtr get_parser<FastxReader>(const std::string& filename);
} // namespace read_parsers
-} // namespace khmer
+} // namespace oxli
+
+// vim: set ft=cpp sts=4 sw=4 tw=80:
+
diff --git a/lib/storage.cc b/src/oxli/storage.cc
similarity index 92%
rename from lib/storage.cc
rename to src/oxli/storage.cc
index 488aebc..66acff1 100644
--- a/lib/storage.cc
+++ b/src/oxli/storage.cc
@@ -40,17 +40,17 @@ Contact: khmer-project at idyll.org
#include <fstream>
#include <iostream>
-#include "khmer_exception.hh"
-#include "hashtable.hh"
+#include "oxli/oxli_exception.hh"
+#include "oxli/hashtable.hh"
#include "zlib.h"
-using namespace khmer;
+using namespace oxli;
using namespace std;
void Storage::set_use_bigcount(bool b)
{
if (!_supports_bigcount) {
- throw khmer_exception("bigcount is not supported for this storage.");
+ throw oxli_exception("bigcount is not supported for this storage.");
}
_use_bigcount = b;
}
@@ -63,7 +63,7 @@ bool Storage::get_use_bigcount()
void BitStorage::update_from(const BitStorage& other)
{
if (_tablesizes != other._tablesizes) {
- throw khmer_exception("both nodegraphs must have same table sizes");
+ throw oxli_exception("both nodegraphs must have same table sizes");
}
Byte tmp = 0;
@@ -99,7 +99,7 @@ void BitStorage::update_from(const BitStorage& other)
void BitStorage::save(std::string outfilename, WordLength ksize)
{
if (!_counts[0]) {
- throw khmer_exception();
+ throw oxli_exception();
}
unsigned int save_ksize = ksize;
@@ -130,7 +130,7 @@ void BitStorage::save(std::string outfilename, WordLength ksize)
outfile.write((const char *) _counts[i], tablebytes);
}
if (outfile.fail()) {
- throw khmer_file_exception(strerror(errno));
+ throw oxli_file_exception(strerror(errno));
}
outfile.close();
}
@@ -156,13 +156,13 @@ void BitStorage::load(std::string infilename, WordLength &ksize)
} else {
err = "Unknown error in opening file: " + infilename;
}
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
} catch (const std::exception &e) {
// Catching std::exception is a stopgap for
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66145
std::string err = "Unknown error opening file: " + infilename + " "
+ strerror(errno);
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
if (_counts) {
@@ -188,23 +188,23 @@ void BitStorage::load(std::string infilename, WordLength &ksize)
infile.read((char *) &ht_type, 1);
if (!(std::string(signature, 4) == SAVED_SIGNATURE)) {
std::ostringstream err;
- err << "Does not start with signature for a khmer file: 0x";
+ err << "Does not start with signature for a oxli file: 0x";
for(size_t i=0; i < 4; ++i) {
err << std::hex << (int) signature[i];
}
err << " Should be: " << SAVED_SIGNATURE;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
} else if (!(version == SAVED_FORMAT_VERSION)) {
std::ostringstream err;
err << "Incorrect file format version " << (int) version
<< " while reading k-mer graph from " << infilename
<< "; should be " << (int) SAVED_FORMAT_VERSION;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
} else if (!(ht_type == SAVED_HASHBITS)) {
std::ostringstream err;
err << "Incorrect file format type " << (int) ht_type
<< " while reading k-mer graph from " << infilename;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
}
infile.read((char *) &save_ksize, sizeof(save_ksize));
@@ -242,13 +242,13 @@ void BitStorage::load(std::string infilename, WordLength &ksize)
} else {
err = "Error reading from k-mer graph file: " + infilename;
}
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
} catch (const std::exception &e) {
// Catching std::exception is a stopgap for
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66145
std::string err = "Unknown error opening file: " + infilename + " "
+ strerror(errno);
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
}
@@ -288,11 +288,11 @@ ByteStorageFileReader::ByteStorageFileReader(
} else {
err = "Unknown error in opening file: " + infilename;
}
- throw khmer_file_exception(err + " " + strerror(errno));
+ throw oxli_file_exception(err + " " + strerror(errno));
} catch (const std::exception &e) {
std::string err = "Unknown error opening file: " + infilename + " "
+ strerror(errno);
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
if (store._counts) {
@@ -318,23 +318,23 @@ ByteStorageFileReader::ByteStorageFileReader(
infile.read((char *) &ht_type, 1);
if (!(std::string(signature, 4) == SAVED_SIGNATURE)) {
std::ostringstream err;
- err << "Does not start with signature for a khmer file: 0x";
+ err << "Does not start with signature for a oxli file: 0x";
for(size_t i=0; i < 4; ++i) {
err << std::hex << (int) signature[i];
}
err << " Should be: " << SAVED_SIGNATURE;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
} else if (!(version == SAVED_FORMAT_VERSION)) {
std::ostringstream err;
err << "Incorrect file format version " << (int) version
<< " while reading k-mer count file from " << infilename
<< "; should be " << (int) SAVED_FORMAT_VERSION;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
} else if (!(ht_type == SAVED_COUNTING_HT)) {
std::ostringstream err;
err << "Incorrect file format type " << (int) ht_type
<< " while reading k-mer count file from " << infilename;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
}
infile.read((char *) &use_bigcount, 1);
@@ -395,11 +395,11 @@ ByteStorageFileReader::ByteStorageFileReader(
err = "Error reading from k-mer count file: " + infilename + " "
+ strerror(errno);
}
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
} catch (const std::exception &e) {
std::string err = "Error reading from k-mer count file: " + infilename + " "
+ strerror(errno);
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
}
@@ -411,7 +411,7 @@ ByteStorageGzFileReader::ByteStorageGzFileReader(
gzFile infile = gzopen(infilename.c_str(), "rb");
if (infile == Z_NULL) {
std::string err = "Cannot open k-mer count file: " + infilename;
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
if (store._counts) {
@@ -438,13 +438,13 @@ ByteStorageGzFileReader::ByteStorageGzFileReader(
std::string err = "K-mer count file read error: " + infilename + " "
+ strerror(errno);
gzclose(infile);
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
} else if (!(std::string(signature, 4) == SAVED_SIGNATURE)) {
std::ostringstream err;
- err << "Does not start with signature for a khmer " <<
+ err << "Does not start with signature for a oxli " <<
"file: " << signature << " Should be: " <<
SAVED_SIGNATURE;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
} else if (!(version == SAVED_FORMAT_VERSION)
|| !(ht_type == SAVED_COUNTING_HT)) {
if (!(version == SAVED_FORMAT_VERSION)) {
@@ -453,13 +453,13 @@ ByteStorageGzFileReader::ByteStorageGzFileReader(
<< " while reading k-mer count file from " << infilename
<< "; should be " << (int) SAVED_FORMAT_VERSION;
gzclose(infile);
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
} else if (!(ht_type == SAVED_COUNTING_HT)) {
std::ostringstream err;
err << "Incorrect file format type " << (int) ht_type
<< " while reading k-mer count file from " << infilename;
gzclose(infile);
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
}
}
@@ -474,7 +474,7 @@ ByteStorageGzFileReader::ByteStorageGzFileReader(
std::string err = "K-mer count file header read error: " + infilename
+ " " + strerror(errno);
gzclose(infile);
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
ksize = (WordLength) save_ksize;
@@ -500,7 +500,7 @@ ByteStorageGzFileReader::ByteStorageGzFileReader(
err = err + " " + gzerr;
}
gzclose(infile);
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
tablesize = save_tablesize;
@@ -529,7 +529,7 @@ ByteStorageGzFileReader::ByteStorageGzFileReader(
err = err + " " + gzerr;
}
gzclose(infile);
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
loaded += read_b;
@@ -547,7 +547,7 @@ ByteStorageGzFileReader::ByteStorageGzFileReader(
err = err + " " + gzerr;
}
gzclose(infile);
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
if (n_counts) {
@@ -569,7 +569,7 @@ ByteStorageGzFileReader::ByteStorageGzFileReader(
err = err + " " + gzerr;
}
gzclose(infile);
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
store._bigcounts[kmer] = count;
@@ -585,7 +585,7 @@ ByteStorageFileWriter::ByteStorageFileWriter(
const ByteStorage& store)
{
if (!store._counts[0]) {
- throw khmer_exception();
+ throw oxli_exception();
}
unsigned int save_ksize = ksize;
@@ -632,7 +632,7 @@ ByteStorageFileWriter::ByteStorageFileWriter(
}
}
if (outfile.fail()) {
- throw khmer_file_exception(strerror(errno));
+ throw oxli_file_exception(strerror(errno));
}
outfile.close();
}
@@ -643,7 +643,7 @@ ByteStorageGzFileWriter::ByteStorageGzFileWriter(
const ByteStorage &store)
{
if (!store._counts[0]) {
- throw khmer_exception();
+ throw oxli_exception();
}
int errnum = 0;
@@ -656,9 +656,9 @@ ByteStorageGzFileWriter::ByteStorageGzFileWriter(
if (outfile == NULL) {
const char * error = gzerror(outfile, &errnum);
if (errnum == Z_ERRNO) {
- throw khmer_file_exception(strerror(errno));
+ throw oxli_file_exception(strerror(errno));
} else {
- throw khmer_file_exception(error);
+ throw oxli_file_exception(error);
}
}
@@ -716,7 +716,7 @@ ByteStorageGzFileWriter::ByteStorageGzFileWriter(
msg << strerror(errno);
}
gzclose(outfile);
- throw khmer_file_exception(msg.str());
+ throw oxli_file_exception(msg.str());
}
written += gz_result;
}
@@ -735,9 +735,9 @@ ByteStorageGzFileWriter::ByteStorageGzFileWriter(
}
const char * error = gzerror(outfile, &errnum);
if (errnum == Z_ERRNO) {
- throw khmer_file_exception(strerror(errno));
+ throw oxli_file_exception(strerror(errno));
} else if (errnum != Z_OK) {
- throw khmer_file_exception(error);
+ throw oxli_file_exception(error);
}
gzclose(outfile);
}
@@ -772,7 +772,7 @@ void ByteStorage::load(std::string infilename, WordLength& ksize)
void NibbleStorage::save(std::string outfilename, WordLength ksize)
{
if (!_counts[0]) {
- throw khmer_exception();
+ throw oxli_exception();
}
unsigned int save_ksize = ksize;
@@ -818,11 +818,11 @@ void NibbleStorage::load(std::string infilename, WordLength& ksize)
} else {
err = "Unknown error in opening file: " + infilename;
}
- throw khmer_file_exception(err + " " + strerror(errno));
+ throw oxli_file_exception(err + " " + strerror(errno));
} catch (const std::exception &e) {
std::string err = "Unknown error opening file: " + infilename + " "
+ strerror(errno);
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
if (_counts) {
@@ -848,23 +848,23 @@ void NibbleStorage::load(std::string infilename, WordLength& ksize)
infile.read((char *) &ht_type, 1);
if (!(std::string(signature, 4) == SAVED_SIGNATURE)) {
std::ostringstream err;
- err << "Does not start with signature for a khmer file: 0x";
+ err << "Does not start with signature for a oxli file: 0x";
for(size_t i=0; i < 4; ++i) {
err << std::hex << (int) signature[i];
}
err << " Should be: " << SAVED_SIGNATURE;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
} else if (!(version == SAVED_FORMAT_VERSION)) {
std::ostringstream err;
err << "Incorrect file format version " << (int) version
<< " while reading k-mer count file from " << infilename
<< "; should be " << (int) SAVED_FORMAT_VERSION;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
} else if (!(ht_type == SAVED_SMALLCOUNT)) {
std::ostringstream err;
err << "Incorrect file format type " << (int) ht_type
<< " while reading k-mer count file from " << infilename;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
}
infile.read((char *) &save_ksize, sizeof(save_ksize));
@@ -907,10 +907,10 @@ void NibbleStorage::load(std::string infilename, WordLength& ksize)
err = "Error reading from k-mer count file: " + infilename + " "
+ strerror(errno);
}
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
} catch (const std::exception &e) {
std::string err = "Error reading from k-mer count file: " + infilename + " "
+ strerror(errno);
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
}
diff --git a/lib/subset.cc b/src/oxli/subset.cc
similarity index 92%
rename from lib/subset.cc
rename to src/oxli/subset.cc
index 1384923..280d217 100644
--- a/lib/subset.cc
+++ b/src/oxli/subset.cc
@@ -44,19 +44,19 @@ Contact: khmer-project at idyll.org
#include <set>
#include <utility>
-#include "hashgraph.hh"
-#include "khmer_exception.hh"
-#include "read_parsers.hh"
-#include "subset.hh"
-#include "traversal.hh"
+#include "oxli/hashgraph.hh"
+#include "oxli/oxli_exception.hh"
+#include "oxli/read_parsers.hh"
+#include "oxli/subset.hh"
+#include "oxli/traversal.hh"
#define IO_BUF_SIZE 250*1000*1000
#define BIG_TRAVERSALS_ARE 200
// #define VALIDATE_PARTITIONS
-using namespace khmer;
-using namespace khmer:: read_parsers;
+using namespace oxli;
+using namespace oxli:: read_parsers;
using namespace std;
#if 0
@@ -147,61 +147,59 @@ size_t SubsetPartition::output_partitioned_file(
break;
}
- seq = read.sequence;
+ read.set_clean_seq();
+ seq = read.cleaned_seq;
- if (_ht->check_and_normalize_read(seq)) {
- const char * kmer_s = seq.c_str();
+ bool found_tag = false;
+ KmerHashIteratorPtr kmers = _ht->new_kmer_iterator(read.cleaned_seq);
+ while (!kmers->done()) {
+ kmer = kmers->next();
- bool found_tag = false;
- for (unsigned int i = 0; i < seq.length() - ksize + 1; i++) {
- kmer = _ht->hash_dna(kmer_s + i);
-
- // is this a known tag?
- if (set_contains(partition_map, kmer)) {
- found_tag = true;
- break;
- }
+ // is this a known tag?
+ if (set_contains(partition_map, kmer)) {
+ found_tag = true;
+ break;
}
+ }
- // all sequences should have at least one tag in them.
- // assert(found_tag); @CTB currently breaks tests. give fn flag
- // to disable.
+ // all sequences should have at least one tag in them.
+ // assert(found_tag); @CTB currently breaks tests. give fn flag
+ // to disable.
- PartitionID partition_id = 0;
- if (found_tag) {
- PartitionID * partition_p = partition_map[kmer];
- if (partition_p == NULL ) {
- partition_id = 0;
- n_singletons++;
- } else {
- partition_id = *partition_p;
- partitions.insert(partition_id);
- }
+ PartitionID partition_id = 0;
+ if (found_tag) {
+ PartitionID * partition_p = partition_map[kmer];
+ if (partition_p == NULL ) {
+ partition_id = 0;
+ n_singletons++;
+ } else {
+ partition_id = *partition_p;
+ partitions.insert(partition_id);
}
+ }
- if (partition_id > 0 || output_unassigned) {
- if (read.quality.length()) { // FASTQ
- outfile << "@" << read.name << "\t" << partition_id
- << "\n";
- outfile << seq << "\n+\n";
- outfile << read.quality << "\n";
- } else { // FASTA
- outfile << ">" << read.name << "\t" << partition_id;
- outfile << "\n" << seq << "\n";
- }
+ if (partition_id > 0 || output_unassigned) {
+ if (read.quality.length()) { // FASTQ
+ outfile << "@" << read.name << "\t" << partition_id
+ << "\n";
+ outfile << seq << "\n+\n";
+ outfile << read.quality << "\n";
+ } else { // FASTA
+ outfile << ">" << read.name << "\t" << partition_id;
+ outfile << "\n" << seq << "\n";
}
+ }
- total_reads++;
+ total_reads++;
- // run callback, if specified
- if (total_reads % CALLBACK_PERIOD == 0 && callback) {
- try {
- callback("output_partitions", callback_data,
- total_reads, reads_kept);
- } catch (...) {
- outfile.close();
- throw;
- }
+ // run callback, if specified
+ if (total_reads % CALLBACK_PERIOD == 0 && callback) {
+ try {
+ callback("output_partitions", callback_data,
+ total_reads, reads_kept);
+ } catch (...) {
+ outfile.close();
+ throw;
}
}
}
@@ -274,7 +272,7 @@ void SubsetPartition::find_all_tags(
if (!(breadth >= cur_breadth)) { // keep track of watermark, for
// debugging
- throw khmer_exception("Desynchonization between traversal "
+ throw oxli_exception("Desynchonization between traversal "
"and breadth tracking. Did you forget "
"to pop the node or breadth queue?");
}
@@ -472,7 +470,7 @@ void SubsetPartition::find_all_tags_truncate_on_abundance(
// @cswelcher Do these lines actually do anything?
if (!(breadth >= cur_breadth)) { // keep track of watermark, for
// debugging.
- throw khmer_exception("Desynchonization between traversal "
+ throw oxli_exception("Desynchonization between traversal "
"and breadth tracking. Did you forget "
"to pop the node or breadth queue?");
}
@@ -623,7 +621,7 @@ void SubsetPartition::set_partition_id(
{
HashIntoType kmer;
if (!(kmer_s.length() >= _ht->ksize())) {
- throw khmer_exception();
+ throw oxli_exception();
}
kmer = _ht->hash_dna(kmer_s.c_str());
@@ -793,7 +791,7 @@ PartitionID SubsetPartition::get_partition_id(std::string kmer_s)
{
HashIntoType kmer;
if (!(kmer_s.length() >= _ht->ksize())) {
- throw khmer_exception();
+ throw oxli_exception();
}
kmer = _ht->hash_dna(kmer_s.c_str());
@@ -900,13 +898,13 @@ void SubsetPartition::merge_from_disk(string other_filename)
} else {
err = "Unknown error in opening file: " + other_filename;
}
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
} catch (const std::exception &e) {
// Catching std::exception is a stopgap for
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66145
std::string err = "Unknown error opening file: " + other_filename + " "
+ strerror(errno);
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
infile.seekg(0, infile.end);
const int length = infile.tellg();
@@ -914,7 +912,7 @@ void SubsetPartition::merge_from_disk(string other_filename)
if (length == 18) {
std::string err;
err = other_filename + " contains only a header and no partition IDs.";
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
@@ -934,17 +932,17 @@ void SubsetPartition::merge_from_disk(string other_filename)
}
err << " while reading subset pmap from " << other_filename
<< " Should be: " << SAVED_SIGNATURE;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
} else if (!(version == SAVED_FORMAT_VERSION)) {
std::ostringstream err;
err << "Incorrect file format version " << (int) version
<< " while reading subset pmap from " << other_filename;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
} else if (!(ht_type == SAVED_SUBSET)) {
std::ostringstream err;
err << "Incorrect file format type " << (int) ht_type
<< " while reading subset pmap from " << other_filename;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
}
infile.read((char *) &save_ksize, sizeof(save_ksize));
@@ -952,20 +950,20 @@ void SubsetPartition::merge_from_disk(string other_filename)
std::ostringstream err;
err << "Incorrect k-mer size " << save_ksize
<< " while reading subset pmap from " << other_filename;
- throw khmer_file_exception(err.str());
+ throw oxli_file_exception(err.str());
}
infile.read((char *) &expected_pmap_size, sizeof(expected_pmap_size));
} catch (std::ifstream::failure &e) {
std::string err;
err = "Unknown error reading header info from: " + other_filename;
- throw khmer_file_exception(err);
- } catch (khmer_file_exception &e) {
+ throw oxli_file_exception(err);
+ } catch (oxli_file_exception &e) {
throw e;
} catch (const std::exception &e) {
std::string err = "Unknown error opening file: " + other_filename + " "
+ strerror(errno);
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
char * buf = new char[IO_BUF_SIZE];
@@ -1000,7 +998,7 @@ void SubsetPartition::merge_from_disk(string other_filename)
delete[] buf;
std::string err;
err = "Unknown error reading data from: " + other_filename;
- throw khmer_file_exception(err);
+ throw oxli_file_exception(err);
}
}
@@ -1028,7 +1026,7 @@ void SubsetPartition::merge_from_disk(string other_filename)
delete[] buf;
if (loaded != expected_pmap_size) {
- throw khmer_file_exception("error loading partitionmap - "
+ throw oxli_file_exception("error loading partitionmap - "
"invalid # of items");
}
}
@@ -1091,7 +1089,7 @@ void SubsetPartition::save_partitionmap(string pmap_filename)
}
if (outfile.fail()) {
delete[] buf;
- throw khmer_file_exception(strerror(errno));
+ throw oxli_file_exception(strerror(errno));
}
outfile.close();
@@ -1116,7 +1114,7 @@ void SubsetPartition::_validate_pmap()
if (pp_id != NULL) {
if (!(*pp_id >= 1) || !(*pp_id < next_partition_id)) {
- throw khmer_exception();
+ throw oxli_exception();
}
}
}
@@ -1127,7 +1125,7 @@ void SubsetPartition::_validate_pmap()
PartitionPtrSet *s = (*ri).second;
if (!(s != NULL)) {
- throw khmer_exception();
+ throw oxli_exception();
}
for (PartitionPtrSet::const_iterator si = s->begin(); si != s->end();
@@ -1136,7 +1134,7 @@ void SubsetPartition::_validate_pmap()
pp = *si;
if (!(p == *pp)) {
- throw khmer_exception();
+ throw oxli_exception();
}
}
}
@@ -1254,7 +1252,7 @@ unsigned long long SubsetPartition::repartition_largest_partition(
PartitionCountDistribution::const_iterator di = d.end();
if (d.empty()) {
- throw khmer_exception();
+ throw oxli_exception();
}
--di;
@@ -1265,7 +1263,7 @@ unsigned long long SubsetPartition::repartition_largest_partition(
}
}
if (!(biggest_p != 0)) {
- throw khmer_exception();
+ throw oxli_exception();
}
#if VERBOSE_REPARTITION
diff --git a/lib/test-Colors.cc b/src/oxli/test-Colors.cc
similarity index 88%
rename from lib/test-Colors.cc
rename to src/oxli/test-Colors.cc
index 28e06a0..5cca363 100644
--- a/lib/test-Colors.cc
+++ b/src/oxli/test-Colors.cc
@@ -35,13 +35,13 @@ LICENSE (END)
Contact: khmer-project at idyll.org
*/
-#include "khmer.hh"
-#include "hashtable.hh"
-#include "hashbits.hh"
-#include "labelhash.hh"
+#include "oxli/oxli.hh"
+#include "oxli/hashtable.hh"
+#include "oxli/hashbits.hh"
+#include "oxli/labelhash.hh"
#include <iostream>
-using namespace khmer;
+using namespace oxli;
int main()
{
@@ -49,8 +49,8 @@ int main()
std::vector<HashIntoType> sizes_vec (sizes,
sizes + sizeof(sizes) / sizeof(HashIntoType) );
- khmer::LabelHash * lh_pointer = new khmer::LabelHash(20, sizes_vec);
- khmer::Nodegraph * hb_pointer = (khmer::Hashbits *)lh_pointer;
+ oxli::LabelHash * lh_pointer = new oxli::LabelHash(20, sizes_vec);
+ oxli::Nodegraph * hb_pointer = (oxli::Hashbits *)lh_pointer;
std::cout << "lh_pointer n_tags: " << lh_pointer->n_tags() << std::endl;
std::cout << "hb_pointer n_tags: " << hb_pointer->n_tags() << std::endl;
diff --git a/lib/test-compile.cc b/src/oxli/test-compile.cc
similarity index 94%
rename from lib/test-compile.cc
rename to src/oxli/test-compile.cc
index d272613..698a324 100644
--- a/lib/test-compile.cc
+++ b/src/oxli/test-compile.cc
@@ -36,13 +36,13 @@ LICENSE (END)
Contact: khmer-project at idyll.org
*/
-// This file is used to test compilation with libkhmer.a/libkhmer.so, after
+// This file is used to test compilation with liboxli.a/liboxli.so, after
// installation
#include <oxli/hashtable.hh>
int main()
{
- khmer::Countgraph test(1,1);
+ oxli::Countgraph test(1,1);
return 0;
}
diff --git a/lib/traversal.cc b/src/oxli/traversal.cc
similarity index 98%
rename from lib/traversal.cc
rename to src/oxli/traversal.cc
index ca07715..e3befe1 100644
--- a/lib/traversal.cc
+++ b/src/oxli/traversal.cc
@@ -34,15 +34,15 @@ LICENSE (END)
Contact: khmer-project at idyll.org
*/
-#include "khmer.hh"
-#include "hashtable.hh"
-#include "traversal.hh"
-#include "alphabets.hh"
-#include "kmer_hash.hh"
+#include "oxli/oxli.hh"
+#include "oxli/hashtable.hh"
+#include "oxli/traversal.hh"
+#include "oxli/alphabets.hh"
+#include "oxli/kmer_hash.hh"
using namespace std;
-namespace khmer
+namespace oxli
{
/******************************************
@@ -363,4 +363,4 @@ template class AssemblerTraverser<TRAVERSAL_RIGHT>;
template class AssemblerTraverser<TRAVERSAL_LEFT>;
-} // namespace khmer
+} // namespace oxli
diff --git a/tests/test_assembly.py b/tests/graph_features.py
similarity index 53%
rename from tests/test_assembly.py
rename to tests/graph_features.py
index d909338..bf7699b 100644
--- a/tests/test_assembly.py
+++ b/tests/graph_features.py
@@ -44,7 +44,6 @@ import random
import khmer
from khmer.khmer_args import estimate_optimal_with_K_and_f as optimal_fp
-from khmer import ReadParser
from khmer import reverse_complement as revcomp
from . import khmer_tst_utils as utils
@@ -52,9 +51,6 @@ import pytest
import screed
-def teardown():
- utils.cleanup()
-
# We just define this globally rather than in a module-level fixture,
# as we need it during parameterization and whatnot.
K = 21
@@ -135,8 +131,17 @@ def get_random_sequence(length, exclude=None):
return ''.join(seq)
-def reads(sequence, L=100, N=100):
+def reads(sequence, L=100, N=100, dbg_cover=False):
positions = list(range(len(sequence) - L))
+ if dbg_cover is True:
+ for start in range(0, len(sequence), K):
+ read = sequence[start:start + L]
+ if len(read) < K:
+ read = sequence[-L:]
+ yield read
+ N -= 1
+ if N < 0:
+ return
for i in range(N):
start = random.choice(positions)
yield sequence[start:start + L]
@@ -530,377 +535,3 @@ def circular_linear_structure(request, linear_structure):
request.applymarker(pytest.mark.xfail)
return graph, sequence
-
-
-class TestNonBranching:
-
- def test_all_start_positions(self, linear_structure):
- # assemble entire contig, starting from wherever
- graph, contig = linear_structure
- asm = khmer.LinearAssembler(graph)
-
- for start in range(0, len(contig), 150):
- path = asm.assemble(contig[start:start + K])
- assert utils._equals_rc(path, contig), start
-
- def test_all_left_to_beginning(self, linear_structure):
- # assemble directed left
- graph, contig = linear_structure
- asm = khmer.LinearAssembler(graph)
-
- for start in range(0, len(contig), 150):
- path = asm.assemble(contig[start:start + K], direction='L')
- print(path, ', ', contig[:start])
- assert utils._equals_rc(path, contig[:start + K]), start
-
- def test_all_right_to_end(self, linear_structure):
- # assemble directed right
- graph, contig = linear_structure
- asm = khmer.LinearAssembler(graph)
-
- for start in range(0, len(contig), 150):
- path = asm.assemble(contig[start:start + K], direction='R')
- print(path, ', ', contig[:start])
- assert utils._equals_rc(path, contig[start:]), start
-
- def test_circular(self, circular_linear_structure):
- graph, contig = circular_linear_structure
- asm = khmer.LinearAssembler(graph)
-
- path = asm.assemble(contig[:K], direction='R')
- print(path, ',', contig)
- assert utils._equals_rc(path, contig[:len(path)])
-
-
-class TestLinearAssembler_RightBranching:
-
- def test_branch_point(self, right_tip_structure):
- graph, contig, L, HDN, R, tip = right_tip_structure
-
- assert graph.kmer_degree(HDN) == 3
-
- def test_beginning_to_branch(self, right_tip_structure):
- # assemble from beginning of contig, up until branch point
- graph, contig, L, HDN, R, tip = right_tip_structure
- asm = khmer.LinearAssembler(graph)
- path = asm.assemble(contig[0:K])
-
- assert len(path) == HDN.pos + K
- assert utils._equals_rc(path, contig[:len(path)])
-
- def test_beginning_to_branch_revcomp(self, right_tip_structure):
- # assemble from beginning of contig, up until branch point
- # starting from rev comp
- graph, contig, L, HDN, R, tip = right_tip_structure
- asm = khmer.LinearAssembler(graph)
- path = asm.assemble(revcomp(contig[0:K]))
-
- assert len(path) == HDN.pos + K
- assert utils._equals_rc(path, contig[:len(path)])
-
- def test_left_of_branch_to_beginning(self, right_tip_structure):
- # start from HDN (left of branch)
- graph, contig, L, HDN, R, tip = right_tip_structure
- asm = khmer.LinearAssembler(graph)
- path = asm.assemble(L)
-
- assert len(path) == HDN.pos + K
- assert utils._equals_rc(path, contig[:len(path)])
-
- def test_left_of_branch_to_beginning_revcomp(self, right_tip_structure):
- # start from revcomp of HDN (left of branch)
- graph, contig, L, HDN, R, tip = right_tip_structure
- asm = khmer.LinearAssembler(graph)
- path = asm.assemble(revcomp(L))
-
- assert len(path) == HDN.pos + K
- assert utils._equals_rc(path, contig[:len(path)])
-
- def test_right_of_branch_outwards_to_ends(self, right_tip_structure):
- # assemble from right of branch point (at R)
- # Should get the *entire* original contig, as the assembler
- # will move left relative to the branch, and not consider it
- # as a high degree node
- graph, contig, L, HDN, R, tip = right_tip_structure
- asm = khmer.LinearAssembler(graph)
- path = asm.assemble(R)
-
- assert len(path) == len(contig)
- assert utils._equals_rc(path, contig)
-
- def test_end_to_beginning(self, right_tip_structure):
- # should have exact same behavior as right_of_branch_outwards
- graph, contig, L, HDN, R, tip = right_tip_structure
- asm = khmer.LinearAssembler(graph)
- path = asm.assemble(contig[-K:])
-
- assert len(path) == len(contig)
- assert utils._equals_rc(path, contig)
-
-
-class TestLinearAssembler_LeftBranching:
-
- def test_branch_point(self, left_tip_structure):
- graph, contig, L, HDN, R, tip = left_tip_structure
-
- assert graph.kmer_degree(HDN) == 3
-
- def test_end_to_branch(self, left_tip_structure):
- # assemble from end until branch point
- # should include HDN
- graph, contig, L, HDN, R, tip = left_tip_structure
- asm = khmer.LinearAssembler(graph)
- path = asm.assemble(contig[-K:])
-
- assert len(path) == len(contig) - HDN.pos
- assert utils._equals_rc(path, contig[HDN.pos:])
-
- def test_branch_to_end(self, left_tip_structure):
- # assemble from branch point until end
- graph, contig, L, HDN, R, tip = left_tip_structure
- asm = khmer.LinearAssembler(graph)
- path = asm.assemble(HDN)
-
- assert len(path) == len(contig) - HDN.pos
- assert utils._equals_rc(path, contig[HDN.pos:])
-
- def test_from_branch_to_ends_with_stopbf(self, left_tip_structure):
- # block the tip with the stop_bf. should return a full length contig.
- graph, contig, L, HDN, R, tip = left_tip_structure
- asm = khmer.LinearAssembler(graph)
-
- stop_bf = khmer.Nodegraph(K, 1e5, 4)
- stop_bf.count(tip)
-
- path = asm.assemble(HDN, stop_bf)
-
- assert len(path) == len(contig)
- assert utils._equals_rc(path, contig)
-
- def test_from_branch_to_ends_with_stopbf_revcomp(self, left_tip_structure):
- # block the tip with the stop_bf. should return a full length contig.
- graph, contig, L, HDN, R, tip = left_tip_structure
- asm = khmer.LinearAssembler(graph)
- stop_bf = khmer.Nodegraph(K, 1e5, 4)
- stop_bf.count(tip)
-
- path = asm.assemble(revcomp(HDN), stop_bf)
-
- assert len(path) == len(contig)
- assert utils._equals_rc(path, contig)
-
- def test_end_thru_tip_with_stopbf(self, left_tip_structure):
- # assemble up to branch point, and include introduced branch b/c
- # of stop bf
- graph, contig, L, HDN, R, tip = left_tip_structure
- asm = khmer.LinearAssembler(graph)
-
- stop_bf = khmer.Nodegraph(K, 1e5, 4)
- stop_bf.count(L) # ...and block original path
- path = asm.assemble(contig[-K:], stop_bf)
- assert len(path) == len(contig) - HDN.pos + 1
-
- # should be the tip k-kmer, plus the last base of the HDN thru
- # the end of the contig
- assert utils._equals_rc(path, tip + contig[HDN.pos + K - 1:])
-
- def test_single_node_flanked_by_hdns(self, left_tip_structure):
- # assemble single node flanked by high-degree nodes
- # we'll copy the main nodegraph before mutating it
- graph, contig, L, HDN, R, tip = left_tip_structure
- asm = khmer.LinearAssembler(graph)
-
- graph.consume(mutate_position(contig, HDN.pos + K))
-
- path = asm.assemble(HDN)
-
- assert len(path) == K
- assert utils._equals_rc(path, HDN)
-
-
-class TestLabeledAssembler:
-
- def test_beginning_to_end_across_tip(self, right_tip_structure):
- # assemble entire contig, ignoring branch point b/c of labels
- graph, contig, L, HDN, R, tip = right_tip_structure
- lh = khmer._GraphLabels(graph)
- asm = khmer.SimpleLabeledAssembler(lh)
- hdn = graph.find_high_degree_nodes(contig)
- # L, HDN, and R will be labeled with 1
- lh.label_across_high_degree_nodes(contig, hdn, 1)
-
- path = asm.assemble(contig[:K])
-
- assert len(path) == 1, "there should only be one path"
- path = path[0] # @CTB
-
- assert len(path) == len(contig)
- assert utils._equals_rc(path, contig)
-
- def test_assemble_right_double_fork(self, right_double_fork_structure):
- # assemble two contigs from a double forked structure
- graph, contig, L, HDN, R, branch = right_double_fork_structure
- lh = khmer._GraphLabels(graph)
- asm = khmer.SimpleLabeledAssembler(lh)
-
- hdn = graph.find_high_degree_nodes(contig)
- hdn += graph.find_high_degree_nodes(branch)
- print(list(hdn))
- lh.label_across_high_degree_nodes(contig, hdn, 1)
- lh.label_across_high_degree_nodes(branch, hdn, 2)
- print(lh.get_tag_labels(list(hdn)[0]))
-
- paths = asm.assemble(contig[:K])
- print('Path lengths', [len(x) for x in paths])
-
- assert len(paths) == 2
-
- assert any(utils._equals_rc(path, contig) for path in paths)
- assert any(utils._equals_rc(path, branch) for path in paths)
-
- def test_assemble_right_triple_fork(self, right_triple_fork_structure):
- # assemble three contigs from a trip fork
- (graph, contig, L, HDN, R,
- top_sequence, bottom_sequence) = right_triple_fork_structure
- lh = khmer._GraphLabels(graph)
- asm = khmer.SimpleLabeledAssembler(lh)
-
- hdn = graph.find_high_degree_nodes(contig)
- hdn += graph.find_high_degree_nodes(top_sequence)
- hdn += graph.find_high_degree_nodes(bottom_sequence)
- print(list(hdn))
- lh.label_across_high_degree_nodes(contig, hdn, 1)
- lh.label_across_high_degree_nodes(top_sequence, hdn, 2)
- lh.label_across_high_degree_nodes(bottom_sequence, hdn, 3)
- print(lh.get_tag_labels(list(hdn)[0]))
-
- paths = asm.assemble(contig[:K])
- print([len(x) for x in paths])
-
- assert len(paths) == 3
-
- assert any(utils._equals_rc(path, contig) for path in paths)
- assert any(utils._equals_rc(path, top_sequence) for path in paths)
- assert any(utils._equals_rc(path, bottom_sequence) for path in paths)
-
- def test_assemble_left_double_fork(self, left_double_fork_structure):
- # assemble entire contig + branch points b/c of labels; start from end
- graph, contig, L, HDN, R, branch = left_double_fork_structure
- lh = khmer._GraphLabels(graph)
- asm = khmer.SimpleLabeledAssembler(lh)
-
- # first try without the labels
- paths = asm.assemble(contig[-K:])
-
- assert len(paths) == 1
- # without labels, should get the beginning of the HDN thru the end
- assert paths[0] == contig[HDN.pos:]
-
- # now add labels and check that we get two full length paths
- hdn = graph.find_high_degree_nodes(contig)
- hdn += graph.find_high_degree_nodes(branch)
- print(list(hdn))
- lh.label_across_high_degree_nodes(contig, hdn, 1)
- lh.label_across_high_degree_nodes(branch, hdn, 2)
- print(lh.get_tag_labels(list(hdn)[0]))
-
- paths = asm.assemble(contig[-K:])
-
- assert len(paths) == 2
-
- assert any(utils._equals_rc(path, contig) for path in paths)
- assert any(utils._equals_rc(path, branch) for path in paths)
-
- def test_assemble_snp_bubble_single(self, snp_bubble_structure):
- # assemble entire contig + one of two paths through a bubble
- graph, wildtype, mutant, HDN_L, HDN_R = snp_bubble_structure
- lh = khmer._GraphLabels(graph)
- asm = khmer.SimpleLabeledAssembler(lh)
-
- hdn = graph.find_high_degree_nodes(wildtype)
- assert len(hdn) == 2
- lh.label_across_high_degree_nodes(wildtype, hdn, 1)
-
- paths = asm.assemble(wildtype[:K])
-
- assert len(paths) == 1
- assert utils._equals_rc(paths[0], wildtype)
-
- def test_assemble_snp_bubble_both(self, snp_bubble_structure):
- # assemble entire contig + both paths
- graph, wildtype, mutant, HDN_L, HDN_R = snp_bubble_structure
- lh = khmer._GraphLabels(graph)
- asm = khmer.SimpleLabeledAssembler(lh)
-
- hdn = graph.find_high_degree_nodes(wildtype)
- hdn += graph.find_high_degree_nodes(mutant)
- assert len(hdn) == 2
- lh.label_across_high_degree_nodes(wildtype, hdn, 1)
- lh.label_across_high_degree_nodes(mutant, hdn, 2)
-
- paths = asm.assemble(wildtype[:K])
-
- assert len(paths) == 2
-
- assert any(utils._contains_rc(wildtype, path) for path in paths)
- assert any(utils._contains_rc(mutant, path) for path in paths)
- # assert all(path[:HDN_L.pos+K][-K:] == HDN_L for path in paths)
- # assert all(path[HDN_R.pos:][:K] == HDN_R for path in paths)
- # assert paths[0][:HDN_L.pos+K] == paths[1][:HDN_L.pos+K]
- # assert paths[0][HDN_R.pos:] == paths[1][HDN_R.pos:]
-
- def test_assemble_snp_bubble_stopbf(self, snp_bubble_structure):
- # assemble one side of bubble, blocked with stop_bf,
- # when labels on both branches
- # stop_bf should trip a filter failure, negating the label spanning
- graph, wildtype, mutant, HDN_L, HDN_R = snp_bubble_structure
- stop_bf = khmer.Nodegraph(K, 1e5, 4)
- lh = khmer._GraphLabels(graph)
- asm = khmer.SimpleLabeledAssembler(lh)
-
- hdn = graph.find_high_degree_nodes(wildtype)
- hdn += graph.find_high_degree_nodes(mutant)
- assert len(hdn) == 2
- lh.label_across_high_degree_nodes(wildtype, hdn, 1)
- lh.label_across_high_degree_nodes(mutant, hdn, 2)
-
- # do the labeling, but block the mutant with stop_bf
- stop_bf.count(mutant[HDN_L.pos + 1:HDN_L.pos + K + 1])
- paths = asm.assemble(wildtype[:K], stop_bf)
-
- assert len(paths) == 1
- assert any(utils._equals_rc(path, wildtype) for path in paths)
-
- # @pytest.mark.skip(reason='destroys your computer and then the world')
- def test_assemble_tandem_repeats(self, tandem_repeat_structure):
- # assemble one copy of a tandem repeat
- graph, repeat, tandem_repeats = tandem_repeat_structure
- lh = khmer._GraphLabels(graph)
- asm = khmer.SimpleLabeledAssembler(lh)
- paths = asm.assemble(repeat[:K])
-
- assert len(paths) == 1
- # There are K-1 k-mers spanning the junction between
- # the beginning and end of the repeat
- assert len(paths[0]) == len(repeat) + K - 1
-
-
-class TestJunctionCountAssembler:
-
- def test_beginning_to_end_across_tip(self, right_tip_structure):
- # assemble entire contig, ignoring branch point b/c of labels
- graph, contig, L, HDN, R, tip = right_tip_structure
- asm = khmer.JunctionCountAssembler(graph)
- asm.consume(contig)
- asm.consume(contig)
- asm.consume(contig)
-
- path = asm.assemble(contig[:K])
- print('P:', path[0])
- print('T:', tip)
- print('C:', contig)
- assert len(path) == 1, "there should only be one path"
- path = path[0] # @CTB
-
- assert len(path) == len(contig)
- assert utils._equals_rc(path, contig)
diff --git a/tests/khmer_tst_utils.py b/tests/khmer_tst_utils.py
index be32b3d..e310874 100644
--- a/tests/khmer_tst_utils.py
+++ b/tests/khmer_tst_utils.py
@@ -83,6 +83,7 @@ def get_test_data(filename):
filename)
return filepath
+
CLEANUPLIST = []
diff --git a/tests/test-data/banding-reads.fq b/tests/test-data/banding-reads.fq
new file mode 100644
index 0000000..59c4663
--- /dev/null
+++ b/tests/test-data/banding-reads.fq
@@ -0,0 +1,8000 @@
+ at seq1_1406708_1407199_1:0:0_2:0:0_2b227/2
+GGCAACAATACTACAGTGGCGCAAGAAGGCTGGATTACAGGCGCCCGGGGTTGAAAATTTCCTGGTAAGTGCTTGTACCAAAGTTGCATTTGGCCTCCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1080343_1080791_1:0:0_0:0:0_43ce/2
+ATTCTAAATTATACTGATGGCCCACTATGGGATTATGTCCTTCCGAAGTGAGACCTTAATATATTTTTGTTAATCAGTGACTGGGCAAGGCTGAGATGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2106314_2106801_0:0:0_1:0:0_1cb17/2
+CATGGTTACTTTCCTGCTTTCACAGCCAGGAGAAGGCCCCGCCTGTAATGTTGCTGACTGTGGCCAGGCTCAGAAAGAAATAAGGTTTGTTCTCACACAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2054496_2054886_1:0:0_2:0:0_53d64/1
+TACCTGTCAAGGTTCAGGACAAGGTGCTGGAGAGTTGAGCCACCATACTCTAGGGTGATTGAGATTAATGTGTCCATCAAGCTTTCTTATTGGTTTCAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1565858_1566242_2:0:0_0:0:0_641b/2
+ATTAAGCATTTCTTTTCCAGTCCAGTCTCTCAGAAGTACTACTTGTTTGTTGTATTTACAACATGGCTTTGCAGGGATAGGGCCCAAAGAATATCCAAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1920883_1921405_0:0:0_1:0:0_27e41/2
+TGGTACTGAATTTGACTGCAGGCTGGAATATGAAACAGTAATGCCCTGGAGTCGGGGTTCTTATTTTATATTATTGACAGTTGAACAGGTTCTAGTTGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_287010_287493_2:0:0_1:0:0_a55a/2
+TGTATTGTTTGCGTTCGATCAGGGAGGACCTGACTGGGTGTGTGTCTTTGTGAGAATTCTAAAGAGCAAAGCTATATAACAGACGTCCTGGTTCCTGACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_366632_367185_1:0:0_0:0:0_3fa46/1
+CATTCATGATCAGAATTGTCTATTTCAGCATCTGACCTCCATCTTTAAAAGAAAAGTAATAATTTGAGAGTGGTTCAAGCAAAACGTGTGAAGGTTGCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_615068_615460_2:0:0_0:0:0_49d58/1
+AGTAAGGGATGGAGAGCAGTAGTCGCATGATCAACCATTTGTATTCAATAACAGGAAGGAGTCACCATGGGCAAAATCAAGATCATGGGGGAGACTTTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2214008_2214437_0:0:0_1:0:0_30eb7/1
+CAGTCTGAGTTGGGAGGCCCTGTCTTGCAGAATTCCAGGCCTATGTGTGATCCAAGTCTATATTCAGCTCCAAGATTAAGTACCTCATTAAATATTCTGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2037745_2038152_1:0:0_2:0:0_450f7/1
+TATCTGAAGTCGCCCACGGAGTGCCTACAAGCCCCCCACCGCGCCTCTTTCACTGCGGTGGTCTTGAACCCGAGTAGTTAGATGAGTCTGTGCAGAAGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_957161_957578_0:0:0_1:0:0_2c9ee/2
+ATACGCTGTTACATGTCATAGAAAAAAAAACCCTAAAAAAAAATCACATAAAAATGATTGCAAGTCACGTTTATGTTAGAGCTTTTTCGTTCTGCACCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1441390_1441872_0:0:0_1:0:0_47757/1
+AACACATTCAACTACTGTGTAGTAAGTGACGTTTGAAGTTACATTCAAGTAAAGTAAATCTTCTATCTTGCGCGCCGGGTGGCTCACATAATAGTTTTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_709979_710339_0:0:0_1:0:0_2644e/1
+TGGGAAAATTCAAAGGCCTTTCCCACAGCAAAAAAAAAAATAAAGCTATTTTTACGCAGAGTCAGCTAATTTTCTCATATTCAGTCCTTGGCTACCACTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1030897_1031398_0:0:0_1:0:0_135fb/1
+GCCCTAATAATTTTATTCAGAAACAGACACAAATAGTAAGAAAGGCAACAAATACCAATTATTTTTGAGACAGGTCTAATTTAAAAGAGCTGAGGCCGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1910419_1910896_0:0:0_1:0:0_59dc9/1
+CTCATTACTTCTGGTACTTTCCCATTTCCAAACAATATATAAGTATATACATTCCTAAAAAAAACAAAAGAGGACTGACCTGTGTCAGTTTTTAATGCTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2005322_2005830_1:0:0_1:0:0_39b13/2
+TCAATGTGAGCCAGATATATCAAGTGACAAACAGACTTGTTTTGTATTTTAATAGAACAGTTGTGTCTAAGCACCTTTTGTGTGCAAGGCGATTCAGAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_209362_209792_1:0:0_1:0:0_1b7ae/2
+GCAATATCTGAAATTCCTTTGTTTTAAGATTTTTGAAATTTATTAAGACCATGCAAACTAGGTAGGGTAAATCTTAGAAAAGCAACTGGAAATATTTCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1838754_1839218_1:0:0_1:0:0_4fce1/2
+GACTGCGCTTACTTCAGTTAAAAACAGTCCATTTAACTTCCCAGCTTCCAGTAAACACGCAGAGTTGACAAAAACGATAAATGGATGGCCCTCTAAGTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1443443_1443910_1:0:0_0:0:0_1c0c6/2
+GCCCTAACACGTAAGAAAGCGAACCTTATTTCTTTCTTTGTGGTCTGGATTTACAGTGACCGTTCACGGAATCTGGTTCCAAAATAAAACCCTGACACTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_501349_501712_1:0:0_0:0:0_458f6/2
+CTCCTTAATACACATGGGAGGCAGGTCTGAAAATGAAGGGAAAGGAAGGAATTCTTTTAAAGACCCCATCCTAACACCCTTTAGCACAATGGACATCTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2354924_2355414_1:0:0_0:0:0_191c3/1
+GCTTCAGGGAAAGGAAGTTTGGAAAATGCTGAATAAGATGGAGGGACACATACAGACTCCGCTGAGGCAGAATGTGATCTATTAAGGATGCCCTTGTTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1537088_1537511_1:0:0_0:0:0_52cd/1
+TGGCACCCCAAAATACAAAGATTAATTTATATTTATTTAATATCAAAGAAGGCTTAAACACTTTTACTACTGGAAGGGTTGCACATTGCTGTCACAATAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2426763_2427245_1:0:0_1:0:0_217e0/2
+ATATGCTTTTAGCCACCGGAGTTTTGACTGCTGCTCCTAACATTTTCACCCAATCAGTCAGAAATAACAAAGGAAATGAGAGGCAAGACACCCCAGACTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1129506_1129982_1:0:0_0:0:0_4153/1
+GCACCAGGCAAGTCTTTCCCTATCTTACCAAACCTAGCTAAAGACCAACGGCCTCCTCTGAAGAGACAGAGGGAAATTTGTATATATTTGGACGAGACAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_964105_964535_1:0:0_1:0:0_2f334/2
+ATTTTATAAATTATGTCTATAGCCTGTAAGTCTACGGCCCCTAGGAGACAGGGCAATGTGTGTGGGTTTCAGTCAAGACTAATTGGCATTCATTGATAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2267497_2267979_1:0:0_1:0:0_6825/2
+TTTGTTTTTTTCTGGCTTCCTCCTGGCCAGCCCCTCCCACGCAAGTTAAAAAGGCTCACGCTGGCATTGATAGTTCTACTGCTTAGAATGAGTTCGATGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1041_1455_0:0:0_1:0:0_4cb72/2
+CCTTTAAGTGATTCTCTACTAAAAAGATCATTGTAATTATGAAATGGCACAACTGATGAGAACCACGATAGGTGCCGTCATCTGTTCAGTATGTGTATGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1745711_1746140_0:0:0_2:0:0_23a27/1
+GGAGGATTTATCTATAGATTATTGACTTTGTCTCTGGGGTGGGTTTATATATAATTTTTAAAGTTTTTTGGTGAACCGCACAGAGCTGGGAGCAGACAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_192179_192570_1:0:0_1:0:0_48719/2
+CTGCATGGTGCCTGCTTTACTCCTTTTAAGAGATAAAACCTCACTGAAATGATGTGTGTGTGTGTTGAATAGTTCCAGCCTGGGCAGAGCAGTGGCACAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1119048_1119507_1:0:0_1:0:0_a740/2
+TGGAATAGACAGAGAAAAAAGTGAATGGGCACTTTGAGCCACAGAAAAAAACACTGCACACACTCCATTTCCGCAACTCCAAAATCATGTTTAGTAGGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_91664_92117_0:0:0_1:0:0_404bb/1
+TGACAAAGTGGATCACTCATGCCATTTCTTATTTCCTGGCATTTACCACGAAGCCGTTTGAGATAAAATATAATTTTCCAATTTCAGAGAGAGTTGAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1288364_1288814_1:0:0_1:0:0_6b87/2
+TACTACTCCAGCTATTCATCCTTGGAAGTGGAGGCTGCGGGTGAGACACTTCTGAGACTGTTAGGGTGAATTTCTTGTTCCAGCTCAGAACCATATGCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_852918_853333_0:0:0_2:0:0_303da/2
+CATCCCCTCTCTTTTTTTACTACCTATATTTGTCAAAAACAAAGATGTTGCCGCTATGATGGCCAGCCTGGGTGTTCATTTCCCTCAGTGACATTTAGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1703916_1704298_1:0:0_3:0:0_4662c/2
+GAGACAGCAGCTTCTGCTTAAAAGAATATGGTCAGATAAATACAGTGTTTGCAATTCTGGCTTTGATATATAAGTGACAATGTGGGCATCAACAAACACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1775951_1776414_0:0:0_1:0:0_520a1/1
+AGTAAGAGCCACCTCCGCCTTGTCCAACCTGTGAACTGGTTTTCCCAACATGCCATGTTTTCCATCCTGGACATGGGATTGCACACCAGCCACTGGCATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1906683_1907112_1:0:0_0:0:0_1f3d/1
+TGCAAAATAACAGAGGGACCAGACAAAGGGTACAGGTGGTGCTGTGTGGATTGAGAAAGTTGGAAGATGCCCCAGCCCTTCAATGTGGTATGTTGGCCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2468729_2469243_1:0:0_0:0:0_4dcf6/2
+TGCTTGTTCTACATTTGAATTATGGAATGAATCATAAAGTACAGCAGCTTTCATTACTTTTTCCTCTTTTTATTCAACAATATAACTCTGATATTATTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2324461_2324845_1:0:0_1:0:0_4f5c3/2
+AAGGTTAAACCTGTTCAGTTTGTTGCCAAGAAGTCTAAGGCTTTGAAAAGCAAGATCATGTACCCCTTCTTCCATATGATGTAACATTTGTTGTATCTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1920808_1921245_0:0:0_1:0:0_34d3e/1
+GCATAGAGGCAGGAAGCTTTCTAAACTAGATCTCTGCCCAAAGTTATCACAAGGGAATGAATCCAGGTGCACAAGTATTCAACAAAGCATAAAGGTGAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_212777_213257_0:0:0_1:0:0_24e79/1
+TCTGGAAGTCTTGAGGTTAGCTTTCCTAACCTGTTCAAAAAAGGAAATGTTCTCAACCACATATAAAACATTATGACAATATAAAAATTGGTCATGGGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_131451_131952_0:0:0_1:0:0_44570/1
+GGGCCCCAGGCATACATACCTGATTATGTCACAGAGAGGGATACACCGGGAGGGGCGGGCTTTGAAAGAGGACATTATGCTTGTCCGTCTCCCTCTCTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_123388_123909_0:0:0_2:0:0_2808c/1
+AAATTTCTACCTGCTGTGTTCTGGCATTTCTTGTTATATACATTTTTGTATTTTGAACAGTAGTTTTGTGGAAAGAGTGTATACAAATAGAATGTTTGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1127465_1127881_0:0:0_1:0:0_34643/2
+TGACCACCTTCACACCCAGCCTGGTTTAAATGATCTTTTAATGATCCGCCAGGCAGGCTTTTCAAGCAAGAATAGAGTGGCACTCCCCAAGTGCAGCTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1536601_1537029_2:0:0_1:0:0_10ec9/1
+GAATCTAAAACTAATAATTGACTGGTGCCAAACAAATATCGTATTTTTCTGAGTGCAGTCTCAGAAAGGGAGGGAAGATGGAAGAGTACTGGGAGAGGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1191143_1191555_1:0:0_0:0:0_27bd2/1
+TCCTCTCCTCTTGGCTGGAGGAGCGGGTGGTGGTGGATAGGCTGGAGTTAAGTCTTTTTTTGAATGTAGTGATGTTAGCACATGCGAGCTCACTTGGTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1887841_1888317_1:0:0_0:0:0_30b0f/1
+TTATTTTTTGTCATAAATCATCACAATGTCTTGTCTGTTCTCAGGTAAGCAACACGGTGAGTGGTTTTTTTTTTGTACTGATTAAGGGAAATAAAGAGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1573730_1574041_0:0:0_1:0:0_58448/1
+TTCAATCCCATCACAGGCTAGCCCCCTCTAAATAGTTCATCACACTGCAAGGAGTTTGAGGTTTGATATCATAAAATTTTATATATATACGCATCCCTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1454165_1454676_0:0:0_2:0:0_24710/2
+AAAGGTAATAGTAAATGTTCTTTGGACTTTAGTAATATGCTCTGAAAGTTCTATATCCCTATAACACAGACTGGACTGGACGCGCGACAGAAAAAAAGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1563604_1564109_1:0:0_1:0:0_111c1/2
+TCAATACTTGAACCCTGCAGCCTGGCCAAAATTCATTTAAATGGAGTGTTCTGATCAGCAATCCTTTCCGGCTGTTTCTGTCCTTTAAAAATTTTTTGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_763923_764293_0:0:0_2:0:0_107b9/2
+AACCTATGTGACTGGGCACACGGACACAGCCAGGGAGCTAATTTTGTTTGAAAGTCTTGAGTTAGAGATGAAGGTAAGCATTCCTTGGAGTGACTACCTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2189296_2189742_0:0:0_1:0:0_3d512/1
+TAATTATTTTTTGTATGTGTGTGATTTTCTTTAAGTTAAAAAACATGCATTTGGTTTATGGAACCACTATTGAGTAGCTGGGAGTTTTCCAAAGTGGCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1895665_1896002_0:0:0_2:0:0_448ac/2
+CCACCTGCACCAAGCTTGGGAGCTGCGACTGACATCGTTGGGCTAACATTTGGAGGATATTCCTTCTTTCTGCATATAAAAAAAAAAAGACTTTGCTCGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2423101_2423551_0:0:0_1:0:0_4aa4d/2
+TGACAGAAAACGAAACTGTTTATAGTATTTTGCCTCCTAGGAGTCTTGAGCCTCAGGGCTGTGCGACAGTTTCTCAGTGCTACACTTTCCCCTTAAAAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1520769_1521320_0:0:0_1:0:0_35e04/1
+TTTTACATTTATTTAGATTTCTGTCATTTCAAATCTAGAAATTAAGCCACAACGTGTGGTTCTGCTTGGTCAGAGCAGGTGTATATAAACAATCACAATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_379521_379847_5:0:0_1:0:0_532ae/2
+TATTCTACTACAGCTGACAAGCAATACCTGGAAGCAGAAAAAACATCTTTCGTTACGCAGGATTTCGTTCTTCAGATCCAGGCATATCTTCCCCATCTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_7118_7558_1:0:0_1:0:0_faa8/1
+GCAAAGAGTGAAACCACTGGCAAAAAAGTTGTGGAAAATAATCAGAGGCCAGCCTACTTGCTTGAAAGAGAGGAATGAGAACTTCTTAAAAAGGACTTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1657297_1657649_1:0:0_0:0:0_9428/2
+GGTTCTGCTGTGAGTTCAGAGCTGCATTTAAAGGTAATGATACACGTTGACACATACTCCCTGCATGCCATCCTGTATATATGAGTATGAGTTAGAGATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_517714_518172_2:0:0_1:0:0_348ef/1
+ATACAAGGCCATTACAGTCCACACCTATTCTTTGTTTTGCATCTGTGATCCAGAATCATAACCAACCTCCAGGTCACGATCTTCGCCCTCCTTAGCCGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_569010_569498_1:0:0_1:0:0_57efb/1
+CTAGCACAGAGTAATCAATCCCAAGTCAAGTCACAGTAGGAATGAAAATGCAGTACCAGGGATGACCAAAAAAAAATTATTTTTGTAGATGATTCCTACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1168447_1168849_1:0:0_1:0:0_41f73/1
+TATTTTGACATCACCTGGAAGGAGACCAAGTGATATAGAGTTGTCTTAGCTTGTTTTCCTTAATTTATAGAAGGACAATTTTATTGCTACCTCTTGATAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1424239_1424663_2:0:0_3:0:0_55c60/1
+AGATGAGTGAATGGGGGAAGCAGATCTTGGAAATGAGACTGTATAAAAATGAGCACCAGATGGAGAATGGCTGCGGAGGCGGAGATATTTTTACCATTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2313844_2314356_1:0:0_0:0:0_470d5/1
+TTTAAATGCAGCAGCACTGGAAAATTATAATAAAACTGATGCTACCTCTTCATCAACACCGAGTTAATACAAAATAGAAAAGAAAAATAACACATCTAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1378217_1378710_1:0:0_0:0:0_ad72/2
+AATTTTACTGATATTATTTCAACACAGTGAGCTAATGCATCTCTGTGTGAGGTCATGGCGTTGGTGTTACAGGTCTTCAGGCCAGAAAAAAGTCTTTAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_929176_929616_0:0:0_1:0:0_28a1c/1
+CCTTGTTTGCATAAAAAAAATTGTTGATAGTGCTGAGGCAGAGGACGGAGGTGGGCAATTAATCAAAAACTTTATTTTAAGAGATGTTCTCTCTACCCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_802958_803314_1:0:0_1:0:0_91a1/2
+GCATGAGTAGCTGGGAGGCTGGAGGGAGGGAGAGCAGAGCTTACTCAGAGAAGGCCAACATCTTGAGGATTTCTCCCAGCAGCTTTTAGACCTTTTATTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1155065_1155600_1:0:0_1:0:0_3ba10/1
+TGGTAGCTGAGTGGTCCCTCTAATTTAAAAATGCTAGGGGCTGGATGTAGCTGAACTGTGGAAAGGCCTCAAGACATTTTCTTTTACAGGCTTCACCTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2008096_2008575_1:0:0_1:0:0_4cf81/2
+GGAGCTCACTAATTAAGTTAACTCTGAATCTCTATGATGGAATCACCTGCCGACTGCATAAGCATGGGAATAAAACAAAATAATCAGTTCAACACTGAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1686388_1686822_1:0:0_1:0:0_42c4/2
+TGCTATTATTGATCCAACATGCCTGATGATTCTGAGTGTGGTGGCACTCTCTCTCACACATCAACAGATACCTGGCAAGACCATCACCTCTCCCAGTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_637834_638308_0:0:0_1:0:0_1fae2/2
+AGGGTGACAACACAAACTTCAACTGATTAGCTCTCTTGGGTTCACATGCATACAGCCCACCATACCCTTCCAAGGCTCGGATCACTTAGATAGATAGCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1861517_1861972_1:0:0_1:0:0_42c45/2
+CTGCGCCCGGCAAACGAGTAGAGACGGACATCCGTTCAGCCTGGCTACCGCCCACTGCAATAGTGCTGTAAGGTACTCAACTAGTGATTCTTAGCACAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_375696_376096_1:0:0_0:0:0_1880f/2
+CTTTCATAACTCATTCATGAGGGTTCAAAAACTATACCATTATTGCACCTAATTTATATAGGTTGGGGAGAATGTGAGTAGCTTTGCAAGGTGTGGATAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1667489_1668026_1:0:0_2:0:0_5b52c/2
+AAAGGAGAATTCCCACAGCCTGCAACTTGTCACACTGCAGTTAACACAGTGGCACCGCAAATACTTCTCTCTGGATCAACTGAGGTCACACTAGCTGGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2123665_2124053_2:0:0_2:0:0_aebf/2
+AATATCCAGGCTGAAATAAGTGGCGTAAGATGTGGAAAGATACATCACACCTGCTTCAACAAACCTGGGAGGAGCAGCATTCACCTATAGGCCAGGACTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1086541_1087020_0:0:0_1:0:0_6d/1
+CTTCTGGTTGTAAAGCTTAGAGGTAAAAACAGGGAGGATGAAGTATGACTTACCACTTCATGAATCTCTATAAGTTATATGAACACCTGTAATCCCAGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2006341_2006734_1:0:0_1:0:0_3f530/1
+TTTTTCCAGACACAAACTTAGCGACACCAAAAATCTAGTAATTTCTGAATGCTGGTCCTCCCAAATGAATGCATCAGTAGCTGGGCACCTGCAGTGAGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1087045_1087587_1:0:0_1:0:0_2dbc0/1
+TAATAGAGGTGGATATTCACAGCTCCACGCTGTCCTTATCAGCTGCAAAAATATATATTTTTTAAATTCTGCTTACTGTGGCTCGCTGCAGATGGATGAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1239130_1239546_2:0:0_0:0:0_27e13/1
+TTATGAAATTTCTTTCTTTCATTATTGCCACATGTGGTGCTTCGATTCAATTTCCAATACTTTTCATATATGCGTGAGCCATGGAATTTTAATTATTTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1696718_1697218_2:0:0_0:0:0_f198/1
+GGACAGCTTCATTCTGAAGTTTGTAATGATGACCTAAATTTTATTAAGGAGACCAAGTGATGGCCACTGCATTTCCAGTACTACTGATTTCTCTCTTACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1268144_1268533_0:0:0_2:0:0_58ad1/2
+AGGATGGGTTGGGCAACAATTCTCTTACATGAACAGGTTTGAGGACATGTGCATCTCTCTCCAGCGGTCTTTTAGAGAGAAAAGGATGCTCATGTGATGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1954521_1954921_1:0:0_0:0:0_33df2/2
+AACACAATCTCAGCCTGTGTGCATGTATGTATATCTTTTTATAGAAATTGCAGTGTCTCCACTGCACTCTGTTCCAGCAAGACTGGGGGAGTGGTGACGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_891370_891880_0:0:0_1:0:0_1ac34/1
+CATCTAGTAAGCAGCACCTTGCATTCCTGGGTTCTAGACTAAGATTATTACAGCGCTTTCTAAAAAGAAAGACATCAGATAAGAGAATATATTTGTTTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1467247_1467708_0:0:0_1:0:0_1f2b3/2
+AGAGGAAAAGAATGCCTCAGATTTAATAGTTGTTGTCATCGGAGGTGATACTATTGGCCAGAATCTAATTTTAGTAACCAACAGACCATGTGCGTATTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1216736_1217173_1:0:0_2:0:0_edd4/2
+GGCAATATATATTGGCTTCATCATCATTTAAGGGACTCCACCATGTCCCTCATTGAGGGACACGCTAATTTGGGCGCCACAGCCAGCTTGGTTCTTCTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_334013_334508_2:0:0_0:0:0_27d80/1
+CTCTTAGTGCCTGAATTCGTTCAGTGATCTCGGCCTCATAGCGAGATCAATAGTTTTAAGCATACCATCATAGTCCCCAGCTACTTGTACATGAAGAGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2066889_2067432_0:0:0_1:0:0_4ef5d/2
+ATTTATTCCCACTTCTCTGGCTTTAGGTCAGGTCAGTGATCTCCATATCCTCAAACTGATGCCTGGGGCCGAGATGGTAGGAAGGTGGAAAAGAACAGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2162851_2163324_0:0:0_1:0:0_3575b/1
+GGACTGTGTGAGTTAACCACACCTCAGCCTCAGCCTTGTGCAAGGAACATGTATAACTTCTTTAAAAACCTTGTTTTTTTAAACAAATTGAGTACTTTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_362656_363096_0:0:0_1:0:0_1a7b5/2
+GAAGGTCCCAGTCTCAAAGCAGAGGTGGCACTTTGGCTAATTTTGTGTCAAGGAGGTGGAAGCTGAAATCCCAGCCTCCACTTACTATGATAAAAGTGAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_817324_817757_0:0:0_1:0:0_13b2d/2
+TTGACAAAATAGAATCCAGAGGCAGGGGAGTGCATTCGGTAATCTTCTTGCTATGAGGTTTGAAACAGGAAATGTTGAGGTCCAAGCAGGGCCATACGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_753194_753649_3:0:0_1:0:0_35e66/1
+CATTAGATAATTTAACTGATCTGGCTGTGCTTTCAGAATGACATCCTCAGCCTGAACTCACAGCCGAGGGCGTGCAAAATGTCACCCCGTCTAAAGACAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1111125_1111609_1:0:0_1:0:0_361b2/1
+GATGATCTTAAAAACTCTATTCAATCATGCAAAGCTGTTTTTAAATGTAGGACCTTTCTATAGTTAAATTAGAACGACCTCCTCCTTATAACCACACGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1050585_1050974_1:0:0_1:0:0_3053c/1
+GCATGTAAAATACATTTGGACTACCATCAGTATAAAGCTGCAGCTGTCTCAAAGTCTACAGGAGTTTATGCAATACCAATGAGTTTAAATGATAAGAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_717278_717807_1:0:0_0:0:0_2d551/1
+AAAACAAAAATAAATTCTCAGCTATACAAAAAGTGAAGTATTAAATAATGAGATAGACAAGTACACTGGTCTCGAACTCTATGATTTAACGTAAAATAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1716066_1716461_1:0:0_0:0:0_1b52d/1
+GAAACTTGTATGACAGAACTGTTTTTTTGTTTGTTGTTTAAATCTCATAACATTCACGCCCAGGGAAAAACCAACGTCAACTCCAACTGACACCTGGGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2154536_2155011_0:0:0_1:0:0_32631/2
+CATTCATTGTTAGTGTAAGTTTTGAGTTGAACCCAAAGTTGGAGTCATAGGCGTGGTGGGGCAGGGCAGTCAAAAACTACTGCACAATCTTTTAATGTAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1054757_1055194_1:0:0_0:0:0_40405/1
+ATACCCTGTAGTAGAAGGGGTTTTTTTTTAATGATTATAAATATAATGAACAGCTAAGCCACAGTGAGTCATATCAGCGGGCCCTTGCAGTGATTCAGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2232056_2232504_0:0:0_1:0:0_53075/1
+AAAAACAGAAAAAATATATATATGATTTTGAGGTTGCTTTGCCTTTGAATTACCTTGTTGTTTTACAGGCCAGGCTACTCGGTGAGGGGGCTCACTGTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_642000_642387_1:0:0_1:0:0_3f536/2
+AGCCTACATCAATAAATGTTAATCTAGATAGATGGTGGTGAGAAAGCCTATCATTAAAAACTAGTAAACTTCAGTCATATATATATCTATTGAATCAGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1303011_1303464_1:0:0_3:0:0_328a0/2
+TGACTCTGTTTGAAGGAGTTTATCTACAAGAAAGAGGAGTTCAGGCTGAGGCCAGTATGAGAATGCTTCAATACAACTGGCTTTTTATCACAGTCAGTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1764570_1764977_1:0:0_0:0:0_16886/2
+TAATCAGTTGGGGATGGAGGAGGGCCTCCCAGCTACTCGGGTGGGCTTCTTTGTGAGATACTCATTAGTGTTAAAAATACATTTATTAGCCTTGATATAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_235135_235598_1:0:0_0:0:0_12ed6/2
+TGGAAATAACCCTCCCCAGGCAGCTTGGTGGGGGGTGGATAACGATAACAGATCATGATCTCATTATGAGTCTCCTTTTCTTTTCGGAGCTGGGACTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2000542_2000940_2:0:0_0:0:0_4b8c9/2
+TGCCCACAGCCCAAAGGTTTCAGAAACAGAGGATTTTCTTGAACACCGATAATCTGCCTATATTATTTTCCCTCCCCTCTCACAGTATTGCTGGAATAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1730765_1731134_0:0:0_1:0:0_16c12/1
+TTTGAAATATTAAAGTGGGTTGCCCTGATGCCTGATCCAATTCTAGTTCCCCCATCTATTTCTTATGGGGGTTTTTCTTCACAGAGCTTGCATCCTGACC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1936401_1936842_0:0:0_1:0:0_2754e/1
+TTCCTTCCATACTTGCAAGTGAAATTAGGTAATAATCCTGGACACCTTCCAGGGAAAGTAGAGATTCAAATTTATCTGAATAAGTTATGTCTCAGCTCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_392941_393379_0:0:0_1:0:0_c5a0/2
+TCCCGGGAGGCTGGGTATGAGTGAGAACCCAGTCTTGCTCTCTAAGCTCCCTCCTCCCAAAGATGAAGCATGTGGCTCAGCAAATCTGCCTTGATAGTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1915479_1915894_1:0:0_1:0:0_24b16/2
+AAAAAGATAATACAGAAATATCAACAGAGTATATACACGCAGTAATCCTGGCTTCCTTTTGTGTTTGTCCACTTGATCAGACTCCAGGGGTGAAGACACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1312224_1312578_1:0:0_2:0:0_2493e/2
+CCTTAATAGGAAAAATGAAGGTGGCTCCCTGGAGTCGCCTGGGATTAGTGCAAACAAAAACAATATTAATTTCAAAAAACCTTATTGTTCTGTCCTCCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_509431_509835_1:0:0_0:0:0_26036/2
+TCAATTGGTTAAGATGGGCTCAGTGGTGTCCTGAGATCGATATTCGGTTCTGCCTGTGTACAAAAACACACCTCACAGAGTTGATATCTTCATGTTTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1530568_1531088_1:0:0_0:0:0_dbbf/2
+AAATCACAGAATTAATCAGTGTATGTTGCTTTTAATAATTTTTTGCACAAAATTTCTACATGTAGGTACAGGCCGAAGCCAGTGATATCATGGCTCATTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_914420_914891_1:0:0_0:0:0_558d1/2
+TTTCTGGATGCAAAAATTTCAAAAATACAGAGACACGTGCAAAGGAAGTGAGCCCAGGCATGGCCCTTTATCTCAAGCTGCTTTTATGTTATACCTCCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_461290_461842_0:0:0_1:0:0_15d37/1
+TTCTAACTCTTCATAGGCAACTATTTGGGAAATTGAATAAGATTGACTCTACTGTGTTCATGCCGGTGCACTGTCGGCCTCCCCTAATGTCTGATTTTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_170232_170661_2:0:0_1:0:0_1e367/1
+CGGGGCTCGGGCCCCAAACAATTCTGAGAGGGAAGTCCTATAATCAGGGTACAGCCAGGCTGACAGTTTTGTCAAGTGTATTTGGAATACCAATAGAATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_839850_840266_2:0:0_0:0:0_36f81/1
+CTTCTTTTGTTACCGTATGCAGGCAGGCAGGTCATTTTAAATAAACGGCAGGTGGAAAGGTTATGATTGATTTTAAATTGAGTGCATTAATGGTCGTTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2005020_2005442_1:0:0_1:0:0_ba96/2
+AAGTGACAAACAGACTTGTTTTGTATTTTAATAGAACAGTTGTGTCTAAGCACCTTTTGTGTGCAAGGCCATTCAGAATTGATCCTAGGGCTCTGAGGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_712593_713035_0:0:0_1:0:0_22b26/2
+TAAACTGGGGCACATAAAATTGATTGTTTCAACATAAATAATTCCATTAAGCTCAAGGGAAGCATGGGTGCGACAGGATGGTTTGTTGAAACAACACATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_273645_274160_2:0:0_1:0:0_41d63/1
+TCCTTGCTTCATCATTACTAAAGAGTTTAGTCAGCGGACGATGCTCCTGAACTTCTGCAGCCTGGGGTGGGGCAACAGTCTCATGGCTGGGACTGCCATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_150934_151421_0:0:0_1:0:0_2e071/1
+TTGTTTGCTCTCTCCTGATTCGACACTGTGACGCTGCTTTGAACCTGGAAACTAGAATACTGACCTAATAGGGGGCTAATAATTTATTTATGTCCTCAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2134603_2134953_1:0:0_0:0:0_5500d/1
+GTGTGTGTGTTAACTATAATGTTTGCAATCTCAGACTGTCCCATATGACCACAGGCAGAGCTTCATCTGGGATGATTTAGGGTGTGGTGTTTGTTTTGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2100958_2101458_1:0:0_1:0:0_21baf/2
+ACATTAAGAGAGCACCCTTGAACCTCCCACTTGGCCAATTCCTTAAGGCAGGACAAAATAAAATAGCACAGGATTTTAATATAGATATGTGGAGGAGATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_914312_914698_0:0:0_1:0:0_1e231/2
+GTTGGCCTGGCTTCACAGATGCTGGGGCCGTTCTTGTAATGTATATATGACACTTCACTACTCTTCTCTCTCCCACACATTTTTCTGTCCCAAAATATAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_532760_533216_1:0:0_0:0:0_3fd37/1
+ATCTATCAGGGGTGCTTTTGTAAATTAGCACAGACACTGACTTTCCCACTGTCAAGTCATGTATAGTCTCCCATTAACTATAATTCTTGACCCTCCAATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_157261_157713_1:0:0_1:0:0_25177/1
+CTTTTATCTTCATCCTTTGACTTTGGTGCAGGTTAAATTTGCCAGACCTGAGTTCAGGAAGTCAGCCTAGGATCAATTGAAGCATATAAACACAGGTGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2360455_2360896_0:0:0_1:0:0_1abe9/2
+AGGCTTTGTTCTCTTGGGCACATGTGAGCCAGAGCTAGAGTGTGAGACTAATATCCATGATCCTTTATATATCCTCCCACCTTGTGAAGTTTGCAATGAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1757509_1757925_0:0:0_1:0:0_1f21e/1
+AACCAATAAGAGAGTATTACAGGCGTGAGGTCCTTGTGACTCATTTCATATTTGACTGGTGTCCAAGCATGGATCCTAGATCAGTTTTGGATATGGGTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2450963_2451394_1:0:0_1:0:0_5a11/2
+GTATACAAAAAGGGGCAGGAAACGGTGTTCCCCAATGTATACACAGATGCCTTAATATCAAAGAACAAGTGCGGGGTTTTATTTGTGACTCAATAACAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1963304_1963792_1:0:0_0:0:0_470f0/2
+TATGGAATATCCTCAGCAGTGAGCTGGAAGATCAACTTGAGGTCCCAGCTATTGGGGATGCCCGGCAACACCCGGCCCCAGCCATACCTATGAATATATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2177174_2177642_1:0:0_1:0:0_2a7ab/1
+GGGATGCTGTGAGCCAGTGTACCTGAATTGATTCTCAATCCTAATGGCCTACCACCTTTCGTTTAAGAACTAGAAACATCAATCAGTCCCAGGGCTTCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1290677_1291137_0:0:0_1:0:0_37b71/1
+TGAGCTCACTATAGCTGTAATACCTATATTATTTACTCTCTCAGCCTGCAAGACTCTTTATGGCGACGTCAACCTGGTGCCTCAGGAGCAGCTTTCAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1495067_1495504_0:0:0_2:0:0_14221/1
+CACTCTTGATTTATTCACCACTTGTTTTGTATTTATGATAAGTGTTGTATGGTTGCCTCAAGTAGGAAAAGTTTGCTGAGGAGGCCGAGATTTTTGTGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1712488_1712906_0:0:0_1:0:0_405a1/2
+TGGCAGACGTCTCTTATGCTCCATTCTGTCCAAAATCTTCTTCAATGCAAAACCTACAATCAAGCAAAAAAACATGGCCTGAAACCATTTGTCAGAGCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_142116_142566_0:0:0_1:0:0_49d9e/1
+CTGGGACATCACCTCCTTGAGCCCCTCTAAATATAACAATTCAAGTTATAAACCTATTGGAGCACCCCTCCCACCTGAACTCCCAGCACATTGGTGACAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1107041_1107476_1:0:0_0:0:0_2ba36/2
+GTGAAACCAGTATTCCATGTATGAGTTCTTACAGAAACTGCTCGCCTCCCCGTTTTTGCAACCTCTGGCTCAGGAAGCTTTTAAAAATCAAACTTACAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2002337_2002808_1:0:0_0:0:0_3cd7e/1
+TTAAAGCGTGAGCCAGGGATTACCGGGATGTTGGTAACATAGTATCTGTTCTCCTTTTCCTTATAACTAAAGGTCAGCTTGATTGTATCTTGGGATTCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2181069_2181513_1:0:0_1:0:0_2c485/2
+TCATGTTGAGCTGAGTGAGCTACACAACTGAGTTACTAGGATTTTGGGAATCACACATGGAATGGATTTTGTGTTTGCTATGATTTCATAAGTCAAGGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1026948_1027375_0:0:0_1:0:0_5a15d/2
+TGCATCCTCTTATCTATATAAAATGAGCATTGAACCTGTTTAAATTTAAACAGAGTCTTGTGGGGGGAAGGTGGAACCAGAGCAGATTCCAATGCAGAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_746197_746648_0:0:0_1:0:0_113c3/1
+AAGAAACACTCCAACCTACCATTCTGCCATGGTGGTGTATGAGTGGATCAGTGTTTGGCATTCCCAGCATATAAATTCTAGTTTTTCTAAGAAAATATTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1098058_1098510_1:0:0_2:0:0_56f4e/1
+CCAGAGCACAGAGTGGAGGGAGGCTGGAAGGTCAGTGAGCCCTTCCAGGAGGAGGAAGGGCTGTTTTTAATAAAGTGCTGGGAAAGACACGATAACAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2169731_2170123_2:0:0_0:0:0_ea08/1
+CTTGGGTGATCCTTTGTATTACCATCAATACTTCTTAGTATTGTTGAACCCGTGGCTCTGCCTCAAATAAATGGACCTATTGTATATATATGTGTATGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_643826_644180_2:0:0_1:0:0_2c5f3/1
+AGTCCCAGGGTGGAGACGGAATGGAATGGAAGCTGCCGGCTAAAAACATTTTTGATATTTGAAATCTATATTAAGAAGGCAACCAGAGACAGACATCAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2309734_2310224_0:0:0_2:0:0_1a283/2
+CGAAGTTCTTTTAAGCAACTTATACTATACGTGGTCTTAGATTCCAACTAAAAACCCAATAATGAGAATAACAATGATGAATATTTAGTATCCTGGGGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_958025_958433_1:0:0_0:0:0_230fe/2
+CACAAGTGGACACGTGGAGCTGGGAAAAGCGTTGGAAAACAGTCTCACGGTGGCTAAATGTCACCAGGAGTTGTATTGCTGATTTATCCACCACTTTAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_502571_503020_1:0:0_1:0:0_27f34/1
+TCTCCTCAGCCTCCCCCATTCCTTTAAAACAGGGTATATTCTCACGCCGGAGCTCCCCACTCCATCCCAGCCTAATGTGTTGTAAGTCCCAGCTTCTACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_30186_30667_1:0:0_1:0:0_2883d/2
+ATAAAAATAAATCAATGATGCTGTTTTATTTGATGGTCTGGACTGAAAAAAGACAGTTTTGGTCTCAGCAAAGATGATTTATGCCTTTGATGGGTGTGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2325684_2326074_0:0:0_1:0:0_3e3da/1
+TAAAGTTCTGTGTCTCTGCTTGAATCACAGCTGCTGATCTCAGTGGGTTACAGAGAGCAGGAGGCATTATAATGGCTGAGGATCACCTCCGCCTCGGTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_542674_543137_2:0:0_2:0:0_53a8c/1
+ATAAAAAAAAAATTCTATTTGTGGATGAGGCTGATTTATTTCATGGGTTCTCATGGCCATCGGCTGGACTGGGCAAGAGTCCTAAGGCAGGCCTTGCAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1534484_1535007_1:0:0_1:0:0_28ba0/1
+ATTAGGTCCGTCTTGTTCTGAAATGACCAGTTCAAGCCCCTGACCACCCAGTGATGTCATTTATTTTTGTAAGGGAAGGATCACTTTTTGTAGATTTTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1939960_1940384_1:0:0_1:0:0_3f884/2
+TCTCTTGCTCTATTAAAAATCGAACATGTCCCTGAGTCCAAGAATTTGTTTCCTTGTTCAGACTGTATATTACAGGTTGGGGTCTCAAGTGTGTGTGTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1475889_1476291_1:0:0_2:0:0_2e20f/2
+AAAACACTGGTATCCCTCATGAACAATTTAGATTAAGCCAATGACCTGACCAACAAGGGTCTAGCTATGGTTCTTTAGGAAGAGCTTGATTTCATAGAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1657513_1657969_0:0:0_1:0:0_ab54/2
+ATTCTCCCCACGTCTATTTATACAGATCGTGTAAATCTGCAGTTGTACTTTGGAAATGTGAACTACCATGTCCTAGAAACATTAAACAAAAAAAATATAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2379916_2380357_0:0:0_1:0:0_122fe/2
+TTGAATCTGTTGGTGTGAGCCGAGATCTGGTGTCATGGGGGAAAAATAAAAAGCAGGTACTGCTACCACTAGAACGGTAATATATATATCAATCACCCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2264843_2265330_1:0:0_0:0:0_33e76/2
+TGGTGGCGATGAACTTTCAGTTCCCCAGACTGGGTGCGGCCCCACCCCCGAGCTTGTGAGGATGGCTCCAAGTAAAGCAATGGGATTTTTGTAGAGAAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_695668_696062_1:0:0_0:0:0_5b245/2
+TAATTTAGTTTCCAGTTTGAGCAGGTTTTCTTTTCCATTGGCGATCTATTTTATTTTCAGGAAGGTTGCCTCACCTCCTCTTCAGAGCACCTGCCTCAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_798287_798678_1:0:0_0:0:0_6601/2
+AGTGGCCTTGCACCTTCGTGAAGATATATACTTCCAGGAGGATGGGGGTTTTCTTCCTTAACCACATATGTAAGCTCAGGGAGAATGGAAACATTAAACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1251913_1252310_0:0:0_1:0:0_50fca/2
+GGAAGTCAAGAGAAAGCTGGCTTAATACTATTTCCTTCTATAATTTGATTTGGAGCTATTCAAGTCACTGCAATGCGATCTCTTATCATGCTGTACCCCG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_306472_306897_1:0:0_1:0:0_53f7d/2
+TATGGAGTAGATGAGATAAATTTCAGGTGCCTGTTGCTTTTGGAGCCCCGAGGCCTCTGACTCTGCATGGGAGCTCCCTGGCCGGGCAAAGCGTTTCATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1023981_1024422_1:0:0_1:0:0_4a042/1
+AGCACTCCATGCACCACCTCTGCTAGTATTCATGGATGCAAGAGGAAATTGAACTGCTTGTATTCAAAAAAAAAAAAATGGCAGAGATCAAAATGAAAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_829410_829845_0:0:0_1:0:0_2a43b/1
+TTGAGAGACACCACTCAAAATGCTTCCTCCTATATCAAAAAGGAAATGTCTGTGCCTAGTTGTGAATGTACATATATAACTCATTTACCCCATAATTAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1548338_1548742_0:0:0_1:0:0_19a3c/2
+ACCCGGGTTTTGTCCTCTGCAACAAAGTGAGTGAAGAGAATGGACAAGGTATTTTCCCCATGGGCATTCTATGGTTAGATAACTTTTTTTTTTTTATTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1180836_1181343_2:0:0_0:0:0_2cb6c/2
+GGGGATGCAAAGTGTGAATATTCAAGACCTTGACAACAAAAAAAGACCCAGGGCTGACTAAAACTTAAAATGGAATCCAGTTCCCTTTCTTTACTTAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1046131_1046625_1:0:0_2:0:0_3b85a/1
+TTGGAATTGAAGCCCTGGGGGAAATGTACTTGTTTTATGACAACTGCCAATTCTGAGACATTTCTGTGCTCAGCTTCTAAAATGTCCCAAAGCAAGACTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1171403_1171805_1:0:0_1:0:0_253c3/2
+ACCCCTGCCCGGCTGTCTTGTCCAAGGATTGAGTGAAAAACTACCTACAGTTTCTCAAATTCCCTTCATGCTTCAAGCGCCCTCTGTTTAGTCCCTAGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1182103_1182543_0:0:0_2:0:0_18954/1
+CACTCGGGACACAAACTGTCGTGCTTGAGTAATAATTTTATTATATCGTAGAATCAGGGGACCATATATGATACAGCACGTACACAGGTCAGGAGAATCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_975307_975728_3:0:0_1:0:0_199b/1
+GTTTCTTTCTGAAAGATCGCTTTCGTTTTCATAAACAAATTCTATCATACTTTTCGTCTGCATATGAAAAACCAATGCGAGATTTTTAACACAGGTATCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1184801_1185283_1:0:0_1:0:0_bd76/1
+CTCATACCTGCTGTGCTGGAATGCACCGTCACTGGCCAGCATGATTTCACTAGAAATGGGAAGGCTGTTACCTAAGATTCGAGACCCCCAATTATCAGCG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_254670_255241_0:0:0_1:0:0_1e869/1
+TGAAAGGAAGCACTCCAGACTTTTGTGTTAAAAACTTTCTTTGAATTATATCATTTGTCACCTGTGCCATCTTCACCTGATATCATACACCATGTCTGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2197300_2197681_1:0:0_0:0:0_c181/1
+TCATCATGAATTATAACATTTCTGCCAGGTGTTAGCCCTGGAAAGTGCTGTACTGTTTTATTTTGAGGGGCAGGAGAACTCATTATTATACCCAGAACAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2178945_2179323_1:0:0_1:0:0_2db58/1
+ATCGGAGGAGCAGGAAAATCTGCCTTATAGTTTTAACTATTATTAAGTGATAGCTAGCATTTCTGGGGCCCCTCCGCCTCGGCTCACGGAAGTGATTAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1221589_1222023_0:0:0_1:0:0_42190/1
+GCTTTGGGTCTTATCATATCAAAAAAATTTACCGATTACAGGCACCTCATGTGCACACCATGCTTATAAATCTGACCTCAGCCTTTGCTCACTGAGGCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_713169_713604_1:0:0_0:0:0_9cdb/2
+GAGTTCTCCTGACCAAGATGAGGCCGGAGTTACTGCATGCATTCTCACAGAGAATACAATGGGTTAAAACATCAACTGGAGGTTCATTCAGCTCTGAGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1316614_1317126_2:0:0_1:0:0_4372b/2
+TTCTCCAAGTGATCTGCTCGCTCAAGATGAGTTATTACAGAGTCTGTTCTAAGATTTACCTGGGATCTCGGCTCATTATTTAAGTGAGGCTACCACATCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1251782_1252240_1:0:0_0:0:0_40781/2
+ATCATTAGTAGTGGGTCCTTTACCATGTCGGTAGCAGCATGGGACCAACACTGCACTCCTTGGCTGGACATTTGCAAATTCAGTGTTGATTTTTTGTTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_127921_128337_1:0:0_2:0:0_4fea4/1
+AGAGGCAGGGGTGTTTCACAACTGCCAAAAATTAAAGGAAGGTCAATAACTTGGGCATGCATTTAATTTTTGTGAGTCCAAGTGTTTCCTAGAGAAAGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1709782_1710209_1:0:0_0:0:0_444f4/1
+ATGGCTTCTCACATTTAAGATTAACTCTGCCTGGGCCGGGGGAGTTTATTTGTAATCCCAGCATGTCATCTTGCTGTGCATTGCACTACACATTACAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2462991_2463354_2:0:0_2:0:0_53839/2
+TGTTAACAACAACAGTGACATTCCCTGCTCTGAATACAAAATATATAGAAATCGGGCCGCGGCGGAGGCTGTTCTTGCTAGAACCCGTGTATGTACAGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_809579_810020_1:0:0_0:0:0_2c83b/1
+ACTGAGTAGTTGGTCAAAAGGGAAGCTGGAGTGTGAGGCAGAGCTAGCCAGTTCTCTTATCAGAGTCTTACGATGATTGCTTCTCTTTGTCAAGACAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_452108_452586_1:0:0_1:0:0_59345/1
+GGTGAAACTAGTGGCCCACTGAACCCATCTGTTAGTAATATTTTCCTGTATACTGTCCCTGCCTCCCTTTCATAATCTTCCCAGGTTTCACATGCTTTAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1117757_1118065_0:0:0_1:0:0_d426/1
+TATAAGCTATTGAAACCTAATTATTACACATGTGTCCTCCAGGTGACTGAAAGCAGTATGGTGACTCTCTGAATAAAAACATGGTCCTGTGTGCTGCTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2480816_2481253_1:0:0_0:0:0_357f8/1
+TCCGGCGGCTTGATTGCTTTGGGCAATACAAGTCCTTGTAACCTCTACAATGCCTATTCTGGACAGTAGCTGGGTTTTTCTATAAATAACAAAAAACATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2220193_2220637_2:0:0_0:0:0_50c5c/1
+TATCTCACAGCTCTAAAACCTACCAAAATGATTTACAAATTGCTTGGGAAATACCGGAACTTCATTGGTATTCTCCTTAGGAGCTCCTGGATGTATAAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_110736_111257_1:0:0_0:0:0_147c9/2
+GCTGTTTGTAGAAGGGAAATAAATTTTTAGTAGAGATGCCATCACTTGATACAGTACCTATGCTATTGTTGCTGTCGCCTTTGCTTAACCCCTATTTCTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1326534_1327058_2:0:0_1:0:0_36524/2
+GGGAACAGAATGATTGGCAAGAAACTCCAGTGAGCCCTTTGTACATGTCCAGGTCTAATGTTGTGTTCCTACCCTCGGACCAAGCACAAATTATATATAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1900919_1901360_2:0:0_0:0:0_1ee9a/2
+ACCGAATAGACCCAGTGTTGGCATAGTTTGAGAGCTTGTCATCTTTATTTGCTTAGCCAAGCATAAGAGAAGGCCCTGGCCAGCGGACCGCACACATAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2343878_2344356_1:0:0_2:0:0_5a644/2
+AGTTGTTCATTTTTTATTTATAAGATGTCCCTAGCACGGCCAGGAATGGAATATCACTCACATGTCTGTCTCCATCCACATCAACCAGCCTCCAAGATTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_372043_372507_1:0:0_0:0:0_58b6a/2
+TGCATAAAACATGAGAATATTAATTAGCCTCCGGGTTCAACACAATCCTACAGACTGGCATGGCTTTAAGAGAAGCACTGTGTACCAGCATATATATATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_844471_844930_0:0:0_1:0:0_db43/1
+GCTGGTGAGTCACCCTCCTGGACAACGTGAAGCTTCTTCTCCCCAGGCAACAGTTTCTGGTCATGTCAAGGTCTTGATCCTTCAGTCTTGTCCAAGTGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1271351_1271783_1:0:0_2:0:0_50069/1
+ATCCCAAGAAAGTCACCTCGCGCCTTATCCACCTCAAAGTGTGTGCCTCAGCTACTCCGGATTTAATGATATTTTGCCAGGAATACATGTCTTGTATGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_478068_478447_1:0:0_1:0:0_1eaee/1
+TGTTAACATAGAGTGTGGGCCACCAAAGTATATCTTTATGGGGAGGCCTATGTGGTGTTCTATCCTTGGCTCCATCTCCAACATATATAGAGAAAATGAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1995119_1995592_0:0:0_1:0:0_154d1/2
+ATCATGGCTGTGTAGTTTTAAATTTGACTCAAGGTGTGGGAACTTATTCCACAATGGATGTCAACGTACAACTTTCTTTATACATTTTCACAGACCGTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_848405_848834_1:0:0_1:0:0_104a/2
+AGATGGAGGTCCACTCACTCATTTAGAAATACAAGTTCCATTCGCTAGATCTCCAACCAAAAATGTGACCACTGGCTGGAGTCAAATAAATCAGTTATTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2080518_2080993_0:0:0_2:0:0_33b39/1
+GCACAAATGAAATTTCATTGCTAGCTGGCATTTTTGTTTTAAGAGACAGAGACAGCTGGAGGATTTAAAATTGGGACTACTTGTCTTTGCATCAGCCTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2417758_2418230_1:0:0_1:0:0_36bd9/2
+CTTTGCCCATGCACACATGGTGCTTGTTAGCTATTAATCCCCCATCTTAAAGTACAGTGCGGTGGCACACACACACTACGCCTGCCCAGCCCAGCTGCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_509757_510282_1:0:0_0:0:0_54c2f/2
+TTGTTAACTGTACATTAATACTTAGAAACAGCAGGGCCCCTCAAACAAACCAAGGCTGCTTTGGGAGGCTGACTATGCTAAGGATAGAGATGATGATGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1945716_1946190_1:0:0_1:0:0_d2da/1
+GAAAAATTTGCATTATGCTATCACAAAGTGTTATAAAAACAGGTAGCTGGATTACAGGCCTCCACTAACACTCAGCCTTTAATCCGCATATAGTGTTAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1480142_1480731_0:0:0_1:0:0_306a0/1
+TCAGCCCTATATTTCATATTTTATCCATTGCTCTGTCGTTATCTCACGAAACCCCAGAAAGTCTCCAGCCTGGAGTTAACCCAGCTCAGGTAGATTACAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_471837_472274_0:0:0_1:0:0_5a6e5/1
+ATATAACTAAAATACAAATCTTAAGAAACATCTGACTTTAAAAGTGCTGTATAATCATCACATTTAAATGACCTCGTGAAACTTAGTTTTGAAACTGGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1141156_1141647_1:0:0_0:0:0_3997d/2
+ATAGACATTTATTCTGGTCCCTGTCCCAAGTCAAAGAATAGACCAACCTAGTGTGCTATTGTCCTAACCACACAGGTGGCCAGTGAGACTGGAAGGGTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1728755_1729195_2:0:0_1:0:0_2d5ff/1
+ACCTTCATAGGACCACAAATATATATTGGAACACGGCAAAGGCTATGCCTTTTTCATTCTCAGTTTTTTGTCTCCTGGAAAATCTAGACAGAGGTATACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2082618_2083135_0:0:0_1:0:0_2a796/2
+TTTGATTCGGAGGTCCCAAGTCGTGGTGAGGAAACAGACTTTCTTCTGCGAATTTTGGTGGTGAAACAGAATTTAAATGTGCCTGCCATTGGGCAAAGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1879772_1880182_0:0:0_1:0:0_32b2f/1
+CATGCCTGTGTGACAAAAACTACCATAAAATTAAATTGAGTGAGAAACCTTAAATACAACTCATTTTATTTACTTTGTATATTTTTAAAGCTGGCCTGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1398298_1398693_1:0:0_1:0:0_ce7f/1
+CAGTTCTGGGGCTCACTGACTAGATGAGTCCTCCCAAAGCCTTATACTGTCCAGGATAGCATTCAACAAAAAGGGAGTGAGCTCTTCTCACACTTTGGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1266412_1266805_2:0:0_1:0:0_3989c/2
+TTTCTCTCCATCTTTCTTTTCCTAACGTTTTCTGGTTCCCTAATCCTGGGGTTCAAAAACTCAAGTCAAGCTAGACTAAATTCTCCTGGTAATTTATCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1586176_1586640_0:0:0_2:0:0_4c363/2
+GATCATCCTTCTAACAGGATTTTCCATGCTCTAGTTGGCACTTGATGGTCTTGGTTCAGGCCAAAAGGAAATAAGAGCAAGAAATCAGTGAGATGCTCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_632229_632713_1:0:0_0:0:0_43253/2
+GTCCTCAATTTTCATTATGTTTTTACCAAGGAAGAAAAAAATCAGACCCAGAACCTATAATTTGAAATCCCTATAGGCAATGGGTGAACACCTCCGCTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1795979_1796534_1:0:0_2:0:0_b849/2
+AAACATATTGTTGTTGCCAGGGAGGAAAGAAAATGTATAATGATTTTCTTTAGAGGGAAAAAGAAATTTGAATAATTCTTAGATCCCTGAAGTTGAGCCG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1016901_1017422_1:0:0_1:0:0_50014/2
+GGAGTTACATCCACTGCTCTGGGATTACCCAAGTATTGCTTGCTTTAAATAAATAGCCACCCATCCTTTAGAGTTATATCTCTAGCATTTTTGCCTCAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2355507_2355984_1:0:0_1:0:0_53272/2
+TAAAATGAGGGTGGTCATAGATGTTCTTATAGGGTTCACATGAGGAGGGTGAGTCCTGAAACCATATCTACCTTTTATTCCAAATTCCCTGCATACCTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2230372_2230791_1:0:0_0:0:0_15a27/1
+CTCTGGGAGACTGAGAGAGACTACCAAAACAGTGAGATCGTAACAGTATTTCTTCTCTTGGTGTGTGCTAGGTTTTTGGCTTTCCTACTATTTCCTCTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1266126_1266635_1:0:0_2:0:0_1f685/1
+GGTCTCATCAACTTTAGCATCCTTGGCAAAATTCCACTTAGGAGGAATTGAAAGGAAAAAAAATCATTTCAATAAGTGAAATGAAGACCATCAATAATTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_963012_963402_1:0:0_2:0:0_43e30/1
+ACTAACTGATGAAAATGGAGCGCTGCCTCTGTCTCAGCCTAGGGTCTTGATCCTGCTTGTTTTTAGAGAAGCTGTATCATATGGCGCACCACCAGTTATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_385304_385763_1:0:0_1:0:0_3cb24/1
+ACAGGGTGGTTGGGGTCAGACAGAGTGGCTCTGTGTCAATGAGTGTTTTTCTCAAATTCATATTTTTAATGGAATTTAAAGTAAAGAAAAAAAGAAGCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1663960_1664411_1:0:0_0:0:0_514f0/2
+TGATTCCTTTCTCCACCTTTCCAATACGAGGTCATCCAGAGCACCAACACAGTATTGAGATCTTATGTAAGATTCTATTTCCAACCTAGGGATGTGGGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1532753_1533169_1:0:0_1:0:0_46d95/2
+ACTGACTCTGGGACTCCAATAGCCTAGGGCAGCCTGGGCAACAAATACTCAGGACAAGGACTGAAAGTCCCAGCATGGTTTTTATCCATCATCCTTTGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1593980_1594389_2:0:0_1:0:0_3b463/2
+CCAGTTGCTTTGAGAAAACTGGCAATTTCCACCACACAGTGAGCAGATTTCGGAGAGAGGCAAAAGGACCTCCCGCCACTCCTCCAATTACTTTTGTCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2077945_2078369_0:0:0_1:0:0_4254d/1
+CTGCACTTTGGGGCTGGATCCTTTTGGATTTTGAATTGAAGAATCGCTTTCCATGCCTGCAAGTTGCTCTTCAGGACATCTGTCAAGTTGGTCTTACTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_759096_759584_1:0:0_2:0:0_27db3/1
+TGGTTTCTGAAATGACTTGGCCTAGTTTAAGGCCAGGTTGGAAATGTCCAAACCATTGTGGTTGCAGAGTGTTTAAACCTTGTAAAACAAGAAAAGAATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2484763_2485236_0:0:0_1:0:0_2a34f/1
+GTGAAGCTGAACTGTGCAATTTAATAGTTATGTTCTTAGAATCCTAAGTCCCTCTGCTCATGGTGATGCCCAGGCATAGTAAGTCATGCTGACCTGGGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2111568_2111982_1:0:0_1:0:0_16e5c/1
+GAAAAAAAAAGTTTCTGCCCGGCTTGGAGAAATGATTTTCAGATGATTTTATCAGTATTTGGATTAGGCTTTCAAGGTCTGGGATGGCATATATTGATCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1683272_1683734_2:0:0_1:0:0_4bbcb/1
+TCCTAGCTAGGTATTGTTCTGCAGGTGACCAGTACACTCCCACCACTACTGGAAGTGAAGAATACCCCAGCTAACTCCAGGGACCACAAATAGGAGCAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_51992_52458_2:0:0_0:0:0_40d59/2
+AACTTCTCGATCTCCCCCCGAAGACTAACTTATGCTTTATAAAAATATCTTCATCAGGGAAAATATATGTAATCCATTATGTTTAAGATTCACGAGGTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2134862_2135312_1:0:0_1:0:0_27458/1
+CTTCTCAAGCGTTCAGCTTGTTTTTAAAATTTATTTCCCTAACCGCACCCCCTCTAATGCACAATGGAGTGGAGGGTTAGGGTCTTTTTGTCAGGGGTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2495282_2495813_0:0:0_1:0:0_15f4e/1
+CTGGGGTCAGGGTGGGTTGAACAAAAATTGGATTTCCTCTTACTCTCACCTCGATCTTCCTGAAAAAATACTGATGCATAGAACAAGAACTTGTTTGCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2431236_2431670_1:0:0_1:0:0_3e42c/2
+GGGGCTGTGGACAGGCCTGTGAGTCTCCTGGGTGTTAACTTCTTCTTAAACATGACCTCAGGAGTGCAAATGTTCCACCTGGGTTGGAAAATGGGCGGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_125235_125725_1:0:0_2:0:0_26d08/1
+AAGGTGAACAAAAAATGGCGTGCAGCGCGTGCCTGTAATCCCCTAGGTGTGATTAAACAGTCCCCGGAATCCAGCCTGGGCTTATGAATTTCACACCAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2002477_2002927_0:0:0_1:0:0_2cbfe/2
+GTGGGCCATTCCAGCACTTAAAAGCACATGTCCTCTTTGAGGGCGTCAGGTCCCCTCATCCCCATAGGTTTAAAAACATCTAAACAAAGTTTTATTTAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1735089_1735606_1:0:0_0:0:0_35439/1
+TCAAAAAGAATAAAATAAAACTGATGAGTGTATGGCCCTAAATGGATTTTGTGGACTAAATACAGTGCTGGGAGGGTGTAGAGAAAATGATATTGATTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_669517_670033_1:0:0_0:0:0_360a3/2
+CTGACTCAGGTCACTGCTACACCTGTAGGTGCTGTGGACATCCGCCTCAGCCTTAGTAGGGATGCTTTCTGATTTCCCAGCTGTGTCTGCTACGAAGATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_228446_228869_0:0:0_1:0:0_48c9f/2
+ATTAAGGTATGATAGTTACATAAAAACCACCATGTTAATCATAATGCATGCCTTGCTTAGCAACCTCCGCCCAGCACCCCAGACTTCTTTCTTTCCTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_650553_651078_1:0:0_1:0:0_10f7a/1
+AATGAACAGAAACACTACCTATAGAAAATTACAGTGTTTTTATGTGACACAATAAAGGAGCAGGCCAATACCTAATGTTGTAGAGGAACTTTTAGTGTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2163433_2163779_1:0:0_2:0:0_581ef/1
+ATATAATCATGAAACACAAGAGAAAAAAAAAAAATGGATGGAGGGGCAGAGAGTTCTACAATAACAATATTTGCACAGACTGAGTCAAAGGAAGTTTCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_165979_166449_2:0:0_0:0:0_56e87/1
+ACACAGCACTGGACCCCCAGGCTGGGATTTTGTGATGTGATGTTCCTTTTCTATGTTTCACACGTGTTACTAGTATATTGGTATCAGAATTACAGTCACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_388549_388925_1:0:0_0:0:0_38c66/1
+CTCCCTCGCACCCATAGACCAGCAAACACCCAAAGAAAGGGGGTGCTGTGAAAAAAGAGTTTGAATTGGACTTGACTTTGCATCATATACAGGCATGGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1545095_1545614_1:0:0_1:0:0_2e36b/1
+GGTCCAGGCTCAATTTTCCATTGAATATGCAAGTTATCTCTCTGCAATGAATGGCAGGGATTGGCAGGAGAATAGGCTGAGGCCGAGAAAATTAGCTGAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1178364_1178741_1:0:0_1:0:0_714e/2
+ATAGCATAATAGTGACATAACATGTGTATCTTCCACTGCAGCCTTTTAATAAATGGTAAATTTTTTTTTTTTCACAGCGAGCGCCAAGTTTACTTGAGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_454757_455207_2:0:0_0:0:0_44dd0/1
+GCCTTTGGGGAGGCTGGGTGTCACCACCATTTCCAGAAACAGGCCATACTTAAGCCTTTTAAAAGTATAATCATGGTGACCCAGAGGAAACTCCTTCCGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2289230_2289752_1:0:0_1:0:0_56bb1/1
+AGGAGTTCTTTTGTTTAATATCATCATCTCAAACTGACAGAACTTCTCCTTAGTAGGATTTCCCCCTTTTGGAAACTCTCGCTCTTGTGACTTTTCTACC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2084758_2085354_1:0:0_1:0:0_1225a/2
+TCACCTGCAATTACAGGCCCTGGCCAGCAACAGAGTACTCCACAAGGGATCCGGTCATCAAAGAGCAGAAAAGAAACAGAAGAATAGACCGAGGTTGAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1952421_1952868_0:0:0_1:0:0_55543/1
+CTCTACTTCTTTTCCTGGGTCTAGCTCTTAACTTGAGCACATGGTTCAGCAGCTATCACGGTTTAAAAAAAAATGTTAATTTTTAAAGGTATATTTTTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1929316_1929745_1:0:0_1:0:0_6b1a/2
+AAAAGCCCATCCTTGGCATCTATAACTCACCTGCCTGCCTTTAAGGCTTTCTAGATTGAGAGAATTGCTTCAAACCACGGTGGGAGATCAGGGCTGGAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2272318_2272823_3:0:0_0:0:0_2b57/1
+TATCATCATTGCAGTCTCACTCTGGGCCAGCTGTGTCTTAACCATGAACTGTAGCATCCAGAATTGGATTGTCATTGTCCTCTCCTGAAACTATTTTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_267278_267781_0:0:0_1:0:0_4d1d6/2
+TGTTATTTTGCTGCACTGGACAGGGAGTCTGCTCCTAAATTATTATCGCACATGGAAGGAAGTTGGATCACAATGTAATCCCATGGGCTCCTGTACAGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_502152_502625_1:0:0_1:0:0_29f72/2
+TCTGGAATTGGCTTTTTCAACACCACAGAGTTTAATAAATACAATCCTATGTTGGCTCTGATTCGCCCCTCCTGACTACAGGAGAGGAATCCATTTTTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_367029_367464_0:0:0_3:0:0_1ec8d/1
+CCCCAACATGGTATCAGGAAGAAATGTTTCTTCCTGATGCTCTAACTATCTCTTTCTTAACGTTTGAGATGAGACTCCCAATCAAAAGGGCCAGGTTCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1189452_1189935_0:0:0_1:0:0_2f508/2
+GCATTTGGGAGATATTTTTTTCTATCTGCTGGAGGGGAACCTTAGCAAAAGATTTCTAAAATAGTATTGTAGATAATTTTGAGGGATTTTTAAAAATCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_706123_706525_1:0:0_0:0:0_40e2f/2
+CCATCCAGCAACTCTGCACGACCACGCCTTCTCCCATCACCTATTTTATTGGGAGGAAATAAACCAGTACAATAGTATCCGGGGTTGTGAAACAGTTCTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1639408_1639883_1:0:0_1:0:0_44911/1
+GCCAGAGATATATAAAATAACTCTACTGGAAAACAAATGTTAGTCTTGCTCATAGAGTCAGAGGACTGGAAAAGGCCAATGAGTCGTGTATTACCTTATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1995270_1995805_1:0:0_0:0:0_313ce/1
+CACCGACTGAACAACTACAATCTAAATGCTATTGTATAGGGCAGATCACGATAATATCACATTGCCTGTAATCTAAAGGTCTTGCTATGGTTGCTCTCTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2116519_2117056_0:0:0_2:0:0_957c/2
+TTGCTTTTCCAGTCTGTATCCACCCAGTGATCATCATCTCTGCATAAGACGAGTAGTATGAGTAGGGGTCCACACACATAAACAATTCAGGCGGCTCACC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1194133_1194580_1:0:0_2:0:0_55f47/1
+TGTGATGTTCACTCCCAAGTTTTGTATTTTTATCTCTGTCTAGGAAGGTTGCTCTACTGATGATGTATGTGACTCTCAATATAAAATTCTTTTTGGTGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1973997_1974450_1:0:0_1:0:0_36e5b/2
+TGTCACTCTGTTGTTTATTATTTGTCTTGCTTGGAAGTCCAGAAAAATTCACAGCTGAGGAAATATTAAAAAAGCTTTTGCCCACGAGAAGAAAGTTTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_692989_693430_2:0:0_1:0:0_3e2ee/2
+CATTTTGAAGTACTTGGCTCACACAGGCTTCAAGTTCTTCCACTAGACTTTATCACTAGGAAGGGTTCCAGATAAGGAGGTTGGTCCCAAGTGCTTTTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1640086_1640505_1:0:0_0:0:0_4929e/1
+TAGGACAACTGGATACAGATGGATGGATTCCTTAGAGCGAGGCTGAGTTAAGAAATATCAGGTGCCTATAAGCATGGTTAGTGCAGTGGCATGAGCGTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_595846_596355_1:0:0_1:0:0_46d76/2
+CCTTCCTTCATGTATACTTCCAGTCTCCTGAGTAAAACTGATGAAAGGGAAAAGACTAAGGGCATGACCAGCCACCTCTCCACTCCTCTTAGAATTTTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_85943_86318_1:0:0_1:0:0_352b2/1
+CACAGCAGTAGTACCCACACTGTTAGAGCACCAGTAATCATTGATTTAAAAGAGTTCAACCCTAGGAGTGGGGGAAAGCCCATCTCAAAAAAATAAAATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1697092_1697527_0:0:0_1:0:0_5a5d7/1
+AAGTGCTGGGATAGTGGCGCTAGTTAGTTTATTTTTGAGGAGTTTCTCTTTGCATTCTCCTTCTAAATAATAATGGACATCGAGACCTTTTGATCAAGCG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2013844_2014252_1:0:0_1:0:0_39940/1
+ACTAACAACACAGCAAGCAAATCTGGCCCCTCCTTAAACATACATGTAATCAGATACATGATTAATAGATAAATGGGATGTAATTTAACCTCCAGCCTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1832228_1832649_0:0:0_1:0:0_52113/1
+CAAACCTCTCTGAGTGATTGGAATTGAAAAAGTTGGCATTTCTCTCTCTTGTTTCTATTTTTACTTGTTCCCATTCGACGCTCCAAACTGGAGGGAGTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_968650_968995_0:0:0_2:0:0_2233d/2
+TCATCTTCTAGATGCAGGTGTAACTTAATGTACTCAAAAATAAATTTGGCAGCTATGAATCAAGTACATTTTAGGCTGGCCAAGCCAGGAGCTAATTGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_784628_785082_1:0:0_1:0:0_124/2
+GAAAGGAAAGATTGGACATTCCTGCCACCAAGTAAATATACATTATAGCCGTTAATTAGCCAGGGAGGCTGAGAGCAGACCAATCAAATTAATGAATCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_971116_971628_1:0:0_1:0:0_2a54a/2
+CCCACGCTCTCAGTGATTAATATAAGTGATGTTCTAATGATCGCTTGAAGGAAGTAAAATTAAGCAATGCCTAGTAATACATAGAAACACACAACTTTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_797157_797632_0:0:0_2:0:0_13235/1
+ATAAAAGCATCTGATAACTCCAGCTTAAAGTTATAGGACAATAGGTTTGAGCACAGATAACCTCTTTCTAAAGTTTGGCTCTTATCATACACCACGCCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_300675_301083_1:0:0_0:0:0_17e07/2
+AAAAATTTTTCAAATACTATCAAAAAAAAAAGTGCCTGTGTCCCCCACTTTTAAATGTTAAAAATGCTGATGTTGGTTGGCCGCACTTTGTGTAGAATCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2143556_2143993_1:0:0_1:0:0_36ad/2
+TTTCTCCCTCCGACTTCCAAATATGACATCAGTAGGGATCACTGAGATTATGAGGAGATCTTTTCCCCCACCATGTGGTTACGTTTTTATAAAGTCTGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1381026_1381551_1:0:0_0:0:0_1c524/2
+AGATAGTAATTTTTTTGTTTCTGTCCATGGAACTTGAAAAGGCAGGACTTCCATTTACTTTTACACATTTTTACAATAAAATCTAGATGCAAATGATCCG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2182259_2182717_1:0:0_0:0:0_1b0b1/2
+ATGTGCGGGAGGGAAAAACTGAGTGAGGTGTTTGCCAGGTCCATTTGATCTAGGTGGCCAGGGGTGGATAAATTTGATCATTTATTTTAAAGTTGCAGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_738400_738845_1:0:0_1:0:0_1f08b/1
+CCCCTGTTGTGTATGTCAACCCCACCTCATGCTAAGGTAGTTGGTGTGACTTAATTTATCCAAGGCACTCCGCCTACTCCTTGCAGTGTTTTAGGAGTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_845749_846162_2:0:0_0:0:0_4e854/1
+CACATTATAATCTTCTCCCCAGCAACACCCCCTCAATATATGTTAATGCTGCAATTTTATCCCACGCCTGTGCATTATTTAGGTTCTCATCTTATATATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_932233_932717_0:0:0_2:0:0_4ffd2/1
+TTTCTAGTAAAACAAACTGTTCTGTTAACGCATGCCTTCCACAAGAACACCTAAGGCCTCCCAGGCTCCTGGTAAGCTCAGTTCTAGGTCCATTTCTGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2445075_2445534_1:0:0_1:0:0_1c53a/1
+GGGGAGGTGGGTCTTAAAACAACCTTCAGAAGGCCAGGTTTTGGGATTACCATACACTCCCCAACTCAGTAAATGTCAATAATGAGAATAAAAATTTTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1191177_1191623_0:0:0_1:0:0_263b7/1
+AGGTAAAGAAATGACCGAAATGACACACTAGTCTCAGCTTTGTTGAGCTCCCTCTTGCGGCGGCTAATTTAGGTCAGCCTTCAATGGCCCTGTCCAGCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1320255_1320766_0:0:0_1:0:0_9c28/2
+CAAGTGCTGGGAAATTGCTGAGCAGTCCCAGGAAATTGACATTATGTATACTATTAAACAAAGTCTTGATGGGGAAGCTAACAAGAGAGACGGATCAGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1245589_1246107_2:0:0_0:0:0_be6/2
+AACTTCTCTCTGAGGCGGCTCCCTCTCTGCCTCACACCTCTAGACAGCCCTCAATCAATAAAACAAAAAGAAAATCATATCCATGCACCCTGTGCCACAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_137090_137544_1:0:0_0:0:0_1cbf2/1
+AGCAAGATCGATGCCATTCTCTGCCTAGGGACTTGGGAGCATGCAGTGTGTGTGTGTGTGGACAGAGTTTGAAAATACTTCAGAAATAGATTTTCCCTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2452852_2453311_2:0:0_0:0:0_40515/2
+TTAAGAAAGAAGGTCAGAAATTTATGGTTCCCGTTCTTTCAGTCTGTTTGTTCTAGGATTTCTCAGCCTCAGTTTCTCTGATATTTACTGTTCTTCTACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_178728_179057_1:0:0_1:0:0_f52d/1
+GATCTCGTTCACCATTTGTTTTTATTGTGTCGCCGGGCACCAAATGGATTTTGAGCAATGACAAATGAAATAGGAACTCACATTGAGACTGGATAGAGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1468732_1469201_1:0:0_1:0:0_2afa1/1
+ATGTTGGCCTGAATATCTCAGATCGTGTTACTTTGGGACATATGTTTATATCCAAAGTCTTGCAAAGTCCCAGTCTGTAGTGTCTGTCAGTAATAAACAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_936271_936708_0:0:0_1:0:0_52006/1
+GAAATATGCATAAATAGTATATCTTTCTCTGCCCTTAGTGCAGTCAGGCTCGATTCTCTCCCAGCCTGAAAGCTGTAATAATCAATTAATAGAGGGAGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2161762_2162270_0:0:0_2:0:0_348ad/2
+ACTTCTCACTTTAGTTTTTAAAATGTGCTATAGTCTTTAGTCAGATATATAAGAAATTTTGATCAGAAGCTGAGGTCAAATACTTATACGTCCGGGGTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2233599_2234078_1:0:0_1:0:0_4a434/1
+GTCAGAATAGGAGGTCAAAACAGCAAAATCAACGTTTACTGGGTCATGTGCCCGGCGGCAGGCAGGGGTCAGCAGTCAAGATTCACCTCCCGAGTAGTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_154791_155164_1:0:0_0:0:0_13c56/1
+TGCTCACTTGATCGTATACAAATGGGATTACAAATCTGCTCCTAAAGAGGCAAAGGATCACCACTTTGTAATCACCACCCCTTCTGAGGTGGAAGTGTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1619028_1619588_2:0:0_1:0:0_336bc/1
+TCGAACAGTTCCAAAGAGAGGGGAATTGCCTTTCTCCTGCCTCCGCTGCAGGGACTGACAGAACTCCAGTCACACCCAGAATGACTTAGCTGGGATGTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_510106_510523_0:0:0_1:0:0_581f6/1
+CCCATGCCAAGGAGCAGGGTGTCACTATTCTATTATGAAAAGTAGGATGATCTTAGTGTTGACAACCTAAATTTACATGAACCTGGCCAACAGCTGCTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2382776_2383224_1:0:0_0:0:0_d7a8/1
+ATAAGTGGATTTGGGCCGGAGCGTGAGCCCATAAGCAGACTCCGTAAAACAGGTGCAGGTTATAACTGGGTAAAAATGTATGATCTAAGAAAGAATGGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1529254_1529714_1:0:0_2:0:0_3d85f/2
+GGGTCTGAGCAATTTGGGAAATGCCACCGCATCGGAGTTTCTTTAAATATGCCCATGCGAGTAGGACTGGATGGCATTGTTTTGTTCCGTTGAAGATTAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2281791_2282206_1:0:0_0:0:0_3d32f/1
+TGCACTCCTCCTGGACTGCTGTCACCCATGTCTACCGGCTAGTTAATGACAGCAACAATTCAATGGGGATTAACTGCCTGGTACTAGTAATTTCATATCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_52506_52973_1:0:0_0:0:0_2255c/1
+ATGTCCCAATATTCTTAACCCCACAGACATAGTGAACGAAAGAAAAAGTGCAGTTCCAAATGATTGAGGCCAAAGAAGGAAGAATCCCATGGGATTGGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1072991_1073503_1:0:0_1:0:0_2748c/2
+TTTGAAAGTTCCAGCGATGGAGTGTGGGGGTAGCACCAAGTCCTAGGCAGAGCCTGGGGTTCTGTCCACAAAACATGGTGTGAATCAAAACATAGAGGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1911814_1912286_1:0:0_1:0:0_2dfb9/1
+TAGCACATATATACTAGAAGAATATTTGGCTCTGGGATTATAACAGAGAGGATACAGAGTAATAGGATCAGCACTTTTATTGAATGTGCTAGAAGTAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_635051_635521_1:0:0_0:0:0_3f063/2
+CCACAGAACTATCCATATCATGCTCACTAAAAAATTAGTGCTTCATTCATCATTCATTAGACCAGCCAGTGCATATTCTGAAGCCCCACAGAGTCAGGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1841388_1841826_0:0:0_2:0:0_2d945/1
+ATCACAGTTAATTGTGAATTTGTGATTAGATTGCTTTGAGCTTTTAATTACTTGAAAGAGGGTTGATTGACTATGGTGACAAAGTTTGCATTTATAATAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_838128_838631_1:0:0_1:0:0_15a14/2
+TTTTGTTTTTGTGAACCTGGACAAGATGCATGAAGACCCACCCACCATCCCTTTATTTTGTTTATATTAAGTGTAAGCAAAAAAAAAAAACCCAAGCAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2117580_2118037_2:0:0_0:0:0_49e1/1
+AACTACTAACTTCCACTAATCATATGTAAATTTTTAATTTATCCATTAGCACTGACCCCATCTTCTTCCAAGTTTATTTTTGTTGCCTCGATCTTGGCCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2361275_2361776_1:0:0_2:0:0_69c0/2
+TACTTTCCTACAATCATAGATTCAGCTGGAGGGGAGCCATGAGCATCTTTGGCAACATCCAATTGAAGTTATTTGGAAAAATTGGTGGTGGCATGGTGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_174874_175286_1:0:0_0:0:0_3eab9/1
+TGGGTAGTTGTTTGAAGAAAAAAAAGCCACTCTGATACCTACTAATGTCATGTTTGAGTCCTAAAGCAACTTTTCTAAATGTACCTATATGGTCAGACTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1035768_1036221_1:0:0_0:0:0_45364/2
+ACTTAAACTATGATCTTTACTTTATGTTTCGTTCCCTTTACAGGCCAAAATATCCCTCCCAGCACTTTATAGTAAAGCCACGTAGTGTTAGGTGGAGTAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1583714_1584182_0:0:0_1:0:0_7afb/2
+CTTATTTTTAACTAGATAAGATTCACGCACTGTTATTTCCACAGGCGCGCAGCCGGGCGGAGCGCTGAATCCGGATTCCACAACACTGATTTTGGTCTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_112109_112558_1:0:0_0:0:0_4b134/1
+ATGGAAACCCACGACAGAGCAAGAGCAGATACAAAAATGTTGCCCAAGTCTAGAGGCAGGAGCACCCGAGTAATAACAAAAAAAAAAATTTATTTATTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2499166_2499692_1:0:0_0:0:0_25ebc/2
+AGATTGAAATTCCTTCCACTTTCAGTTGGATAACGATGCAATATGCCCCACCTCTGTTATCAGTGTGTTACCAAATATCTGGCAAGTTATAAATGGAACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1201713_1202160_1:0:0_1:0:0_2acad/1
+CCAAAGTCCTGGAAAAAAACAGTCATTGGAAAACCCCGACCCAAAGGCTCCATTCATTTGGCCCTCAGCTTCATAGAAATAAATTTATTTGTGCCAGTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1003919_1004321_1:0:0_1:0:0_9fe9/2
+TTTTTCCTCTAAATCAATGATTTTTGGAATGGAAAAGTCAGAAGTGGCTCACTGTATGTATTCAGCCTGGTTTTAACCAGACGACTCAAAAAAAAATTAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1118479_1118960_0:0:0_1:0:0_36fc9/2
+GCGATGTTGATCACCTCCGCCTCGGCCAAGATGGGTGCTGGAGAATTGATCTTCCTATTTTATGTGGGTTGGTGAAACAATCAAGACCACAATCTTTTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1886250_1886693_0:0:0_1:0:0_36237/1
+AACACTTTGCCTTGTCATCAGTACCTATGGGGTATGAGCATACACAGTAGACTGGCCAGCTTCAATCTTAGGAGCCAAGTCAAAACAATGTGGTGTTCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_263528_263936_1:0:0_1:0:0_28795/2
+GTTTTTTTGTTGTGTTGTGGGCTTGTATTATGTTTTACAATGAGGAACCCTCCCTGCTGTGCCTCGGTTCTGTGTACGAGGCCGTTTCTGTTTTAGAGAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_521926_522374_1:0:0_0:0:0_1460a/1
+TCGTCCTCTAGTTTTGGGTTTTCTTTCCTTGCTGATTATGTTTTAGAGATTCTCTACATATTTTTATTTTGTTTTATTTAGATACCCAGGGTGCACCAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2070907_2071397_3:0:0_1:0:0_46fa0/2
+GTACTGAAAAAGCAGAAGCTGAAGGGTGTGGGGTAATAGAAAACTGGAAACAATCTTCCTGTGTGGTCCCATGCACTGACGCCACTTTGAACCTGCCACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1781978_1782386_0:0:0_1:0:0_2ce9a/2
+TTGATATATTAATAAAAACATGTTGGGTAAGGTTAGGTTAAAAAATCCAGTAGACGTGTCCCATATACTGGTCTCACCAATGCCAGGCTGGGCTTCTCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_560457_560927_2:0:0_0:0:0_71b2/1
+TGCTCCTCGCCTTGGCACAGAGACTCTACCCCCAAAAAGAGTAATGTGGTGTTGAAGGTAACAATTCAAAGCTTTCTGAACCAATGGCACACTGAGAAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1195519_1196010_0:0:0_2:0:0_4f987/1
+TTTGCTGGGAATGCTGTGGTGAAACAAACCATAATCAACTTCTGGTCCATTATTAAATCTGGCGTGACCCCCTGGGGATGGGGCCAGACCCACTGCAACC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2317265_2317686_0:0:0_1:0:0_54466/1
+CCATGGGAGCGTGTGTGCCTATGAGCACTTTGATTCCTTCTTCCTCACTGCAGGAAATCATTTCCTGACCACATCATTCAACACAAAAATTTTATTTCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1792418_1792858_0:0:0_1:0:0_558d3/1
+TATTTAGTATTCTATAAAAAAGTCTTGATATAAGCTAAAGATGACATTTATGGAAATATGAGGCATCAATACTAGAAAATAGAATATACATGTACCTCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2440084_2440542_4:0:0_0:0:0_3a738/1
+ATCTTCTGGATCTGGTTCTACTAAATCATTTTTTTTGTTAGTAAATAAGCACTTGTGTCCTCCTATCTTTCTCAGACAGAATGGAACTCCCAAGCCTCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_481949_482406_1:0:0_0:0:0_46801/1
+GAATTATTCTAACAGTAGTATTAGCATTATCCTGAAAGTTTGTGTTCTCATGGAATGGAAGTTATCCTTTCCTATATTTGTGGTCACTTGGGTGAGCCTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_12448_12984_1:0:0_0:0:0_39f45/2
+AGTAGCTGGACCATCCAAAGTCTTTTGATCTTGGGCAAATATTTGACTTATTTAAAGATAGTAATTTTTCTAAAGTCCTTATTCTCCATTGGGCTGGAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_320253_320708_2:0:0_1:0:0_19984/1
+GAGGTGCTGACATATTGACTTGTTCATTTTTTCTAAAGAACTGGAGAACAAACCAAACATTGATTCTAGAGTCTTGGGGGAAGGAACTGTATTCATACCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_362114_362538_1:0:0_1:0:0_214d8/2
+TAGGAGATCATCTGAAGATCTACAGGCGCCGCTTTGATCATGAATGAAGGATAGGGAAGCATGTATGAAAAAGGAAGTGATTACAGGTGCTTTGAAGAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_890433_890870_1:0:0_0:0:0_48516/1
+AATGATCAGAGTTCTTTTAAATAATACATTTATTTTTAGTAAAGAAACATTCTTCTAGTCCAGTCACATTGAACCGCGTCTCTACCCTTACTATATGAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_825692_826158_0:0:0_1:0:0_259f5/1
+TTAATCTGCAGTGAGCCGCCGCGCCCGACGTCCCTTCAACCTGACTTCTCAGTTGCTTCGTAATTAGTTCAACCCGCCACTCTTTTCATATTGGGGGGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_380706_381185_1:0:0_2:0:0_32c5d/1
+ATGATGATTCTGTTGTCACAGGGTTTTTCTTGGTTAAGGTGTGTGTGAGCATTCACTTTTTAGCTGCCTCAGACACATACACTATCGCTGCACTCCCTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_953260_953717_1:0:0_1:0:0_17d80/1
+ACGTTGTGCTTTTCCAATAGAAGGCGCGGTCAAGAGCTGAAAATGGACTTGAAGAAGTTATGGGAGGGAGAATGGGGGCTAATTGTTCGGTCACTTGTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2292282_2292689_1:0:0_0:0:0_46a79/1
+TTTGATTTATACAGAAGCTCTGTCTCAAAGGCAACCTCCTGACCTTACACCAGCAGCCCAAACTCAATTCCTTTTCCTTTGTAGTCTCGAACCCGCCAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_982112_982599_1:0:0_1:0:0_2cf80/1
+TTATCCAAAGTCACTCGCTAGGAGCAGGTCAAAGGTTTTGTAAGCCATGTGCAGAAATACATACCCAGGTAGCTACTTAAAGAATGTTCTTTGAGGGTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2115038_2115551_2:0:0_1:0:0_21b47/1
+TAGGACAAGTCAAAGTCCTGCTCCTCAACAGGAGACCATACATAATAACTGGTGCTAAAGGAACTGGTCTACCCTGTTAACATACCATAGGGTGTGTGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_997965_998428_2:0:0_1:0:0_40ada/1
+GTGAAATTTTTAGACACCTGCTCCAGTCTTCACATAAAATTAGTTTTATTTGCAGTAACCATATCCTGCCGCCGCCATGAATTTGCCCCAATTATTTTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_465449_465842_1:0:0_1:0:0_1cafb/2
+CTCCAAAAATCTCACTCAAGAGTTGGGACCAGCATGTAATAGAAAAAAGCTCCTATTCTGTGTTAATTTTTACATCTGGAAGGTGGTTTATTTATTTGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1648727_1649167_0:0:0_2:0:0_174e5/1
+AAAATCCACTTAGATTGGGCATCTTTATGCGCTACTGGGTTCAAATGATGATATTACGGACAGAAACTGAAAGTAATTTATTGAGGCTGATCTTTCTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2080221_2080703_1:0:0_1:0:0_20d20/2
+ACAACAGGTGCCCATTCTTCCTAGTGATAGAAAAGAAAATATGAGAGTTGAGGAGGACCAATGGAGAGGAGAGACCCCATTAAATCACTAGAAATACAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1072547_1072951_2:0:0_1:0:0_29e9d/2
+AATGTGTGCACTCCAACATGTAGCCCATACCCCCACCTTACCATCCCATCACCAAGTATTTGTCAGAAAAATAATATCTGTAGATTATTCAAATGAATCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2093002_2093454_1:0:0_0:0:0_50891/1
+CATCAAATCTGAACTTCCTTTGTTGAAACATCAAAACAAATGTGTGTATTTCTGGAGTTCTAAAATTACAGTAACAAATCAAGCCTAGGATGCTGCATAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1340208_1340517_0:0:0_1:0:0_24613/2
+ATGACGTGTAACAGTTTAACCTCCCAACTCAGTTCAGTATATATAAGCCCTGATCCTGCAATGAGAGGTGAGGTAAAACACTCCAGCTGGAGGAGGCTAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_155367_155784_2:0:0_1:0:0_3d59b/1
+GAATATTTTCATTTCAAAACTAATTTTTTGTTTATCTATCAGTATTTTGACCCCATCTCACCGTCTCTCTTGCTTATAGGCCTAAACTTGTTTTCTTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_399104_399523_1:0:0_1:0:0_2c89/1
+CTACGCTGGGAAAGGCAATCTGATTTTGTAAATGGAATGTGGACAGCAGGAGGGGTTTGAGAGTCTCAGCGCCCTGTCCTTGAATTTCCTTTTCTCTGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1646711_1647128_1:0:0_0:0:0_3cc2b/1
+GCCATGCTTAAATACAAATTACCCTATGAAATGTAGTGGCAGGTCTGGGATTAAATGGAGCTCTGCCCTTCCAAAATACCAACTAATGCCTAACTCACAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_472168_472549_1:0:0_1:0:0_1d4ae/2
+ATCATACATCTAACTAAAATACAAATCTTAAGAAACATCTGACTTTAAAAGTGCTGTATAATCATCACATTTAAATGACCTCGTGAAACTTAGTTTTGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1451776_1452176_1:0:0_0:0:0_3558a/2
+CATGAGCCAATGCCCCCAGACGGCTTACAGGTATGTTAAACCATGCATGGGCTGGAGTATAATTCTTCTTCCGGCCCCTTACTGGTGTAATCCCCCTCCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_301846_302303_0:0:0_1:0:0_142f4/1
+TTTCTCTAATCCTGGGATTAGGATTTTCTAACCTAAAAATAGTCTTTGTCTTTAACATCTATTTTTTTAGGTTCTTTCTTCAAATGAATTGCCATTCCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1923566_1924041_0:0:0_1:0:0_415b1/2
+ATTTGAGGCAGTGATATTTAAAGTTTCTCTGGTGATTTATTTCTTTGTGATTTTGAGGCTTCTCAAATTAAGTTTTAGGACTTTGATATTAAGAATCTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_763664_764051_1:0:0_0:0:0_15da5/1
+GGTGAACCTTATCCTTTGATCTTCAAAGCATTAAGTCTGACCTGGGTGAAACAATAAAAAGTATTTGTAAATTTAAAAAGAATTATGAGGGAATGGCCCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2101963_2102379_2:0:0_1:0:0_2b5fd/1
+TTATATAGATATGTTTGTCAAACAAAGCTTCTGACCTCAAGGAGGCGTTTGAAAACACAGCTTGTCCATTGCTGTGATTGTTGAAATTTTCTTTCACAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_754686_755107_1:0:0_1:0:0_2023a/1
+GGGTCAGAAAGATCTGGTGAACATAGAAATTTTATCATTTTAATTTAAAAGAAGAAACTTAACATGTAGATTCAAGACATCTGCAGTGGAGGGGTGTGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_770794_771190_0:0:0_1:0:0_1eb2d/1
+ATTCGATGGCTTCAATTGTAAAATGTTGCCCACCGCACCTGGTGTATTTTGCCAAGAGAAATTGATTTGTCTTCCATCTTTGTGCAGAGTGAGGCAGCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2319635_2320241_1:0:0_1:0:0_cd79/2
+AACAGGTCTTGCCCAAAAGGCTGAGCTCACCAAGTCTCTCATTGCAGGCCAAGTTTAAAAAGTACTGTTTAACCTCTAAAAGAATCTGTTTATGAAATGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1546311_1546812_1:0:0_2:0:0_3d1ef/1
+TTCTCTCCTGTTTTACTGTTCTCCTCCAAATGAAGAACAGAAATGGCCCCAGCCTGCCCTCTGTTTTTCCTTATTTAAAAAAAAAACTTCAGCCCTCCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_379993_380457_1:0:0_0:0:0_171ae/2
+AGCCTTGACCAATCTTTATTTATTTATATTTGAAAAGGGAATTTTATTTAGTTAAAAATAAAGGAAATCCATGTTCAGACAATGATTTGTAGTTTACCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1125545_1126088_1:0:0_1:0:0_3231f/1
+AGCTGAAAGGTTCTGAATGATATCAAGTTCTTATTTTCAATAAAGGACTGAGCATCAGTTGGGAAAAAGTATTTTGATAGTGAGTTCTAAAAAAAATGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1909460_1909910_1:0:0_0:0:0_24b96/1
+GCTTTGGAAAGTTGCACATTTTTTGCATCCACACTCGTACCATGGGAGAGGCAGATCCCTTGATTCCCTGCAGAGAGGGGGCTATCTCAAATCTGCCATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2329306_2329790_1:0:0_1:0:0_5306d/2
+TTCCTAGAAGTTAATAAAAATGATCTTTTCATGAGCTAAAAGCCTAATTTTGGACTAGCAAGATTCCTTTTCAAAGGATTTATACATAAAGTGGGACGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1368433_1368857_1:0:0_0:0:0_f137/1
+TATTAAGTTACAAGCTGTAAAGACTTTGTTACTTTAATTCCTTTACATATGCAGAGGTTCATTAAAATTTAGTTTGATGTAAATAAATGAGAAAGGTGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_968458_968878_0:0:0_1:0:0_421bc/2
+CCATCTCATTTTGTTCAATGGGGAGAGACATTCATATAGTGGAACTGTCAACTTTGCTATTAAGTTAGAAATGCATCTGTGTTAGGTAAATGCAGAAAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2307391_2307828_2:0:0_0:0:0_5afe6/2
+ACATGGTGGGAGGTTCATCATCCCAGCTGAACAGAGCTTGCTAAGTCATAGCATAACAATGGGGCCTTCAGCTTCATTGGTAAGCATTATCTCGGCAAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2120723_2121189_3:0:0_0:0:0_4895c/2
+ACTACTACAAACAGAGAGGAGCAGCCTCAGCTGGGAACATCATAGGCTGGTCTTCCTTCAAAGTGAAGGAGCAGCAAGAAGGCATGCTTTCTCTGCGCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_485039_485456_1:0:0_0:0:0_4162f/1
+TGTGGGTTTCTCTGTTTGTGTACTCCTGCTTTGCAAATGATCTTTTCTACCAGTCACATACATTGTGGTTTGCAAACCATGTTTGGATGAGTATTCCCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1385041_1385506_0:0:0_1:0:0_5d87/1
+AAGTTCTGTTCTATTCAGCATTTTAAGATGCCTCCCAGAGAACCCCGCGAAGGGGGACGAACAAGTTTTTATAACATGGCAGTGTGTGGCAGTTTTTCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1341773_1342313_0:0:0_1:0:0_28015/2
+ATTAGAGTCCAGTTTGGAAGGAAGGACAGCATTTCTAAGCCCTGAACATGAAAACTAAGTGCTGGGGCCCTGGGCACATAGTCCAACCTATGATCGTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1625525_1625944_1:0:0_1:0:0_5a142/2
+TCATGGATAGCATTTTCATACACACGAAAAAATATTCTGGGGCCCAGTCATCATCGGCCTCTGCCCATCCACTGGAGCTTAAAGTCCTTGAGCTGTAGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1381248_1381692_1:0:0_1:0:0_2f249/2
+GTTTGAGACCAGTAACATTTTCATTTCACTTCGTGATCTAGGACGACGGAACTCCTCTGTTTGAAAAACTTCACAGAGTTATAATCAGCACTTTTCAAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1604923_1605288_1:0:0_0:0:0_5609f/1
+AGAGTCAGGCGTAAAAGGTGCCATGCAAATAGCTAGACAAACAATATTACGTTCATCAATAAAGAGGCAGGATCTTTTAAGAATCTCTGTAATAAAGAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1494704_1495088_2:0:0_1:0:0_56998/2
+AAGCCTTGAAAATTACTCTACCCTCTGGCACGTGGCAAATTAAGCTGCCGAGGCATCGCGCCACCGAGAATAATATGGTAGCTGATATGATCAAGAAGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1065025_1065376_1:0:0_1:0:0_36801/1
+TTTTAATTGAAGTTGTTGGCAAAGACCATTGCTTGCTAAAAGGAATGCTATTCAACAGACAGAGAGAGTAGTTTAGGAACTTTTTAAATGATATAATAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1306713_1307124_0:0:0_1:0:0_1076/1
+TATATTTATATGTGGTCCACATAATCCCAGCATTCAAAAGTCTCAAACTCGGGAGGCAGAGGAGAAACCGGTACCAATTTCACTCCTGCCTCTCCTGGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_516579_516969_2:0:0_0:0:0_4e602/1
+CACTCATAGAGTTAAGAGGCAGTGGCTAAAGTGTTTTTCCATTTTTATGAATGAACAACATGGCCAGGACTACAAAATACTGTTTATGATCATAACCTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1662020_1662459_1:0:0_0:0:0_1e59f/1
+CTCTTGCAGGGAGAGAGAGCCCTCATTTATACTAAATTTATTCTTCACAAACACAAACTTTTTTGCCCTGGGGCGGGCATGGGGATAACATATGATAGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1393063_1393578_0:0:0_1:0:0_5a04a/1
+GTGCCAGTTGCCCATTTCATGAAGTATCACAGAGTCTCCTGCCATTTCCCAGTCTCAGAAATACTTGCCCTATGGTAATTGAATGGAGAATCCAGGCTGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1723375_1723833_2:0:0_1:0:0_43e14/1
+GCTCACCCCCTACTGAAAACTTCCTTTTCCAGGCAATAATCCCAGCCTCTGCCTTCATCCTTTGTCCTTGCCACTGAGTGCAGCCACCGTCAAATTCTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1361969_1362440_1:0:0_1:0:0_28b4c/1
+TTGCTATGGCAATACCCTAGGCATGTACTTTTTAGAGAGGACAAATTATGCCTGGCAGTATAGCCAAGTGGATGGCAGTTTGTCTTCCTGTAATCCCAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2153654_2154083_0:0:0_1:0:0_3605f/1
+ACATTAACTGGACTATTTACAGAATGCCCTCTTCTACCTTTGCTTCCTGAGGATTGAGTTTGTGGAAAATCTGTAATCCAGTCTCCCACCAGCTACATGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_205654_206076_1:0:0_2:0:0_3914e/2
+GCAAAAAGAAACTTTAAGGGAATGACAGCCCTCGGGTGTGCAGCTGATGCCTGGTCATCCCTTAGAATCCAGTGTCATCAACAAGCAAAATTAAGTATTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1926088_1926564_0:0:0_1:0:0_405b1/1
+GGAACAATCTACGTGTAACCTCGGCCTACAGCTTCTTGAACTGCATCTCTTAGTGGGATTCATATTTACCTAAGTGAGTCAAGTTTGAGATAGAGATGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2365170_2365625_1:0:0_0:0:0_19492/1
+GAATGTATCCTGTTTACATTTTACCCTGAATACAAGAAAACCGAGGCTGAGGCATTTCAAGAACATGGTACGCAGGCTTACCCATGGAGGTCTCACCCCG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1707627_1708118_1:0:0_1:0:0_41660/1
+AGCTGTTAGCTCGAGCGGATCACGAAAAGGAAGACTTCTTCACACAGAGAACATCGGCCCATGTATAGAGTTTTTAAAAACTGGTTACTGTTGGATTTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1623428_1623892_1:0:0_1:0:0_30715/1
+ACAACAGCAGGCTGGAAGGAAAACACTCAAGGCAACCTCCGTTTTGCCTATCCTTAAACTCAGTGTCTCAATTACAGGGATGCACAGCATTTGATAGGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1349503_1349903_0:0:0_2:0:0_514b9/1
+GACCCACTGCCTTTGTGAATGAGTGAATAAAAAAAGCAGGGCAGAGCTCAGCTGTCCTGAGGTGATTCTTTCAACAAATCTTTGAAAAGAAGCTGAATCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1223838_1224309_1:0:0_1:0:0_54833/1
+GGGGCTATCTATTTTTTTTCTTTTAAATGGAGCATGGATGTGCCTAGCCTACTTCAGCTTAGAGTTTTGGATTTCAAGCTGAAGAAAATATTGTGGCATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1785183_1785632_1:0:0_0:0:0_7f59/1
+GCTACTGATAAATAGTCTTGAACTAATGTGTGACAGCACTTGAAATAATGAGTTGAGTTGAGTGAAAATTAATAGAAAACAGTGAGAAACAAAAAAAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2094440_2094884_1:0:0_1:0:0_edad/1
+TAATTGAGACCATGTGCATGTGCTTTGAGCCCCACCCTCATTTATATACTGAAGTATCCATAGTAACAAACACCTGGGTTCATTCGTGGAGGGAGACAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1881901_1882340_0:0:0_1:0:0_15305/1
+GCTGAAGGCAGAGCACATGTGTCTGGCTGAGCAATCGCTATGGTTCTTAATTTTTGTTTCCATCTCTTTTGGTAATGGTAAGTAGCTTTGTTTTTTATTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1924034_1924430_1:0:0_1:0:0_59350/1
+AGTTTTTAATTTTAAGAAATGGCATGCAATGCTGCGCTCCTCTCCTTATTGTGGCAAGGCTGAGCCACAGGGGAAATATTGCATCCAGCGATTCTGGATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1754261_1754669_3:0:0_1:0:0_2921b/2
+GCTCGCTCTTGGAGAGCGAGTGTATGTGTTTAAAACCTTGGGAATATGTTTTTTTCCAAACATAAAGCAAATGTTACATAGCATAAGCTTCTAAACGATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2097482_2097871_0:0:0_1:0:0_283f5/1
+TTGGGTTCCATCTGGTTTGTTTTCTGTGTTTTTAGTTGAACAAATGTATTTCTTTTAATTGGATGTCAAGTTTATTTATCTTTTTTCAAGTGTACTTCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2457539_2458006_1:0:0_0:0:0_2b632/1
+TGCTTGCTGAGTAGTAGAGAATCCAACTACAAAATGATGGAATATAATTACAGATAATTTCCATGGGTGTCTGTCATTGCAGCACACATGGTGAAGCATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1280485_1280940_0:0:0_2:0:0_57c4a/2
+AGTGCCATGGTAAACACTACATGTCTCAATAAAAATGGGGTTAACTTTAGTGTTGCTGAGAACAGAGTAAAGGGATGACAGGTGGATTCAGTATCATCCG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_13745_14121_1:0:0_1:0:0_21058/1
+TGCTGGCTAAGAAAGCATCTGTCGCCTTAAAATCATGGTTTCTATATAATCATCTCAGAAAGGTTAGTTCTAGAATAACTTATAATTGACAAAAATTGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_475512_475957_1:0:0_0:0:0_13510/1
+CTATAAAAAGCACGGCTCACTTCAAGTGGACTTAGACCAGCGTGACATCTTATTGTGATTTGGAGCTCAACATTTGTTGTAGGGCTCTGGAAATAGAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_753920_754315_1:0:0_0:0:0_15087/2
+TCCCACCTAGACTGCCACATTTATTATCCATGGTATAATATTTATCTTACTATAAAAGTAAAATCCTGGTACATACACCCGCCCCCTAGCCTAATCCCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1153376_1153877_1:0:0_2:0:0_16ff0/1
+TGAATTCAAAGAGCGAGGCTTATCACATGGAGCAACGGTGAGCTAATTTGTATTTAAAAAATCGAAAATGGGACTTGCATTTTTTCCCTCCTTCCTATTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2136957_2137493_1:0:0_2:0:0_25c88/1
+AGGCTGCTGTAATATGGAGAAGTTTGACAATTGTAATTATTTACTAGATTCTAAATATTTTCCTAACCAGGTCCTGCTCCACCAACACGTTACGTGATCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1182469_1182963_2:0:0_0:0:0_54609/1
+TGAGTAATAATTTTATTATATCGTAGAATCAGGGGACCATATATGATACAGCACTTACACAGGTCAGGAGAATCAGCAAAGATCGGAAATAACTGAACCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1010681_1011017_2:0:0_0:0:0_f069/2
+TCGGATCAGAGTTACTGTCCATTCAGCTTCAAATTCAAAAATAAACAGCCATCCATACTGAATTAAAAGTAGTAAAGCCACCAATAATCCCAGACATTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_859871_860414_1:0:0_0:0:0_5ac16/2
+GTGTCTTATCAGCAATTTCAATAGTTAGAAAACGTCCCTGGATTTGATACATCTGTGAGAATCCCACAGAGCAGCACTCCACCATCACAGGTGATGTTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_764341_764724_0:0:0_1:0:0_4b5ba/1
+GCAGGACTTTAGTTCTTTTGTTTTCAGAATACAAAGAAAGTATAATCTCATGTCGGTGAAACTCCTCTAAAATTATTCTTTTGTCCTAGAAGAATAAGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2430185_2430627_1:0:0_0:0:0_1f40e/1
+ATTGACAGAGTGTCTCTATACATCCTCAAAAGACAACTCATGTGGTTGAAAAGGAGGGAGGCAGATACTGGGGAGGGGTGACAAAAATATAAAAAAAATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1119469_1119936_0:0:0_1:0:0_2c9f0/2
+AAATCCTAAGTACCTTTACTGACAAGGTCTGCAGTGTGTAGACACATTAAGAAGAATGTATAACCACTATATCTGAGTGGGTATAAAATGGTAATTATGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2379351_2379714_0:0:0_2:0:0_5a960/1
+TGGCTGGTCTTGCATGGTTGCTGGGCAAAGTGCCCTTCTGCAAAAATTTTTCCAATTTTCTGTGGTATTCTTTGTTCCAGCCTTCTTGCATCCAGTCTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_302047_302434_0:0:0_2:0:0_1da1c/1
+GAAGCCATCATTTTGTGATAATACCCAGGGCAGACCTTTTGGTAGAACTCATCAAACTCTACTTTGGAATCTGCCTCCCAGCCTGTAGTTCTAATTTAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2468362_2468768_1:0:0_1:0:0_53cda/1
+GATACAGGTGATGTGCAATTCAAAGGTCTATTTGCTGAGTTGGGGGTCGGGCTATCCCCTGTGGAATACCATGAAGCATTTTGGATCTAGTGTGCTGGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2029664_2029998_0:0:0_1:0:0_5a1cf/1
+CATGCATGTTGAATGCCCTTCCTCCTACCTTGGATTCATAGTGCTGTATATGGTAACAGCACTATTTGGGTTTTTTTTGCCTAGAAATTAGAGGGGTCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1727467_1727946_0:0:0_1:0:0_571dd/2
+AGCCAACATGGTGGATTATTTTTATCATACAATGATACAGCACTTTGGGTAATATAAACCTTTGCCAGCTGTTTGTTTAGCTAAAGGTAGGGGCTGGGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2194486_2195003_1:0:0_1:0:0_2b789/1
+GCCACCACATGACAGTTTGCAAGGCTGGGATAATTTAAGTTAAAACTTAATAACTTAATATTAAGACGGCTTCTGAGTAGGGTCTATCAGCAACTCCTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_138469_138867_1:0:0_1:0:0_d772/1
+ATTCAAGTCCCGAGTAGAGGCTGCATAGCCTCCCAGCTGATACTTGGTGGGGCAAATGGTGTATCAGTCTAGAATTGTTAGGAAGACTCCTGAGTTCTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1942311_1942895_1:0:0_0:0:0_4e0df/2
+GTCTGAGACCAACCATGCCAAAAAAACTGGTTTGAGGAGGGGTTCATATGAATATCTGTTTTTTTTTGTAGACAGAGTCCAATACGCTTCTCCTGTCTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1332832_1333254_1:0:0_1:0:0_2a1c/1
+GTTAGCAACTTCAACACAGCAGTAGCAGCTCTGTTGATCCTTCTAGTTCCCATGTCAAAGACAGAAATTTTTCTCATGTGGTGGGGCTGGACAAGAGACG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1582399_1582865_2:0:0_0:0:0_4792c/1
+CTCAGGTCTATGAATAAATTATTGCTGAATAATCCCGGCCCAGAGCTGCCCTACTTTATTGCATACTTATTTTTGGAGAAAATGCCTTCGTTCAGGAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_564565_565049_0:0:0_1:0:0_50485/1
+ACTGGAGGCTCCCTCCACCAGAGCAGTGAGCCATTGAGACAATAACGCTCCCCATTACTTTCTTCTTTCAATTGTTTCTTCCACAGCTGCAGTGAGACAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_167212_167658_2:0:0_0:0:0_4c998/2
+CAGTTGAGTTACTTTGTAGTGTGTGTGTGATTGCTCTGGTTGTTTTATTTATGCACATGCATACAGGGGCTCTATATTCAACACAAAAGTTTTTGCAGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1831086_1831514_0:0:0_1:0:0_4fc55/2
+CAATCCGTCGCCGCCCTTCCAATAAAAATGAGATGGCTACTTCTGAGGCAGACATCCACAAGCTGCTATCCATTAAGGAAAATAGACTCAGTGACAAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_801804_802184_0:0:0_1:0:0_2d8/1
+GAATGAGGCAGGGAGGCAGGATCACCAGCCTGGCCTCCTCCTGGCTAATCCCAGCACAGTGTGGTATTTAACTCTACAAAAAGGTAGAAATGTGTCACAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1670314_1670794_0:0:0_1:0:0_1b1d1/2
+ACTACACAAAGCTAACAGCAGAAATGCCTGCTGTGACCCTGGAGTGGGAATGCTATTGCAGTCTCACACAGCTCACTTTTGTTTGAAGTTGAAATGAGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_476032_476444_1:0:0_1:0:0_12ff1/1
+CAGGAGACCCTTTTGAATTGAACTGATGAGATGACTGATTAAGATTGCACTCCAGTGCTGGGACCACCCAGAACTCGATCCACCTAGGAAAGCCCTCAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2058666_2059073_1:0:0_0:0:0_1cfbb/1
+GGGGCCAGCAGGTTACCACAGAGTGGATTGGGTACACACTAAACAAAAAATGTCATTATATGACTAAACTTCGGGGCTTAATAAGTTCATAACAAAGCGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1948245_1948671_1:0:0_0:0:0_477a7/1
+CTCATAGTAGGGAGTGGCATTCATCTGTGTACTCCCACTTATCCAGGAGTAAAACTTTTTGGAAACTTCTCTCTGAAGTTTTACAATATGCAGAGTTTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_542015_542458_2:0:0_1:0:0_300a2/2
+ATGTGTGGGTGCAGCCGCTGACCTGGCTCTGGCAATGGCAAAGTGCTGACACCAAAAATAATATTACAGTTTTTTTTTTGCCTGTAAACTGAAGTAGGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1860800_1861234_1:0:0_1:0:0_d230/1
+AGTCTGTAGTTACTACCATTATACATAAGAGCTTGGCAGAACGATGGAGAGGATTATGACTAGCTGCAGCTACAGGTAAGCTTCCTCTCCAGAACGTAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_220321_220762_1:0:0_0:0:0_3e04e/1
+ACACTCAAAGGGCGCCCCCGCTCTCAATAAATAAACATAACCTGCCCAGGTTGTCATATGATACTAATTCTTATCTGAAACTCCTGGAATACTTACCTAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1023329_1023692_0:0:0_2:0:0_f774/1
+CACTTCCCCACATCTGAGCACTCATAAAGTTCAAGCTGGGAAAAAAGATGGGGGACTACGTCCTTCCTCAGGATGTACCCAGGCTCTGAGCAGTTTGTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2011582_2011984_1:0:0_1:0:0_13445/2
+TTGAGGTTTGGGCCCGACTGCTCCAGAGGAACAGTCCCACCCACGTACAAATAAATTTTTTAGTAGAGACCCTTCGTATGTATCCTAGATCACGGTTAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1654122_1654582_1:0:0_0:0:0_58387/1
+ATAAACTAAAATCTCAGCCTAGAAGCTTTGCATTCCCATCCCTAGATCCTGCGGGGTTTCACATTGAAGATTACTAAAACATAGGGAATGATTGAGCCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_948490_948967_0:0:0_1:0:0_13a0/2
+AACCTCTGCTGACAGATGTTGAACCCTGTGAAGCTCTTGTTTCTGGGACTACAGGCATTGAACACACACTAGGTTATCAAAAAGCATGAACAGGAGTAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_993841_994226_1:0:0_1:0:0_d17e/2
+TAACACGGTGTTGGGCATTGAATGAAACGACTGGTGAGCCAGTTAAAACTGTTATCCCGTTAGGAGTTAGTTTCCCATTTAATTGTTCTCATTCAGGCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1800548_1800917_0:0:0_1:0:0_1075d/1
+GCCCCGTCTCCCCAGTAGGAGAATGCTTTTAAACTCCTCTCTGAAAGTGAGAGAGAGGAGAATCAAAAAAAAAAAAAAACACATAAAAAATTAGCTATGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_879131_879517_1:0:0_0:0:0_50446/1
+AGGCACACCAGAAGCTGAGAAGATTTATCTAGATGAACAGCCTCCCAAAGTGATGCGTACCCAGGTTTGCGGGGCGCCCGGCTTAGATGGAAAGTCTCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2258901_2259358_1:0:0_0:0:0_4b4ae/1
+GGTGTGCTGAGTTTGCACATGAGCAAGAAGTCTCCTGCCTTGTCTTTCCCCCATTATAGAAGTCCTGAAAACTCTAACTTCACACAAAAAGGCAAACTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_553867_554287_1:0:0_1:0:0_1b3af/2
+ACTGCACTTAATTACACCAAAAAGACTATACTTTTTGTCTTCCCTTTACTGCTTTTGGTCTTGAACAATCTCCCATCATTAAATCACAACCGCTCCAGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_139881_140373_0:0:0_1:0:0_572c5/1
+TCCTTTATCATGAATATTTAATTAGCAAAGTAATGTTACCTGTCTCCAGAAAAACAAAGGCTTGGCCCTCACTGCCCTATTATTGTTAACAGAAGAAGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_428209_428674_0:0:0_1:0:0_46a2c/2
+GTAATGGGAGGTCAGAATAAACTGCCCACGCTCTGAAACTTCATAATTTTTCTAACCTGGGTCTTGCACTTTGGCTACACATAAAGTTAGTAAAAGAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_816525_816953_3:0:0_1:0:0_29e4f/1
+AGCTGAAAAGAGATTTGAGGCCGCCCCGCTGTTTAATTGAAAAGACACTGGCAGCTGAGCCTGGCTAAATTTGAAAATTAGAACATTGGGCTGTCTCTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2367905_2368372_0:0:0_1:0:0_691b/1
+TAAGAACATGGCAGTGGTTTTCTCCTCAAACAAGCGTCTGCAATGGCGTGAGGAGTATGGTCTGACTGTTGCTATTTTTTTCTTTGAGATCCATGGAGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1433810_1434313_4:0:0_1:0:0_5bfc/1
+GATTCCTGTGCTGGCAGGCTGGGATACAGTCTGTGATTCAACTCTTTTGAAGCCTGGAACCAGTGGACCCCAGCTTTCCATTGTTTTTATCAATTTCAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1883030_1883499_3:0:0_1:0:0_18ce8/1
+TCCTTGTAAATGACTTGCTGCTTTTCCCAAAGATCTTTGTGTGGGCCATGAGCTCCTACTCTATCCGAGAAGAGAAATAGCCCATTTTTAGGCAAATAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1576268_1576707_1:0:0_1:0:0_1a2c9/2
+GTGAGAAGCATTTTACAAAATTTTCAGGAGGGAGAATTTGAAAATATAACTGTGAGCATCTTGATGTGGAAGATGAGGATCTGGCTGGAATGTGAAGAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_875962_876467_2:0:0_0:0:0_2d6ec/2
+ATATAGATCCTCTCTCTCAGAAATGGGCACCACTTAGGAATTAAAAGCATGTTACAGAATATTCCAAGTGGTGCAGCCACTGCAACAGACAGAAAATGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_872720_873194_1:0:0_1:0:0_4f59/2
+TATTTTCAAGAAAAAAAGTGATAAAAACACCCAGGATCAAATCTCTGTGAAGTGACCTTTACAAACTTATACTGATGGGATCTCCTGCCTGTTTATGCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_19490_19943_1:0:0_1:0:0_4133f/2
+AGACTGTAACTATGAAGGGCGCGATCTGTGGTAGAGGGTCCAAACACTATGTTGAACTGCTAAGAGTATGTGTACAACAGCTTATGGGCATGAGGATATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2072821_2073257_2:0:0_1:0:0_580ef/2
+AAGAGTTTGATTTCTCATACAATCTTTCCAAATAGTTTCCTGTATTCAAATTCCTTTAAGCCTCCCAGTCTTGGTCAGAGAGAATGCATAGCCAAGTCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1983950_1984377_2:0:0_1:0:0_7b4f/2
+TGCAGCCACTTTCTTTTCCTGACTTCATGTCTTCTCCATCCATGAAATGCCCAAAGTACAACTGTCTCTCTTGTGCTAAGATAGCTTAGGAAAGTAATGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1307100_1307552_1:0:0_2:0:0_3ab33/1
+CAGTGGTTAACCTAACCCTTTCTCCAGAGTTATTGATCTTGCATTTTCTCATCACCTCGGCATCAAATTTAAGTCTGCCTAGGCATTTGTACACGATTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2323015_2323484_1:0:0_1:0:0_39b7e/2
+GTATAGCCCGAGGTGTAGAGACAGGCAGAGCTGCCAGCCTGCAGAGTGGCACTGATTAAAAGCACTGTGGAGGGGCTTTGGATTTAGTATATGGCTCCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2496306_2496799_2:0:0_0:0:0_f7ee/1
+GTTTGCTGCAAGCACAAGTGATCCGATTGTACTGTTTTATTAAGTAACTAACAGAGTTTAGATTTTTATAGCAAAGGTCTGGATCAATTGTTTTTTCTAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_655172_655673_1:0:0_0:0:0_204d1/1
+ACTGCTCTGCAGAAAACGTCATGGACAACAGGAGATGATCCTTAATTGAAAAAAATGTAAAATTTTTGTTTTTTCCTTCTTCAAGTGCAGGCATCTTCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_401207_401673_1:0:0_2:0:0_153ed/2
+CACTTGGGTCCCCATTTATTCCTGAATGAACACTGTTGCTCCCTGAGTTCACAGAACATCAGTAAAAAAATGTTGAACCTAGAATTCTCACAACTTCTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2034437_2035011_1:0:0_0:0:0_16d00/2
+ATGGTGCCCGGTTAAATTTGCATCACATGATGATTTAACCAGGCTGCCCATGCAGAAGCTCCTTCCAGTTACATAATAATAAGAAAAGAGGTAAAACATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_347170_347616_0:0:0_1:0:0_84d8/2
+TGTATCTGGGACCCTTGACTGAGGCAGAGGGGCTCGCTGCCCGACCTGGACAGCAATGACAACCCCCTGTGGAACAGTTTTGTTTTGCCACCAGCATTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_964287_964662_0:0:0_1:0:0_1b6fa/2
+TAGTATGTAAGGAAGGGTAGCAAGTTGATTTTGGTTTTGGAAAAATGCTAGAGGGCAGACATATATCAAACAGATGGAGTGATCCTAGAAAAAGTGAATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_769722_770246_0:0:0_1:0:0_35948/1
+GTCCTTCCCAAGGGCAGAAGTATAGATGTGGCCCAATTAGCTACTGAGGTTGGCACAGCCTATGCTGAGGCAGTCTGGCTCATAGTTAGATGATGGTCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1692816_1693359_2:0:0_0:0:0_da74/2
+AAATTTTTTTTAGGGAGGGTGTGAAGTAGCCCCCGTCCGGGCATTTGTGGTTTAAGCCTATCGGATAAGATGATGCAGTCCGGCACCCATTTTTAATAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1493784_1494253_1:0:0_1:0:0_2cefd/2
+GAAAGGTTCTAATAGCAAGTTTTTAAAGGAAATAACTTAGAATTTAGGAACCACCCTGGCACACATAAGGTATTTTTGTAAATCAGGGATAGTTACTGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_671246_671662_0:0:0_1:0:0_4a581/1
+AGACTCCACATTTTTCTCGAACTTCTCCCCAGTCATTTGGTGAGCAACATTTGATGGATACCCTCAAATTATAATTTGCGCTGGACACTCGGGAGGGAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2143528_2143973_1:0:0_1:0:0_10d41/1
+TGTTCCTCTGATTTTTAACCCTTATCTGGTCTCGGCTTGCATTCTTTTACAGTACTTTTATCGTCCTGCGGGATAGGGTAACTCACTCATCTGTCAGGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2353221_2353687_0:0:0_1:0:0_46da9/1
+CCCTCTGAGGTCACATTTCTGACATCAGTTTCTTTTCCTCCTATCCCTTTGTGATGAATTATGCTATCTTCACAGTCCTTCAAAAAAGTGTGTAAACTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_405300_405744_1:0:0_0:0:0_29fb0/1
+TTTTCCTCCAGAGGCAGGCCCCTTGAATTAAAAAATGAGTGATCTCTTTAACAACTGAATCTGCTGACTGCAATTCTCCCATGACACACATGCCCTTTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1076281_1076763_1:0:0_1:0:0_3d43b/1
+GTTCATCCACAGCTTCATTCTGTTTGCCTGTATGTGGGCATGAAAAAATTTATAATATTTAATTAACTGAACTTATTTTAAAGATGCAGTTTTGGGCAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1445692_1446114_1:0:0_2:0:0_da84/2
+CCTTTCCTTTCCCATGATCCCTATTTACACTGTTGCCTGGTTGAGAGTAGCCTGGTCAGTATTTATAGTGCTGCACAAGTGAAATGGTGGCTTTCCATCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_936055_936454_1:0:0_0:0:0_31cb1/2
+CACCTTACATATTCCCAGGGGAATTATTCGCTGAAGATCAAGGACTGACGAAAGTAGTTTTATGCACTGACCTGGGTTCTCAGCCTCCCAATTGTGGAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1396974_1397482_0:0:0_1:0:0_15c73/1
+TTTCCTTTCGATTCTTGATGTGTCCGCATCAGGTATGCCCTCTGGGTGCCCTACATTTTACTAGACTCCACGAAGGGGGTGGGTTATCCAACTTATAATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1646902_1647291_1:0:0_0:0:0_17428/1
+ATGGTACAGTATTGAATAGAACTCAGACTCCTCAATTAATGTCGGATGGGAGGCCAACATCTGTAGCTCTGCCACCTACAAATTTCTCTGGCCTCGGCTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1028373_1028861_1:0:0_1:0:0_1cdca/2
+TTCCTATGCCATGTTGTTGTGGGCAATGCCTGACAATTTGCCCAGCTTTGGGAAACCCTTTTCAGTCGGTCTTCATATACATGATCCCAATTCTTGCAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1693939_1694242_1:0:0_1:0:0_df95/1
+CAAGAGGTGAGACTGACTGGAGTGGAACAATATAGATATTTCTGTGTGGCCTGCAATTGGTAATCATGCCTTCACTGCCTCAGCCTCCTGTAGCTAACAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_911597_912007_1:0:0_0:0:0_1b028/1
+TCCTCTAGCTAAAGTGATTCATAGTGAGCTGAATGAAAGAGATGAGGAAAGCAGCTTCAGCACCAAACCTTGGGAGGCTCACCTTATGCCACTTGAGCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1242967_1243455_1:0:0_0:0:0_41845/2
+GGCTGGAGTGGACTTCATTGATTTTAAACACAGGGTTGGGGGGAGGCTGACTCATGACATCATTGCACAATCTCAAGGACAATCTCACCATGCAAGTGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_222582_223175_0:0:0_1:0:0_3e94a/2
+CTATATTCGGGAAGTACATAAAATCTCAAAACTAGACCAGGTTGCCCAGGACACTTAAAGCTTATGAATCACATTTTCTCCTTTCCAGTTGTTGGCTCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1377330_1377846_1:0:0_1:0:0_52345/2
+AGGGAAGTCAGGTGGGAAAGTTACTGGTTCAGGAACAATAACAAACACAATTAACATGGAATAGGGAGGATTGAGTAAAAACCCCAGGGACCCTGTTTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1624208_1624550_2:0:0_1:0:0_3dd87/2
+GCTGTGGTTCTGGCTGTATAACAGAACTGGCTTCTCTTATTCTGGGACCCGGGAGGCGGGCAGAATCAGAATTCCCATCACAGCCCCAGAAGCGGGTGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1244548_1245012_0:0:0_1:0:0_3dd45/1
+TAATCACAAGGCGGGCGATCTGGGATGCTCATAACTATAGTTCACCAAACTTAGTGGTTACTTAATTGGCCAGGAGGAGCACAAATGTTCTACACCCCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1521184_1521597_1:0:0_0:0:0_ec23/1
+TTTCTTTCTTCTAACCACAGTAACTGCTTCTCTAACATTTTACATTTATTTAGATTTCTGTCATTTCAAATCTAGAACTTAAGCCACAACGTGTGGTTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1852026_1852494_1:0:0_1:0:0_40d03/2
+ACCTGAACTTCTTTCAATAAAACTGATTAGCTAATTTTATATATCATTCTTAGGCATGTAAATTTCTTCCTGAAGCTGATTCACGTTACACTAGATCCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1491514_1491923_2:0:0_1:0:0_10878/1
+GTTAAATGTCAAATAATGATGATATCACTGGCCCCATCCTTTTCTTAATGGGACCTGACAGAGGTACTGATATCCCAGGCAGATCACGGCTGATTCCTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_816362_816889_0:0:0_1:0:0_4fd7f/2
+CCATGTATTAATACAAAAAATTATACGGAGTTTCTAACATTTCAGTGTAGCTGCTCAGGAGTTCAGCTGAAAAGAGATTTGAGGCCGCCCGGCTGTTTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1584602_1585106_1:0:0_1:0:0_448c2/1
+TTTGTAAAGGAAAGATTACAGAAAACAACTCTGACTTACAGACTAAAATTATTCTTGAATAATACTTAGGATGGATAGATTTCTGAAATTCTTTCAATTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_818082_818587_1:0:0_0:0:0_4bcb8/2
+TATTGCTGGCCCACCATCTAAGGGAAGACTAATCCCACACTCTGCAAATGATTCTATAAGAAGGGATTAAGATTATGTTTCCTGCCCTCACTGCACAGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2427585_2428010_1:0:0_1:0:0_10e5d/2
+CCCAGCCTCTATGTACACTTGGCTCACGGTTTCAACTTGGGAGAATGATAGGATGTTGGCAAAATTTCTAATCCACATGCTAAATTAATTGCCATTCTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_312836_313261_1:0:0_1:0:0_37906/2
+GTCGAAGGGAATGAAGGCTGGTCCTTGAGGAGAGCTGCCATTCCCACAATCACTTAAGATTTTCTTTTCTAAAAATTTCAAGTATAGACTTGAGCCACAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2392480_2392801_0:0:0_1:0:0_3301b/1
+AGTGTCTCATAGACACAGGGTGAGTATATGATAATTGATTTATTCTCTACTAATACCTCAGTCCGGACAGCACTAGTACCACGCACAATTAGCAGTTAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2022579_2022959_1:0:0_1:0:0_d9ae/2
+CAGAGGATTGCACACCTGCAACTATATAGAGTAAAGAAGCCTGGTGTCTATATAAATGTTGATTTTTACCAATCTCGGCTTGCGGGTTTGGAAGGTCCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1257265_1257759_1:0:0_1:0:0_2e75f/1
+GAGGGAGGCCCTCTGCTATTGTAAGGTGGAGCACCTTCTTTGACCCAGGCTGAGCAAAAAAACACAGAAAACTGTGAGTTAAAAAGTAAGGGGAAGAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2362090_2362507_1:0:0_0:0:0_5745c/2
+GAGCAGTGAGGGGATTACTATTGAGTGGGGCTGTCAGTAGTGCCATGTATCTTTCTTCTATATTAGGATCCTCTCTTATGGATGCCCTGGCCAGGGAATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2069878_2070373_2:0:0_1:0:0_b560/2
+TCATGAACCTCGAGAGGGGCAGCCTTTTGTCCAAGCTCCTGCCTAACACCTCTTCCTGATTGTATTTGTTTTCTTAGTTGACGGAGATCTCTACAATGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1128619_1129086_1:0:0_0:0:0_26d9a/2
+ATAAATATACTTGGAATCACCTCAGCCTCCTGTGTTTTAGAGCCTGGCACTATCATCAGGAGTAACTACAACTAAGTCATCAGAAGATAACAAAGTGAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1325756_1326229_1:0:0_1:0:0_46722/1
+TATATATGTCATGCTCTCTAGTGACAGAGTGCTGGAGTGCAGCTTAGAGTCTCTTTGAAGAATCAGAGAAACAAAATAACACCTATGTTATATGCAAAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_628058_628508_1:0:0_1:0:0_4ec0e/2
+CCACCGGGAGCTCATTGTTGCTCTTTGGTGCCGTGTGTGGCTTCAAATCGGGACATGGGATCACAATTTGTGGGCAGGGCTCATTCTAAATCTTAATAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1441786_1442177_0:0:0_1:0:0_154d4/2
+CATAGTGGTTCCTACCTTTGGCTGGGATCATTTTGCTAAAAGTGATCTGGCATTGCTCCTACAATATACTTCTACTAAAGACACGTAATATTAAATATTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1174281_1174682_1:0:0_1:0:0_9103/2
+ATAGGCACCACCTCTTTGTCTCTCATTGAGACACCTGCACCCAGCTACTCAGGAAGGACAGTCTTCATGAAAACTATACCTAGGAAGTGATTTTTGTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2138270_2138818_0:0:0_2:0:0_234c1/2
+GGCCCGGCCAGGGGTTCTTTTTAAAAACTAAAGACAATAATATCCTGTATATGGCTATTAGCCAGTGACAATTCACAAGATAATAAGTGTTCCATGAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1949463_1949901_3:0:0_2:0:0_dfd3/1
+AGCGGTCCATTGTGGAATGAGTGTAAGCCTAGCTCGATCTCTGCTGGATTGGTCCCAGGTATGTAAATTATTAAAAAGAACAAATTGTTCTAAAAATTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2158609_2159079_1:0:0_1:0:0_5b2bc/2
+GCAGAGGGCTGCACTTCACTCTGGGGATCATTCCAAATAGTGAGTTAAACCCCAAACAGTACAGACACTGAAGCCTTCTCTGATATGGGGTTTCGATTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2087423_2087859_0:0:0_1:0:0_1cfb4/1
+ATGTACTTCCTCTCTGGGCTTAAAGGATAGAATAGTATTCTCTATTATTGTCTCTTCCCCAGAGTTAGTAGATCCACCCCCACACGCCTGGGTGATGACG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1207571_1208101_0:0:0_1:0:0_4e06e/1
+TTTCAATTTTTTGGACTTCAGGGTCTGTTATGAACTCTGCTGTTCTATGTCTACATTACCTCAGCATCAAGACATTAAGCTTTCACTCAATCACAACAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_752851_753261_0:0:0_1:0:0_2ba49/1
+AAGTCTGGCTGGTTAAAAATATACCCAGTCTTTCTAAATGAAGTCTAAGCCACCTAGAGTAATCCTCTGAGAGGTTCTCATGAGAAGTAAGAGGGACAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1367631_1368041_0:0:0_1:0:0_53cfe/2
+ACCATTATTTTCAGAGACTCTGAGAATTTGGAAGTGGGAGGCAACACAATTGATTTCTCCTCCAGAGTAGCATGAGACCATGTCATTGTCAGAGGCTAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_391979_392394_0:0:0_1:0:0_f13f/1
+CAGGTCATGGCTTTGGGAGGCTGGCTGCTGAGGCACAAGAAAAATACAGATAGAACTCTATGCATTCGATAAAAAAAACACCAACCCAATGGGGATACTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1842432_1842945_2:0:0_1:0:0_296d7/2
+CAAATACCGCACCAGCTACTCTACACATCAAATTCCTTAGGGCAGCCCCTTGTAGACTTTCCTTCAAAATAATGTCTGTTCTTTATGGAGATGTTTGGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_274781_275272_1:0:0_1:0:0_19ea1/2
+ATTATTTATTTTCTAGGAGCAGGTTTTCTGCCACCTTGTGGCGGATCACCATTTTTCACTCTGCAAAGTGTTTAGCACAGCTGGGATTAGAATTAATGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1723113_1723601_0:0:0_1:0:0_51873/1
+AAATTAGAAAAATCATTTCAGAGGAACTAACATTATGCTGACCAGATGCAGTGGGGCACAAGGTCAAGATGCCAGCCTCCTGAAAGTCAAAACAATAACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2442229_2442639_1:0:0_0:0:0_510f6/1
+AGCGGGCGGCAGGAGGTGGGGTTGGGCCCTTCCTCATATTAATGACCAGAGGCAGAAATGATGGAGAGAGGGAGGCAGGCTGCTAAAGTACTTTTGAGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2296390_2296783_0:0:0_3:0:0_169c5/1
+TACGCCTGTGCGATGTTTCTCATACTGAGTGTAAGACTCGGGCTGGACATCGATGAGGCATGGTGAATTGTCAGCTCACAGAGCACTTAACATCAGTTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2250819_2251264_2:0:0_1:0:0_4603c/1
+CATTTTTCTTTTTAATTTCCTTTCTGCTGAGTTGATAGAGTCGTTTTCTATTTTTTAAAACTACCATAGTATGCTCCAAATAAGGAAATGGACAATGATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1870207_1870617_0:0:0_1:0:0_3cb31/1
+CATGCTTTATCCTACTTGAAGTTAATTAGAGTAAACTCTGGAGTGCTGCCCTTGGCACAAACACAGGACCTGCTGTAGTCCTTGCTCTTCTCACTGCTGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1629267_1629696_0:0:0_1:0:0_52dae/1
+TGATTTTCTGCAAACTGTATTTTTCTTAGCTTAAGTTCTAGCCTAGAAATGAGCCGAGGCGGGCCAGAAACTCCTGTAATGGAGACTCCAGGTTCATGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2096191_2096653_0:0:0_1:0:0_8506/1
+TGTAACCAAGTCACTAGATTGAATGATATAAGGATCTTGTTCTCAGTCTCAGGCTTGAACCTCCGCCTCCACACACCTAGCCAAACAATAGGAATGTTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_997780_998195_0:0:0_1:0:0_4cf7f/2
+CAGAACTTAAATGACGCAAGGTCTGTATTCCCTCTTAATTATATTTGTAATCAGGGATGTTTTGTTCACTTAGTAAATGATTGGCCAAAATTTTAAATTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2288048_2288532_1:0:0_1:0:0_24f3a/1
+TTATTTTCATCATAAACAATTGTGTAGCCTGGCCAGCCCGTCCATTTTCAGTTGTTTTTGACTGATTGCAACTACAGGAAGGCACATATATTGTGTGTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_132597_133054_0:0:0_1:0:0_40ee2/2
+GTGCAGTGGATGAAAAAAACTGCACCACTGGCAGTCTGAGGAGGGTGTTCAAATACTGGTTGAGATAATGGGAGCTCAAGGAGATCTTAGCAAAATCACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2015657_2016194_0:0:0_1:0:0_311ab/1
+GCAGGAGTGGGTGACCCCCAAAAGCTAAAGTAAATAGGTCAGGTGTGGTGGAATTGTCACCATGGCCTGCTCTCTGGAAAAATACAATGATTCTGGTAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2499592_2500021_0:0:0_2:0:0_c226/1
+AGGTTGAAGGCAGAATATGCGTAGCCTACTACCAATATAAACATAGCAACCTCTGTGTTCCTAATTCTTGAAGCAATGTCTTCTACTCAGCCTTCCACAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1946937_1947339_1:0:0_0:0:0_1fa89/1
+AGGAATATATCAGACAAAAGTGCAGTGACACATGTGGGCCTTCATCATGGTGGAAACGGATGCAGAAATAAAATTTAAACGTTACATGGTTTTGCCTGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1236762_1237161_0:0:0_1:0:0_3e451/2
+CCTTTGGGTGGCAGGAAATGCGGGGGCCCACCACATCACAGTTTATTTTTTGTGTATAAAGGAAAGACAGAGAGAGTCAAAAGTATGGAGAACACACAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_93265_93805_0:0:0_2:0:0_354e3/2
+GAGTTCTCAGTTCGAGAACCCTTCCTCATGATATTCATGGCATTTCGCCTCCCAGTCCCTGCATCTTGCATATACATATAAATAAAGGAAGGCTACTTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_58922_59463_1:0:0_0:0:0_3a719/2
+ACAGCTCTCGTTTGTATATTACTTCTGCAGGCTCCTTCTCTACCCATGAGCTTTCAGTATTTTACTGTAAAGATAGGAAAGGGTGCCGTCAGGGAGTCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_963350_963766_0:0:0_1:0:0_21788/2
+TAGTTTTCTTTAGAATAAGGAGGTGCAGAGGTGGGCCTATCTTGATATCCCTTTCTTATAAAACCACCAGTTCTTTTTGTGGTGGGGAGGGGGTGAGAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1054966_1055451_1:0:0_2:0:0_53ba0/2
+AATGAAGAAGCATTTATGCTCAAGAGGGAGGAGGAGTACAGTCTAAGAAGGGGTTCAAAAACAGTTTCTTAGCTCTCTCCCTGTAAGCACATGTGCACTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1337037_1337551_3:0:0_1:0:0_4ddc0/1
+TCATTCTTCATCCTATTTAATACTGCTTTTGATCCTGTCTTGAAATTCTTGGAGGTAGAACTTGTTTACTTAAATGCGGCTGACTCCCGTGAGTGGTCCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_673755_674288_1:0:0_1:0:0_b203/2
+TCAACAACCCAAAGTGTTTAAGAAATGCACTTCTAGTTATCTTTTCAGGAAGCGGGGAGGCCTGCCTGCGGCCAAGCAGGGACTGCCTCGTGGAATAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_622213_622625_0:0:0_1:0:0_22135/1
+AGCAAGTACAAAGTTTTGTTTTGAACACTTTGGGAGGCTGTTCTAAAATTAAATCCACTGCAAAACAGCGGCATGGTAAAGAATTCGTGCCACCTTTGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1572114_1572558_1:0:0_0:0:0_23dd8/1
+ACTACCCCTCAGCATCCTCTTGCCTGTAAGAATCAGAGAGAATCCTCTGGGTTACATTGGTCTACTCACATGGCTTTGAAAATATGCTTCATTGAAAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1136169_1136623_0:0:0_2:0:0_51f0c/1
+TGGAGGTTTTGTTCCATCCCAGCAGAGCCTTTGCTGGAGTATGTCACTAAAGGCCTTCCAGGAGGGAAGTTACATACTGTAATGTTAAAAGTCCTGCACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1538069_1538410_0:0:0_1:0:0_3322b/2
+ACTATGCTAATTCAGACTTGGCTGTGCAATCCTTGACATTACCTTTGCTGGAGGGACCTCAGACTGCCTTCTTGTAATGACATTTCAATGGCTTATCCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1367658_1368182_1:0:0_1:0:0_35896/1
+TTATGAAAAAGGACACACACCGTTGGGGCCCCGCTCAGATAGAGCAATCCTAAATGCATTTGATCTTTCTGGATTTTCTTATGTAATCACTGCACCATTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_735_1165_1:0:0_2:0:0_447aa/2
+GCGTCGGGAGGGTCTCTTGCCCTCCTGCCACTGGAGTGGATGAAGGATTGATGGGCTTCCCTGTTCTCTGTCAGTGAGCCCCAAGGAGAGTGCGTTGAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_28184_28641_1:0:0_1:0:0_40a0c/1
+GTGGGGCCACAGCAAAGTGCTCTTTTGGCTTGATGAAATAACATCATTCTAATTATGTCAAAAAAAAAAAACTTTTACTCCTCTTAGAGCTGCTACAGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2136958_2137392_1:0:0_0:0:0_122f1/2
+GTACTGTATATTATATAGGGACCCTGAACCTCTAAGAGTATGTAAGTGTATCACATCCTCAGCCTGAGGCACATGAAGCAGGTAATGTATCTAAAGATTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1675136_1675478_0:0:0_1:0:0_136e1/2
+GCTGTGGTGCCCATTCCTGCACTCCAAGGCAAAGGCTTCAAAAAAAAAAAATGGATGAAAGAATAGAAGAGATGCTGGGCCTCTCACTAATATCTGCAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1555390_1555840_1:0:0_0:0:0_59bd2/2
+TTTTGAGGCCTGCCTCCCGAAGAGAAATCCTATACACCCACGCCACTACCATTTTGACTTCAACAATTTCTCCAGCCTGTACCTGCTCTTTCCACTTGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_231291_231625_1:0:0_1:0:0_50bb4/1
+GGAACACATATTCCCGTCTCAGAATATTTCTTCATTGTGCCAAGCTGGGATTATTATCATGTCGGAAAGGAAACTAAACTTACTGGCATGGCGATCACAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1813539_1814059_1:0:0_1:0:0_29500/2
+ATAGGACTTGAAGCAAATATAGGGACCTGCTCCTACTTGAGACCCCCTTTCTGAGTCATACACAGTAATATTAATTAAAGGATGGTGGGGGGTCCATATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_797314_797768_1:0:0_3:0:0_4b3d9/1
+TTTTGCTTCACGTACATTATTCAACTGGCTGCTGCCTTACAACTGTATCTTTGGGTATATTTAAGTGGAGACAGCGGCCCGCCCCCAGCTTTCTAGGTAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_180828_181266_0:0:0_1:0:0_2383d/1
+TAAATATGGGCAAGTGACATTAAAGGGAATTCTACCCATCGGAATGTGGATATTAATATTAAACAATTCTCTTATTTTGAAACAGAGCGAAAGAGAGGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_324959_325438_2:0:0_1:0:0_51110/1
+CCTCTAGTTCTGCTTGTATCTCATTCATGCAATGGTTCTAAGAAATGTAGGGGAGAAAAAATTTAAGGGGTTTGATCCAAAAGCAATGAATACAACAGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2472917_2473382_1:0:0_0:0:0_7e97/2
+AATTTTCCTATGCCAGGTCTGGTTAACCATATGTATTAATATTTTGGGGATAAAATTACAAACTAACTGGGCTAACAGACGATAATAGATTCTTACATTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_735262_735712_1:0:0_1:0:0_494d3/1
+ACTTTTTCTTGAGGCTGCTCATTGTAGAGGTGGCATTAATTACACCATTCTGATTTTCTCTGCAATAAAAGGGAATATTAAGACCACAGTCTCTGGGGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_804432_804959_2:0:0_0:0:0_211d8/1
+CCTGTCTATGCAGTGAGGAAAATGTTCCTAAATAAATTTCACCCAGATAAGTTTGTTTTATCAAATACCTATAAGCAATCCTTCTCTCATTGAATTTCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_817929_818400_0:0:0_1:0:0_3be08/2
+TATGGTTTTCCTTGCAGAAGTTCAAGCGACTGTCCACACGCAAAAAACTTGTGCATATTCCTGGCAGTCTAATTTATCTGGTCGAGTTGAGTAGCCCTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1364111_1364501_0:0:0_1:0:0_2d394/1
+TTATTTTTTGCAATAAAAAAAAGATCGGTTCTGCCTTATGGTAATAGACACTGGGTAACTTTCACTGATCAGGGTATTTTAAAAATTGTTGAAATAATCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_588401_588880_0:0:0_1:0:0_44e35/1
+CTACCTACCATGCAAAGGCAAATTCTTTTTGGAAATATGAATTAGGGTAAATAGGCCTCACCTCCGTTCTTATCTTTCTGATATAGAATTTTCCACTCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2243999_2244456_2:0:0_0:0:0_52426/2
+GTGGTGATAGATTGTTGAGTTTCTCATACATGGGCCAGCTTGAACTTCTCCCTGAGTTGTTTGCTCTGGGAAGCAAAGTCATCTATGTCACTTTGCACTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1394717_1395261_1:0:0_1:0:0_9f97/2
+AAATATCACGGAAAAGGTAAATTCCCCTGCCCCAAAGCAGGTCAAAAGATAATACTGGTTAGATCCTCCTGAGGCGCGATCTCCTGAGTCGGGAGGGAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1110853_1111222_0:0:0_1:0:0_14e8a/2
+ACGATGATCTTAAAAACTCTATTCAATCATGCAAAGCTGTTTTTAAATGTAGCACCTTTCTATAGTTAAATTAGAACGACCTCCTCCTTATAACCACAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1625893_1626386_1:0:0_0:0:0_bc88/1
+CATCATCGGCCTCTGCCCATCCACTGGAGCTTAAAGTCCTTGAGCTGTAGTTTGATTATCTGCAAGGGATGAGTTCAGCTTGTAATCTCACAGAGTTCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_775261_775719_1:0:0_1:0:0_1c19f/2
+TCCTTCAGGCATTTCCAAACTCTCCCTCCGACCTGCCCATCCTGTCTGTAAATGGAAATAAATTGTTGTGATGGGGTTTAGAATTCCTTCAGGTTCCTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2301495_2301968_0:0:0_1:0:0_3fbad/2
+TTAATTGTGATCATCAAGGTCTTGTTTTAATGACACCTACAACATGCTGAGATGAAACCCCATTCTATATTTTGGCTACTCGCGAGTCTCTGATTGGTAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1445165_1445655_0:0:0_1:0:0_7c7d/1
+CAGTTATAATCCAACAGAATTCAAGTAATGCCCCCTCTGATAGTAAGTCCCCATCTGGAAAATTGCTATTTATAAAGAGATGAGATGGAGACTCATTTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_502593_503027_0:0:0_1:0:0_273bf/2
+AGCCTCCCCCATTCCTTGAAAACAGGGTATATTCTCACGCCGGAGCTCCCCACTCCATCCCAGCCTAATGTGTTGTAAGTCCCAGCTACTACTGAGCTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1596718_1597240_2:0:0_1:0:0_2d758/1
+GCTTATGTATTGAACTTTTTGTCTGGGTGCCCTCCTGTCCGGCGAGAGACGTGGTAAATACATACATGCCAGGAGCTGCTTAAGGAAAAGCAATTTATTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1215210_1215630_1:0:0_0:0:0_560fe/1
+ATAACAAGAAAATTAATTCAGTCTTGCTCAGTATATTAGCTTGCTCCCATAAAGCTGGCTGGAGTGCAGGGGTGTGCAGGGAACCTGCCCTCACCACTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_521219_521641_1:0:0_1:0:0_26d5f/1
+TGCAATATATCATTCTACCTGACCAACACCTGAAAGTTAAAATTCCTGAATTCATCCTCTCCTCCCAATGGTAACTTTATAAACAAAAAGTAATAAATAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1302333_1302870_1:0:0_1:0:0_163f5/2
+GTGATTTAGCTGGATGGGAACCAGGGATTAAATTTTAGGAGGCTGTTGCCAAAGTGCAGGGGTGGTGGGTGACACAGCAGCCTGTTTTGGGAGCCTGGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1746628_1747124_2:0:0_1:0:0_1cae7/1
+ATAAAAATAGCATAGCACTTTGGATAGTTTGAGAGCAAGAGCCCTCTGCCCGCCCCCGAGTTCCCATTGGAAGGAAAGGTACACATTAAAGAAATAAAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2177941_2178361_0:0:0_1:0:0_4b3af/1
+GGGAAAGACAGAGTGCTATTCTTGTATCAACACTGGGAACATTGTTCTTAAAAAAAAAGATTTAAAGTATCTACTTATAAGAAATAAAATATTTTCTGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_864623_865195_4:0:0_0:0:0_2c783/2
+GGGGAGGGATGGGGTTTATTTCAACATATTTATACAAAAAGCAATGGCTGTGAGTCCACTTTAAACCACTCTGCTTTATTTATTAGGTAGCTGGGATTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_83665_84107_1:0:0_1:0:0_5390a/1
+TTTTCATGGCAAGAGCCTGGTTAAGATCTGTTTTCTTGTTTTTATTAGAAAGAGCTAGATAAAAGAGGGGGGATAATGACAGAACACATTATTGCAAATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1943221_1943647_0:0:0_1:0:0_226f0/1
+ACTAATGCAAATCAGTTCACTCTTTTTCTGCTGTTAGCATTAAACTGGTTATATTCTCTTTTTTCCTAACTATAGGTTTGCCTATACAATTACTCCTCGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_880213_880707_2:0:0_1:0:0_177bb/1
+GTGTACGAGATTTACTCTTTGACTGCAGGATGGTAAATAAGAATAAGCACAAGCAAGTGAAAAGGCTGGCCCACTAACTTACTATTGTTTTTTTTAAATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1361349_1361766_0:0:0_1:0:0_11084/1
+CTTTTGAAACTAAAAACTGTGTGATATGCCTACACTTTTATTCACAATATGTTAACAGCATATAAAAAGCAATTAGAGTTTTTCATTTCCAGGAGAATCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_922706_923132_2:0:0_1:0:0_319c0/2
+AGCAAGAGCAATGGAAGTATACAGATGGAAAAGGACTCCAACCCACCTTTTTTTTTTTTTTTCAGTGTAGTCTTGCAGCGCCACCGGGAGAATAGAAGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_50481_51023_1:0:0_0:0:0_2cec1/2
+GGAATGTATGCGAGGAGAATCACTGTGTTTATATCTTCCCATCTTTTCTAATCTCATTGCAAAGAAGCCAGGCACGGGATCCCATTGCCCGGCGCCTGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_862401_862886_0:0:0_1:0:0_4cf9f/2
+TTAGTTCTGCAACCCCATAATAGCAACTGCGCCCGGCCTCCTCAAGCTCCCATTGATTTCACAGGCCAGTTCCCAAACCATCGATAAAACTACCAAGATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1874606_1875105_1:0:0_2:0:0_31d31/1
+GCACTTTAATCCCAGAAACTTTCTTTTATTTCTGCCCATCATTGAAATTGCCTTCCCTTTTTTTTTACGGAAAAGAGATGCCTATCAGTAATTGCTTGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_885730_886197_3:0:0_1:0:0_3de18/1
+AGCTTGCCTAGCTACTTTGGTACCTAGTGAGCCACATGCCTAAATGCATTTGTATATTTTCCATTCCAGGAGTCGCAAGGAGATTATAAAAACGCAAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1154360_1154780_1:0:0_1:0:0_158ff/2
+GAGATGGATGTGAGGTATTGGGTTGTTTTTCCTATTGTGTTTGTAGAATTTCTGCAGCAGTGCAAACCAACCAAGTTTGATACTATGTGCTGTCCGGTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2017813_2018315_1:0:0_1:0:0_3fb0e/2
+AGCCCCTTGATGAATAATGCATCAACTATTATTTTTGCTCTGTATTTTTGTGAAAAGATTTAAACCTCGGCTGCTGGCTGGAGTGCTGTCCGAGGCGGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_938375_938855_1:0:0_1:0:0_138c2/2
+AAACAAAAAAGAACAAAGCCTGGTTATCTCTCTGAAAATACAATAGATGTTCTAACAAATGTAAGGGCCCCTTCAGCAGAATTAGCTACAGCTTCACATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_81096_81614_1:0:0_0:0:0_511f3/2
+TGATTCAGGGCTGAGACTAAGGGTCAGGAGTTTTTGTAAGTTTATTATAGCTACTCTTGCTAGGACATAAATGCATTCAGACAAAAATAGCTTGCACCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2084581_2085055_0:0:0_1:0:0_b0ea/1
+GCCTTCTCGGATGTTTGCGATTGGTATCAGAAGTCCCAGTCCCATTAGTAGCTGCTGGCAGGTCTTTAACTTATCTTTAAATATGGAGTGAGCACTCTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1456965_1457501_1:0:0_1:0:0_33fb4/1
+CCATCACATCTCTAAGCTTGGCAACAGCGAGACTCACAGAAGTGTTTATCTCCATATCCTAGCTACTGAGGAACCATCTGAACTTAATTAGTTTAATTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2295856_2296326_1:0:0_1:0:0_36fc4/2
+GGTGATCCTTTGGTTTGGAGTGCCTAATTTGGGAAAGAGCAAAACTCAGCTGGACAGTGGTTTCCTCCGAACAAGCACATTCTCTAAAACTAAAATACAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_568574_569054_1:0:0_1:0:0_3bbf1/1
+CGCTTGATCCAAACACTGCAGTACTGCGCTGTTTGGGGGTGCATAACATTGTGCTGGTCCGTGGTGACAAGGAAGAGTTCCTGCCTCCCTCTAAGAACTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_167876_168321_1:0:0_0:0:0_16bdb/2
+ATCATTTCAATTACCCTTAAACATGTATGTATAGTGATTATGCATACCACAATGAACACAGGAATTGCTTCATCGTGTGCAGTCAGGAAAAAAATAAATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1017799_1018195_0:0:0_1:0:0_3a87e/2
+GAGCTGGAAACTTTACCTCACCTTTGAGTAGCACTCCAGCACTGGCCCACTCTGTGGTTATATTTATCGAGACTATCTGCATAAGCAGACATCTGCAGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2085457_2085895_0:0:0_1:0:0_3de64/2
+TGTCTTATGCGCTTGTTTCAGAGAAACAATAAAATTAGGATTGTTCTAGCACTTAGAGACTCGGTTATCTTCATAGCAGGTCAAGACCAGGGTATTTCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1201125_1201526_1:0:0_0:0:0_4aa8d/1
+GCTGGAGAAACTCGAGACCCACCCCCATAGATAATTTTAAGAGGCTTTATATTTGTGTGTGCCAGGGCGGAACTGGCTCATGTGACAAATAATTCAAGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_399207_399639_0:0:0_1:0:0_cc59/1
+ATATATTTCAGCAGCATTTGATTTAATTACAAGTGACTTTGTCAGAGATCGTGGAGCTATTTTTTTTATGAAGCCAGGCTGGGATTCAGTACAGACATAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_634352_634867_1:0:0_0:0:0_c9dd/1
+GAGGCTAGGATGTTTTTGAAGTGAAACTGTTAAGGGAGTCATATGGCACTCACTAGGCCCACTTTGGTTATGTGGCCTTTCACAAGAGTTGAATTACTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2329978_2330425_0:0:0_1:0:0_2a669/2
+AAACTGAAGGTAAAGCAAGACCAGCGCCGCGGTCATCACAGCCCTTGCCTTTCACAGATGCGCTCCTTTCTAAATGAATACATATTTTTCATTTCGTGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2394283_2394802_0:0:0_1:0:0_b8f5/1
+AGGTCTGCAAGCTCTTTGTATTCTCAGGTTAATATACCGTGGTGATAATGGCAGGGTTTTCAACACCTCCGCAAAAACTATAACTGGCAAGTGTGGATGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_874257_874755_1:0:0_0:0:0_2bbed/1
+AAGCTTAAATGTTAGTGGTGGTAGCTGTTATTGAATCCAGGGCAAAACAATTTCAGTCATTGCTTTTGCTCACGGGGGTCTTTTTTTGGGGAAAATGTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_20970_21418_0:0:0_1:0:0_4b79b/1
+AAGAAATATGGATGAGGCTGAGAGAGGGTTAATACAAAAAAAAAAAAACTACCAAGCTAGTAGTTTTATCTTGGGCTTTACATGTCTACTAAACCACACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1044387_1044821_0:0:0_1:0:0_26b7c/2
+TACAATATTAGGAGACTGGCCGGGTTCCCTACCTTTACAGGAAGGGTGAGGTCTAGATCAAAACAAAGTTCTGTTCATCTGAGCCGCGCCCAAAGTGTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_400534_401019_1:0:0_1:0:0_1e883/1
+GGGCAATTGGCATTGGCTAAAAATGTTCTGTTATTAGCCATATCAAAACAAAAAATCTTTGTCTGCACTCCACCTTTACAGCAAGAAATAGGTAAAACTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2253207_2253695_1:0:0_1:0:0_97a8/2
+TTAAAGTTTGCACAACAGCTTCATTGAATATCGAATACCATGTGCATGTGATATCTTTGGAAGTTCTGAGCAGGGTTTTTCATGACAACTACGTCCCAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_406459_406890_0:0:0_1:0:0_4fa17/1
+AGAAAGCATCCACTTCCGGAGCCACACACAGGAAATGATGCTTACATATTCTGTAATTAAAATAACTTTAAAAGCTGGGACTTATAATTTTATGACTCGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_742673_743004_1:0:0_0:0:0_1a764/2
+ATAGACATCCTCCCCACTTCCACTCTCTGGCTGGAGCTCCACTAGCTCCCGACCTAGTAACAAGAATTTCCTGTGTGCAATTCATCATGGAATATATAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2232356_2232786_1:0:0_0:0:0_264a1/1
+CACTAATTTCTGCACTCCCACATTTTGTAAAGTCTTCCTATCTCTTTTTAAAAACAGAAAAAATATATATATGATTTTGAGGTTGCTTTGCCTTTGAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1156493_1156905_0:0:0_1:0:0_25b7a/1
+GGATCTTAACCATCATCCTGACAAAAAGCCTGAGCATGCCTGCAACACTTACAAGAAACATCATTCCTCATGCTGAGATGGGAAAAGGAGGAGTGAACAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1716384_1716835_1:0:0_1:0:0_2d451/1
+TGGAGGCCGATCCCATGGTCGGCACCAAGTTTACTATTAATGCCATTCTTCATTAAGGAGAGGGAAGGCAGGATGAGATACTGTGTGGCCTGGAGCAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_634266_634675_0:0:0_1:0:0_14612/2
+GCCTAGGAGTCTGCACGGTATGATCCACCTTTTTCATTAGAGTTTCCAACAAGAGGTCCGCCCTGAGGTAGAATCTATCAAGTTCCCTCTACGAAAGATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_497569_497993_1:0:0_0:0:0_35b94/2
+CCTCTGCCTGAAAATGTTGCAAAAGACAGAGTGAGACACCCAGGCTGGTCCAGCCTCCCTCACAACAGGAAAGTTGGCTGACTTGAGTTGGCTCAGACGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_936624_937087_4:0:0_0:0:0_484d7/2
+AGTATATGTTTCTCTGCCCTTAGTTCAGTCAGGCTCGATTCTCTCCCAGCCTGAAAGCTTTCATAATCAATTAATAGAGGGCGGGAAATTAGCCTGTAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2236137_2236531_1:0:0_1:0:0_2bb99/2
+AAGTGACTCCTAGCCAGACACAAGAGAAATGCTTAGATATACCCCATACTTAATAGATCCACCTCGTGATTCACGCCTCGGCTCACTGCACTCTGTCGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1870233_1870636_1:0:0_1:0:0_24772/2
+GCTAACATAGTATGCTTGAGACCATTATACTCAGCTTTTATTATCACTAGGCCAGGCTGGCATCACCACTAGCAGAGCAGCTCTGCAGTGATGTAACCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_860454_860868_4:0:0_1:0:0_3be0c/1
+TTTAGAAGAATTCCCAAAAATCATATGAACAATGGGTGGTCTCACTCCAGATTGCTTTTCTCTGATTTTTTTTAAAACTGGAGGGGAAGGAGCTCCATAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_248313_248810_0:0:0_1:0:0_3e392/1
+GTACTACTCAGGTATTCCTGTGAGGTACAATTGCTATGCAATACATAGGTGTGATCTCCCGGCTGAACAAAATTTACTATTATATGTAGTTTTGTAGCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_573650_574107_0:0:0_3:0:0_9503/1
+CTTTAATATCAGTTTAATTCAAAGAGTTAGTCTTTTAAAGACAGGGATTATGGTAGGTGCCTTGGCCTTCCCCTGGAGGGCCGGGGAACTTGTTCTCATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_759026_759526_1:0:0_1:0:0_31de/1
+AAATGAAGGTTTTACAGAATCAAATTCCAACATAAAGAAGCTGGGACCCCTCTCCATGTGGTTTCTGAAATGCCTTGGCCTAGTTTAAGGCCAGGTTGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1498283_1498786_1:0:0_1:0:0_12abe/1
+GGTGGAGGAGTCTTGGATAACCATGTTGCAGTTAATTATAGGATCCCACCTCCACTTCGTCTGACCCAAGGTTTACATGCAGTGTTCTCTCTCTGCTATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2109427_2109896_0:0:0_1:0:0_4b687/2
+AAAAAATCACCTTTAACTGCCAGGCTCTCTAGCTATAGTAGACTAATATTAGTTTGTTACTTAAATAAATAGATGTCCTGTGGGCTCTCCCTGGACTCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_732201_732703_2:0:0_2:0:0_4f96d/1
+AAACGGGTAGCCGGGCCCGGCTAATATAAAACCCACCACGACATTTGAACTATGCTGTTTTCAGCCTACCTTTAATATATGTGGTCAGACTACAGCTACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2305965_2306357_1:0:0_1:0:0_38798/1
+ATGCCTGAGATGGAGTTCACTGTGGCCAGGGAAGTTAGGATTCATTCTCTGGAACGTCCAAAGGGGACGCCCAGACTATCCTATCAACTCAGCACCGATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1245761_1246218_3:0:0_1:0:0_4afaf/1
+GGTTACGGCCCCATCACAGCTTTACATGCATAAGAATGCAATTTGATGTGCGATCCTAACCCTTCCCAGCCTGGCAATTAATAATGTCTCTATCTCTTGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2350776_2351218_0:0:0_1:0:0_4af80/2
+ATATTTGATGTCATACACACAGGTGCTGGGTGGATTTCCCCTTAAACCCCAAGATAGGGAACACAGCGCGGCTGGATATTCCTTAAATTCTAAGTGGAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_325191_325610_1:0:0_0:0:0_3aae/1
+GACTTCTCTTGATCCAAAGAGTCTCCTTACAATGACATAACCACATTTCAGAGAGAGCTGTGTCTGGAGCTGTATTCTCAGTCCAAGAAATTTCTATATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_737058_737498_0:0:0_1:0:0_26825/2
+TCCATCTGTCGCGGCCAGGGCTTCAACACATAGCCCAGAAATGAAGGTTGACATGGGCTCAAGAGTTTTTTTCTAAGACTCTAGATGAGCTTTCTGACAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_866604_867096_1:0:0_1:0:0_b7e9/1
+ATCTGGGTCCAAGTGATCTCGGCCAGGAGGTGGTCACTAATGATACAAAATTGAAATTATATGCATCCCCTTTCTGTTTTTCTATTCGGGAGGTGGGGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1788256_1788698_0:0:0_2:0:0_53d36/2
+CATGTCTAAACTATACCACTAGGAAAAGTTATATTTTTCTGTGAAGTAACTGAGTAGGGAGGCAGTAAAATCTACACAGAGGCGGAGCTTCTGATTAGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1323848_1324371_2:0:0_1:0:0_3ec9c/2
+ACCATATAATATCCCAGAGACTCTCTGTTACATAAGCATGATTCTTTTTCAGACCAGAAATTGCCCCAAAGGCAAAAAAAGTGCCTTTTTCGGTGCCACG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1297346_1297791_1:0:0_0:0:0_59961/2
+TTTTTAGAAGAGAAAACATTAAAAGGTCACTCTCTTTTTGATATGATCACTCCTAACAAAAAAAAAATGGAAAAGAACAGAACCTTCCCAGATTGCCAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2041224_2041677_1:0:0_0:0:0_4d4c9/1
+TCTCCGGCTAATTTTTAAAAAAAGAGGTACCTGGACTACATTTATTTAAAACACACAGGAAGTTTTCTCTTGTTTTCTTTTTTAGGGCTTATTATTTTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1823589_1824075_1:0:0_1:0:0_1bce6/2
+TTTAGGCTTGGTGCTCAGAAGCAGAAACATTCACGTTACATACATATACACCTACTGATCTCTACAAATTGTAGAGACTGCAATACCATGGCGCCATTAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_969817_970283_0:0:0_1:0:0_457e7/1
+AGTGGCCTTTGAATCCATACTAACCATACGTTCAAACCTTTCAGGTTACCTTGTGTATCAGTGCTGAGATCCCAGCGTGTCTGATTTATATTATACAAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_544708_545209_2:0:0_0:0:0_2ee6f/1
+TGAGATGGAGAAGCTATAAGTAGAGACAGAGGCATGATATAGCAATCCCACCCAAAATACAGTCAGGAACGAAAAAAAAAAAAATCGGAGTGTCCACTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1865307_1865718_0:0:0_1:0:0_5120a/1
+TGCTGAAGATTATAAAAACAGAGCTTGTGTATTTTGAAGTGATGAATGAATAAAAAGTCATAGCTTTGTGTAGTTTTTTTTATGTGAAACTCAATTTGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_163920_164495_0:0:0_1:0:0_42001/2
+TACCTATTCCCAAGTTCAGGGTTTTAAGCAAAGCAAATGGGTGGGACGTCTCTTGTATTTGCTGGTCTTTATGTCTGTCTCAAACTGTTTGCTTTTTGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_279939_280312_0:0:0_2:0:0_17226/1
+GACTCATAAATATAACAAAAAAAGACAAACGAGTTCGTTGGAAAAGATATTTTGTAGTTTGAAAAAAATCATGGCCAACACTGTCTTCAAGAAGCTTATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2275574_2276021_2:0:0_1:0:0_2c6d8/2
+AAAAGAAAAGAGACTCCAGCTGCATTTTTTTCCAATTTGCGTTCCTGCCAGGCTGAAGACCCCGCTCTTTGTTACAGTGGCTGTCCTTACCAGGGAGACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_384864_385336_0:0:0_1:0:0_29ff5/2
+AAGTGAGGTAGTGAAGACCCCTGGGGAACCCCACCCCCACTCTATTATCTCTCAAATTGTATTTTTCTCAGTCTTATTATTTTGAAACCTTATCTGCATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2452162_2452650_1:0:0_1:0:0_1f3f7/1
+ACCAGCCAGGCCTCCCATTCAATTTCAACATCATATACATCAATAAGCTTTGATGTGAATTCTCCATCACTGCAGCATTGTCTTGACCTGGACAGGGCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_690912_691344_1:0:0_1:0:0_2ee5b/2
+AACCTGCCCGTCAGAGGAGGGAGGCATCTATATGATTTATTTACTCCACCCAGATCTCCTCCCTAGGTATCATATACCTGCCTCCCCCTCCTGAGTAGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_945947_946336_1:0:0_1:0:0_59972/2
+TCCGAACTTTATTTCCACTGCGGAGAAAAAAAGAGTAATCCTCTCAAAATTCTAGAGCCCAAAAAAAAAAAAAGCTGTAGCTCCCTGAAAGATTGCTAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2274369_2274760_1:0:0_1:0:0_28f51/1
+AATTATATTCCTCACCCCACCATATAGGCACTCCATCCATGGGTAGGACAGTGCCCCCGCCCGCCTGAGCAAGTCATGTACAAAATCTATATAAAATGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_305715_306169_1:0:0_1:0:0_24320/2
+GCATTCTAAAGAAATGCCCAGGGATGGTAACAATGTGGCTTTTAAACCTCTTTTATGGAAATGCACATAGCAGAAGATGGGGTTGTTGAAGAAAAAGAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2485335_2485801_2:0:0_2:0:0_48005/1
+TAATAAGATGCAGGTAGGTGGAAAATTAGCCATTTAACAATTACAGGGAGGTGCCAGAGCTTCTTTACTGATTAAGACAAAGCCAGCGAAGTGGTTGCTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1061942_1062326_1:0:0_0:0:0_35ddb/1
+AGTGATGTTCTTAGTGAGAGTGAATGAGTGTGTATGTACAATAGCATCCATGAAGCATTTCAATGAAGAACACAGAATTACCAATGCCAGTTCTCATTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_225617_226092_0:0:0_1:0:0_57fa6/2
+TGGATAAAAGAAAAAGAAATCCTGTACTAGCCAGTCTCCAGCGGCTGAGGTATTCTGTGTGTGTGTTAAAAAGGGACATGTGTTTCAAAAGAAGAAAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2208004_2208554_0:0:0_1:0:0_19eb2/2
+AGAAATGAAGGGTTCAACTGTCTCACTGGGAAAAAAACTCTTGAATTCCAGAGCATCACCACGCTGCTTTACATCATACATTTTGTGGCACAACATCTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1606578_1606961_0:0:0_1:0:0_19f1d/2
+ACAAATACATTTTAGGTCCTTTCTCTGTCTGACAGAGGCTGGAACCAATCTCATAAAGGTATTGTTGCCCAACTCCTCGCTTGGAATGCCCAAGTTAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_721562_722048_2:0:0_2:0:0_235be/2
+ACAAAGATTAGAATCAACTACAGCCTTTACTGTAACTCTTACCAGCCTGCTGCTAATGGTTCTGGTCTCGTCCCCACCACAGCGCGGTGGCCTTTATTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1465547_1465947_1:0:0_1:0:0_5a37d/1
+TTCAACCCTGAATTTGAAACCCTTTTGGCAAGACTGCGCTGGGATATTTCACTCCAGCTTACCATTGAAAGAGTCTCTCCATTGCAACTGGAGAGTGATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2296606_2297070_1:0:0_0:0:0_447f/2
+GGAATCGACAAAGTAGAACAGTACAGTGCTCACTCTCTGGTTACATGAGACTCAGGGAGATCTTTCCTTTGAAGAGATTACGCCTGTTCTATGTTTCTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1211272_1211725_1:0:0_2:0:0_116de/1
+GCCTCACCCAAAGCAATCCACATACCAGTAAAAAAAATATCTTTCTTTTTAAAATTAATCCTCAGGCATTGCCATCTAGTCCCTCCCCCACAGAACACTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1941960_1942469_2:0:0_1:0:0_37226/2
+TAAAAACCCACTAGAGAAATTCTTTTGTCAGTGGGAAATGAGCAGCTTGAACTCAAGCAGGAGATGATATACATATCTTACACACACTGGGGACACTTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1530642_1531139_1:0:0_0:0:0_1e740/1
+GAAGCCAGTGATATCATGGCTCATTAAAATGATATGTGGCTTTGTGCTCAGAAAAAGCAAAGTAGCTATTCAGAATAAAAGAAATGTTATTTTATGTTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1342664_1343037_1:0:0_0:0:0_36625/2
+TAAAGAAAATTTTCGGTTGAGTTTAACCTAGAGGCCGAGTAATGATTCAACAGATCGAGGCAGCGTAAGAAATTTTTTATATTAATCTCCTCCACTACAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_188854_189272_1:0:0_1:0:0_45239/2
+GGGTGTAGCAACTTCATTAGGAACCAACTCCCTTTGTTTTTGAGAAGAAATTAAAATGTGCGAATCTCTACTAAATTTAGAATCTTATGAGTTTCAGCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1561955_1562435_1:0:0_2:0:0_59b14/2
+TCAATGGCTGGTCTAGCAGTCTGGGCTCAAGAGGTTGGTGATGCAGAGCCTGGGAAGCAGTCGTCCAGGATGTTCCCAGGAGAAAGAAAGAAGTAGCTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_796512_796985_2:0:0_0:0:0_5a96e/1
+TTTTTGTGGCCCTCCCAAAGCCAGTCTGGAGTCTTCCTCTTTGCTATTTTTAAAAATATTGCATCTGAAGAGAACAACATGAAAAACAAATTAAGATGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_934398_934936_2:0:0_0:0:0_5899e/2
+GTGAACCTCTAGTGGTGGTTCCCATTGCACTCTTTTCACCCAGCCCCCAGCCCATGCCCCTGAGCATGGTAGAAATAGCAGTGGAAGAACAACTTGTCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_783511_783958_1:0:0_0:0:0_30c19/2
+CATTTTTTTTCCTAAAATTTAATTCCTGAGGCCGCGGGCATGGTCCATGGTGCTGACTGTTCTACCTCAATGTTACAGAACACTGGCAGGCAAAAAGTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1188425_1188887_1:0:0_0:0:0_1aff/1
+ATTTTTGTACTACTTGGAAAGAAATATTGAGTGTGACACACACTCTGGTTTTCTTGGAATTTCCTATTTTATATACAACTACGTTCAATTATAAATGATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_727874_728417_1:0:0_0:0:0_46210/2
+CATAATGCATCCACTCACAGCCATGTACATACCAGAGTCTAAGGTGCCAGTGTGTGTGTGTGTTCAGTAGCTGGGATGGTCTACTAAAATCAAACATGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1929836_1930263_1:0:0_1:0:0_2130a/2
+CATTCATTTCAGAAATAAAAAGGAGAACGTGGTTCCAGGTATATACACATGCTTTTGCATTTTCATTCAATCAATCACAGGCAGGAAATGAATGTCTGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1687468_1687968_0:0:0_1:0:0_338ad/1
+GAGGTCAGGGACAAGACTTGTTTGCTCTGCCACCGTGTTCTGGCAGCCACTGTGTCAGGCAATGTAAAGAGGAAGTCACCTGAGTAGATTTCTCTCTATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_887757_888278_1:0:0_1:0:0_28fec/2
+AATAATTTATAGCACCTGGTTCTCCACATAGGTGCATGGGTAAATAGAGCAATCATTAATGACTGCTTAGGGTCAGGCAAAAAAAAAAACTCCCTTTCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_599695_600137_1:0:0_0:0:0_1c4e6/2
+TGAGGAGAATGAGGAAGCACAAATAATTTTATTTTTATTGTTTTATTCCCATCCCATGGCGACCGCTCCTCACTCAGTTTGAAAAAAGGAAACTCTGTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_549749_550222_1:0:0_1:0:0_257b7/1
+CAGAAAGTTTTCATAGCTGGGACTTTTTTTTTATGTTCATTAACAATTAATAATTATGTAGGATTCCAGCCTGAGTCTAATGATTTTATTGGTAACTGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_805338_805773_1:0:0_1:0:0_439ec/2
+TCTCGGCAAGGAAGAATGTCCTGGGTTAGGTTCTGGATTAAGCAGATTTTGCCATGAATAGAGTTTAGGAGGATTACTCCTCTTCTAATAATTAAAAAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1500548_1501015_2:0:0_2:0:0_1f545/2
+TGCTGTAGAAAAAGTAATTTATAGTCGTGGCATGCAGTGGAGCAGGCTACATTATCAAATACATTAAAAAAAAATATCCAGGTTTGAAAACCCAGAAGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_270908_271354_0:0:0_2:0:0_2f95/2
+TATACTTCAGGTTGCAACAATTCCCAATAAATGATATGATATTATGTTTGGACTTCACCATGGGTGCACCACCCACTCATATAAACTGCTGAATTAGATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_116133_116605_1:0:0_1:0:0_51122/2
+TGGGTCTTTATGAGCAGGCCAGGAACCTGGCCTAGGAGTGATTCAATCATCAGGAACCTCAAAACCTATGTGGGAGGGCTTTCCTCTTTCCTATGTTGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1792936_1793315_0:0:0_1:0:0_f55e/1
+AAGATGGGATTTGCAATGGCGTCCTTTCCTTGCTGTCTAACTGTGTGTAGAAAATTTAACTCTCAACCTCCATCGCAGCCTGGTCATCAAGATTGAAGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2123504_2123978_0:0:0_1:0:0_3f41b/1
+TTCTCCCCTTCCGTGAAATACAAAATTGTTCTGTTAGAATGATTTAGCAAACAATGAATAAAAAAAAAAAGAAACAATATCCACGCTGAAATAAGTGGCG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_241817_242282_2:0:0_0:0:0_b605/1
+TAACCCACATATACTGCAGCTGCTGCTCAAGTTCATTGTGTATGTGTGAGCCCTGGAGAAGGTGGAGTGCACAGGTGAACGCCGCTATTTGGAGTGGAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_583526_583992_1:0:0_2:0:0_1b679/2
+GAGACCCGATCCAGACCACAAACTGGAGTGCATTCAGTACCCATCACAATCAAAGAATAACTATCTTGAGGACAGAGCAAAGCCATGAGTAAAAACCAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2080821_2081281_1:0:0_1:0:0_365c8/2
+GATGTATGCAATCCTCCTCCCCAGCCTTCCCTGCGGCCGTATTTTTTTTATTGGAAAACTTCTGATATTCAATCATCTGCAGCTAATTTCAACATGCTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_172494_173024_1:0:0_1:0:0_65ad/1
+TTATGGAAGAAGTTAGACACCGCGCCATTGTTATTATTTCCATGTTAGGGATGTGGAGCCTGGCTTTTTAGGTCATGTAGCGTCGGCATAGGATTCTGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1168567_1168984_0:0:0_1:0:0_fa65/1
+TGTTTGCAAGAAATGCACCCACTACAAAGCCAAATGGTCATACCCCACAGTAATGGCTTATGGCAACATATTCCATACAACAAATTCTAAATGTCAGGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1451033_1451515_1:0:0_1:0:0_fcca/2
+TCGATCTCAAGGACTACTATATAAATATACTTAACTACCATACGATTTAACTCAGACATAATTTTCTTTAGTTGAAAAGTTCGCTTTTCTTACCTGTAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_810003_810498_0:0:0_1:0:0_54909/1
+CTCTGTCCTTACTGCTGGGCATTTCTAACCTTCCTGCCCGCCGGAAGAGAAAACCCTGTCACCTATGGCCATTTTCCACCAAGTAGGACTGGTCCTACCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1228751_1229201_1:0:0_1:0:0_e3e8/1
+TGCTGCGTAAGGTTGCAGCTGGTGGGTTTCATCTTTCCAATAACCTTATATTTTGACCAATATCTACCTGGGGCAGCCTGGCCTTTGTTTCTTTATTATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_396087_396434_1:0:0_0:0:0_d623/1
+AGTGGTGGTTTTCAGAATGTGAAAGTGTATACCATCGGATTGCCTTGGCATGCATAATTATACAAAACTAGCAAAGAAACAGATGAAAAAAGAGGAGCTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_655426_655936_1:0:0_0:0:0_a0f4/1
+CCAAGATACTCATATTAGGCTGGACACCAAACAACTGCAGAGGCCCCATTTTCAGTTGTGGATGGGGGGGACTATCTCTCAAAGTAGGTCCCATTGAGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_345960_346290_1:0:0_0:0:0_18206/2
+GAGCATCTCCCCAGCTCCAGACCCGAAGGGCTCATAGAGAGGCCCCCTGTGGTTGCTGTCTTCATAGTCAATTCTTAAACCCAGGTAACAGTCACACAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_584026_584507_0:0:0_2:0:0_19cf2/1
+TCACTCCTTTTGTGACCATATCAAACTGTCTCAATGTCAAATGCTGACCTGACCTCTTACTGGGAATATCATGACGTCAAAGATGAGTGGGAGGCAAATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_633672_634132_0:0:0_1:0:0_12adc/2
+CTCCCTCCTCCAAACTGAGGTGTGTGTGTTTTGCCAGCTGGGTAGGTATTTCTGCCCTTCCATTTGAATATCTCTGATGGTTATCTCACACATCAATTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_834750_835319_1:0:0_1:0:0_3e8b2/1
+CACTTGAGGTATCTGTTACTTCAGAGTTGCAGTGATGTGCCCCACTGTGCCTTTATATAAAGAGAGTGGGTCTTTGTCATTGTTGATTATAAAAGAATCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_456469_456903_0:0:0_1:0:0_326f3/1
+TGGGGTAATTTTGTCCCAGCTACTCAAGTGCTGTGCACTTTGCAGGAGATAAAGGCAGGGGGTATATTAAAGTCTTTCTGGGTGGGCTTTGACTTTGTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1244935_1245409_1:0:0_1:0:0_525be/2
+TTTATTGATTCTTTAGAGATGCATGTATTTTTTTCTGCTGACTTTGGTGTGAATTAAAGACTTGGTGGTTAAAAGTAGGACTTCAGAACACCAAGGAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_21923_22338_1:0:0_1:0:0_3a450/1
+GGAGTGCAGAGTGGTCAATTACTGGTACACACACAGGGCTGGTGGCCTTAGCCGTTATCAGGAGTCGCATGGACGTTTAATTTTGGCTATGCATTCTATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1609456_1609892_1:0:0_1:0:0_27b4f/2
+TTTCTTGATCTCCCAGCAAGCTACAGAAGTAGAGATCCTAGAGACAGGGATACTACTGTTTTGGAGAACTCCTATTTTTATCTAAAAGCACATATATGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_328471_328934_1:0:0_0:0:0_5a335/2
+CAATAATACTTTTTCCATTCATACAAATGATGAAGTTACAAACAGGTGTGGACGAATAATAACTACTTGGATGCTTTTTCTGAGACACTGGACAAGCACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_274980_275463_0:0:0_1:0:0_4ff75/1
+ACATGCCTGTAATAAATTAATTTTTAACCAACATGATCCTATATTGTTGGACCTCCAGTCCCCAAGGGAATCCCCTAATGCAAGATAGCAAAGTTGTAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1454057_1454495_2:0:0_0:0:0_59cb0/2
+AGATAAAAACACTGGACGTGGTCAATATTCTGCTAATTTAGAAGCTTTGTGACCTGTCATTGTGGCCGCGGCATCCCCACCATTCCTGACCTCTGCAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_309309_309730_2:0:0_0:0:0_43a5d/2
+CTGCCCTTACTATATAAAGGGAAATACTTACAAAATTATTTAAATGCTACAATAAAGTGCTGACACTTAAGCGTGCAGTGCAGAGGGCTGCTAAAAAACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_802151_802569_0:0:0_2:0:0_1ca9d/2
+TGGTTTCTCTCTCTCTGAGAGCATCCATGACTTAATTTTACTGGCACTGCAGTAGAGAATGTGAAAGCTATAGTCCCCCTGTACATACAAAAATTTTTAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_503240_503670_1:0:0_0:0:0_42e53/2
+TAACATGGGAAAGGACTGAGACCTGATGCCATTATCTGCCTTGGCCTGAGGCAGCCTCCCAAAAGTAAGTCTGTGATGCTGAGGCCAACACTTATTGATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2168539_2168949_0:0:0_2:0:0_43028/1
+TTATCCTAATTCCTGGAACTACTGCCGCTTCTCTAATTCTGTCTCAGCCCACAATCGTCTTCCTCATTTCAACATAAATATATCGTGTGAAATCCAATTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1232395_1232830_1:0:0_0:0:0_1bf/2
+ATAGTGGTGAAGAGAGGAAGGAAACATTAACATCTTTCTCCCCCAGCAAATACATATATCTCCTGCCTTTATAATTTTTTCAAAGGTTTAAGCTAGAATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1259452_1259977_2:0:0_0:0:0_466ac/1
+CACTGCTCTTTAAAATATATGACTGTCCCTAGGCCCGATATGAATAGTTATGAATAGAAGTCTCATTTTTAGATGCAGAAAGCTGATCTTACATGTGTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_731035_731483_0:0:0_1:0:0_35856/2
+CTTATTCATCAATCCAGGGCAAGCTAGACCAGGTTGGGGCTCTCTCAGGACTGTAAGATGAATAGTGTTCCAAGGTGTGACTGACAGAAACCACCATGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2116234_2116702_1:0:0_0:0:0_2d342/2
+CACTTTTTGTTGCAGAGGTTAAGTCAGAGAGACGGCCAAGAGCAATGTTCCAGGGTATTTATTTAAATTTGGTGAGCCATGAAAAACATGGGGGGATACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1272473_1272861_3:0:0_1:0:0_59723/2
+CTGGCCCTGGGGCCCCTGACACCTGTGGTAATCCTCAACATATGATTTCTAGATGGAGATCTATCTGTTTTTGTGGGTTAATTTTATCTGCCATAATTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_785501_785978_1:0:0_0:0:0_382cc/2
+ACATTTAACTAATTTGCAGTAGAGTTGCGGGTGGAAGTCTCTATAAGGCAAGAAGGGCAGATACTAAACAAATTCTCCAGCACTGGAGTGGGAATGGGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2159968_2160436_0:0:0_1:0:0_d0b9/1
+CATACAGAAGAAGGCCGCCGCCCAGCTTTTTATCCATTTGTTGCAGCATCTTCTCCTAAATCTCAAACTTTGGCTAGGAAAACCTAAAGAAAGTCCAAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_646606_647000_0:0:0_1:0:0_3d99a/1
+ATTCTTCTGTATTCCCTTCTGCCTGTTACATCCTCAGCTGACAAAGGTATGCTGAGACCTGAGAGACACTTTTCATTTTCTTCGAAGCGGCCGTGGCCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1127368_1127813_1:0:0_1:0:0_3f8db/2
+GCGTAGAAGTGTACCCATGCGCTAGATGTGTAATTAGACTTTTTTGTTTTGTACCACTCATTCTAGGGTGACCACCTTCACACCCAGCCTGGTTTAAATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1773540_1774035_2:0:0_1:0:0_10040/2
+ACAACAGGCACAGGCAGGGAAGATGATGAACCATAAAGGGCACCATGACTATTTTTGACATATTTTTAGGAGCCGAGGCAATGTATATATCTGTACAGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1033689_1034071_0:0:0_1:0:0_2ea13/1
+ACCAGCTCAGGAAGTGGCGTGCGTGTCCTGGGGCTTAGAATCAACATTTTTTCCTCCCTGGAAATGTAATCTTGGTCTCGAAGGATCATTCCCATGTGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1942649_1943086_0:0:0_2:0:0_2dfe4/2
+GTCTAGACAGTAAATGAAGGATTGCATATGAAAACAACTAGAGCAAATCAAGTAAGCAGTAGGCAGGAAGGGCTTGGGTTGTATATATTAAGAGTATTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_388127_388631_0:0:0_1:0:0_46c68/2
+TCTTTGTTTTGCTCAAACGCCCTCGCACCCATAGACCAGCAAACAACCAAAGAAAGGGGGTGCTGTGAAAAAAGAGTTTGAATTGGACTTGACTTTGCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2400031_2400487_1:0:0_0:0:0_43964/1
+ATATCTTTACAAGAAGTCATTTCATCTTATCGGGTCTCCATCCCCACTCATTTTGGACATTAGCCTTAGGAGCATTTGTGAATGAAGTCTATAAAAAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_33561_34030_1:0:0_1:0:0_12d9b/2
+AACTCAAAGTGAAGTGGCATTGGCCAGTTTCCATATCAGTGATCTCTTTCCCCCACACTGAGTCTTGTCTACCAAAATTTGAGTCTCTCTCCATTTCATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1895084_1895560_1:0:0_0:0:0_4a60b/1
+AAGTATACTTGGTTTCACAGTGGGATTAAAGACACACCTCTCGGGAGTCTCAAGGTTTTGGTTTGTTTTTTTTTTTTCGCGTGTCTTATAACATTTCTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1246421_1246847_1:0:0_1:0:0_49660/1
+CTGTTTGCATTTTGCAATGGTTCCTGAGGTCATGAGCCTTTATATAAAGCCAGAGACGGGGTTTCTTCATTATTATGGCCCTGCAAGGAAGAGGGCATGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2373672_2374210_0:0:0_1:0:0_39f1/2
+CAGAGCTTAATCAGGGGAAGGAAATACAAAATTGAGTAATTTGGGAACTGGACCGATGCCTTCCCACCTGGAGGCCAAGGCATTATGGAATCTCTTCCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2078991_2079383_1:0:0_1:0:0_57546/1
+TTATTAGAAACCATTTCATAAGCAGGGAGACGGGGGGGTCAATTCTCAGCTCATCTCACTGCATAGTTATATCTACCATATGGTATTTCAATTTGGACAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_652011_652454_1:0:0_0:0:0_4bea/2
+TTTGGTTTTGGACATTTACTGCAAACACTGAGACAGTGGAGCTGAGACAGCGTGGCACACGCTCCCTCACAACATAAACATTCCCCTGCTTGTGAAGAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2316072_2316470_1:0:0_0:0:0_f3fe/1
+CCGCCTCGGCTCAGAGGAATATTATCCCATCCCACTATGCTATCACAATCATTATTGACATTGATTTGTGTGTGTGCTTGTCTCCTCTCGATTCTCCAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1542701_1543129_1:0:0_0:0:0_2d526/1
+GCCTGCACTCTGTCACGTCTGCTTTTTCTATAAACTCCTATGAAACCTGCCATGTTTTCATTTCACCCAGGTGAGCCACATCTCTTACATTAGAAAGTGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_815662_816060_1:0:0_2:0:0_2bb33/1
+AGGCATACACACCCCATACTTACCACTGGTCCAAATAGATTCCATGGCAATGAAAACCTAATAGTACAAAGTATGAGAACTGTGGTGCTGGCAGTGAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1035050_1035474_0:0:0_4:0:0_4b0be/2
+TTAATCGATATTAAGACACTATCTTTCTTTGCTTTTCTGCGGACCCCAAAGATGATTGATGAAAAGTTTTTACTAGAGACAAGTATGCAGCCTGCTTCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_545427_545880_0:0:0_2:0:0_48528/1
+TATTTAAGGGTATTCCCCCGTCGGGAGAAAGGACCCTGACATAGTGCTGTGTTAACTGGCTCAGGAGTTAGTTCTGCCTTTAATGATCAATGCTTGAACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_275764_276219_2:0:0_1:0:0_40d36/2
+AGGTTGGGAATCATCTCCATTGGTAAAAATTAAAGTGGGGACAGAGGTCTAGTGTCTCCCAGCTGGAGTGCATACCATCTAGGAGCATAGAGCCCAAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_486577_486958_1:0:0_1:0:0_51069/1
+GGTTGTGACATTTAAAGGGAGGCTTTCTCCAAACAGAACTCATCCTGGCTCACTGTGAATAAAGCTATGGCAGGAGGCCAGTCCTTATGAAGAAAAGGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1566119_1566629_1:0:0_0:0:0_263b6/1
+ATTGCGTAACTGGTACCGTCTCTACTGCACTCAAACTCTTATTCTAGTCGGAGTCAAATTATTTTGATTGATTCCAGTTGGATGAGGGAGGAAGGCAACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2124964_2125334_2:0:0_1:0:0_13e38/2
+CTTTAACCATGGGATATATAGGACTCTAAATCCATCTCTTTTAAAAACATCTTAAAACCTTGTCTGGGTTGGGGGGCGAGGAACTAATCTTCCCGTATCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2388167_2388675_2:0:0_2:0:0_59432/1
+GAGATATTTTTTGACACTGCAGGTGTTTCCCTCTTCAGAGTGTTAAATTTCACCTCTGACCTACTCGGAACAGCCAGTGCATTTTTGTATGTCTTTGGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_882396_882921_1:0:0_1:0:0_1ed8/2
+GATATTCACAAGGAAGAATTATAAAATGGTGGTGCTTCCGCCTGCCCCAACACCACCAACTCCTTCACAAGGCTATTGTGGCTCACACTCCAGCAGCGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1743605_1744093_1:0:0_0:0:0_4552b/2
+TATACATTACAAACCTCCTGCGTTGAGAATGGAAACAGAGTTGGTGCTAACAGAATAAGCAGTTCTTTCCTTGCACCTGCTAAGTAAACAAGGAGGTATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1651508_1652003_0:0:0_1:0:0_387b3/2
+TGAAATGATGGCTATAAACAATAATCTCCAAAACTGGGTGACGTTGTATCCTGACCATTCAAATGAATTGGAAACACTTGACTATTACTTATCATATTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_637804_638263_0:0:0_1:0:0_1d568/2
+CGAGTTATGGGACAGAAAACTTGTGGCCAGTATAATAATATTGGGAGGGTGACAACACAAACTTCAACTGAGTAGCTCTCTTGGGTTCACATGCATCCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2102258_2102716_0:0:0_2:0:0_f7a7/2
+ATATGGAAGCCTGTAGTAACTAAATGGACATGTAAAGTATTTGACAGCAGCAGGTCAGAGTCAAACTTGCTTGTTTTTAAAATACAATTTTCTTGTTTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1012167_1012588_0:0:0_1:0:0_57b8d/2
+TCAAACACATTCAAAATTGCTGTAAGGTTCATTATTATGTTACAGGGCCCTCCCTTTCTCACAGTGCTACTTGGGGGTTTTTTCAGAGACACTCATGGCG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2388852_2389281_2:0:0_1:0:0_2db92/1
+ATAGCAGAAGGAGCAGAAGAAAAGATTTCTCTACAGAATAGGAAACATGAGGTTAAGTCCTCCTCACTGCATGGTTTCAAAACTGAGGCTCTAATATTAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_472120_472511_1:0:0_1:0:0_4ca58/2
+CACTGTGTAGAGCCTGGGCACAGTCATTAAAATCTGCAGTCTGGGGGCATCATTCATCTAACTAAAATCCAAATCTTAAGAAACATCTGACTTTAAAAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_128115_128519_1:0:0_0:0:0_4338f/1
+TGATTCTTTGTCTTCCCTTTTTTTGTCTTGACATTCTCTGACCAGCTTTCACTGCAAAGCCTCGGTGCAGGCATCCTCAAGGCCTTTTTGCCTTTAATAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_786022_786485_2:0:0_1:0:0_3b129/1
+TTCTCTGCCATTCATTTCTCTGCCACTAAAGATAATTTGGATGTTAGAATCACATCTTCCCCTCTGTACTTATAAATGCATTCTAGGAGGAAATAAACCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_154162_154573_1:0:0_0:0:0_50811/2
+GTGTGCATGCTGGTGAGCGCAATATTCTGTCTTTTTTAGAACAATTCTTGTGCTAGACCATGCCAACATGATCTATTATGGAATGTATTTGTGGAATAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_392960_393516_1:0:0_1:0:0_5053f/1
+CTGGGCAAAGTCCTGCCTCACTGGGCCTCATGTTGTAGAGACAGCTAGTATTATAAGGTAAAGCTTGGCCAGACCCAAGATTATCTTAGAAGGAAATTAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_725662_726079_0:0:0_1:0:0_3dccd/2
+TTTTCAAGCCCTTTCTGGCCCTGCTTATTTACCTAACAAATCACCCAGGAAGACTCTTATTTGCAGATGTAGAGACGGAATAACAAAAAATCACTTTGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1134864_1135288_1:0:0_0:0:0_24e3f/2
+CCTAATAACAGAAACAAAAACCTACCTAGTAATGAAGCTTCTTTTCTGGAAAGACAGTGCTCGTGTGTAAGTAGAGCACAATTTCTCACTGCAGTGGAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_821099_821635_2:0:0_0:0:0_4ccf6/2
+CTCACATCCACCTCGTGATCAGGCCAGGCATCAACTAATGGTGGCAACAGGAAATTGGATCACTCACTGATGATGACTTCAACCATTCGAGGCCTTCATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1339732_1340209_1:0:0_1:0:0_10255/2
+TCTTGCCTTTGGTTAAACCTAGTTTAAGGTCGTAAGTGCAGGTGCAGTCCCCAGGGGCTGAGGTCACAGTGCTGCTGTATCTGTGTGAGCCCCCCCTCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_199671_200143_0:0:0_1:0:0_77b4/2
+CCTTATAATGGAAATAGCATTTCTATATACATTTTTTTTGAAGGATTGTGATTCCCCAAAGTCAGGCATTGCCCATCTTCAAAAGTACTATGTCGCCCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1825280_1825724_1:0:0_0:0:0_9d70/1
+GCTACGTCCATGCAAAGCCAATGTGTGTTTTGAGATAAACAAAAAAAAAAATATAATCTTGGAAAGCAAATCTTAAATAAGAGGACTACAAAAAACACCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2159702_2160193_1:0:0_0:0:0_1047e/1
+TGCTCTGTCAAGGTTTTGAGAATCTGCCCAGGCTGAGGAAATATAACAGACTTTGAAACTCGATCTTAAAACCCATCTGGTGGAGACACCCGCTCCCTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1432166_1432709_3:0:0_1:0:0_193b6/1
+CATGTGTTCTGCTACCTCGGGCCAGAGCTAAACGTTTTCTCAACACAAGCTAACTGCACTTCTTTCCCCATTTTGAAACTACAAAACAACAGCTTAAGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_245580_245896_0:0:0_1:0:0_4452f/2
+AAGTATAAGACGGACTGGGAGTAACTCTTATGCCCTGTCCTGGAAGGCCTCCTGCACTGGTGCTTTAGCTATTCTTCACCCCATGAGGGTGAGAAAAATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_579165_579649_1:0:0_1:0:0_1266a/1
+ATTTTAATATTATTTATCCATTGAAGGAAAAAAAAAAAGCTAAAGATACATAAATAATATGGACTGTAATCTTGGGCAAAAGATTCAATCAATACCTCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_26646_27051_1:0:0_0:0:0_11cd0/1
+GTCACCCATGATCCACGGTTGGGCTCTGTACTTTTGAAGCCATCTTTAAAAAGAGGATTTTAATACTCTCTCTTTTGAGATGTCTAGGTTTCACTTTAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_742056_742516_1:0:0_0:0:0_33500/1
+CATCCTGTCGGTTTCAACTTGCCAAGGTTCTAGTTTTTTTTATACAGAAGAAAGAAACACTTACAAGTCTTACTTTAAGCTGAGGTTAGGAATCTTAATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_391383_391813_0:0:0_1:0:0_2f6bf/1
+CATAAGCACCATCATGCCTTCACTTCCATATAATTGACTAAAAAGGTGGGATTAAGATGGGGATTATAGACCTGCTACATGCATATACTTACCAAGAAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1096180_1096590_1:0:0_1:0:0_3c356/2
+GCCAAAAGAGAGGTACTCAGAGACAGAGAAAGAGTTCGAGGCTGGGAGGATGGAACAGGAGAATTCCGTTTCGGCTCACTTCTCTGAGTTAAAGTTTTAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1074972_1075420_3:0:0_0:0:0_1fed3/1
+AAAGAGAACCTGGACTGCGTTAAATTTATAAACAAAAAACACCTCACCAACGTCTCTACTACCAGAAATCACCATGTTACTGCTTCTGGACAACTCTGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1845571_1846058_1:0:0_1:0:0_42ae3/1
+TTTTTTGCAATGAGTGCATCTTAAAGGACAACTCTTGCTCATCGGCTAATGTGTGTGCCACCATGAATAAAAACAAAGACTTCTCTTCACATTCCTTCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1616894_1617277_0:0:0_1:0:0_4da7a/1
+ACCACATCTACTTTTCTTGTTACACCCATTGAAATAACTATATTTTTTCTTCGTGGACGGCAGGCACATCTCAAGCGCTTCATAATGCTATAGTAATGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1103329_1103800_1:0:0_1:0:0_1f640/2
+TGCATCCACAGTTATTGAATTGAACATTGCAGGCAAGTTTGTTTAAAGTGGCACGATGCATTCCTGGGCGAAACCTCGAATGAAAATCAAAATCGGATGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_156313_156688_0:0:0_1:0:0_59155/2
+AGCATTTTGTGAAGCTGAGTCTATGACAATGAGCCTACCCTATGTGTCCATTTTGTACATGTAGTTAACCAAAAACTATTTTTGTAGTACAGCCACTGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1275129_1275482_1:0:0_1:0:0_4cde9/2
+CAATGGAAAGGTTTTTTAAAAGAAATGGAACGCTTTTAGTAACAAGACCTGGTAATCCCAAAACCTTTTCATATTCTTGTGTGTGTGCAATTTCAGGAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_164871_165320_1:0:0_0:0:0_3e785/2
+CATAACTGTATTTTTCCTGTGTCAGGAGGAAATGGATAGAGACCATCCCAGGCTCATTCTGAAGGAAATGCTGCCTTATAGGGATAGCTCACTGATAGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1810820_1811251_0:0:0_1:0:0_1958c/2
+GATCTTCCTCCCCAGCGCTTGAACCACTGTAGTCCCCGTGGGGTTTTAAAATAGCCATCCTCTTCCTGTGGAACACCTATGAAAAGAATAGTTTTTTGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2463948_2464317_0:0:0_1:0:0_10a16/1
+AAGCTCACTTTCTCTTTCTCTTCAAACCTCTATCCAGTTTCACAGAGTGGAATAATATCTATCATATCTTCTTTTGATGGGTGGACAAACTCCTGCTGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1165604_1166011_1:0:0_1:0:0_32fee/2
+TTCAAGACTCTTTCCTCGGCTAACCTTCACCTGTTCACACAGGGCTTCATGCATGTCTTAGTCAGAAATAAATTAACATGTCCTTACTGGGGATGGCGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_182437_182891_0:0:0_1:0:0_49d6e/2
+ATCATCTAGTGTTTTGTAGAGACAAGGTCACACGGTGAAATATTTTTACTTTTCCTGAGGTGAAAAAACAGTCCCATTTCTCACTGCACTCCCTACCTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1965146_1965621_1:0:0_1:0:0_c1de/1
+GATGGTTAATGTAAACCTAATATGCAGAGGTGGTGGGTCTGGCCTCTCTTTTACTTACAATAATCTTATCACTTATCCTTCCTAAGCATTAGAGAATTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2136774_2137252_1:0:0_2:0:0_23a9c/2
+TTTTTCAATAATTCAAATTAAACTTGTTTAATTCTACAGTATAGCTTTAAAACAAAAGTGGACTCCAAAAAGACTTATTCGAAAGCCAGGCCTCAAGAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_541276_541761_0:0:0_1:0:0_24fea/1
+CACACAAACATTTGAAGAAGCTGCTAATAATTAGAGTCTACTGTAATCAATTAGCTGGAGTTCAGATACTTTTGGAATGTAACAGAGCAAAAACAAATAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1431742_1432224_1:0:0_0:0:0_a166/1
+CTAGACATGATGTTTTCCAGCCAAATAAAAATAGTTTCTAATGGGCTCACTGGCATGTTGTTTTCTTCAGAATATCTATCATTTGAAAGGTGGGCACTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2206556_2206980_0:0:0_3:0:0_30ca3/1
+TTAACTGCTCTGCAAGCCAAGTCATATTCTCACCACCTCCACCCCTTTCTTTTTTCGTATATATGGAGATCATTTTTAAAGAGGTCAGTGACTACAAGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_594534_594954_0:0:0_1:0:0_1097d/2
+GACATTCCAATATCATTTAAACTTTAGGAGTTCGACTGTTCCCACGGGATTACCAAGTGTATGTGGCGCCTGTAGATTATCTAAACTTTTTCCAATTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1129414_1129907_1:0:0_0:0:0_5a23c/2
+AGCCTCATGCCCTTTGACTTGGGCAACAACATGCTAACAAGGGCTGGAGCCAAGAGATTCCCTATTCCCTCCTTAGAGATGAATTTCGCCGGGCACCAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1383645_1384158_1:0:0_1:0:0_3df47/2
+CTGGAGGCTGGGCTATTATAACAACAAATAAAACCTACACTCCATTTCCCATAGTAACTCTGTCGCTGGCAAAAATTAGTAGAGACCTTCCTTTACAATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1296920_1297291_2:0:0_1:0:0_1752b/2
+CACCGAGCGTGAAAGTGGTATAGTAAATTGTTCCTTGCTTTGTGATCTCGGGGGCTTCCCACCCTTGCCCCAACTCTGTTTCTGGGTGAAGGAGATTTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2161442_2161802_1:0:0_1:0:0_33bf7/1
+ACTCTGTCTCACCAAAGTTGTCTACTGTCTCAAATATCAGTGAGCAAAGGCCCTAGCACATCTCCTGGGATTACAGGCCTGTCATTAGAGTAATCCAGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2011035_2011482_1:0:0_0:0:0_23b4d/2
+ATAACAAAGTGAGCGTCCCCCACCCACATTCTTATGAATCATGATGGAGTCTCAAAGAGGTCGCAGATCTAGAGATATCTAGATTTCTCAAAAGGAAAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_185178_185664_0:0:0_1:0:0_e226/1
+TTTGGCCTCACCGGAAGTCGCCTTCATAATCTTACCAGTGCCACCCTGGTACATAAAGTTTAATTTACTGTTAATAGGAAGGATAGATAGTCTCCAATAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_30239_30726_2:0:0_0:0:0_514f2/1
+AGGTCTTCATTGAGTATGTGGGCTACTAACTTTGGGTTGAATCCTTGACCCATGAAGCTATTTACTACAACCCAAACAAGATATGGCCAAGCAGCAGAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1103361_1103747_2:0:0_0:0:0_36943/1
+TAGCTATTGTGGATAAATTAGCATGTGAGCCCCCCGCATCAATGCACCTCAGTCCACCACTTTCTTCCTTGGCTGCACACACAGGAAAATGGTTTTTAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1542610_1543103_2:0:0_0:0:0_1bc5b/1
+TTCGTAAATTTCACAGATGTAAATACATTAGACAGGGGAAGGAGCCCGCCTCCCGCCCACATGCTACCCCGTCCTAGACTCTGCAGTCGAGGCCTGCCCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1873924_1874394_1:0:0_0:0:0_284bd/1
+GTGGTGGACTATAAATGAAGTTTACCCCCGGACCGTCAGGGTCTGAGACATACAAAAAATTTTTTTCTCCATGACAGGTTCATTTCATATACTGTCCCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2244862_2245213_0:0:0_1:0:0_25838/1
+TAAAACATTCTACCATTTTACAAAATGAATCCGGGAACATTGTTGATCCATGTGCCATTGCTTTTCCAAATGATTCACAGTGAGACCGGCCACACCATCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_557513_557961_0:0:0_2:0:0_2f426/1
+TATAATAATACTTTATGCTGGGCAGAGTTTGCAAACAGTTTGTCTTAACGACTTGCTTGCTGAGTTATTCCTTTCTGATCTGCTGCAACCTCAGATGAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1770030_1770427_2:0:0_1:0:0_52b5d/2
+AGGTGTGACAGCTTACAGGCGCAGCCTCATAAAAATCATCAATGTTTGAATCAAATAGAGGGGAAATTTCACATTTAATTGAGGAAGGACAGAAGATTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_711792_712219_1:0:0_1:0:0_f15/1
+AAAAGTCTGGAATGATTGGCTGAGGAAAAGTACTTTTTTTTTATTTTTCCCTAGACACACACTTATGTTTTGTGTCATCCATGTGTCTCTTGGTGAGGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2468066_2468514_1:0:0_0:0:0_6957/2
+AGTCAATCTTGGCCTGGGTATGTATTACCTGGTCACAAGTACTGACGCAGACAGAGAAATTTCAGCCACTCAGTGATTAATAAAAAATAATAATATTTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1104897_1105365_1:0:0_1:0:0_20eaa/2
+TGCCTGAAGAACACAGTCTCCTGGCAACAGAAACTCACACACACACTAACTCTACACACCAACTGATCACTTAAGTAACAGATATTTGTCTTTCTGTGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_389079_389549_0:0:0_1:0:0_11518/2
+GCAGTTTCCCCCGAATGGGCTTTGGGTTCAGCCCTTCAAAAAAGGAACAGAGTTCCAAGACTGTATAGATGGCTTCGGCCTGCAGGCTTGCTAAAAATTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2125489_2125980_1:0:0_1:0:0_562d1/1
+AAATACCATGATTTTAATGTGTCGCGCCCACTCAACGTCTGAGATCCTCAAGCAATTGCTAAATCATTAATTAAAGACCTTTTATACCTAACTTTACTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1654763_1655150_1:0:0_1:0:0_bab/2
+AACTATTTATATCCATGAAGACAAGACTCTGAATGCACCCACCCTTGACTATACAGGTTGAGATAAGTCTCCCATTTTATCTGTAATTTTTGATAAAATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1754431_1754806_0:0:0_1:0:0_5b28f/2
+GAATTGATTGTGTTATCTACTAGGAATGGGAGGCTGGAAAGCAAGAAAGAAAAGTTAAATTTTTTTATTTTCTTTTTCCGAAAACAAACAGGTGTAAGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1417799_1418312_1:0:0_0:0:0_492a4/1
+TTTTATTAAATATTTTTATCTTCCTGACTGAGGTTGCAAGCTGGAAACTTGGGAACCACCATTCATAAAATGGTGAGAGTAGCTGGGACTAAGCCGGGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_357321_357744_1:0:0_0:0:0_3daf3/1
+CTGAGGCTTTCTTTTCCATAAAAAGATTTACAGTATAAAAGTTATCAGTCACCCCCGCCACCCACCAACCAGAGTCTGGAACTCAATATCTACAATCTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1084256_1084710_1:0:0_1:0:0_1b693/2
+TAAAGAATTGTATAATATTTCTCTACTTTCAAATCTGCTCTACTATATTTAATTTAAACGCATTCAACTAAGAATATCCACTGCAACTGTGTCTGTTTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1996110_1996573_1:0:0_1:0:0_492b4/1
+CTAGACATTTCAACTTCCAAATATGAAAGAAAAGAAAAACAAACCAATTAGGCTGTGATATTGTTTTGGTTACAGGATAGGACTGCAAGGGGGTAAGCCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1270507_1270946_1:0:0_1:0:0_2a854/1
+TGTTTTTGGGAATCGAAATAAGCTCCTCCCTAGGAAAGTCTGAATAATTGTGCTAAACTTTCTGTGACAGAACAGCGCTTTATAATGAAAGCAAACGTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1635452_1635889_1:0:0_0:0:0_2c28e/2
+TTTCCAGTCACCCATTTATTAACTTGAAATGGGTCAAATGCCTACCCATTAGCCATATAATGCCTGTAAGGCTTACAGGCGAGTGGGCAATGGCTGAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_223705_224049_1:0:0_2:0:0_42e7b/2
+TTTTTTGAGACACCTGCACAGTGTAGTGGTGGATGTCTCATAAGTATTGAAATGCGATTGATACCCATCGCAGGCAGAATCTGACCGCTGTGTTTTTTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1466323_1466835_0:0:0_1:0:0_2a89f/1
+TATATCTGGGCACAAGGTCCAGGCTCTTCATGTCATATAATAGGTTGAGAAATGACACAAAGGAGTGGTAGGGTTCAAAAAAGAGCCCTGCAGAGAAAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1247851_1248388_0:0:0_1:0:0_28ad3/1
+ACTCCTAGCATTGAACTCCAGCTGCATGTGTATCCAGTTGAAAGGATGCAGACATCTGGAAAAAAGTGCTCTGTGATATTCATTTCCACCCACTCCTGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_789177_789669_0:0:0_1:0:0_33c68/1
+TGTGTGCAAGTGTTGATAAGCAGACGTGTATAATATATTACAACTGTTTCATATCTTCCTCAGCCACAGCCAAACTGAAATATAGTAATGATGATTTATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1924532_1924966_1:0:0_2:0:0_399c3/1
+AATGTTGAGGATATACCATGTACAAACTGCTTTGAGATAGAAACATATTGAGGTTTGGACTACCAAAAGAGCGAACGCTTTGGTCCCTTACAGTATATCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1677067_1677387_1:0:0_1:0:0_42688/2
+TGACTAATTCTAGCAGGAGATCCAGCCAGATCAAGACATGTGATATTTCTCCCCTAAATAGAATGTGTGTGCCACTGTTGCAATTGATCTCAACCTACAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_306698_307195_1:0:0_1:0:0_327e4/2
+ACAGAAACAAAAAGAAATATGCGGGGGAGGAGTGGTTTGTTAAAGCTTTGTTTTCGAAAGGTCTCACTTGCACTCAAATCAGAGCCCAGAACCTTTTCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_106615_107066_0:0:0_1:0:0_929c/2
+ATATTATTTCTGCTGTGATCCTCACTGTGCCTGTTTTGATAAAGTTCTGATTTAGAGGTTTAATTTCCTGGGAGGAAGAAACGCTTGCCATCACCCAGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_145995_146481_1:0:0_2:0:0_55bb3/2
+TCTACAACTGAGCACCATGGCCTAAGAATTCCCTATTGCAGGCATGTAGAATTCTACTAGGAAACAAAATGCCGGAATTTGGACTGGAGTTTGATCCTGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1119910_1120413_0:0:0_1:0:0_535ec/2
+AATTTTTTAGGCTAGCTTTAGAGAAATGGATTGCTTGTCTCTAGGTTTTCTTCATGCCCGTTCCAGTGGTTCAACTATGTTCTCAAAACCATCTGCTACC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2047007_2047503_0:0:0_1:0:0_2cf40/2
+CTGCACAAGAATCGCACCATGACTTGCCCTTCATCTCTATACACACATCTGTCACGAAGACGTATTTTCTTCAACTTTTGCCTTCTTCCCACCCCTGTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1680896_1681324_1:0:0_1:0:0_15bb0/1
+CTGGCCGAGGCCAACAAACCAGGAGTCTTTTCTGGTGGCTCATAGAATAATAAAAGGCCTAGATGTGTTTATATTTTTTTTTCTTTACGCCCAGGGCCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1347803_1348158_1:0:0_1:0:0_19e8c/2
+GAAATAAAGAACGTCGGCTCACAGCGACAGAGCCCTTCTGTATGCAAGGCCATAAAGAAAAGGGAGAAATCCTTATATATATAGCTTAGACTTAGCCGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1394209_1394625_0:0:0_1:0:0_4fbdb/1
+GACGTAGTATGGGGGAGTACTCATCCAGGGATACTAAACCTGAAGATTTTTCTTCACAAAGGAAGCACTGGAAAACTAACTAAGGAAATACAAATCTATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_284957_285389_0:0:0_2:0:0_27015/2
+TGGGTGGGAGGACGGATGAACCATCAAGAAAGAATTAGTATTCTCTGCTTAGAAACGGGTTCCCTCCAACATGGAGGAGGCTGGAAGTTTATTTCTACTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_206067_206600_0:0:0_1:0:0_4757e/2
+ATACGTATAGCTCATTTGATGAGAGAATGATGAAGGTAGGCTTGGCCATAATATTTATTGCTTCCAGAAAGATTTTTTTACCATACAGTCCAGCCTGGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_232507_232932_0:0:0_1:0:0_16fe2/1
+GACACATTCTGACTGTGTCAAATAGTCTGGAGCTACTCAAATGAAAAACTAGTTCCCTTGAAGGCAGGAAAGGATTAGGGAAGTTGACAACCCGCCCTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_816269_816778_1:0:0_0:0:0_bbd8/2
+ATTTCATGCATCTAGACATGGCACTGGAATATCTGAAAAAAAAATACCTTTTGTGACTAAGTCTTTTCCATCTCTTCAAGCTAACTGGTGTTATCCTGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2431013_2431447_2:0:0_0:0:0_1ea34/1
+AAGTTATTTTACCACAGAGCCATAGAGACCCAGAGCCGCAGATTTCTTGGGCATGATTATCAGTAACAGATACTAGCCCTGTTCCTGTAAGGTTTCCGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_841155_841576_1:0:0_1:0:0_2f663/2
+CTTAAAAGGTGCATTTAGGATTGATATTATAATTTCATTAAAGGAAGCTTTTCTCCCTGCCCACTCACCCAGTGAGTGGGGAAGCTGAGACTTATTAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1744474_1744929_1:0:0_1:0:0_13c7b/2
+ACAATCAAAAAGAAAGGTACGGTGACTAAATATTGTGCACTCCAGCAAAGCATGTTGAAGTTCCATCTATGGTAGCGTGTAAGACAAATTAGTATCCCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_504031_504521_3:0:0_0:0:0_180bf/1
+TTCTGCAGGGATTAATTAGATATTATCTTAAAAATATACATATTCAAAAGTGGTACCAATCCCTATTCCATCTTAGGATTTTTAAACAGCCCTGCCTCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_29_453_0:0:0_3:0:0_46053/2
+TCTGTATATAACTCCTGCCTATGTTTCAGCATTAACACACTGTCCCACCCGCCACTGAAGGAGGGAAAACTACGAGGCCAGGACATGAATGTGTGTTTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_514734_515141_2:0:0_1:0:0_562ac/2
+TCTCCTAATAAGGGCCTCACCTGTGGTGTTAGAGACTGGATATCAAGTGGAGGTGAAAAAAAAAAAAATCAATCATAAATAGGGCTACTGGCCAGATCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1657950_1658437_0:0:0_1:0:0_e0bf/1
+TTGGGAGGGACTGACTAGGTTTGACACCATTGTAGGCTGACTGTTAAAATCATATAAAGTCATGAGCCACTCTTCTTGTAGTAAATTTTTTAAGATAACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_990128_990560_1:0:0_0:0:0_34fa8/1
+CACATTGGATAATGAGAGGCCAACTGGAGCTAGGAACAAATAGCGACCTTAATAAACACACAGCTGGTCTCTACAGAATGTATCTATTAACCAGCGCCGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_544632_545046_1:0:0_0:0:0_28c93/2
+TTGCCTCCACTCCACTGCACAACAGTAATTTTCTTAGAAGTGATCCCCCCATTAGGCTATCCATATATAGTTCGAGTGAGATGGAGAAGCTATAAGTAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1526303_1526776_1:0:0_1:0:0_33532/2
+CAGCTATCTACCCCAAATCAGGACTGAAGTGACAAAGTACGCTTGTACTTGGAGGTTCACACATATTGAAAAAGGTACATTGGCCTCAGCCCACCCACAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_446452_446934_0:0:0_1:0:0_489bb/2
+ATAAACAACATACGAAAAGAAAGTGAGATCACAACTCAGCAAATTGCTCACACCGTGGTCTGGCTAAGGTGCTGTGAAGTCCAAGAAGATAAGAGAAAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_617489_617888_3:0:0_0:0:0_51b55/2
+GAGGCCGACCTCGGGATTACAGGCAGATTCACTATCTCACTCCTGCAAGCTCTTGTTGGCTAAGGCTAATTATTCAAAAAAAAATTTGATAGTATCCTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_131171_131669_1:0:0_1:0:0_106e0/1
+GATGCAGTTTTAAATCAATAAAACTAAAAGTTTAACACGATCACACAAGCAACGGCTAACAAGACGGTCTGAGCAGAATAGGGAGTCAGAAAGTATAGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1668602_1669010_1:0:0_1:0:0_4f9a5/1
+GGTCTAGAAGAAAACTGTTTTGTTCTTTTGTGTGCGTGCTATTGTTCAAGATTTACATGGTGAATATTTTTTTATTCTAAAAAGAAACCACACTATATAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1095912_1096397_1:0:0_2:0:0_26ff0/1
+ATTCAGGGGGAGTCAAAGTATTAACTCTTGTATTTAAAACCAAACATCATGGACACAGCATATTCAAACAGACTCTCCCGACTCATCTTAGACAGGGAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_19207_19713_0:0:0_2:0:0_1d9dd/2
+AAATGTTGAATTGGGTATAGGAAAAATGAATATAAAATTCAGGTGTTCAGTAACAACAACCCAGGATATTGAAGCCCCCTCTTTTCTTCAACTTCTAGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1298589_1299093_0:0:0_1:0:0_5144d/2
+ACAGAAGCACAGACAGAATCTCTCCAGCACTGAATTGCTTGATCCAAGTAAAGATCCTTTAACTTAGAAGATAGAGAATTTAGCTGAGTAAGTGTTTCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_210835_211218_1:0:0_0:0:0_17489/1
+ACAAGTTTCAGTACTGGCCAAAGCATTCATTCAACTAAAAAAATGATTCTGTTTGAAAAGGAACTTTCCTGGAGTAAAAATACATGACCTGCTAAACATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1930883_1931369_0:0:0_1:0:0_3d188/2
+GCCTGGGCTCTCCACTTTCTCCTTCTTGCTATCAGTATAGGCAGAGGGCTTTTACTTATATGACTCCCTCCAATTATAGAAGTGATGATTAATAACAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2151702_2152154_1:0:0_1:0:0_18650/2
+AGGCGAAGTGATTCAAGGCAAAACAGCAGCATCCTGATTTTATACTTTGGTTTTGTATTTGGTTCTTCGAGGTGGACTTAACTCACATAAGGTAGGATGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_269786_270139_0:0:0_2:0:0_1f206/1
+TCCACCAGTCCACACCCGGCAGTTTCCTACCTTCAAGGATCTCCCCTAACATGCTAGCAGAAGACAGGAATTTTTATTTTTGAAGAATAGGGCTTCTCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_529126_529571_0:0:0_1:0:0_44c37/1
+GTTTGTTGTACTTGAATACCAACAGCCTCATATGAGTACTCCAGGAGAGAGCCTGCTCTGGGGGATATAATATTCATTCCTGCTGAAGGACAAAATGACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1238762_1239122_0:0:0_1:0:0_36780/2
+ACTGGCATCCATGTATAACATTCTTTTTGTATATACACATGATCCTGCCAAAGTGCTACTCCAATCAAATTTTAAGAATTTATTGTGAAAAAAAAAAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_580053_580565_1:0:0_0:0:0_5d5f/1
+TTTTTGATTTAATATGTATCCTTTCTCTGATAAAATTTGGAACACAGGACAAGGATTTTAAAAGTCATCCATTCAGTTTCCCTCCAATCTCACCCTGTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_739908_740301_1:0:0_2:0:0_46bff/1
+ATTCCCGTGGCTGCTGCCCTGCCAGACAGGACGGTGAAACGTGCTGTGTACCTTTACTCTATCCTTGTAGTCCCTGCTAGATGACGGGGTCTATTGCTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_15666_16088_0:0:0_1:0:0_13f8/1
+AATAAAAACATAATTTATTGCAACAGAGTGTAAAAGTCATTTTATCAAGTGCTGGTCAGGTCCACCATCCAGTTGAATTGACTAAGGCTGCAAGTGCATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2178490_2178961_1:0:0_0:0:0_ae76/2
+GCCATAATCCTAGCTTTCTTTGAAGATGTAGCTGACAGATCCAGCCTTCTTTTAAAAATCTCTATGGAAATTTTCTTTCAGTGACACAGTGTTTGAGCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_899543_899970_2:0:0_3:0:0_244d7/2
+CACCAGTTTTTTGTTGTTCAAGAGAATATTATATTTGAAATATATTCCTATCGGCCTCTCACTTTAGTAGCTCCGTCCAGGCTTCTGAAGTCAATATAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_726047_726583_2:0:0_1:0:0_a15c/1
+TTGAGGTGGGTGGGGTGGGAGGAATGATAGGGCCACTGCTGTGAATGATAGATAGATTTCTGTGGCTGAGGCAAATATCTTCTTTATGAGCATCCTCTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1410959_1411386_1:0:0_0:0:0_461fa/2
+AGTGAAACCACCAACCAGAGTTTTTCCCAGCAGAAATGCCTCAGCCACCACTCTTGAGCCTGGTACCCTACTCTATGTGGTGAGCCTTTGTAGGATATCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2320897_2321358_1:0:0_1:0:0_49206/2
+GTATAGCAGTGATACAGAGAAGAAGGAGAAAAGAAACAGATTCTTATCCTCTGCTCAGGTTCACCTCTGAGAGAGTGAAGTATCACTTGAAGGGGGATGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1207339_1207790_0:0:0_1:0:0_41b53/2
+TCCAGTTTTACTTCAAAGCACCAAATTGCTGTCACATTAATTGAATAATGAAGGCCCAGAACATGTGTAATAGACAAATACCAAATAAGACTCCTGATAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2162521_2162963_1:0:0_1:0:0_3fb1/1
+GAGCGCTACCCTTCCCAGAATTTATCTTATAAGTATAATTGTCATTGGAATACCTTAAAAAAGACACAGGTGTAGACCACTTCACATTTTTTTGAAACAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_999272_999780_1:0:0_0:0:0_8d14/1
+TGGCTGGAGTGTTATTTTGAATGTCACAGCACCCTTTATAAGGCTGGTACTGACAAGGTCAGAAACTATTGAAGCTATCCTTTGCAAATGATAGCACAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1743162_1743606_0:0:0_1:0:0_58108/1
+ACACTCTTTTGTTTTTGTAATAAAATCTGCCAGGACTCAGCCTGGGTTTTCATACCCAAATGTCCAAAGTGTTTGTAATCAATTCTGAATTAAATTTATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_666831_667317_0:0:0_1:0:0_1405f/1
+TAGTGGCCATGGCAGTATTCATCATATACAAATAAAAAACAAATAAAGTGAGCTTCCAAAGTGGGAAGGATAAGATATTATATTATGCATCATACATATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_546621_547078_1:0:0_0:0:0_34469/2
+CGACTATGGGAAGGGGAGAGTAGGGCCTAAGAAAAGGGAATGATTTTCGTTCAGCAGCTGCCCTCTGAGGTTAAAATGGTTTCTCCTGATGCTTAATAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_644035_644478_0:0:0_1:0:0_32885/2
+CCAGCAAGTCCTCCCACGACCTTCCAGCCTGAGGCTGCTATTTAAAAACAACATTTCAAGATGTTCTACTACTATCCCAGCTAGATAGATGCCTAGTACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1825553_1826060_0:0:0_2:0:0_40a1/1
+TAGAGGGTATCTTTCTGAAGTGGAAGTGTCTGGTTCCTGAGATGAAGCTTCGAAGAGAAACGTTCATGATCCACAAAAAACTTCTTCCACTGCGAATTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1556751_1557225_0:0:0_1:0:0_8d8c/2
+AGAGGTGGTTTATAATCCCACTAAACCACTGACTCAGTATTTAGTTAAATAAAAAAAAAAAAAAAAAAAGCTACCACTAAGAATGAATGGTGGTGAACAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_171501_171933_0:0:0_1:0:0_1c4c/1
+TCATCAGATCGCGCATGCCTGTAACATGTAGACAGAAAGACTAAGACAAATACAGTTCTTCCTGAGTAATGGCTGCTAAGTACTGTATAAAGAGTTCAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1154149_1154672_0:0:0_1:0:0_33885/2
+GCCAAGATTCATCCATTTTTAACAGACATTTCTCCTTTCTAAACTTCTCACTTCTGTTCACCCTCTAATTTCAGCAGAACCTATGAGCTGGAGAAGAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_934169_934653_1:0:0_1:0:0_3be8/1
+CCTGAATAACTAGAGATGAGAACAGGATTTACTTCAAACCAAGGTCCATCAATTAATGAGACAAATATCAACCACTGTGTCACAGTTAAGTACCTGGAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_138792_139301_0:0:0_1:0:0_4e079/2
+TCAGCACCAGTTAATTGGGATCAAATTTCTGCCTTCATTTTTTTTGAATATGTATCCCTGTTCCTAAGCAGCTCTGTCTCTGAACAGTAACTGCAAAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2302313_2302823_1:0:0_0:0:0_39350/2
+ACACATTGAACCATACTACTGAGAATAAATTGATTAGCCTTGCCCCCAGCCTGCGTATGAACAATCATCTACTATTTTGCTTTAGCAATTATGGCTGAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_371980_372384_0:0:0_1:0:0_1335e/2
+TCTAACTGTCTTCATCAGCATGGTGAGTCCAGTGTTCTCTCCATTCCTCCTTCACTAATTGTCCCTCTCTGACTGCTCCAGTGGTGGCTCCATGAGGGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_985312_985821_1:0:0_1:0:0_24853/2
+GGTCATGAAGCTATATAAGCACTCAATGAAAAGAAACATCTAATGGAAATAATTCATTAGAGTGCAGGGAGTGGGTAAACAACAGTGTGGTGACGTTTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_346956_347308_0:0:0_2:0:0_43a84/2
+TAGGTATAATGTTCATCATTTATTTGTTTTTAAAAGTGCTGATTTGTAGAATGGACCTGGGACAGGATGTAGATTTTAAGGGAGGTTTTTAGCACTTTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1625424_1625927_1:0:0_1:0:0_595c1/1
+TGTGGCCAGGCTAGGGATCATGGATAGCATTTTCATACACACGAAAAAATATTCTGTGGCACAGTCATCATCGGCCTCTGCCCATCCACTGGAGCTTAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_988022_988513_1:0:0_0:0:0_8e05/2
+ACAGACACTAGGACCTCTGCAAGCTTTTGGGAAGGTTCAAGAACCCCGTTCCATAAACCTTAGTATGGAATCAAACTGATACCACTATGATACAATTGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1412575_1412942_1:0:0_1:0:0_32a31/1
+ACACATAAGCTTTCTATTAGAGGGACAACATGGGCTCACAGAAGAGCTTGTGGCTTGGGCAAGGCATGGAAAGTTCTGCAATACAATTTCCTTTCCCAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2088601_2089101_0:0:0_1:0:0_21c35/2
+AATTTAAGAGTAGAGACGGGAATGCAGATATATATATTACAAGTTACCCTTAAATAAAATCTTTTAATTGTTCACTATATATAAGTGAGTCACAGGAGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_571638_572055_1:0:0_0:0:0_4928b/1
+CTGGTCTGGAAGTTCTTGGGGTGGGTACATGGTGTCCAAGATTGATCCTCCCGTCCCCACGGCATTTATAGACTGAATTATTCCTCCTGGCTTCTTCCCG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_805396_805878_1:0:0_0:0:0_7339/2
+TAGAGTTTAGGAGGATTACTCATCTTCTACTAATTAAAAAGAAACATCTTAGAAAAGACAGACTAAATGTTAGGGGGAAAGGCAACATACACTTACCTAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_845016_845438_2:0:0_2:0:0_30c31/1
+AGGATGAGAAAGGAAGAATCTTCCAAATGGAGAGCTTTGACCTCAACCTCTTGGCTCCCTAGAGTTACTGCCTCAGGAGGACGTTGTCATTTCCCCTCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2202161_2202575_0:0:0_1:0:0_21c99/1
+GAATGGAGCACCTGAAGGTCTAGTGAACCCAGATCAAAAGAAACTGAATTTTGGTTCAGTGTCACTTCCAATAAATGTTTGTTAACAACAGTGGCATGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1670054_1670524_0:0:0_1:0:0_45755/1
+CATGTGGCTTCAGTGAAACCTCCATTCCTGATAAAAATCAGATGAAGTCAAGAAACCAAGGTGTAGTAAATATTTATTTTAGATTTCCATTTGAAAACGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_907580_908036_0:0:0_1:0:0_71c7/1
+TCTGCTTTTATGATTTTGTACAGGAAGCAGCATAGGCAACACCGCTTCTATCAGTGGCCGAGGAGCCACTAAGAAGGGTAATACAACTCAGGAGTATGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1711029_1711477_3:0:0_0:0:0_15c81/2
+CTGGTGAAAGTATAGCCTGCTGGGAAGTCAAACTGGTTCTGTTTTTATAGAAAAATCACCATCTCTGCCAAGACCAAGCCTTTCCCATATGGACCGGCCG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1029180_1029557_1:0:0_1:0:0_1cccb/2
+CGAGTCCAGAATGTTAAACCTGGCTTTTGTTTACCCAGCTACTTCAGGCTGGAATGGCGTCGTGCGGCAGATGATGGTCAAGAGAGCTGGGTCATTGTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1683834_1684279_1:0:0_0:0:0_bdb6/1
+CTGTACTTTTAGATGTGACTCCAGATCTGGGCTTCATCTACTTGATGATGTCTGAGACAGAACCCCATCACATAACAACTTGTGGGGACTTCAGCAATAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1502788_1503265_1:0:0_2:0:0_2b6f1/2
+TTGATCTCGGCCTCCAATAATAGCCAATTGAGTAACTGGAGAAAGGCTTTCAGATACTAATATCCAACCTCCCCTTATCATATATATATTTGTCAAGGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1084957_1085455_1:0:0_1:0:0_3f2cd/1
+AAAGAAAAGTTCTGCACTCTGAAAAACATAGAAAAATTCAGTGAGATGCTTACCCAATAGGCGGATCTGTTCCAGTGAGCATTTGATCCCCAGAAGTGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_496428_496879_1:0:0_0:0:0_36535/2
+AAATCCTAAATGGGAGACAACACCAATTTTCACCAATATTATATCTTCTAAGCTTTGAAGCCCCCAATCTTTTCCCCAGAGGTGGATCACTGTGTGGCCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1259674_1260110_0:0:0_1:0:0_36c01/1
+ACCTGCCCACTCCAAAATTTAGGAGCCTCCCAATTTACTGGATGGTTATGTACGCAATGCCAGTCTAGCCTTGGGCTCTTTCATGTTGGGAGAAATTGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_66072_66534_0:0:0_1:0:0_2e323/1
+TGTGTGACTCCCTCACCACAGTGTGAATGCTGGGGGTCGTGAAGTCATCTACTATTAGTAGCTGAGACAGTCTACTTAGGGAACTTGAACCATTTGGAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1724087_1724550_2:0:0_0:0:0_79eb/2
+CTAAAATATTTTATAATTGTCCTCAAAACACATAATTTTTTTGTAAATTAAGTGTTTCTGACTGAGTTCTCAAACTGAAAGTCAATGAAAATTATGTGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_681562_681942_0:0:0_2:0:0_194f4/2
+TCCAAACGCCATAATTTAAACTAGACAATTTGATAAACATGTATTTACATATCATTATAAGCAGAAGGCACCTAAGCTTTGGGTGAATACTTTAAAATAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1731376_1731811_0:0:0_1:0:0_194cf/2
+ATCTAGCAGGCCATGGTGTTAACTAACATGGAAACAAGAGACTTACAAGATCCCAGTCCCAGCTAAAACTCCTGTGGTGGCAAAGCTTCTAGGCTAAGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1764331_1764853_1:0:0_1:0:0_3ffbb/1
+CAGCCTCCCATCCTGGCTGCACGGTGGGATGGAGTGCTGGGATATATTAAATTATATTGGCCACAGGTGTAAAATGCTTGCTCTATGATAATGGTGCACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_877039_877531_1:0:0_1:0:0_437c9/2
+AAAGAAAAAGACAGGCGGGGACAATCTATAGACTCTATATTTTTTTTTTTGTCTTAGAGATAATTTTAGACACAGAAGCCTGAGGTCCGTTCAGCAGAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1790495_1790919_1:0:0_1:0:0_2a6cb/2
+TATATCACATACAAAAACAATCATATCCTTTACTGCTTCTGTCGCTAGCTCTTGCTCTGTAAACAAGTGTTCTGGAACCGTTCTTCAGATTTTTGAAAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1949987_1950405_1:0:0_1:0:0_335b3/1
+GAAAGCAACATGATTTTTAGTGTGAATACTTGGGTACTACCTCTGCCTCAGGTTCAGAGCCCCTATAATCTGAGAATGTAGTTAATTTATATTATGGCCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1886531_1886998_1:0:0_1:0:0_21784/1
+GTGTTGCCCAGCTACGTGAGTTTACTTTAAATGCCTATTTTTAAAATGCTGTAATTCGTTGTAGACACAGCCAGATCTCCACCAATGATACTTAAAGATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2252190_2252660_0:0:0_1:0:0_d925/2
+GGTTCAAAAAATTGTTGTAACCTCCAAAAAAATAGTAATCCCCCACCCAGCTACCTGGAGACCAGCCCAGGGATGGGGGGAGGCAGCGTTTGGATGATAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_903080_903473_0:0:0_1:0:0_38d15/2
+TCTTTGCCAGGCAATTACTGGTGTATGTCGTATAAGATTTGAAAAGGACAGGGAGGATTAAGTAAAAACCCAGCCTGGATTTGGGCTTATTAGATATTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_314753_315169_1:0:0_0:0:0_45355/1
+AGAACCAGAGTGTCCGTCTGTAAATTAATCACTTTTTAAAAAGATCATCTACATCTCTACAGAGTCCCAGCCCCATCAAGGAGTTCCTCCTGATAGAAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_73245_73604_0:0:0_2:0:0_21fe6/2
+GCAGATCTTTATGCCATAAACAGTGGCTACACCAGTTTCCCTGCATTTCGGAGGCTTAAATCAATTCATCCTACGTTAACATTAGAGGGTTTCAAATATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2479133_2479517_0:0:0_1:0:0_3e884/2
+GGTTCACCAGCCTTTCTTACACACATAACATTAAAAATGCTATCGCCTGTAGCAAAGATATTTATATCTCTGGGACGTGCTTGCAAAGTCTGGGTTAGAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1308425_1308918_1:0:0_0:0:0_2cc37/1
+GTCTGAGTAGCAGGACTGTAATTACTTCAAATTTCAAGAGTTTCTAAGAATTAATTTAATAACAATATTTCAGACCCTATAAGGTACTTTGATTTGGCCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_900074_900523_0:0:0_1:0:0_9b19/1
+TGTGTGGAAGTATGTATTAGAAGGGGAAGTCTCAGTGATGATCATGGTGAATATCCCGTTTCTATTAAGCAAGGGCAAGGTAAATGCAAGACTCCCACCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2157332_2157881_1:0:0_1:0:0_3a0a0/2
+TTTTCCCCCGTGGTGACAGTTGCGGTGATAGAATCCTAGATGATTTTGAGCCCTTGATACACAGAGAAGAATTCTTTATAAATGCTTGTGCAGTAAACTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2150312_2150705_0:0:0_1:0:0_454ed/2
+TGAAAGAGCTCGGGGTGGATTTCATTCCCCCAGCTTCTTTGGGAGTTTCGACTTGCTCCTCATCAAAAAGAAACCCCACTCTGGTAATTGTGACCAAGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_201911_202433_1:0:0_0:0:0_44772/2
+AGTGCTTGGCTGCCAACAGGTGTGATTTTTCTAGCACTTTTTTGAATAAAAAAGCAAGAGAAAGTGCCCTAACTGAAGAGCCATGGCAATGGGGCAAGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_278913_279314_0:0:0_1:0:0_183b9/1
+AAGTAGAGAGGATTGAATTCTATAATCTGTTGAATTATTTTTTTTTAGATCCTATCTGAGAATTTCAAAAATATCTTTTAGGACATCTTCCCCCTCCAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_845368_845820_1:0:0_1:0:0_24cde/1
+TGGGTGGTGGGTCAGTGAGAAGTTTTCTCACATGATAATCTTCTCCCCAGCAACACCCCCTCAATATATGTTAATGATGCAATTTTATCCAACGCCTGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2422445_2422911_2:0:0_1:0:0_4e99c/1
+GCCACCACCACTCCCTGGCTGGTGAGTGTGAAATTTTACATGAGGCTGAGACTGCCATTTAAGCTGCCTCAACAGAATAAGTACCCTTGCAGTGAGCCCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1734130_1734592_2:0:0_1:0:0_4af6a/2
+TTCTGACACTGTGCAAACCCATGTACCAATGACTAAGTGTGCACAGCTCTGTGATGTTGGATTGTGAAATTGATAGTAAATAAAACAGGAATACATCTGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1061411_1061852_1:0:0_0:0:0_2f507/2
+CTTATATATGTTTACAGGCGTGGTGGCAGATATTCCAAAAAGGACTTTTATGTATCTTTGTCATTCTTTTTGCATATGATCCTTGTAGATTAGTAGTGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2009834_2010293_1:0:0_1:0:0_4b9e0/2
+TGGTTCTAGTTTCCACTGAATCCAACTTTTAAAGATGTCTTCTGTTGTCAGGGAGGCCAGGCCGGTGGTAGGGGTGCTAAAGCACAAGCAAAATAATTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2297040_2297403_2:0:0_0:0:0_55947/2
+TGTTTAAGATACTGGCACAGAGCGAGAAAAGAAATTCATGGAAGCAGTTTGAAGCCTGCAACTCACTTTCATATGTAAGGTGTGCAACAGGTGCCCTGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1550991_1551457_2:0:0_0:0:0_4e3c5/1
+GAATTATATTGCATCCTCAGCTCTGCACTCCATTCATTTTTTATTAATGCATCACTTGCAGAAAATATGTTCAACTAGTATCATATATATAGGTTTTGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_54237_54658_1:0:0_2:0:0_19a0f/1
+GATGTGGTGGTGGCTGGTATAATTGTTTCTTTCCCACACTTGATTTTACCAACATGTACTTCATTTGCTGTTGATAGAAGCTCTAGTGAAAATATGAATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1938390_1938799_1:0:0_2:0:0_33d6e/2
+AAATAATAGGGTGGCCAGTCTGAAGTAGAATTCGTATAAAATCTCTGTGATGGTGGGGTTCGCCAGGCGGGATTTCCAGCACTGAATTCTTCTAGCTGAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1199579_1200084_1:0:0_2:0:0_43f68/1
+TTTCAAAATTAGAAGGCTTTTGTGACAGGCCACGGTGTTAAATGCTTGAGCAACTGAGGTAGAGGAAGTCTCACTGCTATGTGATTCATCAATTACTTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2253323_2253793_2:0:0_0:0:0_40447/2
+CAGTTCTGATGCAATTACAGGGACTGAAGGTTATTGCAGAGGAAACTACACGTGCCTGGCAGAAGAAAGGAAATGTGGCCTCCTCCTGATAACTAACATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_737677_738174_1:0:0_1:0:0_18d92/2
+GGAGGGCATGATTGTTGTTGCCTAGAGTGAAACTGATTACAACGTGATTAGTGTCTCAATAGTTTTGAAATCATAGAGGTTTTCATAGTAGATGTGTGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2222735_2223193_1:0:0_1:0:0_2220e/2
+TGATGAAACATGCGCTGGCTCTCATTCAGACCTGGGCTCGTTTTGAATATCATTTAGCTTTAGGGAGAATTTGGGAAACTCTTAATAGGCATTGCTTGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_648668_649124_2:0:0_1:0:0_5086f/2
+AGTGGCGAAACACCATTGGAAAAAAAAAATTTTAAACAAACATGTGACCCAGGCCAGGCATTTGTAACCATAGTTCTATTTATTTGGGCAAGACATTTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_243132_243565_0:0:0_1:0:0_3feef/2
+TCATCTGTCCCTATGAAGGCTCTCTCTTTCCTGTGGGGCTACAATTTTGAATATGATCTAAGATAATACTGCACAAGAAGACGCTGCCTCCTGGGCGTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_946418_946928_1:0:0_1:0:0_359bd/1
+ATCCAAGACTGAGGCAGATTCCTCAAGTGATGAGACTAAAAGAAAGTCCATGGGCCAGGGTTTGGGCAGATAGTGCCAAGTGATGTCAAAGAGGATCCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1903745_1904136_1:0:0_0:0:0_41f28/1
+CCAGCTTCTAGGTCTGTGTGTGACTCTGTTTCAGAGAGGCTTTGTGCAGGATTTTGTGTGATAAGCAGCATTTACTATAGCACACTCCACTCCAGAGAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1983642_1984056_1:0:0_0:0:0_21a52/1
+AATCTGTGCAACGTGCTAAAATGGATCCTTCTCCAATCTATAACCAAATCATAATCCACCACACGCACCAGGGAATCCATTTTTGTAACTACCTTAATAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1530603_1531093_1:0:0_0:0:0_4561a/2
+TAATTTTATGCACAAAATTTCTACATGTAGGTACAGGCCGAAGCCAGTGATATCATGGCTCATTAAAATGATATGTGGCTTTGTGCTCAGAAAAAGAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1486346_1486786_2:0:0_0:0:0_4adba/2
+CAGGGCAGCATAATGAGACGGAGTGCAGCTGTTTTCTGATGGAGTCATGTTATAAATCCAGAAGGAGGGGAGCTGACTCAATAACACACCATGGCAAGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_251154_251648_2:0:0_0:0:0_11f0c/1
+ATGGGGCTGGAGGGAAAATCAGGTTCCAGTTTCGCGTTGATGTAAACCCTGGCCATGAGAATTTCTGTGGAGAAATTAGCTGTTCCTCTCATTGCACTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_917360_917783_0:0:0_1:0:0_4aece/1
+TTTGCCTGGCTGAGAGAAAAACAGCTGTGGGTATCATGGGTATAATTTGTAGAAAACCAATGTGGAACACACACAGAATGACTCCAGACTCCCTCAAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1227831_1228182_0:0:0_1:0:0_f9b9/2
+CATGTGCACTATCTTTCGAGGTGAAGAACAAATAAAAACCAGAGCTTTAATATAATTAGTCTTTATTTTTCTTCCCTACCCAAAAATATTAATTTGTTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2048024_2048435_0:0:0_2:0:0_49330/1
+TAGATAATCACCTAAAAACCAGACAATTCTATCTTTTGTTTGTGGCACCTGCCTTTCTTATCCTCATAGAACTAAAAGGACAACAACAGGTAGGAAAGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1272683_1273159_2:0:0_2:0:0_6756/1
+CTGTGCTCCAACCATGTGCCAAGAAACAAACATCAGGTGTTGGGATCTTTGTATTTGTGTCTATTTCATATGTAATATACTGGCCCTGGGGCCCCAGACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1142121_1142507_1:0:0_1:0:0_5ab3f/1
+TAAAATGCCTGAGACTAAACATGGACAAGGTTTTTTAAAGGGATAATGGGCATGGACCCAGAAGTTGCTAAGTACCAAACAGAGCGAAACCTAAATAATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_619356_619778_2:0:0_1:0:0_399dc/1
+CTGCTACCTAGGGGTGTCAATCTAGAGACAGGAGTTAAAATAGCAGGAGTTTAAGACATCTTCCATGAGCGATCTGCATCATTCAAATGGCGTGGAAGAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2124846_2125172_1:0:0_2:0:0_2c86/1
+CTGGAGAAGACTACAGACTCCGTCTGTGGCAAAAAAAAAAGAAAACTCCTAACATGCACAAAAGCTATCAATACCATTCACCCGACCCAGCCATACATGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_300809_301240_1:0:0_1:0:0_4b912/2
+ATGCCCACCTAAATATCACTCCTAAAAACTAAAATTCCATCTCAAAACAGCATGTTTGTTGAAATCTTCCATTTGCAGAGAGCCAGAAAAAAAATTATCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_778829_779196_0:0:0_1:0:0_3c02/1
+ATAGATGCTCAATAAATGGAATACTCACAGTGACAGTAACACAAAGCATCATTATTGTTATTATTTTTCTTTCTTTCTGTAATCCCAGTAGAGTGGGTAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_416057_416487_1:0:0_1:0:0_42607/2
+TCAATAATGAAAAGGACATTTTTTTTATTATGGCATTAAACAAAAAAAAAGCTGCAGCATCGTGATGTTGGGGATGGATTTTTTTGTTAATAAATCTTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1215352_1215867_2:0:0_1:0:0_11630/1
+GCCAACAGTCAGGAGTTTATTAGTACTCCTGGAGACCAACCTCCAGAGCTCCCGTTTCTGTGTCGTACACGAATCGGACCCGGGAGGGAAAGGGGTCTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_178537_178954_2:0:0_0:0:0_4a38f/1
+TACATATGGGTGGATAGTAAAGAAATATCATATAAAAGAGAGGCCAGAAGGGAAACAGGGCTCCAGCTTGCACTCCAGTGAGATTTGGCCACCAGGTTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_413693_414178_1:0:0_0:0:0_28725/1
+ACATGCACCCGGGTTCAAGGGTTCTGTTTGTCTGCCACTACAGGCCGCTCTGTACTTTTCTCCACAACCAAATTCCCTGGGCAAGAGGAAGCTAAGCTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1401127_1401604_0:0:0_1:0:0_1050/2
+TTTGGAATACCTAAGGTTCACTGCAACAACATGGCCTCAGGAGTAGCCATAACAGTATCATAAAAATTTCTTAAGGCTGCCTCTTGGAAACAACATTATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_85932_86369_1:0:0_0:0:0_1aab2/1
+CTTCTTTGGCTCACAGCAGTAGTACCCACACTGTTAGAGCACCTGTAATCATTGATTTCAAAGAGTTCAACCCTAGGAGTGGGGGAAAGCCCATCTCAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1326874_1327379_1:0:0_1:0:0_367a9/1
+AGACTCAAGATGATTTGATGTTTAACCATTCTGGTGGCCTCTACTTTTTAGACATGATGGATCTTCATCACTCTGACCTTTTCTTCATTATAAAACCAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_197488_197809_1:0:0_0:0:0_5ea7/2
+CCCGCAAGTGTACAGCAGTTGCTTTTTTGTTTGTTTTTGTGGAACTCCAGCACTTTGGTGGTGCCTCTCTGCTACCTACTGGTAGAGGTTCTTCTTCTAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1204791_1205234_1:0:0_0:0:0_1faa1/2
+CTGCCCAGCAAATCCAATTAAATATTAGTATCATTATTTATAATCTTTTTGTTTCAATTTTTAGAATCGCCCAGGTTTTGGGAATTGACGCCTCTCAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1250720_1251181_1:0:0_0:0:0_3ffcb/1
+CCTCCCCCAGCCTGGCCTCATAAAAAAGCAGGTAAGAAGACCATTCCTGGCAAGACCCTCTGGGCTTTCACTAGTTTCATCCATTTCTCTACAAAATTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1975083_1975501_2:0:0_1:0:0_2703f/1
+CACTTCATTTAAGGGTGGTGCAGCCCCTCGCTCTGATTGTGATGAATCCAGTTATCCATTATAAGAAAGTTGCACATCAGGTCTGGAAGAGATAGGTTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1439228_1439696_3:0:0_2:0:0_fa42/1
+GTTAGGAAAAAAAACGGGGCCGGGCGCAATTGAATTTACATTGTTTTTTACATGAAGATTTGCATTCAAGTATTCATGGCAACTATCTTTATTGTACCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1460575_1460982_2:0:0_1:0:0_164c1/1
+ACTTTTGTCCTTGATCTCTTTTTTCCTCAAGGTTCAAGTGACAAATAAAGGGGTGGCCCAGGATCCCTGTGATAGTTCTTCAGGAGACCCAACATTTATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1765980_1766498_1:0:0_0:0:0_35554/1
+TAATTTGAAAACAGGCACTTTGTAGGAGGTTTCAAAGTAGCAGTCATTTCACCACATCCAAGAACTTACCTCCCCAAAGGTTGCAACAGAGCAACCTGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_906977_907342_0:0:0_1:0:0_1a78f/1
+TATCTATAGATAGAAAGTGACTTACTCTTCCCACTTTGTGCCCAGGCAAGTGATATTCTCCCCACGTCTGAGACCATGTGTGCATTTCCAACTTACAAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1543618_1544076_1:0:0_2:0:0_580e8/1
+CTCTCACTAAAAGTGTTCAAAAGACAGATGGAGATGTGGTTCGGGTGCAGTTAGTTTTTCTTAATGCTTTGCAACCTGGAAGCAATATTCTCAGCACGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1401041_1401557_0:0:0_2:0:0_54038/2
+AAGCAAACAGCAACAGTTCCTATTCTCCAAGAAGATCCCAGAGATTTTTTGGAATACCTAAGGTTCACTGCATCAACATGGCCTCAGGAGTAGCCATAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1446231_1446640_0:0:0_2:0:0_3ebd3/2
+AATTCTAACTCTGTTTGCTCACTTTTTAATATGTATTCTTCTGGAAGACACACTCTATAATCATGCATAAATAAGAGACTGCCTGGCTTATCCATGTTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_115019_115471_1:0:0_1:0:0_d032/2
+CTTCCCTTTCCTCATCCTGTTGTCCACCTTGCCCAAAGCTGTAGCAACCCCCCTTTCTAGATGTGGCCATTCCTAGGCTCTGAGGTCCATTCTCTCCCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_907510_907937_1:0:0_2:0:0_2094e/2
+CGCGGTGGAATTCTTTACAAGATGTGCTTCCAGCCTCATTTTGGTGGCCGGGTCTGAGCGTAATGGGTGGAGAGGCTGTATCATTATAACAAACCTCCCG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2306701_2307124_1:0:0_2:0:0_28d48/2
+ATAGACCCCATGTGTAAACCAAACTCTAAGTATACTTCTTATTTTTAAAAGTAAAAGCAGCTTTCTCACATTCTAGAAATGTTTTTTAATGTAAATTACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1257057_1257524_1:0:0_0:0:0_526eb/2
+AATACTAGTACATTAAGGGCTAAGGGTCTCCAAATCGAAACAGCTGGGAGGCTAAGAATTGAAAGTCAAAGGAGGAAATAGAATGGGACCGCATCCTGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1902115_1902483_0:0:0_2:0:0_19f5f/2
+CTACCGTAAAATCAGCTGTGTCATGGCACTCAGTTGTGTTCCAGATTCACTGTAACTAATAAATACTAAAAAATATTACAGGTGTCAGTTAATTAAAACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1442523_1442901_0:0:0_1:0:0_618d/2
+TTGACAAACCTGTTCAGTGGTGTCTGTTATCACTATCCATAGGGTGCTGTTCCTTTGATTAGTACACTATATTTGGGTGTACACCAAAATGGCCTTTCTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1226230_1226600_0:0:0_1:0:0_5a31c/2
+AGAACAGCTTTTTATTTTTCTAACCTCTGTCTCGCTCTCAGTTATGAAGGTAAGGTCATGATATGGAATGTTAGGAATGCTGAATGGGTGTAAACTTCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1435479_1435914_0:0:0_1:0:0_441ab/1
+CACATTTGGTAGTGGATGGCCACTTTAAGAGCACCCAGCATGAGGAGGAGATGTGGCCAACGTGAGTACTCTGGCTCAAGTGGTAAGTCTCGCTGCCAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1720636_1721043_2:0:0_0:0:0_159c6/2
+CTCTAATTTTGCTAACTGACAAGCACCGTAGTTAAAGAAAAAAAAGACCTACAGAGCAACCCTTTACTGCACAACCACTGTATGAAGATGGATTTAAATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_430501_430984_1:0:0_0:0:0_1852/2
+AATTTTTTTGTGATGGTCTCTTATTCCTTAAGAAGACTCCTCTGAAAATAAAGTGCTCACACTTTCCTCTCTGGCCTTGGGTGGCGTGAACCAGCCCCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1465608_1466123_0:0:0_2:0:0_3936b/1
+CAAAAGAGTCACCCTACCCTAACTAGTATAAAAATTTATATATTAATTAGAGAGGAGGCAAAGATGAGTGGGTGCCCAGAGGTTAATGACCTCATATTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_482940_483382_0:0:0_1:0:0_2f491/2
+TTTCTATTTAAGTATACATTCCTATGGACTGTTGCCCTTTCTTAACTTCCTGCGCTGCTGTTCACTTATAGATAGAATATGAGGTCAATTCCACACTGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1430640_1431114_2:0:0_1:0:0_1c4fb/2
+CCGGTTGTGCCCCTCTGCATTTAACCTTTCTGCACTGATATATTTGCAAAGAAATCAAAACCAAAGAGCAGAGCCAGTACTTTGAAAACACAGAGGCGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2276244_2276753_1:0:0_0:0:0_f51c/1
+ATTCTCAGGAACTGGGCCATGTTGATATGTTTCACTGCCATTCTGGTCTCAGTTTTCTCTTCTAAAAAAATTTAACCATGATATAGTTAGAGACGGGGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_841151_841649_1:0:0_1:0:0_27ba/2
+ATGCAAGGGGAAAACGAAGGCAGGGTTTACATCATAAACAAAAATACTGAGGTATCACCTGTTTGTATCCTTGCCTCAAGCAGCAGATAATTAATAAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1535404_1535861_0:0:0_1:0:0_1d382/2
+CCCATAGCCATGACATTGAGAGTGCAGCTCTGGAGCTGTGCTTCCCTTGAGCCAGGTTTGTTTGAAAAAATCTGTTAGGTTTGGAATGGTAACTGAATGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2469952_2470471_1:0:0_1:0:0_5b81d/2
+TGGGTTTCACTACTTGCCCTCTGGGCTGTCCTCTTGGTGAGAATTAAAATTCTTCGTTTAGCATCTAGCATCTGGGTTGGTCAAGGCCCCCCACTTAGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2225597_2226065_0:0:0_1:0:0_3db6e/1
+TTATTGATTTTCTGGATTTGTTCTCGCATTCCCTTCTCAGACATCCATCCCCTTCCGTTTAAGCTATGGAGTGCTGTTTTAGTTCTGGACTTGGTTTACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1077090_1077493_0:0:0_1:0:0_29a70/1
+AAAATAAATTCCACATCTTATATCAGAAGCCACCACGATATGGCTCACTGCACCTGCCAATTCTTACATATGAGAGTACTGTTAGGTATTGTGACCTTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2206524_2206899_1:0:0_0:0:0_563af/2
+AGCTCTCAAAATACTGCAGGAGAAACCTGCTGTGGCCCCTTTTTAAAAAGAAGGGGTCTGTGGCCTCCCATCTAATTATCATCCCTGAGTGGGAGACAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1637506_1637981_0:0:0_1:0:0_24f8/1
+CCCAGGTACAAATAAGAGACGGGGTTATGTTTATTTACTGTAATCCCAAGGTTTCATCTTCAGTATTTATGCTTTTTTAAATGACTAACTGTAAAAAAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2164785_2165273_1:0:0_1:0:0_3eff5/2
+CTAGCCCAGGGAGATAATGGATTTCTAAGCAGTTGTTTAATGTATTTGATAAATTAGTGTGTCTGTCAGCATCTTACCATATCTCACAGACATGAGACAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1004314_1004824_1:0:0_1:0:0_2c1ef/2
+GCCCTGGAGTCGAATGTTCAAGCGAACCTGAAAGTGCAATCCTCCACAGGTCTCACACACAAATGATTGAATAAAGGATCTGCAAGAGTAAGTTTGAGAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2228273_2228621_2:0:0_0:0:0_1964c/2
+AATAGTGGATCATCACAGATTAATGTTCACCTGTTCTTATTCAGCTTTACCTGAGTCTGGACGAGAACGTGGCAAGTATCTTCATTTGCAGGGAAGTTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1397775_1398236_1:0:0_0:0:0_b427/2
+CAGGCATACATGGCTTCATGAGTAGCTTGCCAGGTGGGCAGAGCTCCTGGGCTGCAGTCATCAAATGAAGTAGTTGGAATTCGATATTAGTGGCTAATAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_240080_240584_1:0:0_1:0:0_2ff6/2
+CTGTATACTTTACTTAAATGTTGAAATTTAAAAATTTCTCGGCTCAATCAAAAGTAAAGCTTCAAAGTCTTCCTTTAGACAATCTGGGATTATATATTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1673194_1673739_1:0:0_0:0:0_226e4/1
+ATTTTTTCTTGAATGGTGGTCATGCTTTTTTCAAACACGTGAACTACATGATCTTCCTTTCTCCCTACAAAATAGAGGACCTTAACAGGTTCCTATTTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2061817_2062212_0:0:0_2:0:0_ed30/1
+ATACATGCGTCTTTGGAAAAATAAGAATAATTTTGTGGTTTAAGTGCTTCTATGCCATGAGATTTATTTTTTCTGATCCAGCTAGAGCATGTGTATTTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1776461_1776964_1:0:0_1:0:0_19397/1
+AAGGGGAGGCTTAATATTTATTTGGTGAATGCACACAAACGGTATTGGATGTTGAATCCGTTTTTATGTGTTCAAATTTCAGCTTTCCCTTTCCCTCTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1956942_1957429_2:0:0_0:0:0_481e5/2
+GCTCCATTTTGGTCTCAAGAACAAAAAATCAATGACACAGGGGAAAAGCCAGCACCCATGTTAGAAGAGCCTATGTTTTATTTTTACAGCTACTATGTAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1894722_1895132_4:0:0_2:0:0_25b65/2
+GTAAACTTGGACCCGATGAATTACATGATGCTGGGAACCACTTCTCTATATAAGTATACTTGGTTTCACAGTGGGATTAAACACACACCTCTCGGGAGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1959650_1960157_1:0:0_1:0:0_2c23f/2
+CAGCCTGGCAAGGACCCTCAACGAAGCTTTTGTTTTTACCAGTTCCTATGGAGTCAAAGTGCACCGACCCGAGTATATTGGGTTTCCCTTGAGAGTGTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_486385_486901_2:0:0_0:0:0_1a889/1
+CTTGAGGAAAATACAGTAGAAATTAGCATTATGAAAATGACACTCTTTTCCCAGCCTACTGCTGTCACCCAGTGGGTAAAGTCGGGCGGAAGCTACAAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2497243_2497754_1:0:0_1:0:0_307f7/1
+ACACATTAAAAGTCATACCCACCTACCCAGGGATGGAGTGCTTCATTTGAGATGTAGCTCACGCTAGGAGCAGATTCAATGCATTCTGGCTAACCTTGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2453063_2453517_0:0:0_1:0:0_5328c/1
+AAAGCTTAAAATGGAATTCATTATGCACACTGATCAAATTGTTGTTTGGCGCTCATTTGAATATTGAACAAGAAGTGCCTTCACGCCACTGCAAACTGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_631771_632247_2:0:0_2:0:0_2cc4e/1
+GTAACCCTATGGCAACATTTTATGTTAGTAGCCTGGCTGAGGATGAGGAAATGGTTGTAGCAGGAATGGTCTGAAACTCCTGAGTTACCTCCACAACCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1261671_1262167_1:0:0_0:0:0_9273/1
+TCTTTAGGGCATGGGGATTACATTTGCCAAATGCTTAATTCAGAAGGCGTTAGGGCAGAGGTAGATTATTTTCTAAATAGAAAGAAGGATGGAGTGCACG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_382216_382836_1:0:0_0:0:0_da75/2
+CGGAAGGATATGTGGCTAGGACAGAACCAAGAGGCATTCATTCAGCAGACTCTAAAAACTTATCCTCCTGCAGAAGCCAGGCTGAGGAGAGAAAAGAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_628067_628505_1:0:0_2:0:0_36c4c/2
+AAGCCACCGGGAGCTGATTGTTGCTCTTTGGTGCCGTGTGTGGCTTCAAATCGGGACATGGGTGCACAATTTGTGGGCAGGGCTCATTCTAAATCTTAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1586812_1587228_0:0:0_2:0:0_482b1/2
+GACTAGACTCATGAGGAGGGATCTAACCCAGTTCCTTGGTCCTCTAGCTAGAAATGAGCCAAGTTTGGCCTTGGGTCCCAGATGCGTATCTCTGTTCCGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2272641_2273094_1:0:0_0:0:0_3c16/2
+AAGAAGGTGAGGGAGAGCCAAATTTTAAAATTGTCCAGATACCACCCTTTTCCTCACCATGCACTTCTCGATCTCTACCTCATACCTATGTTGTATATAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2400318_2400747_1:0:0_0:0:0_1a5bd/2
+TTCAGACTGTTTTCACAAAGATCTCTACTACGCCGGAGTTGTTGGAACCCAGAAAAAAAATATTCAGTATAAACTTCCTTTTGCATAATACTATTTTGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_88028_88504_1:0:0_1:0:0_53860/2
+GAAATCTAGTTGTTTAGCATCGAACTCTAGTGCAGGAGAGGTTTTCCCACCTTTTGATGTGGCAGGAAAATGATATACAAAGACTCACTCTCATTATTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1436611_1437126_1:0:0_1:0:0_18e63/2
+TACAATTAGATTAATTGCTTTATACATATAATGGGATCTTTTTCTCTTTCAGACAACAGCCCTGATTAAAAAAACGTCAAGGATCTGTCCCTGTGGTCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1934484_1935003_1:0:0_0:0:0_219c9/1
+TGACATGGATTGGCCAGTAGCTGGGCCGAGATGTATTTCCCAAGACCTTAATTTTTTTCATCTGCAATGCTCCTGGTTTTTTCTCTGAGCAAGACCAGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_204427_204856_0:0:0_1:0:0_1cd50/2
+TCTTTGCGTAGAGGGAGTTTGTTACATCCACTTAAATCTCAAAGGGGTCCCTGTGATTGGTTTAGTGATACATAACCTTTTTTTGTAGAATGTTGAACCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1607121_1607504_2:0:0_0:0:0_28870/1
+CTACAAAAACACATACATTAATTCTTATGTGACCATTTCCCCCCAGTTCATCCACTTAATTTGGGAAAGAAGACCAATATGTGTACTCAAGTAGACAGAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1462729_1463152_0:0:0_4:0:0_30d17/1
+GGCTTTGATGCCTGTCACCACTGCATAGGCATGTATCCCTCCTAAATGCTACGAGGGAACCTCTCTCTTGGCCTCCCCTCCACCCCGTCCTATTCAATAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_344906_345404_1:0:0_1:0:0_40438/1
+TTACAAACAATATATATGCACTGCCTTGCCGGGCTTAGCCAAAGAAATTGGCATGTTGGCAAACCCCCTGCCGGGCTCACACCCGCAGGGGAAACGAAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2099960_2100451_0:0:0_1:0:0_2753/2
+AGCCACACCAACCGCTGTAACCGCATTTTAATCTGGCTGTCCCGTTGAACACAGAGAATCATTATTTGAAACAAAACAAAGGCCCAGCAGGGGAAAACAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_151907_152331_2:0:0_1:0:0_18cbd/2
+TTGTGCAGTAGCTGGCCTGGAATGAAAGGAAAAACAGGCTTTGCCAGGAAGGAAAGGGTTGATTATTTCTCCAAAATGTTTATAGCTTTTAGTCATTGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1636997_1637492_2:0:0_0:0:0_2cfeb/1
+AAATATATTTTTCCTTAATGACCCCCATCTACAGTGTTTTGATTTTTTTTTTGAAATTATTCTTTAACAACAACTTCAATTATAAGTGGGCTGGAGGCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1967982_1968344_1:0:0_1:0:0_c16b/1
+ATGCCAAGGTTTCACAAACACAAATTAATTTCCTGGTGCCACCTTCAACCTCCCAGCAGTTCCTCTATTCACAAAGGAAGGAGCTAGCAGAGGAAAGGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_663467_663926_1:0:0_0:0:0_9ff6/1
+CAAAACTTCTCACATAGGGACAGTTTATTTTCTTCCTACCCATGGCTGGTGGTTTCACCCTCTCCTGCCCTACCTACATAAACAAGAAGGGCAGGGGAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2308309_2308693_1:0:0_1:0:0_34119/2
+TACTGCCCTCACCCCCAAGTAACTCTAGACCCATTTATATACTCAGAAAACCCAGCTGCCAACAATTATGTCCCTCAGTGTCTGTGCCCGGTGGCTTAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2402578_2402962_1:0:0_1:0:0_135a9/2
+TTGGCGTGGCCATGACAATTTGCTGCGGGTTCAAGCCACTATTTCAGTAAAAAAAAAAATACACCTGTAGGCTAATTAAGTCATAGGATGGCTTTGCAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1892534_1892970_1:0:0_0:0:0_55b8f/2
+TTCCCATCTTCCTGCAGCGAGCCTGGGCATGTATCCCTTTTTACAAAAAAAAACCAAGCTCTGGGAAAAGATTCAGCCAATATGCTACATAGAGAATTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2317056_2317446_1:0:0_1:0:0_4159b/2
+TGATTCCGGCAGTGGTAAGGCCCCGCCCCCAACTTGTGGGTGCTGGGATTAAGACTACAGGAGGTAACCCATCACATACCTGGGCAAGATTCCAGATTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_260620_260981_2:0:0_2:0:0_4a649/2
+TTTCTATAATAATGAACCTTAGCATTAGCTACTGTAAGTATTAGATTAGTTTTTGGTCAAAGGAGGGTACACAAACAATTTCACATTCCCAGGCTGTTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2452786_2453118_0:0:0_1:0:0_2a149/1
+AGCAGTAGAGACAGATTATATGTTACGCTGTTTTTTTAAAAGAACCCCGTCTCTCTGATTATATTTTTTATCCTTGTTTCATCACCTTGATGGCACATTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_135372_135777_0:0:0_1:0:0_352c3/2
+ATAAGATTACTATCACAGAGGGGGTGGTTCTTCCTTTTCAGTTAAACAACATGGATAAAACATTTGTTCTCTCCTCGGCTCAGCCCCATTAAGGGAAGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_517657_518060_1:0:0_0:0:0_c41b/1
+TCCAGGCAGGTGCCTGGCACCTGCAGAAATGCTATTCATGGGAAAGGGGGCAGACACAAACTCATATTTATTTAAACTCCTTTATTAAATGTCTGTTGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_266162_266661_1:0:0_0:0:0_1c8c4/1
+ATGATCTTTGGAGTGGCTCACAACTGTGGGTTGGCCGTCTCAATTATCGAGACCAGCCGCCACTGCAAGCTGAAATGATCTCTACACATAAAATAATACC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_616911_617374_0:0:0_1:0:0_52083/2
+GAGAACATAGACATTGATGTGTTGACAGTAATTTAAATTAAGATTAGGTATTTCTGGAATTTGCAAGCCCCCATCCGTTTGTTTTTAACATTGAAAGAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_496472_496955_1:0:0_1:0:0_403fd/2
+CTTCTAAGCTTTGAAGCCCCCAATCTTTTCCCCAGAGGTGGATCACTCTGTGGCCTTTCCATTATATATAGACTCTTTTCTGAGGACCGGCCCAAATCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_304082_304527_1:0:0_1:0:0_21eb5/1
+CAGATTCAATGTGAGGGTCTTTGGATTACTCCAAGAAGGTCTCAGACTGGTGGCCAAAATACAAGTTGAGTGATCAACATATCTTCATGGAGGTTCAAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1348700_1349035_1:0:0_0:0:0_3150b/1
+ATAGTTTGACACCCACAACTTTCCATACTCATTGTTCCTGAGGCAGAAAGTTATGGTTTGAGGACCTCTGTTCTCATGGAAGAAGTGTAGGGGGTTTTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1689538_1689970_1:0:0_0:0:0_51b41/1
+TGTAATGCTTGTCAAAGCAAACTCAGACTCATACATCAGATGCCTTCATGAGAAATAGAGAATGATGGTATTATTCATATGAAGAGTCAATGTGACAGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2306637_2306994_0:0:0_1:0:0_1cd9d/1
+GCCCCGGGGGGAAATGTCTTAGACCAGTCTCTATGAATTTCTACAAATATTTCTACCTAAATGCATTGAATCCCAGGAAATCTCTAGATCTCAAGCCAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1269730_1270219_0:0:0_2:0:0_2662e/1
+ATACTTATTATTAGGGACAGGAAAACCATAAGACCTCAAAATTTGAGGCAATTGATAATGTAAGCATTACATAAGCTTTTACCTCGGCCTGACCATCTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_633634_634120_1:0:0_2:0:0_3b845/1
+GCTTGAGATTGCCTCCCTCCTCAAAACTGAGGTGTGTGTGTTTTGCCAGCTGGGTAGGTATTTCTGCCCTTCCATTTGAATATCTCTGTTGTTTATCTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1793348_1793795_1:0:0_0:0:0_28fe3/1
+CACACTGAAACTGGCCACAACTCTCAAATTATAAGTGAAATTAGAATTTTCAGCATCGGGGAGGATTCATTTGATAACATACGGGCATGGGGCTCCATCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1593758_1594314_1:0:0_0:0:0_126d1/1
+CTGGGGTTGGCTGCAAATGTTGCAGTGTTTTTTGAGGTGGTGGGAATGGAAGGCCCTGGGATTCCAGCTTATACTGGCCTGTAAACACAGGTGGGGCTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_362504_363042_2:0:0_1:0:0_20095/1
+TACTAGAAAAAAAAAATTTAAGTCCTCAAAAGTTATTTCTTCCCACTACAGACAGAAGGTCCCAGTCTCAAAGCAGAGGTGGGACTTTGGCGAATTTTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1036178_1036501_1:0:0_1:0:0_54974/2
+GGAGCCCCAAAGATGGGGAGTAACTCGCACATGGTGTACACATGGACTTAACTCTTGATAGATCATGAACTCTAGTGTCTTGTCTTCCTATTTGTTTTGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_728365_728871_2:0:0_1:0:0_8090/1
+TGTCAAAGGAGATATTTTATACTTTGACTTATAACTCTCTGTGAGACAGGGCCTATGAAACTCTCTCATTATTTTTGCCACTCCAGCGTCACATTTGGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1420811_1421272_0:0:0_1:0:0_424ff/1
+TACTGTTTTTCAGGAGTTCTAAAACAGCTTAGACATTAGCCTGGGACTCTCGGCTGGGCATAAAAAAATAAAACTTTCTCTTCGTCATTTCAATGTATTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_413892_414423_2:0:0_1:0:0_5c7c/1
+TGAAGAGGTGGAATAACAATCAGCTTGAACCACCCTTGCAAGCTTTTCCTTTCGGTGATTATTGGCAAATGGCATAGATTGAATGTCAAACAGAACGCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1600203_1600528_0:0:0_2:0:0_4fde8/2
+AACAATGTTTTGATTTAGAATTTTTACTACTTTACAAGTGATTGCACTGTGGTGAAGGTGGCTCTCCTTGTTTCTTTCTTCCAAAGAAGTTCAATAAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1481786_1482246_2:0:0_0:0:0_52e46/2
+CCTCCTACAGAAAAAACAATAGTGTAACATTGGGAAATTATTAGATAAAAATGTACAAAATTATTATCTATAAACTGATGAATTGTCATTTCCTTTAGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_729443_729812_2:0:0_0:0:0_41e95/1
+GTAATGCATACTGAGCACTGTCTCTAGGTACAATTACCCAACCGGAAGTGAGCAGGTGTGCCAAGGCACAGGGATGGGGCATAATCAAGCCAACATAGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_613696_614283_1:0:0_0:0:0_1392a/1
+TCCCTGACCCACAATGATTCTCCTGTCATCCCAGCCTGGGCAAACGTGGTGGAGACAGACAAGTGCTGGGATATGTGCAGTGCGATGACTCTGATATATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_803090_803499_1:0:0_1:0:0_2b5b6/2
+TGAACATGAAAATTCCTGATGAGTGCACACATTTCACCTGATATTGATGCCCAATCATTCTAACATTGGGGTTTCACACAGCCTCGGTGCCTCATGAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_261208_261757_0:0:0_1:0:0_9279/1
+TTCACCTGGCTATTTGGGTTCGCAGCCTGGCACACAGGGATCTTTTACACTAGCAGGTGTATCGTGAGATTTTTTGTATTTTTTTAAAGCCTCCCAAAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2135997_2136462_1:0:0_0:0:0_202be/2
+AAGAAAAATGATATTCAGATAATGTATCGCTTACACGCCTCTGTTTTAATTCTGTATTAGAAATATGGAGTGAGCTAAGATTGGATCTTGTCAAAGCAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1312116_1312559_2:0:0_1:0:0_2e7e2/2
+CTCCATCTCAGCCCCCTGGCCTTAATAGGAAAAATGAAGGTGGCTCCCTGGAGTCTCCTGGGATTAGTCCAAACAAAAACAATATTAATTTCCAAAAACC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2470274_2470682_1:0:0_0:0:0_22298/1
+ACCGAGAAAGAAGTAAGATATCTAGGGGGGGGTTGCAAAATGACCAATGCTGATGAAAGCCACAAGAGGATCACACATACTTAATCTCTCTTTAAAGAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2350639_2351027_1:0:0_0:0:0_46e3d/1
+GAAGCAAAATTACAGGTGTTTCTAGACTGAAGACTTGAACTCCTCAGCACAATTAGCACATATTTGGAGAAGAATCAACAATTTACCGGTTCAGTCTTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_301621_302188_2:0:0_1:0:0_2fd0c/1
+GAAACTCTCCCTCTCCCTACACATAGTGTTAGCACACTTATTATTGAGAGCGCTCGAACTTCTACCTATAGCTGGTTCTGAGTTGGACCAGTATTCATTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1622102_1622559_2:0:0_0:0:0_4d106/2
+GAATCTAGCAGCTCTCGAAAGAGACGGGGTTATACTGGACAAAGAAACTGCTTATTCTGCACAATCTTAGAACTTCCTTCACAGAGATAAAAATATTGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_713825_714264_0:0:0_3:0:0_3d642/1
+GGTCCTGACAAAGTCTAATATGAACATTTCCAAATGATATGGAATAGTGAATCCATCTCTTTGGTCCCCAAGGTCTGATACTGAATGCAAATTTAACTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_581316_581815_1:0:0_1:0:0_36979/2
+CCTAAGTTGAACCTAATTGCCAAGACTTACTGTTTCATAGGGTGTGAGAAGGTTCCATGATTCTCCAACTGTGACTAACAAACTTCCTCTTCTATAGACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1856022_1856472_1:0:0_1:0:0_1d284/2
+ACGTTGGCTATCAGTTCAGCTTAAAGGCTTAATAGAAACATTTTAAAAATCACAGGCTGGGGCGGCGCGAAACCACAGTGAATCAGTGAGGAACCAGGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1887383_1887783_1:0:0_1:0:0_35596/2
+CTGAGTTCTCCCAGGCTGTTTATGGGCTTTCCCTGGCCCTTCTAAACTGCTCTAGGTTTTTTTTTGTTCTAGGAAGGCTGAAAATTATCTTACATTTTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_672439_672945_1:0:0_1:0:0_4f684/2
+AGCTCAAGAAGAGCCTCCAGGCTCCGCCGCTCAGTAGTTAATTCCACCTTTTTATACTATAGTTTTTCCCAAGTTTTACTTCAAATCATAGGTCCGGAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2424592_2424967_0:0:0_1:0:0_300d6/2
+GGCCTGCAGCCTCACCTAACTTGATAGATTCACGTCTTTGGGAGCTGCCCAGCCTCCCGAGCAGGAAAGCATCGTGCTTGAGTGGAAGAGAACAGTATGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1731456_1731965_0:0:0_1:0:0_30b2b/2
+TGGACAGAATGAGCCCAGCAACCTCAGAATGGGTTCTTGGCCAGGTTAGAGTTTCCTTCTCATGCATTACTCTTTGATCACGAAGACAGGAAAGGACATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2338742_2339201_1:0:0_1:0:0_24ec1/2
+ATAAGTTATGAAATACTAAGTTCTTAATCTTTATTCTGTGCGAATCCCAGTTTGCTCTGTGCCCTCCTGCCTCACCCCACCTCATCAAGGTCCCGAGCTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_583533_584037_0:0:0_1:0:0_1511b/1
+ACAATCAAAGAATAACTATCTTGAGGACAGAGCAAAGCGATGAGTAAAACCCAGCGGCAGCATCTTGATTAAGGAAGAATGAGGAATAATCCATGAGCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_38654_39090_2:0:0_0:0:0_8ecd/2
+GCCCTCTCCCTGTTTCTTTATCTTTTTATGGGTGGGTGTGTGTGTGGCTTGTACTCCGTTTCTATGCACCTGGACGATGCTGCTGTCAACACCAGAAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1009665_1010063_1:0:0_2:0:0_a8b9/1
+TCCATATTCAGATACATATATATATTGGATGCAGGTGTGATGGGCTCCAGTTGCAAAGTAAAAACTGCTTCCATTTACATACTGGGAAATTCTCCTAAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_627772_628280_0:0:0_1:0:0_4249/2
+ATCCTTTCAATATAGAATTCCCTTTAAATGCAATTTCAGCTGTTGGTCAGCAATCCTGACATGAGTGTTACATTAGTGCAACGTCAGATGGTCTGAAGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_813967_814450_1:0:0_0:0:0_1effc/1
+TGAAACACCCTGCTGCAGGTCCTCTCTTGTTCTGTTGGTGGCTAGAAAAAAAAAACTGCACTTTGACACTATTAAAAAAGCACCCAGAATTGTACATGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_237732_238238_1:0:0_1:0:0_3c34c/2
+CCACATGAATATTATATTTCTTTCAGCTGAAGCTTGCAATTGAAACATTTGGATTCTAGCCTTAACTTCCAGGCGTGAGCTAGAAAAGATTTGGAAGGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_957824_958221_1:0:0_0:0:0_1b197/1
+AAGGAGGCCATTCATTCTGTGGAAGAATGGAACCTTCGGGTCGGCCTCAACGTCATTATGACCTCCTGCCTCCCAAAAGGCTTCTTTGTATTTTTGATTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2448032_2448394_0:0:0_1:0:0_24977/1
+TTCCGCCTCCCTGTCTTATGAAGGCCTTTTTCGTTTTACAGTTTGGATAGGTGAAGTTGAGCCACCATGGTGTGTGTGATTGACCTTTCTTTCCTTGACC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1571769_1572206_0:0:0_1:0:0_3fea8/2
+AAAAATATCTACCCCTCAGCATCCTCTTGCCTGTAAGAATCAGAGAGAATCCTCTGGCTTACATTGGTCTACTCACATGGCTTTGAAAATATGCTTCATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1406176_1406631_0:0:0_1:0:0_3f1cb/1
+TTTTTAGATGTCTCTGTTGACTTCCTCCAGAAGGCTGGTGTGTGAAATTTTTTTAAATATTTGCAAAAGTGAAGAATCTAGATTTCCTGTTTGGCTTGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2457695_2458175_0:0:0_2:0:0_4d0df/1
+CCACACTCAATATACGAACACACCCACCCAGCTGTGTACTGTTACTCATTTTCCAAAACAATGTCTAATAAACACTAGACTTTTTACTAAACAAGTATAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_279428_279779_0:0:0_1:0:0_2dc7d/1
+TTTCTCAGCCCTGACACGTCTGCAGCTACTTCCCGAGTAGAACATTCTCTAAAAATGAGAATCAGAAATCTATGTACACAGTGTCTAGAAACTAATCTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1028592_1028913_0:0:0_2:0:0_18562/2
+AAAACATTTTCAGTCTGTCTTCATATACATGATCCCAATTCTTGCAGTGAAACTTTGTGAACAAAAATAGCTTTGGCTTCAGCAATCTTTCCATCTTGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2324118_2324579_1:0:0_1:0:0_34349/1
+CCTTTTATGGACAAAGATTGTACACTGATATTCTTGTCGCCTGTGTGTGTGGTGGGTCAAGCAGAGGTAGAGGAGAAAATAACCTTGTCGTTGTGATCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_260073_260521_0:0:0_1:0:0_2a6af/2
+TTGCTTCTTTTGCATGCTGAAGTTCTCAATAGGTATCTGCCTGCTGGGTTCATCTCAGGAGGCTTGATTGATTGCATTGGGTAGGGAGCAAGGGGAGACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2494669_2495126_2:0:0_0:0:0_3a065/2
+ATTCTTTTTACCTGACCTGCCACTGCCGTACGTGTCTTTTGCAACTTGGGCATTGTCATGCGACTTGAAAAAAAAATCCTGAAAATGCATTCGATTGCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_181903_182343_0:0:0_1:0:0_295e3/1
+AATGGCTGGAGTGCACACTATATGTATAAGAGAAATAAATTATTGCTTTTGCTGGTTTTTCATTCTCTTAAGGATCAGAGGCATTATTAAAATTCATCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1025082_1025513_1:0:0_2:0:0_41e01/1
+TTTTATTATTCTGTTCCTTTTTTTCTTGCCAACCTAGCCACGAGGAGTTTTTCTTTCTAATAGGGGCCGCGGCGTTGACTTCTGATTTGAGACCAAGAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_663409_663790_0:0:0_2:0:0_72c7/2
+CAGCAGGTGAAACAAAAATTTAAGAGTGTGATTTTGCTACAAATTTTATGTATATACATCATTTTATAATAATATTAAATATCTCTCACACAATCTTTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_217007_217459_2:0:0_3:0:0_2bf1f/1
+ATTATAGTATTCCTCTGTCTCCAACCTCGACCACCGCATGCCCAGGCAAGACACAGGAGCAAGACAGCCACCAAGTATTGCCGAATGTTGTTTTTTTTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1967900_1968388_2:0:0_1:0:0_5f78/1
+AGTGAAACTTTTTATCCTTCCACAGGTGTGGGATATTTACTATGCATAGTGTGAAATAGAATTCTAGCGGTTCAAGCATCTGATGCCAAGGTTTCACAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1327965_1328498_0:0:0_1:0:0_30f6a/1
+GGTTATATTGTCCCAGCCTTTAATTTTTAAAATGAGCCACAAGGATGTGTCCAATAGTATGGCCGGGTTTCTGAGCAGTTGAATGTAAATAATAAACCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_599000_599392_1:0:0_0:0:0_536a0/2
+TTGCGTATTTACATTAATTATATCTGAGATTCCCTGACCCTGGGACTGGCCTCCTTAAGATCTCAAACTCTTCCCTTTGCAATGGCCACAGCACAGAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2374759_2375160_0:0:0_1:0:0_5a540/2
+ATTCAACTCATCCTCCATCAGAAGTTTTGAGCAGGTTCAGGAGTCTTGCCAGGAAAATAAATAGAAGTGTGTGTTTACTTTCACCAGCCTGAAAGAAACC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_901586_902029_0:0:0_0:0:0_27870/1
+TTCAATTGATCACCGTTGTCAGAGACCACTCTCACAGTGGTCCGAGTGTATCACATTCGACCCTTTCTATATTTTGATCTGTTCTTTTGTTCGTCGATTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_97400_97833_0:0:0_1:0:0_28c83/1
+ACTCTTTGTACTTTTTAAATGGTACACTAAGCGCTGGGCAAGGTTGCTTTCATGCCTCATTAATATATAAACTGAGTCTTTTATTTTTAACTTCTTGATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_674175_674677_1:0:0_1:0:0_ab21/1
+ATCTTCTACTCCAATCATTAAGCGATTCGACATGAGTGGTGGTCTAGATCTAGATCATATCTTAAAGTATTTTGAATTTTGTGAATAGTATTTAAGGCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1683862_1684268_1:0:0_1:0:0_1ffec/2
+TGTTTAAGGCACAGGTGTGGTCTTGATATCACCTCTGCCATTGAATATAATCTTGGCTTTCAATTTTAGAAAAAAAAAAAAAGGGAGGCTGGGAATAACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1151977_1152443_1:0:0_0:0:0_20051/1
+TTGTTTGTCACTGTTCCAGGCTGGAAATTGCCATTTTATTATCTTAAGGTATCCAGCCTCTGCTGTGTGGTGTACTTTTGGCCTCTGTGACTGGTGGCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_457717_457988_1:0:0_1:0:0_223d/2
+AATAACCAAGCAAATCAATTCTCAGGCAGTCACAGTAAAAGAACGGTTGTGCTATCTGAACGTCTTCTTTTGTTTTAATTCCATGCCTTTGAGATTTTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_381519_381954_1:0:0_2:0:0_2f393/1
+GAGTAAAACCATCTTATTTAGAACTGCACTAGAATCTAGGCATAGTACAGTAAGGAATTCTACATGCGCCACCAGAAAGCGCAGTGAGACAGAGCTGTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2465682_2466110_1:0:0_2:0:0_32225/1
+GTCTGGGTGCAGCCTCGCTTCCTCCTGGGCTAGCTTTCCAGATGTGGTCAACACAATTTGGGTCAGGCCACCTCATGCTCCCCAAAGGACACAAGAGTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1795521_1795948_1:0:0_1:0:0_2a074/1
+ATTGAGCCTGAAAGTGTTTTCCCTGTGTGCAATCAAAAAAAGTCAGATTGGTGTGTAGCACTTAATGTTTCAAGGGGAGATACTCACCGTGGCATGGTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2209420_2209845_1:0:0_1:0:0_263c4/2
+ATTATTTTCATCAAAAGTAGTGGTATGAAAAGGCATTATATTTCTATATATTCGTTGTCGTACTGGGCTCCTCTGCAGGAGATATCCCGATACTGTCTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1262534_1262958_1:0:0_1:0:0_1ea32/2
+TTCTCTTTACACTTACTCTAACGAAGACAACCTATGTAGAATTATGTACTGAGTATGAAGGGACACTCATAATAAACACACATCAATGAGCCCTGGCAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1841348_1841881_0:0:0_1:0:0_953d/1
+AAGAGGGTTGATTGACTATGGTGACAAAGTTTGCATTTATAAGATTCTTCATTCAGGATGGAATAAATATACCTCCTGAATTAATCTACATTTATTCACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2448707_2449170_2:0:0_1:0:0_30f7a/1
+GAAATTTTATGAAAAGCCAGGCACGGGGAGGTTGGAACCAAGAAGCCCTTCCCACGAGTCAATTATGTACAAGGAAGGCTAAAAATAATGTCTTCCAACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2184891_2185401_2:0:0_1:0:0_3104/1
+GAGGCCTTACACCAGACATCTGGCTTTTCATTTTGTTTTTATGTTTGCAGCCCAAGCAATTCTTTCCATTTAAAGACAAGGATGATGCTGTTTGTTGGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_260118_260576_1:0:0_0:0:0_26ba/1
+CCTGATCCTGACCATCCTCCAAGTGTTTGTTTCTCTATTTACCACCAGCCGCGTTTCTTGCCTTGGCTCATTGCCTACTCCATAAAATGAAACTTTGGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_870293_870781_1:0:0_0:0:0_5641f/2
+AAGCCTCCCATAGAACTTCCGCATAATCTCACAGCAATTTGGCAGGAAGACTGGAGATTACAGGTATTCTTTACAGGTACCTGAGAGCTAACAATGTGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2068082_2068578_0:0:0_1:0:0_5a6e4/1
+TGGGTATGAGCTCCTTTGAATATCGAGAGAGAGAAATTTTAAGCAGAGTGAAACTGAGAAGAACGTTGAGGCAGGACGATGGATCACTTGTGTTTACAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_215152_215584_1:0:0_0:0:0_101a1/1
+CTTCTGTTCCCTCTTTATTCAGCCATATATTTCAACTCAGACTGAGCCCAAGTTCTTTTAAGTTGTCAAAGAGGAGTTGGGATTCTGTTTTTACAATTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1792183_1792593_1:0:0_1:0:0_195ca/1
+CTTTGACATGGTCACCCCTGGGCAAGATGTGTTCTAAAAAGAGTTAAAGACAGATGCTATTAGAGAGAGAAACAAAAAAAAGGCTAGGCATGATCACTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1528818_1529191_1:0:0_2:0:0_47462/2
+TTGCTGGGACCAGATCAAGAAAAGCGCAAAGGCAAGGAGGGGCTGGATCAAGCTCCTGCCCTCCACCTGTTCTGTTCCAGAAAATCTTAGAAAAATTTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2306999_2307429_1:0:0_1:0:0_34d0e/1
+GTACAGATACAATCAGGAGAAATTATCATACATGTCTCCCCTCACCTTAGATTGCTTTTATACATGGTGGGAGGTTCATCATCACAGCTGAACAGAGCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_710227_710688_1:0:0_1:0:0_2db8a/1
+TCACAACTAGAATCACTCCAGAGCGGCCTCTAATTATTACAGAACCACACGTATGTGACCTGATGATAATTATCTTTTCTGCCGTCAATTACAGGCCTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1312961_1313345_2:0:0_1:0:0_2f1b1/1
+TCCCTCACTAAAGACAGGTGTACAGCTTCAAAAAAAAACAGGACCGATGCCTGGCACTTGCTAAAACTGGATATTTGGGAACAGCATGAGACATCTGAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_398238_398634_1:0:0_0:0:0_2af76/1
+AAGCCCTCCAACCTAAATGATATCGAGGCGGATGTAGCCATTTCAATTTCTAAGTTTCAACTGTTTGCATATACTATGATTGCTGGTCTTTTTAAATACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_505312_505677_1:0:0_0:0:0_46732/1
+GTAAATCCAATTTTAAACAAGTTTTTTTCTTCATTAGAGCACTATTCAAATGTTGTCAAATACGTAAGATAGTTGAATGTTAATTCAAATTGATTATGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2101422_2101795_2:0:0_0:0:0_5b05c/1
+CACTTTTGAAATAGATCTGCTGCTGCTGAGGGAGGCGGGAGGTAAATGATCATGATTCTTGGGAGGGGACATGATTTTCTTACTTGGACCACTCTTGGAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1753214_1753672_1:0:0_0:0:0_d97f/2
+CTACATTGGCGTCACAGACTTGATAAAAACAGACAAGAAAACATCTCTATATTTAAAGTCTAAATCTAATACACACACAAAAAATATGTAGACCCAGGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1520853_1521313_1:0:0_1:0:0_a2ce/1
+TCTAACTTTTTACATTTATTTAGATTTCTGTCATTTCAAATCTAGAAATTAAGCCACAACGTGTGGTTCAGCTTGGTCAGAGCAGGTGTATATAAACAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1152791_1153172_0:0:0_1:0:0_153af/2
+ACTCCTTACTCTGAACTAGTGATCTTGCTTTAATTCATTGAAATTCATTCACCATTATGAAAAATGAGCAGGCAAATTTTTGGTCATGCAATGTCTACTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_85290_85763_1:0:0_1:0:0_38fe0/1
+GGAAATAATACAGGCTGTATGCAACAACAATAATCAATTAGCGAGACCCTATCTGCACTTTCTTTGGAAAGGAGAGGGTATATGTCAGGAGGGCAGAAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_556993_557362_0:0:0_1:0:0_3cba6/2
+TATATATATGGTCGGGTCAGGCCCACAGCCTGTTCTGCAGTCAGTAGTTCCTGTGTTTCACCTTTTCTTTTGTTGGAGCCTAGTTTAAAAGTAATTTGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_750377_750927_0:0:0_1:0:0_21bf5/2
+GTGCAGTGCTTTATCCATGGGTCTGAAGAGATTCCCTCACTGATGTTGATTGTGCTATGAGGCAGTGAACAGGACTTTGCTCCCAGCTAGTTAATACTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1465842_1466396_1:0:0_1:0:0_816d/2
+ATTAGTTTCAACCCTGAATTTGAAACCCTTTTGGCAAGACTGCGCTGGGATAATTCACTCCAGCTTACCATTGAACGAGTCTCTCCATTGCAACTGGAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1670092_1670525_0:0:0_1:0:0_3ea09/2
+ATGTGGCTGCAGTGAAACCTCCATTCCTGATAAAAAACAGATGAAGTCAAGAAACCAAGGTGTAGTAAATATTTATTTTAGATTTCCATTTGAAAACGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_939131_939541_1:0:0_1:0:0_26eac/1
+GTGGGATTTTTGGGAGTCTGACTGCAGATGTTGCTATCAAGTATTCTACCATTTGAGTCAGTTCAAGAGTCTGGAAAGTTTCTGTGAAATCAGGGTTCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_303582_303923_1:0:0_1:0:0_3f15e/2
+ATTGGAAAGAGAGGGTCTAGTTCTGATTCTAAACACTGCACTGATACTCTGCAAGGTAAGACAGCCTCCCGAGTTGCAGAGCGGAGACACCCCCAGAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_935816_936259_1:0:0_0:0:0_2887c/1
+GTGTCCCCAACAGAATTAAAATGACCTATCTACAGAAGAACTTGGAAACATTTGGGAGGAGTTTCCCTAATGCATATTACTTTTTGGCAGAGATATAACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1483457_1483901_1:0:0_0:0:0_4ca2c/1
+GAGAAAGGTAATAACTATTTTCCAAAGTAAAGACAAATAAGTACAATATATATCTTTATTTCTAGACAGTTTATGCATATAGACAGAGCCATAATTTTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2489787_2490233_1:0:0_1:0:0_499dc/2
+TAATTGCATCTTGAGCTCCTCGTGGTAGAAATTCAACACAAAATCCTAAAGTGAATTTAGCCATCAGACTGTCTTATTAATTTTTAGAAAGAAAAGAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1113288_1113680_2:0:0_1:0:0_2e94/2
+GAATAGACTTAAGTACTTAATGTGCCTGGAGGCAGAGAGACAGAACACCAGGGTGACTAAGGGCATAAGAGTAATGCCATCCCAAGGTGCAGGCTAGACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1309970_1310376_0:0:0_1:0:0_7c3b/1
+TTATGTAGGACACTTCACAGCAAAAAAACACTTTGGATAGTCTCATCCACCAAGGGCACGCCCTGTGTCCAGCAAGCAAACTGTTTTGAGACTTGACACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1825815_1826244_2:0:0_1:0:0_44e3b/2
+TGACAGAAGTGAGATAGTATCAGCATACAGCATCCACCAGTCACCTAAAGACAAGGCATGAATGAATTGAGTAAATTTGTTTTTGCAGTACCAGACTGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_280903_281323_1:0:0_1:0:0_3a821/2
+TCTACTGCAACCTCTTGGGTACTGTGATCATCTCCTATGTGCCTGGTGGGCTGAGCTTATCGCTGTTGATAGGGAGGCAATTCCACATTATAGGCAGAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2284972_2285345_1:0:0_1:0:0_4503c/1
+TAGGCAGGGAAAAAAGATCATACCAATTCATGTGGAGCTCAAGTTCCAGAACCAGCACCGCCACTGCAACCAGAATGTTTGTTGTTCATTCTAAATGGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1076712_1077255_2:0:0_0:0:0_315db/2
+TTTATAATATTTAATTAACTGAAGTTATTTTAAAGATGCAGTTTTGGGCAATCAATTTCTGCATCCGCTGTCGAAGGTCTCGAATATTTTTAATACAATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_331127_331583_3:0:0_1:0:0_6163/1
+ATATTGGTAGCGATAGAACTTAAATTGTAGTTGCCTTAAGCAATAAATGGAATAATTAGCCGGATCCCTGGAATCAGAGAATGACTTAGCATTTTCAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1545153_1545583_0:0:0_1:0:0_38208/2
+GGAACAGTATATCCTTTCTTAGAGTTAAATTGTTCCAGGCTCAATTTTCCATTGAATATGCAAGTTATCTCTCTGCAATGAATGGCAGGGATTGGCAGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1448931_1449411_1:0:0_1:0:0_2c570/1
+CTAGTGCATGGCAATAGGTATCTATTTCACCAGTAAAAATCACAGCTCTGAATCTGCAGGGACAAATGCTTCATTGTAGCATTTTGTATCCCAGACGGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_727256_727775_1:0:0_0:0:0_3b121/1
+TAAGGAACAAGAAAAAATTGACATTGTAAATGGACTTTATCTCAAATTTATTGCTTGCGGCTCAAGGAAATGCTTTTGTAAAAAGAGGATTCTCTAATAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1438551_1438961_2:0:0_1:0:0_3d48/2
+CCTAAAGTCTTCCTTGTTGAGTAGATAAGATGCATTTAAACCATTGTCTAACAAAATCAGAAAAAAAAGCTTTCTTCTCACCTCCAAGCGTGGTGGCTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_947423_947920_2:0:0_0:0:0_3765c/2
+ATAAAACATGATTACAGGTAGTGTACACATTTAACCAGGAGTTCGCCAGAAAATGAAATAGAAGGATTGTTTCCTTGTAAAGATAAAGGAGGCAGGACTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2246270_2246641_1:0:0_0:0:0_1ccfb/2
+TTCTTCCTTCTCTGCAACCAGGCTCTCAGGGAACTTTCTGAGCATAAGATGAACTCACTGCTTCCAGTGAGGTGGGGTTCACAAAGGTAGAAAACAAAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_540921_541353_1:0:0_0:0:0_12089/1
+GAGTTTGCACTCCAACCCAGGTAGTGACCCCGTCTCTAAGTAAATGCTTCTGGATGTATATAATTTTGTAAGGTAAGTTCTTGCCCAGGCTGGGAGGTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_923955_924372_0:0:0_2:0:0_37e81/2
+CAAACCTTAAGCCATGGACCAGTTAGGAGGGGATGAGAAAATACCATCTCATTTGTAGATGGGGTGGTGGCGGGCATATTTGTCCCCATAATTTCAGTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_185526_185922_1:0:0_1:0:0_163e3/2
+CTGCTTAGTTTTAGGTAAAGGGAAAGTGACACCCTATAGACAGTGGTTTTAGTTAAACTAATCTCCAGAAAAACATTCACCCTCACATGTGGTGATTAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2461457_2461897_2:0:0_2:0:0_25dde/1
+CCACATGAAAGAGACAGGAAGGGCTTTTACAAAAGAAGTCGGTACAAACCACTTTGCCTAGAAAAACCACTGTAATGCCAGCTAAAGTACTGACCAGAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_281701_282183_1:0:0_0:0:0_15856/2
+ATGCATAATAATTTCAAAGGATGATAAATTACCCTACTTATTCTTGCTAGAATCACTAGCTGGGTTCCACTCAGATTTTTGCCCAGGTCAAAGACAAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2267713_2268134_0:0:0_1:0:0_a3cd/2
+ACATTGCAGCCGTGGGTGGTAAAAGAAAGTGATAATCTTCATGTGTCCTTAGTCTCTAAAGAAAACGGTGGCAAAGATTACAAAAATATGTTGGAGTGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1125709_1126179_0:0:0_2:0:0_596b3/2
+ACCATCTCTCAAATTAGTCCACGTGAGCCAGACTGTGTGTATATACAGCTTTCATCTGTGGACCTTAATCAGCAGCCTAGACCTAAGAACATTTACCGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1264338_1264859_1:0:0_0:0:0_1878d/2
+AAATCATTCTCAATAACTAGCATGTATCTCCTGGGCGAGTAGAGATATCCTAGGTTTCCTGCAACTCAGGAAGAGAAACCTAGCTCCTCCCGGGAGGCGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_698773_699190_1:0:0_1:0:0_487a5/1
+CATGTATTAAAGGAAATACTGCACTCCATTGCTCAAAAGTTTTCTAGGAATGAAGACTAGAATTTCTTCCCTCAGGTGGATATAGTTTTTTTTTACAAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1868866_1869255_1:0:0_1:0:0_46cf4/2
+ATTTAGTGCTGGGAAGGCCTAGAATTATATTTTTTAATAAAAACCTATCTCATTCTGGCATTCAGGTGCCTGGAATGTATTTTCATGGAGAACTTGCTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_473278_473727_0:0:0_2:0:0_1916a/2
+GGCAGGAAAACTGTAAACTGAGTCGAAGACTAGTTGTGTCACTTCGGGTAAAATCCAGAGTCATTCTCAGCCTATAAAAAGCTTATTAAAAGGCAGGTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1234042_1234433_0:0:0_0:0:0_53562/2
+GGGGGCTGAGCTCTTCTTTATTATGCATGT
++
+888888888888888888888888888888
+ at seq1_1796831_1797342_1:0:0_1:0:0_240ae/1
+CACCTGTCTCCTCCCTTTTCGAATAACATTAAACTGCTTCAATATCACCTTTAAAAGTAGCAGAATCAGCAGCAGGTATGTTGTTTTCTACTACTCATGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_219410_219845_2:0:0_0:0:0_2e951/1
+CAAAGGCTAATTTTTTTTGCCACTGCAGATCTTTCTCTCTCTTATTGTCAGGTGCCCCAAAGCGCTTTCATTTACCAAAACGAATATACAAAGTCACAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_682910_683312_0:0:0_1:0:0_19355/1
+AGCAAAAGACTAAAATGTATTGAACACGGTATGACCTAAGGAGACAGAGCATATAGATTATAAAAGACACGCCACCATGTACTAAGCTAAGATAAGGTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2401892_2402372_1:0:0_1:0:0_2f966/2
+TTTCAAGTCAATTTTTCAAAGCTGCCGCCTAGACAGAGTGACAGACCAGCCTCAGTTAGTGTTAGTTGTTGCTTTTCTCAGGAAGACGGGGCCACGGGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1503230_1503704_0:0:0_1:0:0_2cfa1/2
+GTTTGTGCCCTAGGCTGGGTGACCAGACTGCAGCCAAATTTAATAAGTTTATGAAGTGGCCTTTCTGGGGGAGTATTCACGGGGTTTTTAATAGGTTATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2161623_2162110_1:0:0_1:0:0_317c0/1
+GTATGGGGCTGAATTTGAGGACAGGAAGACAGACCAGGCTCCCTTGTCCAGCTTGAAAAGAAAAACGAATGCAGGCTGAAGAAAAGGAGTTACCGCCCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1209503_1209973_1:0:0_1:0:0_211af/2
+AAAAGTTGTGACTTAGCCCCTGCTCTGAGGGGATGGGAGGTTGTGTGTGTTGGAAAAAGAAAATTCAAAATACCAGTATCGGTGGAAACTTAAATCAAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_126462_126891_1:0:0_0:0:0_20084/1
+TGTGAAGAAAGAGGCCTTAAAAATATCTCTGTTCACCATTCCTCATTGATTATATCCACTCAAAGGATCCTGCCTTGGATAATCACTTTTAAATAAATGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_725774_726230_2:0:0_2:0:0_1d6dc/1
+GCAGGCCCTCAGCTTAAAGATAAGCTACTCCCAAATTATTTCTTTAATTATTGTATTTTTGGTTCACGATCTCCGCCAGCGAGGAACGGTATCTACCTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_570253_570688_2:0:0_0:0:0_28998/1
+CAGTAGAAATAGAACCTCCAGTTTTCTTTCCAGAGAAAGGACTTCACCCAGGTGAAAGTCAAAAACAATGCCACCTGCTGTAGTATTCCCTCAGTACGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2305887_2306360_3:0:0_1:0:0_13192/2
+TAGGTGACTAAAAGAGAGAAGACAATTATTGATATGGCTGGTCTTGGCTAAGGGACGAACAAAGAAAGCAGACATGCTAATTGGCTCTGTCGCCAGCAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1035116_1035620_2:0:0_0:0:0_53123/2
+TATAAAGCTGTGTTGTCTTAAATTTAAAATAAGTAGAGGGTTTCTTTTATCCTTCCTGACACACACACCACATGATGAACTTATGTTACTCACATTCCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2337235_2337663_0:0:0_2:0:0_1af5/2
+CAATAATATTTTTCTCTCCCAGCTTCTTTTGGTTTGTAATACTAAAACTTCTGCTAAGAAGTGTGTGCCAGGCTGATTTTACACAAAAAATTTCTCTACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_776319_776768_1:0:0_0:0:0_4b21d/1
+CCCAGAGAAGTAGCTGGGACATTCACTGTGTCAACTCACCCCGAGGGTAAATTTTTGGACTGAGAATGCTTGAAGATTGTGAGGAATGGAGATGGTCCTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2435882_2436419_1:0:0_1:0:0_50da3/1
+TGATCCACTCTGTAGAGTTCGTTGATCTCTAAAGTAATTTATCAGCGTTGGGCGACCAACTCCAGCCATTTAACCCCCTCCTGGATCAATCTATGAATTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1706833_1707299_0:0:0_1:0:0_2b395/2
+GAGTTAAATAATTGACAGTAAAGGAAAAGACATACCAGAGTACATTACGATCAGTTGATACATGTAAATTTTGTGCCACTCTGACCACACATGAGAACTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2013209_2013577_1:0:0_0:0:0_42aa5/2
+CCTGAACTTATTCCTCGAGGCTGGGCATTGTGGTTGTGCTGGACTGGTAGGCATGAGCCGAGGGCATCTTGAACATGTTGGCCACATAATAACATAAATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_796290_796766_3:0:0_2:0:0_29253/2
+ATGCCCAATATTTCGCCTTTCAGTGCACAAACAGATCATCTTTATGTTTTCACCAGTATCTGTTTTCTGGAAGTAGCTGAAACATAGTTAAATTACATGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2220317_2220799_1:0:0_1:0:0_26947/2
+TTCCCAATTTATAAGTCAGTTAGTTGAAGTTGTTCTGTTAGATTTGGACTGGAAAGTGACCTGGGTGTCATGTATACTTGGGACCGGGGCGTGGATAGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_346417_346856_1:0:0_1:0:0_ce58/2
+GATATGAAGGCATGTAATCCCAGCTGCAAAGATTAAAAATGCATCCCACTCAGCACTTTATATAATCATGTATCCCAGAAAAGAACACATATGTAATCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1858590_1858963_1:0:0_0:0:0_23258/2
+TTTGACTATAAAAATAAGATAGATGCCAGGTGGAGATGATCATGACTTCCTCATTATGAAAATATACCTGAGCCACTGCCACAACAAGAGATTAATGAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_737301_737652_0:0:0_1:0:0_509e3/1
+GTCATCTTTATTGGATATGACTTTTTTCACTCACTGGAGTATGAAGGGGAACTGACTGTACACTGAACTTTCGATCTTATTTAAGAAAAAAAAAAAAGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1294211_1294667_1:0:0_0:0:0_42c25/2
+TAGATACTAAATATATTCTAGATCATCTATGTTTGTAGAGTTGGGCTCAGAATTAACTTTGTGATGACACGTTAACATTGTGTTCAGCAGAGAAAATTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2229226_2229711_1:0:0_0:0:0_16329/2
+TTGGGAGGGGGAGGCTGGAGTCATAATTTTATTCTACCAGTATTTTATTAATGTGATATAGTATCTGTTATTCAGTTTTCATCCAATTCTGGTCCTATTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1695920_1696314_1:0:0_1:0:0_560db/1
+CAGCTCGGGCAGCCAAACGTTGGTAAGATTCCTGAGACTAAACCATGTGATAATGTTCATTCTTAATGTTTGGGAGCTATATGGCCACTGAGAAGGGTAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_281563_281973_1:0:0_2:0:0_38ece/1
+TGAACCCCAGGGTAGGACCAATGAAGTGATCAATAAACATTCTCAAAGCCTCCCCCCAGTCAATAGTATATATATGTATATTATTAGATATGATTCCCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2340213_2340701_1:0:0_2:0:0_2f94c/1
+ATTGATTTTCCTCAGGATGGGCAGTCAAGAAACACCTCACCTGCCAGCACATGTTGCCAGTGTAATAGATGTACAAAAGAGGACCTGCTGGGTTTTCTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_313006_313561_0:0:0_2:0:0_4ccbe/2
+CATCCCAAGTCATTGTGGGGTGTTTGGTTCTAGTTGAGACAGAGAGAGAATTAGCCACCAAAAGAAGGGCTGCCAAACAAATTTAACATCTTTCCAAGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1996692_1997071_1:0:0_1:0:0_1c76b/1
+CATGTTTGCAACTTCTTTCATTGGAAAAGGTATATATATGTCTTGTCTTTTGCACAGCACCTGTCCAACGGCGCGTCGCTTTGAGCAGGGTCTGGTTTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1346325_1346665_1:0:0_0:0:0_51274/2
+GCATTCACTTGAATGACCAAAGTGGCAACACGCAGATCAAACGCTTCCCAGGCGTGAAACATCATTCTTCCTTTTGGCAATATGAGTGAATGTCTGGCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1732263_1732713_1:0:0_0:0:0_455d5/1
+TTTTGTAGAAAGATTAATCCCTCTGCCCGGCTTCTCTACTACAGGCTGCACTGCCCCTGACCTCTTACAATGGATGGGGCCTATTTTTCTTGTGGTGCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2232271_2232756_0:0:0_1:0:0_1ccf0/1
+GGATGCTACCTAATGTAATTTTAGGAAGTGAAAGTTCCTTTAGGCTTGAGGTCTATGCATATCTTTATGTTCATGTACCTGGGCACCTGTACGAGCTTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1525663_1526122_0:0:0_1:0:0_eb8f/1
+AAAGTCCTGCGGCCTCCCAGTCTTTATTGTTCCATACAGAACTCACGCCTTGCCTCAGAAAAGCTAGTGAAGATAAGCAATTCACTTTGCTTCCCTGCCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1549611_1549986_1:0:0_1:0:0_16e2/1
+CTATCCCAGTTTTTAGTGGTGGGGTTTCGCCTCCATCTCGGCCCCAAAGTAAGATTATAATAATATCACCTGCACTATACCCTTTGCCAGCATGGCATTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2395250_2395680_2:0:0_2:0:0_51353/2
+TCCCCGTGGCCCCGCGCCACCTGGCCAGAACCAAAATTTGTATGTGGAATCCCAGGGCCCCATTGGTCTCACACCCAGTACTTGCTGTGATGCCCATGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2353349_2353746_1:0:0_1:0:0_3b7bb/2
+CACCATGTTGATGTAAACATAGAATGGGAATATGTAAGAGCTACTTTATAGAGCTAGATGGGCATAATGCAGCTGTACCTGTTAAAATACTCCTGCTGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_759505_759951_0:0:0_1:0:0_177d1/2
+CTGAGGAGAATTTTTAAAACAAACATTTCTCTTCAAGGATAGCAAGATGAGACACCCACACCGGGGATGTATTTTAAATCCTGCAACGTTAAATTGAACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_371808_372274_1:0:0_0:0:0_44686/2
+ACTCATGTTCTTGGAGAAGCACACTCTGACTTTCTGTGGGTCCTCCTCCCTGACCAGATTAAAGAAGTGCTGAACTTCCTTCGCCTCGGCTAACACCAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2013808_2014254_1:0:0_1:0:0_5a81e/2
+CTGTCATCTAGAAGCTATTTTTCAGATGTACACAGAACTAACAACACAGCAAGAAAATCTGGCCCCTCCTTAAACATACATTTAATCAGATACATGATTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2003032_2003389_1:0:0_1:0:0_23c80/1
+CTCTCTGCCCGCCTATCTATATAATGGTGTGAGACTCCGTGGCAGCAATCCATGGTATAGACAATGCTTCACCTGCAAGATAGGAGTTTTAAACTGTAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1214681_1215122_1:0:0_1:0:0_54f87/2
+TGTTTAAGAAGTAATCCTTCGGGGAGGAGTAGTTTTATGTTATATCTTGTGTTCCCCTGGATTGCATGTCATTTACCCTGTCAGTTCCTGTAGGAGCCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1442503_1443004_1:0:0_0:0:0_26546/1
+GTCCATAAAAGAAATTTCATTTGTTACAGTAAAAAGAAGGATAAGTACTGCGTCAGGTTCGGACAGAAAAATACCCTTACCTTAAGAGGAGCACTTCATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2014929_2015420_0:0:0_2:0:0_b19/2
+CTTCTCCTAAACTGTCTTTTAAAACCATTGCTGCACCAGGAGCATGGTCGCGTCTCTGACTGATACGTTGAAGTAGGCCTCTGCCCAATGGTTTCTAAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2138417_2138768_0:0:0_3:0:0_42329/1
+TTTATGAATATAGGTACAATTTTTTTGCGTTGTGTCTTCGTGCTGGTGGGGGCCCGGCCAGGGGTTCTTTTTAAAAACTAAAGACATTAATATCCTGTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2300680_2301215_3:0:0_0:0:0_6a0c/2
+TTGTGTGCTCTGTCATTAAAAATAAATTGAGCATTTAAACACGTTAGATGAGGAGGCAGAGTTAGTTTGCGATCTCTCATGCCTCTCAGAGACATACAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1663562_1663952_1:0:0_0:0:0_4c23b/1
+CTGATTCAAACTGAGTCACCTTGAGCTACTTTTTCTTTTGGTGTACATATATACTCTCAGAATATATTACAGGCGCTGACCAAACTCTAGCCAGCTACCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1987964_1988428_1:0:0_0:0:0_3e3e/2
+TTCCCCCAGTGTTTTTTTAATACTTGCTCTACTAAATAACATAGTTTATAATGGGCCTCCTTCATCTTAGCACTCCCATCTCTTGGGCAACAGACCATGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1411862_1412385_0:0:0_1:0:0_4fbd6/2
+AAAAGAAAACTTTAATTATCACCCTCTTATAAATTATCTGTAGGTTTCTAAACCCAACAAATTTACATTCTCATTAAACCTTAGGAATAATAAGTCCTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1429330_1429812_1:0:0_2:0:0_44840/1
+CTATGTGATGAGTGATACAGGAGAAAACCGCTAGTGGCTGGAGAGCAGGAGATAGATTCTTCATATCCATGGATAGGATTTCTGTTTGTGTTGGCTCAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1960593_1961082_1:0:0_2:0:0_520cc/2
+ATGCCACTAGATGATGGGCTGGTAATCCCAGGGCTGAGAAGGCTGGTTGTTCTATGGCATTCTACAGGGGGCAAACTCTTAACTCAGGACCCGCACTTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1752056_1752506_1:0:0_0:0:0_24f81/2
+CCTGTTGGCCTCTGGCCAGTCATAGGAGCTGAGAAAGAGAGGAAGTGAAATGCAACCTGGTCTCTCTAAAATTAAACTATATCTTGTTCCTTTTCCATTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1106887_1107323_1:0:0_1:0:0_1b69b/2
+GTTGATCTGAAGAACTATAAAATTTTTTATATGATGGTGTTACCCACTGCAATATTTAAAAATCCAGATTTCATACCAATGGAGCATTTTGGTAAACAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_867548_867944_1:0:0_0:0:0_4ea08/1
+GCTACTTCTTGGCTCATGAAGTGCTGGCAGGTGGATGGCCGCACACTATTGTTTTAATTTTGTGTCATTAGATATACCATGTGCAGCCTGCCCAGTGTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_44145_44588_0:0:0_1:0:0_260eb/1
+ACCAGTTTTCCAATTATACACCTGTCAAGAAAAGTAATCCACTGGGTTGTCGACCTCTACTAATTTGTTCAGAAAACTACTGGGGCAGTGGCTAGAAGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_36391_36894_0:0:0_3:0:0_3a676/2
+AAATTAACATCTATTCCCTTTGAGAGCCACTGCAACGTCCATGAGGGTATTCATGGCTCTGCTGGTCGGCCCCAATGTTAGTCCCTCAGCCCAATGGCGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_213054_213549_2:0:0_0:0:0_2514b/2
+CCCATGATCATTCATAGATAGAAACCCTCCCTGAGACCTCAAGCACAGGACCTTTTAGCAGATCGTGAACCCAGCTACCAGCTTAAGACCTTAGCATTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1387664_1388187_1:0:0_1:0:0_1bd8e/2
+TGACAAGTCCTAGGCTGAGCAGCCAGCTGCCCATACCACAACCGGTAAGTATGTGTTCCAGCACAGTTGTGATGTATTGCTTTTTCTCTACCTTCACTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1312895_1313368_1:0:0_1:0:0_48f0c/2
+GCTTGCCCAAACATAGGCTTATGTTTGGCTAAGGCATGGTGGCACACTTACACATAAACCTGTAATTTTTTTTTTAATTTTGAGGCTGGGGCATAATTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2282453_2282933_1:0:0_1:0:0_2eea1/2
+ACATAACCTTCCAATGTATCAGGTACTCAATGGACCCTGTAGTCAATTGTATTTAAGTGTGCCCACACTAAGGCATTTATTGAGGTCTGGGGTCACATAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_771151_771727_0:0:0_1:0:0_2a449/2
+TTAAAGTTCTAGTTATTAAGCCAATTAGCTTCGTATTATATGGAACAGTAGTGTCTCTGTCTAAAGAAGAAACAAAGCAGCGGTAGTTAGAATCGCTCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_901870_902310_1:0:0_0:0:0_5544e/2
+CGTTGAGACTGGGGGAGGTTAAGTTCATAGCAGCAGAGGAAAAGGTGATACTAAAATTTGCCTCTCACATCTCATCCAGACAGCGCTCTGGGCAGTAGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1800984_1801451_0:0:0_1:0:0_4a7c9/1
+TGAAAACCTTTGATGGAGAAAATTAAATTACAAAAATGAAAGCTCACTGACCAGCTCAGTGGCTGTAAGGGAACAATGGCTTCTTGAATGTATGCCATGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1455989_1456493_0:0:0_1:0:0_11edd/2
+TAGGTCAGGTACAAGTTGTAGCAAACCTGGTTAGTTTATATATTCCTGCATCCCTTCAACCAACACCAGTTAACACAATTGCTCCCCTCTAATGGAATCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_703046_703410_2:0:0_1:0:0_3c2ca/1
+CGGGGGTAATCCAAGGGAGGGCGAATGAGCCAAATAATTTTTCATAGGCAAAGTGAGGATGCTTTTTATGAATCAATCATTCACATTCCAAATGTACTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_880886_881261_1:0:0_0:0:0_37904/2
+GGCTCCATGGTAGACAGAGTTGCTCTCTGACCTCGTTGGAAACGGGTGCCCGGCAGCACACATGAATTTTATACACAGACACACACCTCCCATTCTTTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2017085_2017583_1:0:0_3:0:0_13800/2
+TAATGAAAACCACCCAGCGGCAAGTTTATCTTCAGGTACCGACTTACATTTTCTTTCAGTCAAGGGGGGGAGGTTGAATACAAGGTGAGGACTTGTATCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_802358_802779_1:0:0_0:0:0_11d9c/1
+CTTTGCAGAGGATGGCTAGAAGCTTGAACCCACTGCACCGTGGTGAGGAAGTATCACCTGGATGGATAAAATACTCTTCCTATTTTGTCACACTCTGCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_52756_53237_0:0:0_1:0:0_1c2e0/2
+TCTAAAGAAGAATCCTGGATGGAGATCACTGTGCTTTGGTAAAGAGAGAACAGATGTCTGCATATCACTTGATCTGCATGTTGTAGATGGCAAGCAAACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_978803_979242_1:0:0_0:0:0_560de/1
+TTGTCAATATACCTCTCAGTCTGTATTGCAGCAAAGGTCAACCTCTGCTTGAATTTAGTGAAATAATGGCTGCGTGTGCCACCTTAGAGACCCAATGGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2267792_2268164_1:0:0_1:0:0_58186/1
+TTTCCCAGGTTTCCTACAGTACTTCCTGCTAAATTATAAAAATCCTCTCTCAGGCCGAGTTCGGTATGTGTGTGGAAACGGGCAGGAGTTTGTTTTTTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2462428_2462802_2:0:0_0:0:0_f40f/1
+CCATAAAATTTTTTCAGCATCAGCATAGCCTCAGGCTGTGGTGTGCGGTGAGGAGATTCTCCCTCTTACACTCCAAGTATATTTGCCTTCTTCCAGTCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_166664_167088_0:0:0_1:0:0_1ff35/1
+GTGGAACCAAACACATCCAGCTCCCCGGTTTTTTTCAAATGCTGGAGACAGCCATGGGAAGGACTTGAAAGTCTTACAACTCAGCACCTCAGATCCCCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2224240_2224703_2:0:0_1:0:0_14833/1
+TTTTATAGGGGTTGCATGTCGCCCTGGCCATGATGGTCAAATTTGGTTCTGAAAAAAGAGGATTACTTTCCATGTTGGTATTTTAACAGAATACAAAAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1403468_1404019_0:0:0_2:0:0_2c01c/2
+ATGGTGCTGGGCGAGGTGGATGCAAGTTCAATGATGTTATGATTTGAACTACGTGGCAAGAGAGTTGAATTATTTGAGATATATGTTGGCTTCAACTTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_807603_808029_1:0:0_1:0:0_1b496/2
+TACTTGGGATTCTGATTTGGTGGCGTGATGGGCTTTTTTGGAAAAAAGATGACACTGCAACATAGCTGGGTAAGATTATGAAACATCTGTAACAAAATCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2380929_2381377_1:0:0_2:0:0_58aff/1
+CTCTGAACCATGATTTAACAACTCAAGGGCTCCAATCTAAATATCCCAGCTGCATCTCTGAAATAAAAGACCACTAGAAAATACTGCAACCTCCCATAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2000567_2001050_0:0:0_1:0:0_48404/1
+AATTTGTTATTTCTTGTTCAATTTTAGATTGAGCCAATATTATTTGGATGGTTAAGCCCTTCTCTTCATGCCATTCCCTCCTTATTTGGAGAATCAGATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2410329_2410794_1:0:0_4:0:0_36eb/1
+AATTCAAGATGGCCAACACCCAGAACTCCATGACTATAAACAGGCACACACCTGTTACTCCAGCAAAACAGTCGCTTGTTGGCACATCAGTGGAGGATCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_641619_642118_0:0:0_1:0:0_2952d/1
+TAATCTAGATAGATGGTGGTGAGAAAGCCTATCATTAAAAACTAGTTAACTTCAGTAATATATATATCTATTGAATCAGCTTCTCCACCACAACCAATAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_879260_879679_1:0:0_1:0:0_12049/1
+AATTGGATTGTAACCTCTAGTTTGGTTATGCATATATTCTTACTGTTCTTTATCAAGGTCCTGTCCCAGAAGGTCAGTGACTATCTATGGTACTTTCTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1749653_1750120_0:0:0_1:0:0_aaf8/2
+TTAAAGAGGCTCCTGTAACTAAACATGCCTCAGGAGCACTATCTCCCATTATGCTGGCTCACCACTCTCTTAATTAGATTTGTAGCTTCACAAACCTCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1493622_1494059_2:0:0_0:0:0_1dff3/1
+TAAGCTTTAATGGTATTCTGGTTTTGTGATATGCTACACTGGCGTTGTCTTCACAGGTAGGTGATGGTTTTCAGCTCCTCAAGGAAGGTGGCTCTTTGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_936969_937466_0:0:0_1:0:0_67a8/1
+GAGAGCATTTAAATTTTGTGTGTGTGAAGAAATATAAAGGGGACACCCTCCTCACCTTCCTTTACTGGGATTAAGAGTTAGCCATGCCATGATGCTCATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_962662_963175_1:0:0_2:0:0_4ae18/1
+AGAGAAGCTGGATCATATGGAGCACCACCAGTTATATCTGGCCAGGCTGGAAATTATACATTTCACAGATTCTCTTTCTGAGTGTGATCCCAGCATAGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_578706_579238_0:0:0_2:0:0_11255/1
+ACACTGTGGAAGCAGACAGAGGTAACATTTTAATATTATTTATCCATTGAAGGAAAATAAAAAAGCTAAAGATACATAAATAATATGGACTGTAATCTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_832936_833373_2:0:0_0:0:0_43ce4/2
+TTCTGAGCTCAGGACATTTCTCTTCTTAAATCAATATTTTCTTTCTGCACACTGGAGGTTTGGGAATGCAGCTCCCAGCATGCCCACTAGCTCCAGCACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_652842_653312_1:0:0_2:0:0_2393b/2
+TGTAATATTCAGGTAAATCAAACGTTTGTGCTTTTGTTTTATATTCCGTGAATCTTTCAGAGCCTTAACCATTTGTATTATATTAGATCTGAAAGGCAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2096308_2096787_1:0:0_0:0:0_224a5/2
+CAGTACCTGCTTGAGTGAAGAGACTCACCACACCTTGCTCTTTGTATCCATTCATGCTCCAGCCAGGCGTGTATGAAAAATACAGAAATTAGGCTATGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1088552_1089042_1:0:0_2:0:0_5a393/1
+AAGCAGCATTTATCTAAATTATGTATGGAAGGGGCCTATTGGAAACTATATCTAAACAAATTGAAAATAAAAGCCTCTACTCTATGCACTTTTAATTAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1685892_1686310_1:0:0_1:0:0_52550/2
+CGGAACTTTTGAGAAATGCCCTCTGGATCCTTGGTTCCATTCCCATCCCCTCATGCGCATTTCAAACTCCTTCAGACTTCATATAAGTCATTAAAGTTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1336657_1337026_1:0:0_1:0:0_2f13f/1
+ATCCCCAAATATTTGAAAATGCTGGGAAAGACTGAAAAGTACACAGAGGAAGTATATACTGGGCTGGTCCTAAGAATCTTCATTCAGAAATTTTACAATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2341906_2342332_2:0:0_0:0:0_258ce/2
+ACCTCCGGCTACGTGAATATTTTCCCTAAGGAAATACCAATGGCAAAGAGTAAGAATTTCCTCCACAGTTTATATTATTTATCAAATTATCATGAGGAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_166853_167360_0:0:0_1:0:0_1e7bc/2
+TATGCACATGCATTCAGGGGCTCTATATTCAACACAATAGTTTTTGCAGTGACTGTCTGATTCTTTGTATTTCTTTATGAGGCCAGGCTGCACAGTGTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_7879_8363_1:0:0_2:0:0_2dbb0/1
+CAGTAAGTAGTTTGGCTTCGGTTCAAATTTACTTGAACGTCCTTGGCCCAATTGCCAGTGGCTCTGGTGGCTCTCTTTATAGCTGTTGCGTTCCCTCTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_797143_797618_2:0:0_2:0:0_22f64/2
+AGAATAGCTTTTAAATTAAAGCATCTGATAACTCCAGCTTAAAGTTATAGGACAAAAGGTTTGAGCACAGATAACCTCTTTCTAAAGTTTGGCTCATATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_512757_513099_1:0:0_2:0:0_54f8e/1
+ATTAGGGTGAAAACTGATTTAAGAGATGTCCATTGATTAGCTCCACCCCAGAGATACTTATTTTTTTTCAAACCTGGGGCGCCATTGCCAAATCTACTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1929259_1929684_1:0:0_2:0:0_119e3/2
+TATTAAAGGGTGGTGGCCAGGATTGAGACTTCTCATGTAGAGGTTTGAACTCTTGATTAGAATTATGTTAGGTCACATTTGTGGTGTCAAAGAATTATGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2297460_2297897_0:0:0_1:0:0_314da/1
+GAAGACTTGTGTGCCACCCCTTCAGATAGTATCTACCTCAATTGTACAACATGGTTAGGTATATTGATAGTAGTTTTAGTGAGAAGGAGATGGTCACAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2156751_2157279_1:0:0_1:0:0_2d490/2
+AAGATATCAATAATATTAATAATTCCAAGACCTGCCTCCTTTTTTTAGATCTCTCCTGTGCAACCTCGTGCCATACCTTCTCTTCCTCAAGACGCTGCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1551025_1551415_0:0:0_2:0:0_4d70d/2
+ACATACTCAGCTCACTGCAACCTGCCCCCTGCTTGTAGATCAGGCGTGGGAATAGGTAGTTCTATGGGCCATTCCTTTTGGCATATGATCATGCACATAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_805473_805885_2:0:0_0:0:0_201da/1
+AAAGGCAACATACACTTACCTAGATAGAGCAGAAACCCCATCCTTCTTCCTAAGACATCACCACTGTCTTGCTTTTGGCAGGAATAAAGGCCTATGAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_258464_259004_1:0:0_1:0:0_276b3/1
+TTGTGGTACCATCCAGCAGGGTGTCACCCCACTAAAATAATTTTGACTTTTACTGTTTAATTGGTATCCATAATACAATAGCTTGTTTTCTTTGCCCCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_571864_572354_1:0:0_0:0:0_4a6ee/1
+TGGAGTAAGGCCAAGAACTGGATTTTTTTTATAGATGCACGCCCGCCAGCTCTCTATGGCATGACGATGGATTTCAAATAAAAATCTAACGTTTTAGAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_275524_275955_1:0:0_2:0:0_2bcec/2
+GATTTTTAGGAACATTATTTGCCCCCCCCTTGTTTTTCCCAGTAAGAGACAGAGTTTCAGCAAAGGTCTGGCAGCTCCTAGACCAGGTTTTAATTTTTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_192208_192745_3:0:0_0:0:0_52831/1
+GAGATAAAACCTCACTGAAATGATGTGTTTGTGTGTTGAATAGTTCCAGCCTGGGCAGAGCAGTGGCAGAATAGGAATGGCAAAAACAAAGCATCTATTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2035668_2036059_1:0:0_1:0:0_48bb5/2
+GTCAAAGGCACTATAATTTTCTTTGACCAAGGTCTGAGCTTTGTTTGCAATCCATCACTTCTTATCTATGGAGCAGGAAACTGTCTGCTTGGGTCTGGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2280079_2280473_0:0:0_1:0:0_10bb5/1
+GGAGGGGTTGGTTTGAAAGAAAGAGGGTGATCTCTTGCGTTAAGTCAGCTAATTTTAGACCAACCTCTTTTATCCTAAGGACTACAAGAAATTGTTTCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1957629_1958111_1:0:0_0:0:0_dcbe/1
+CTGCAGGTTGACCCCTACTGACTCAGGTGATGCATATGTAGAGCAGTGCAGTACTAAAGATTAGTATTGTTATGATTGTTCCGCTTGAACACATTAGAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1920183_1920651_1:0:0_2:0:0_505b0/1
+GAGTCTCACTCTATAAATGTGCTCGTGATGCATTATGTTCACGCTGGTACAAGTTCTGTACCATCTGTGCCACCTGTGCCAATTCTGAAAAGGTGACTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1866388_1866851_0:0:0_2:0:0_47afc/1
+GAAGAGTCTGCTGTAGATGCCCGGCCCTCCCTTGCCAGAAGAAAGGTTCTGGGATAATTCCTTTCCATATCTCTCCAGCTTGAGCACAAAAAACTTTAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1080208_1080610_0:0:0_2:0:0_4e5fa/1
+GCACTTGTGTGTGTGTGTCAATAAATTGATGTTTAACATGGTGGGACAAGTTCTGGTCTAGAGGATCTCGGCTCACTCACATGGGATGGAACACTTTGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1544939_1545426_0:0:0_1:0:0_44531/1
+AAAAGATCCTAAAATGGGAGAGTTTGTGAGTGCAACTGGCTTGGTAAGAACAACCAGCAAGCTTACCCAAGTAAAAGCAACAGATTTGAGTTCATTACCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1444757_1445275_1:0:0_2:0:0_254fb/2
+TAAATTAATTTTTGGGAGGCTGTTTAATACAAACTGACTTTGTGCTCAGGCCCCCGCCATTCTTCTTTTTTTTATTGGTCCGGAGTGTTAATCTACTAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_32009_32469_2:0:0_1:0:0_a8bd/2
+AAGTCAAAATTGCTCATGATTTACTCGCACGGTGCCAGGTGACTCCAGTTGTTCAAGTAAAAACTTTCAAGACTTTCTGAATAAATTAAATTGATGTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2387471_2387866_1:0:0_1:0:0_27fa1/2
+GCTGTAGATCAGGACTGTAAATGCTTATGTCAGTATGATGGGGGTTGCTCAGAATTCTCATCAATTAACACTGTTACCAGTAATAGTATTTCTCCTGAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2292941_2293348_4:0:0_1:0:0_3dfa9/2
+AAAGCAGTTCTCCGCTGACTTAAAATCAATGGCAGTGATTAAAATTTATCCTTGCATATAAAACAAAAATAAATGTAAGGTCAAGGTGGAAACACTGTGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_277329_277848_1:0:0_0:0:0_2ac57/1
+AGCTACTTTTTCTTTCTCTGTAGCAAATCCTATTTCACCGCGCCCACGCTGGATCTGATGTCTTTTAATTAAAAGTTACATACAAAGCCAGAGTGCAATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2339205_2339574_2:0:0_1:0:0_42d38/1
+TGTTTCATCACCTGTTGCCATTGTATGTTCAAGACCAGCCCTGCTCCTCTATTACTCTTTTTATAAAGTATGTAATAAAAAATTAGCCGTGCCTGCTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1130454_1130907_1:0:0_1:0:0_1f5de/1
+ATCTTTGCATCAAACACTACTACCCGTGATTTCACAAGAGAACTGGTCACTGCACTGACATCCTGTGGCCCTGCCTAGGGTGGAGGCCCCCAGCACAGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_980368_980799_1:0:0_2:0:0_56cf0/2
+ACTTAAGATCCAATAGTGGTAAACTCCTGGGTAGAGAGAGATTTCTTTGTGCTTTAATGATTGATTGTTCTGAGCAAGTTACTATGTATTCCCATAAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2130231_2130650_1:0:0_2:0:0_2bdf7/1
+ATTATTATGAATGGCATAAAGATATTATGAGTTCTTATCTGGATTCAAAGGTAGCACATCCTCATCTCTGTTCACTACGCTTTGTTTCTCTTTTGCTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_893409_893953_1:0:0_1:0:0_27f12/1
+TGGCTGAGCTGCCCACAAAAACATTCCCATGAATGTCCGTGGCTCACTGTGATACTAAACAATATGCTTACAAGCTTCCATAAGGCTGTTGAATGATTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2234883_2235368_1:0:0_2:0:0_55820/1
+CAAAGCATCCATGGCTGGTCTTCCTCAGCCTCTACTGTATGTGACATTTCTAGACACACTGTTATCTTGGCCCTGAAGACAGAAAAACACATAGCAGCGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1291449_1291924_1:0:0_1:0:0_210f4/2
+AGAATTTCATCCCCTGTCTCACATAGAAATAAGGCCAGACTATAGCAGTTTGCTCAGAGAGATCCACCCGAGCCACCATGGGCCAGGGTTCTCTTGATTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1048284_1048747_1:0:0_0:0:0_24e0/1
+AGAAACATTTGAGTGAACCCCGCTAGGGAGAGAGTTTAACACACTTTTTATAGCAGTGTGGCATGAGGGCACATACTGCTGACACTGAACTCAGAAAGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1437923_1438301_2:0:0_3:0:0_493bc/2
+CATCCCTGACCTCTTCCTTTAATAAGCTACATAGACTCTCTGGCCTCCCACTTCAAAAAGGAAGTGTACAGGCCTTTAAAGGCCATCCCGAGTCACCCCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1503578_1503970_0:0:0_1:0:0_4507e/1
+TTATTAGCCAGTAGAGACATTGGGTTTTATTTTGACCCCATTTAGGGGTGCGTTCAGTTACTTGCAAATAAAAACAAAGAAATAAAAAGGCAATATTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_420304_420685_3:0:0_1:0:0_165f9/1
+TCTCACCTCTGCGGAGGTCAACATGTGAGCCTTGCCTTATCCTTGACCTAAATAGTGTATACTCAGAAACTAGAGTGCAACGTCACCATGCTTCAAGCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_762348_762796_0:0:0_1:0:0_21e37/2
+AGGCGATGTTGGTTGTATATTTATCCTTTTCTTTTCTAAATTCTCACATTCCAAACAGTTTGGAACTAGGAGGAAAAAGTTTATTTTGGCATTGACAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_597891_598363_0:0:0_1:0:0_34306/2
+GATCTCTTTCATACATAACATTGTCCTTCCTGCTCAGAAAGAGGAGACACCCAGCTACTAATACTATATCTATTATTACAGAAGACCAATCTAAATGGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1386503_1386938_1:0:0_0:0:0_11b1/2
+TAGGAGGAATGTTTTGCAAAATTATGCGGGGACACTCTGTGCTAAAAATCAATGGAGCTGAGGCCTGGGGATTTCTTTCTGGGAAATATTAGAAATGGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2204140_2204572_0:0:0_1:0:0_59e90/1
+GGATGTGAAATTTCTCTCCTCACAGACCAGCACATAGAGCATTCTTCAGATTATAACTCACACTATTTCTGAACTTACAAATATGGATATGTGTGTGGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_30186_30667_1:0:0_1:0:0_2883d/1
+ACCTAACTTCTAAAAATCAGTGGGAGATATACGCAAGGCCATGCAAGTAAATAAGGTCTTCATTGAGTATGTGGGCTAATAACTTTGGGTTGAATCCTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1143083_1143624_0:0:0_1:0:0_26705/2
+CCAATTATGACATACTGTGGCGGGGTGAAACGACCACCTCAGGACAATTGTTTGGGCTAGTGGTCCAGAAGGACTAGGTTCTTCTCTTTCTCCTATCTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_220385_220805_1:0:0_0:0:0_2f112/1
+TAATTCTTATCTGAAACTCCTGGAATACTTACCTAGGTGTGATAGATCTTGAGGAAATGGACTTTATCCTTATTAATTCATAGGAATTGTAAAAATCACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_525912_526316_0:0:0_2:0:0_95a7/2
+ATAGATAACTTTAGCAGAGTCTCCAGGCAACACATGCTGTTGCCAACATGGCATATAACATTCTTTGCAAAGAAGACAGGCCAATCTGAGGCATGGCAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_571094_571455_0:0:0_1:0:0_4cb64/2
+CCTGTAATGTATAATAAACCTAAGGATGAGATTCATGAAATACACTGTGCCAGACTGGGCGAAACACTTTAATTTTGGTGGGGCCAGCTTGGTTGCAGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_639856_640281_1:0:0_1:0:0_20bb5/1
+GAATTTCTTAGCTTTCACCCACTTTCAAATGTGTATTCAAACCAACATGGGCAATATTTTGTTGGTAGAACCTTCCCTGCCTCCTGCTTCAATTGAGTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_422027_422463_1:0:0_0:0:0_39898/2
+AAAGGGATGTGAAGTGCAGTGGTGTGCTTCCTTTAGTTATCCAGGAGCATATTTGTAAATTTATAACAGATTCCCTGGCCACCCCGCTCTTGAAAGAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2488784_2489224_2:0:0_1:0:0_33aed/2
+CCAGTCTTCATTTAATGGGAAAGCATTGGTAGAATGTGTCTGACTAGCAGGTTCTGACTAATAGCATAGCATAATTATTCAAGCATAAATACACATACCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2353923_2354387_1:0:0_1:0:0_532d7/2
+GGATGAATGCACATGATTGTGAAGGAATCAATAATTGGGTCCCAGCACCCGCCATGCCTAGCTAATAACCTTCTTAGGAGGAAAGCCAGTAACGTGCTAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_602182_602659_0:0:0_1:0:0_44b8/2
+ACTAGCACAGGAAAAAGGAAAAGCAAATGGAATTTTCCTCTAGCTCCACAACCTGGTTTCGAGGCCCCTCCTCAGCTGCAAGCTTTCTGTCCGTAACTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_169971_170344_0:0:0_2:0:0_4be38/2
+CCAAACAATTCTGAGAGGGAAGTCCTATAATCTGGGTACAGCCAGGCTGACAGTTTTGTCAAGTGTATTTGGATTACCAAGAGAATATTAATTTTGTTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1959974_1960446_0:0:0_3:0:0_368c5/2
+GATCACCACTACTTTTTTTTAACATGGAGTGGTATGTGAGAAATCCCGTAACCATGTATTAGGAGAATCAGGGGTAGAATTACGTTTGATTTATTCCATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1979877_1980290_0:0:0_1:0:0_40f85/2
+CTTTCTCAGCCTGATCTCTATTGCTGTTTTACCACGTCGCACCCTTCTCTTAGAAAATTCACAGTTGAACATCTCACTCTGAGTAACAAGAGGGAGCTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_931642_932126_1:0:0_1:0:0_2925/1
+TGTCACTCTTTATTTTAGTGATCAATAAGCAAAAGAACTAAAAAATATAAATTTTTGAACCTGGGCAACAGTGGTAGCCTGGCCCACCCAGATTTCTCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_328866_329307_0:0:0_1:0:0_ba2b/2
+AGAGCGACTTTTGTGTATAGCTCGCTGGGATTTAAAAATTCTGGACTCGGGATTAATTAACAACTTGAGCCATAACACATCTGTAGGCAAATAAATTCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2338459_2338932_1:0:0_1:0:0_15bf7/1
+TGGTCTGGGATAAGCTCGCAAAACAGTGTAGTAATATAAAACTAGCAAAACAATGATAATGACAATAATACGAATGAGAATGCAACTCAGGTCCCCTCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1117484_1117926_0:0:0_2:0:0_4e2c0/1
+AGTAGATGGCCTCCTGGGCATGAGGGCAAATGTCTAAAAACTCATGGAAATATACTGCTCCTGCTGGCAAATGTATCACACACCCTAACTCTTTAAAAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1139084_1139537_1:0:0_1:0:0_32e56/1
+ATTGCTTCATCTACCTTGGTAGTGACATAGTTGATAAATGTATTGCTTGCTCTTCCTGCTTTTTCCGTCTCCAAGACACGATTGGTTGCACAAACAAAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_402051_402534_1:0:0_1:0:0_59818/1
+CCTGTTCATTCTTAACTCAAGAAAGCTCTATAGCAACCTCCTCACCAACCATCTGCTGGAGTGCTAACAACTACTAAGCAGGTTGAGCCGAGTCACTGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_621945_622412_0:0:0_2:0:0_2c8e0/1
+ACGCCTCTTACTTCCCAAATCACCACGCTTGGCTTCCTGTGCTGGGCATATCGTTAGGAGCTTCTATGTACTTGTTTTTGATGCCTCCCCAGGAGGACTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1088865_1089253_0:0:0_1:0:0_feb1/2
+GCCTCAGGGGAAGGGTGACAGGCTGGATTTTTCTCTTCAGGTAAATGTAGGAATAAATTTCCTCCTTTCCAAACCCTCAGTACCACGGTTACAAGTTGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1558148_1558633_1:0:0_1:0:0_4bd61/2
+GCTGTATTTATTCAAGTGGTTTTAACCTTGTTAAAGTATGTGGACAACAACCCCGCTTCTCCAGCCCACGGTTGAGGTCAGGGTTAAGCATCTACAATAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_17054_17469_0:0:0_1:0:0_a794/2
+TTCTCAAAATAACCCCTCGAACTCAAGGACTCCAAAGAAAATGAAGCTATCTATAAAAAACTCTCTCCTAGAAAAGCTGCGAGGAGGATCTTTACAGGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1477048_1477483_0:0:0_2:0:0_672c/2
+TATTGGACATTTCAGTCACTGTAGGTTGGGAACCTTGCCCAGCTGCACATGCACTTATATTTTGTCTTGACCCTTCCTTAAATAATGACCAGCAACAATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2324029_2324496_0:0:0_1:0:0_43f01/1
+TCCCTTAGTGGTGAGGCCATTGTTGTACAGGTAAATTTTGTACAATAGTGGTAGGTGAAATTTAATTCTTTGAAACGGTAAGACCTTTTATGGACAAAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_220625_221119_0:0:0_1:0:0_3bf6c/1
+CCCGTTGCTGTGCTGCTTGGGTAGGGGAACATACTATAGATCACATAAAGGAGTTTCACTTGAAATAAGTCTTGCAGCAAAATCTGATTTTTTTCTTCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1939598_1940077_1:0:0_0:0:0_4ebe5/2
+ATTTTTTCTAAGTTTGAAATCCAATTTCCTCCTCCAGCAGTAGATATGATCAAAAACTCCAGCTCACGCCTGCCTGTGGTTTAGTAGAATATATTGAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2092124_2092649_0:0:0_1:0:0_21215/1
+AATCATGTTAGTGGGAGGGTCAGTCTCAAAGTGTACCACTTCTGCCATTAATTCCCAGAATATAAAAAAAAATAGGGTTTAGTGTCACAGCTAGATTTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_737678_738082_1:0:0_1:0:0_31c77/1
+GAGGGCATGATTGTTGTTGCCTAGAGTGAAACTGATTACAACGGGATTAGTGTCTCAATAGTTTTGAAATCATAGAGGTTTTCATAGTCGATGTGTGCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2226762_2227171_1:0:0_1:0:0_43987/2
+TCATGAGACAATGCACATAAGTTTACATGCAATCTGCCCTTTCATTGAAGATTTTCTTACTACAGCAACAGCAGCGCCCCTTACTTGGAGTGAGATTCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_121177_121666_1:0:0_0:0:0_46dee/1
+GAAGTGGAATATGTTTTTTTTGGACTTGCACTCCTGCCAGATGATCACACTTAATACCAATTATGCTAATAATCAAACAACACCGTGTCATCAAATTAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_273667_274261_2:0:0_1:0:0_40fe2/2
+GATAGGTGTTCACGTTGCCCAGGAATCTATAAAACATCTACTGACCTTGGCTAATAGTTTCTAAAGGCAATCACCTGCAGTTTCACCCCATCATGTGGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_224118_224472_0:0:0_1:0:0_a255/2
+CCTGTAATCCAGGCAAAGCTGCCTTTTGCCTTTGTTTTTCCACATTTGTCAATGATGTTGAGCACGCGCCTGAAATTAAAAGATACAGGCCCTCCACCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2250043_2250522_1:0:0_0:0:0_45e4d/2
+TCCCATCATATAATCTATAGCCCTCCTACTGTTTTTGATATTATGCCACCATGTGGAATTTAAAGATTTGAAACAAAGAAAAAATATATCTTCTTGAGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_719364_719836_0:0:0_1:0:0_382d6/1
+GTGTACATTGGTTCCAACTTTAAAGTCTGCCTGGCCCACCCAGGGCAGAGCTAGTTTGAATTGCACAGCCACCATCCTGGAGATTATTGCCGCAGGGTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_181197_181604_1:0:0_0:0:0_38b8b/1
+TCTACCCATCGGAATTTGGATATTAATATTCAACAATTCTCTTATTTTGAAACAGAGCGAAAGAGAGGGGGCACAGCAACAAGGAGTGCACATTTTGTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1031572_1032043_1:0:0_2:0:0_4cf43/2
+CTCCAGTTTGACATATGCATAGCCATCTTGATTTTTCTTTTTTGGAAACACCACCCTGAGAAAAAGAGGAAAAATAAGATGTGTACGGTCAGAAGGAAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_695690_696087_0:0:0_1:0:0_1ce21/2
+AAAACATAATTAATGTCTGTTGCCCAGCACTTTGCAGTGGGTAGTTCCCTTGCATGGGCTTCCCTTATAAATATTCTAGAAACTCTGTCCAGTACTATTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1587881_1588336_1:0:0_1:0:0_34b33/2
+CTGTGGGATTCCTCTACTACTGTAACCTGTCTGAAAGCTAATAACCACTTCCCAGACTCCATTAGGGCAATGCCCCCGACATTTCAATTTATTCTCCCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1857619_1858071_1:0:0_0:0:0_1a8be/2
+TACCGTGCAGGGCCACCAAACCAATAGGGAGACGGGGTAGTAAAAAATTTCTATACACAGTTACAGACAGCAGTCCAAGTAAAAAACCCCATGAAGGTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1280787_1281311_1:0:0_1:0:0_2344b/2
+GGGACCCCGGCTCAGGGTGGCCCTGAAATATATTTAAAGGCAGAGAGAGAGATTCGTGCCATGGTAAACACTACATGTCTCAATAAAAATGGGGTTAACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_832287_832858_1:0:0_1:0:0_379e7/2
+TGAGTAGTTTTATTTGACAAAGATTTAAGTGCTGGCATAGATTTTGGTCCATTTAAGGGGCCAGTCGAGACACAATCCTATGTAATAATTTGCATTTCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_21283_21733_1:0:0_0:0:0_21585/2
+TAAATGTGATAAATTTAGTGCTGGAGGACCATCTGAAAGAAATATGGATGAGGCTGAGAGAGTGTTAATACAAAAAAAAAAAAACTACCCAGCTAGTAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2327001_2327471_1:0:0_1:0:0_40406/2
+CCCAAAGAAGACGGTCAGACTGTGCCTGTACAACAGTAGAGACGGGTGACCAACACTCTATTGTAGGATAAAAATATGGTGAATAGAGAAACATTATTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1309722_1310131_0:0:0_1:0:0_17948/2
+ATATAGGTGTGATCTGTTTTCTTCCTTCGTCATGAGCAAATGGAAGGAATTCCAGGAGAATGGGATGTGGAAATGTCTACTTTGTTTGTTTTCTACAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1959114_1959512_1:0:0_0:0:0_5b03e/1
+GAAAACAAGAGGGCTCCAAAACTTATTCCTCCCGGGCCTCCAGGCTCCGCCTCGACAAAATTAACAGTAAATTTGTTGAACCTCTGTTTCACAAGGGGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_220154_220587_1:0:0_2:0:0_38abf/1
+CTGGAGAGAAGATGGAGTGATCTTTTATCCTTGAGTTAAATGCCTCAGGTCGGGGCCCTCACCACTACAGAATTTTACGCTTCAAGACTGTTCCTTGGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2448912_2449348_1:0:0_0:0:0_50c34/2
+AAACGGAAAACAAAACATTAGTTCCAAACACAATTGGTGACATAAGTTATGTTGGCCCATGATGACCATGAAAATGCTCTTTGTTTTTTCCCTTAACTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1332460_1332957_2:0:0_1:0:0_3cc53/1
+TCCACTCCAGCACGAGGCTATTATGTAATGAATATGTAGACATTATTTCCTTCAGCTCATGAGCCCTCAGAGTGCAGACAGATAAATAAATCATTTGACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1672567_1672992_0:0:0_1:0:0_11ad9/1
+AAGCTAGGATTGCATATAAAAAAAAGAGTACAGAATATTAAAATATAAGGAACCCTAACCTGACTGTTTTATTTCCACTTTAATCCATGAGCTCTACTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_383102_383629_0:0:0_2:0:0_2a232/2
+TTCTTTTGTACCAATGTCAGTCTTAAAAAATTCAACCTAAGGCAGGCACATCAACCAGTTAATTGAATGTTGGCACATCCAATATTGAAGCTACCAGGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_212933_213378_1:0:0_0:0:0_1b2ec/2
+TAGCAAAATTGTGTCTTTATGCTTTCTGACCACGAAGGAAGATGGAAAAAACTAAGATCAGTAAACAGTGTATTACCGAGACTCCACTGCATGGGGAGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_192621_193085_0:0:0_2:0:0_290f8/2
+GAGACTTGCATAAGGCTCGTTCAACCATGTTAGAATTATTACTCTCCCCCAGCTACGAAAGCAGCTTGGCATGCTTTGTGTGACTATAAGGTGGTGTCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1778916_1779431_1:0:0_0:0:0_1ebf1/1
+GATCCTGGCCCTACAAAAATGTGGTGACTTCAAGTGTCAAGACACAAAGATCTAGGTGTTTGTGATCTCTATTTACTGTGGATTGGGAGAATAGGGCAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1576181_1576622_1:0:0_0:0:0_21f72/1
+TATGTTTATTTCAAAGTGGAGGAGAAAAGTAAGTGGGTCTCAAAGTCACTCACGCCATTTGTGTTATGATTGTTCCTGAAAAACCAGCCCCTGCACCTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2376737_2377171_0:0:0_1:0:0_15748/1
+TCACCCAGGCTACATCTGACAGCATGGTGTAAACAGTGTTGCCCATTGTACATTGGGCCCTTGACTAATCTGGGCATGGTACCGAATCTCTATCAATAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2141935_2142375_0:0:0_1:0:0_103fb/1
+CTCGGCCAGGATTTACCTTGAGGATTTTGTGTTTTTAGAGCTGTTGGCAAGTTATTTCTGATCATTATGTTTATAAAGCCAGGGCGCGATCCGCCCGAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_723729_724170_1:0:0_1:0:0_1576/2
+GGAGGTGCCCAACCAGTTAATACTATCCACTGTAATCCTGTGAAAGGCACTATGGTGAGACTCAGGGTCTCGAACTCCTGGAATCAATTAAAGATTCTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2107947_2108372_0:0:0_1:0:0_1d9b3/1
+GTGTATAGCTTAAAGATAAAAACACCTACATTTTCCTTCACCAGGGCAACTCTGTTGAATCTTCATCCTTAACAAGTTTTTTTCTCAGAGCCTCCTCCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1726267_1726772_2:0:0_0:0:0_23e7a/1
+TCAGACACAGAGCTGAATAGATAGATTCAAAACATTACCTGACCTCAGCTGCAGTGGTGTATGTGTAAAACCAGAATTCTCCAACACTTCTGTTCTATTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2033968_2034385_2:0:0_0:0:0_2961c/1
+GACATCTTGCCAAAAAGAAAAGCTGACTAGCCAGGATTAATTATATAGCCCCTCCCTTAGGGTAGTAAGACACAGGATTCCTAAGTTTTCATCTTCACGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_867876_868317_1:0:0_0:0:0_20392/2
+AAAGGAGCTGGAGTAATTGTTCAGAGGAAAACACAGGCAGGAAGGTATAGACGGGAATAATTCATTAACTTCATCATGTGAATCCTGACCAGTCCTGGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1447177_1447568_2:0:0_0:0:0_445d5/1
+AAAGCCTCAAAGGTTGCACAGTAAAAATCAAGGCTGGTGTATACATTAATCAATGTATTTCCTCTTGTGTTACCATCAATGTCTTTCTGTATTGGCACAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_692595_693047_1:0:0_0:0:0_43bff/1
+GCAATAATAAAAGAAAGGCTCTCCATGCCACCGCATGCATAGGAGGTGAAACTCATCTTTTTAAGAGCTGGGATCCAAAGGCTCTTAGGAAAGTGCTGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1930182_1930596_1:0:0_1:0:0_11337/2
+CAGCAGGCCCAGCCTCAGACCAAGTTAAGGAGGGTTAAGAGTAAGGTACTTAAGGTGTAACTTTCTATCTTTGACATGTCTCATGCCAGGCTGGTGATGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2405750_2406207_1:0:0_2:0:0_50b57/1
+AAGATGGTGAAGGCAATTGTATGAAACCCTTGAAAATATCAGCGACTCATGGTGCCTGTAACGGAGGTCGGAATCCAAAAAGCATGAAGAGAGGAATTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_254538_254850_2:0:0_0:0:0_4581a/2
+TATAACACCTTTTCCACCCATAAAGGCTTTGCCATTACAGGTCCCGGGAGGCGGGGTGGGGGCCAGCACTGCGCTGCTTTTTTTTTTGAGCTCCTGCCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_872822_873272_1:0:0_0:0:0_11fbb/1
+AGATGTTTCCTCGTAAAGGAACCATCTCGGCTTGAACCTGGTTGGAAGCTGCCTCAAGCTCGTGATCTTTTCTAAAGCAGGAGCTCTCACATGGTACATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1479745_1480279_0:0:0_2:0:0_ffc7/1
+AGCAGCATACCTACCGGTCCCCTAAATGGCGGTGTCAGTTTTGCCACCTTGAGCCCTTTTTAACTATTACCAATCAATCTAACTGTAATTTGGGTATGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_254497_254963_2:0:0_1:0:0_1b05a/1
+AATGAAATATTTACTGCATAAAGTTCTGGAACCCTGTAGGATATAAAACGTTGTCCACCCATAAAGGCTTTGCCATTACAGGTCCCGGGAGGCGTGGTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_993443_993883_1:0:0_1:0:0_19801/1
+CTCAGTTAATGTATATGGTAGGAATTTTTATGTCTCCTCCCCCAAACCTTTGCCCAACAGCTCCAGCCTACAAAAAAAATGAAGGAACTTTAAAACCTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1526303_1526700_0:0:0_3:0:0_a929/1
+TGGGTAGATTATGGAATTGCAGACAGACAAACTCCTTGCTCTAATTTTGGTAGTGATAGCTCACTCTTACTCATCTGTTGCAGAGTTCTTGAGCTTCTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2284696_2285084_0:0:0_1:0:0_59826/2
+ATGATCTTCCCAAACAATCTTCAATTTGATTTTTTTGTTTCTGACAAACCATGTGTCTGTTTTTTTCAAATTCAAAAAAAATCAGGGATATGATTTCCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_663091_663546_1:0:0_1:0:0_28674/2
+AATGCACCTCCTCTGCATTGCCTCGGCACACGCTAATTTTTCTTAGAGATGTGATACCCAGGCTGGAGAATTAAAAATTGACATTATATTCTCATTCATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_253701_254234_1:0:0_1:0:0_40a40/1
+GGATTTGAAAAATTTTTCTGTGCTGCCCTTTAATCATTTATTATTATACAATATTGGAAAGAAACAAAAGCTCCTGGTCTCCGTCTCGAGCCGAAGGGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_378377_378890_1:0:0_1:0:0_1e92c/1
+CTTTCATTTTATGTTATATATGTGCCTTGACTAAGATGTGAGTAAGATAGACAGAGCAACACTTGGCATGTCTGCAAATAAATTGCTTGGAAATGGATGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_671486_671951_1:0:0_1:0:0_5227a/2
+TTGCATTCATTTAAAAAAAAAAAAAAAAACGGTGCCTACCGTGAGCTCTTTTCAATAATAAGATTAAAAAAAATTTGAGACTCCACATTTTTCTCGAACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_992109_992546_1:0:0_1:0:0_1ddf6/2
+TGGGGGACAGGGTTGTTATTACTCTATTTCAAAGGTCCAAAAAAATTAGATTAGAGGTTGGCCCCTTCAAATCGAAGGCTTAAAATGAAAATATACACAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_139978_140426_1:0:0_2:0:0_1b6b3/1
+CAGGTCCTGCCTACTCCAAAGTGTGATTCCCAAGAGCTGAGCTCGTATAATGGAAGAGATCGGAAATAGTAAATAAAGTCATGTCTCCACCCTTACCTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_989248_989720_0:0:0_1:0:0_5a4e0/2
+ATTGCAGAGCCAGTTACAGTTACTTACAATTCGGAAGGAGAGGAAAGGTACCTTGCTTAATGAAAAGCCCCGTCTTCGCCACCCCCATTTTCTTCCCAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1075889_1076259_1:0:0_1:0:0_50cb/2
+TATCTCAGTTTTAAATCTAGCCTCACTGGAAACGCTGGCAGATGGGCAATGAGTATATGTAGATCAAGTTTCAGCGAGTTCGAGCAAGTTCTTAAATGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1030458_1030960_0:0:0_1:0:0_4680e/1
+GTTTCCAAAAGCCATGAAAAAATAAATTGCAGTGAGAGTCAGAGGGGAGTGCGTGTGCGGGCGTGGGTTAGGTTCATTCACTGTAGGTATCTCCAGCATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1765582_1766022_1:0:0_0:0:0_31eee/2
+AATTAAAAGCATACATTTTAGTCAGGAGATTTTATTATGTGGGTGACAAACACACACACACACACCCGGGCGTGAGACTGGCAGTAGAATATTTTGATTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1754848_1755328_1:0:0_0:0:0_55514/2
+CTTGAGTTAGCAATCTCAACTCAATGTGCGGTGTCTGTAATCCCCAAGAAGTGATTTTGGAGGCCACCACATTAAATACATATGCACATAAAGTCCTAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1963652_1964124_1:0:0_0:0:0_22643/1
+ACCACAGATACAAAAAAAACATATTAATATATTCTCGATTTTACATACGATATATGACAATTTTCCTTTTTCTCCTAATTTTTCTTCTTAAAGGAAAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_257375_257786_1:0:0_0:0:0_a5ae/1
+TTTTTGTATCCCCCTATTATTTTTTGAGATTACAGAATTGAACTCACAGCAAAAAAATTTCATACTATTAACCATATGCTCTCACCGAAGATTAGTCCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1157190_1157582_0:0:0_2:0:0_179d7/2
+ACTACTCAGAAGACTACAGGAAATATTCCTTTTAGTAAATTTTATGGCTCATGCTATTGTTTGGGAAGCTGGGCGGGGGCAGGGCCTGAGTAGATTACCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1801090_1801477_1:0:0_1:0:0_3223b/2
+AATTTTCGCTAATTTTTGGGCTTCAAAAAAAAAAAAAGTTTTGTATAACGCTGGGCAACAGCCTGGCCATTATTTGTACTTTCTGATTTGAACAAAACCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1879340_1879772_0:0:0_2:0:0_4c095/2
+TTACATAACATAATTGATTTATGCAACTGTAAAATGCTAGAGACCAGCTGTTACTATAAGTGGAGCATCGAATGAAAATAATTTCAGTATTTTTATTTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2284907_2285383_1:0:0_1:0:0_2c57d/2
+GCCTAGAATTGCTGATATTTGTTAGGTAACAGGAGTACATATATCCATTTCTCACAGAATTCAAGCAAAATTCTACCCATGATCTTCCCAAACAATCTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2318288_2318782_0:0:0_1:0:0_28309/1
+CCCCGAGGCTGACATTTTTTTTTTTTAGAGCTCAGGCAATAATACCAATCCCACATGGTGGAGAATGGACCTCATCACTATATTCCTGCTTTCAGTTTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_857751_858177_1:0:0_1:0:0_3bcb5/1
+GCGCTGATACCTGTAGAGAATTTTCTGCAACTAAGACAACCACATGCATTTGGCAGATATACGCATCAAAGCCAGAAGAAACCCAGGGATTCAGGGGTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2826_3250_2:0:0_2:0:0_474d2/1
+TACTAATTATCTGGATAATGATTCACAGTGAGAAACTAGAAAGAAAATGGTTTTCCCTGCACATTATGTTTATCTTATATACTTAGTTTATTTGATTGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1179774_1180172_0:0:0_1:0:0_32e3d/2
+AGACTGATCCTTCCAGTTTCCAGAGTTTGGAGTTTCCTGCCTTTTGCTTCTGGCATCTTTACCCTTCCAGTCTCAAATTCAAGACTATCTTACCCTGAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_412060_412489_1:0:0_0:0:0_35de1/2
+AAGTGGTGGTCCTTATTACCTGAGGTACCAATAAGGAACACTCCAGGAATACTTGGATGGAGCATAAAATACAGTAGCTGAAAACAATTTAATGCAAATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_659392_659805_2:0:0_0:0:0_4e3f4/1
+ATGGAGGTCCACATGTATCTGCAGAATTTATTATACTTTTCCATCCCCACTCTTGCCAGCAAGGACGTAAAGGTTTTGCATAGAAGATATCCACTTCCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_196920_197401_0:0:0_1:0:0_4fde1/2
+TGTTAACATACACTACGTTTTATTATTGGCCAATTTGAGATATGTGCTAACCTTAAATTTGGTAAGTTATTTTTACCTATCAAATCAATGGCTCACGCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2458066_2458445_2:0:0_1:0:0_394ca/1
+TCCTCCACAGCATAAGTCTAGCTGCCAACTTTTGTAGCGAAACCATAAGGTCATATGAATATAGTTATTTCAACATTCAATCAGTGGTGTGGCCTTGAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1750164_1750496_1:0:0_0:0:0_47661/2
+CTCATGTCTTACCACACACCCACAGATACTAACAATCTCCTTTTCAGTAGGTGACAGCTTGGGTGCATGTCAGTGTTTAAAGTTGCTAAATAGGATTGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1986541_1986976_0:0:0_1:0:0_eff9/1
+AACTTATGTTTGTAACCTGGATTTGGCTACGGGCACTTTCCACTCTGGAAGCTACCTATTTTTTGTGGATGAAGACACCCAGGGCTGGTTATTCTGAATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_593231_593699_0:0:0_1:0:0_42f4c/2
+AAATTATCTTCCCAGTGCCCAAGCCAAGGTAGCTCCTTGGCCGGGCCGCCAAGATCACAGAGTTGACCAAGGCAAGTCTCATCCAGTTGAATCCACATAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1449348_1449790_1:0:0_2:0:0_8161/1
+AAAGAAAGCATTAACATAACATTATAAAAAAAGAAAAGTAAGATTTATTTTCCAATTCATCTCAAAAAAAAGAGGATCCCCGTCAGGCACATTTCCATTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_303234_303697_1:0:0_1:0:0_3de3e/2
+TCTATCCAGTTGTGTGTTTCTGTCTGAGCTTTCTATTCAATGGTGCAAGTGCCTGCAATCCAATGCTAAAGACACGTAGAGAGATTTATTGGTTCCAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_993497_993882_3:0:0_1:0:0_833a/1
+TTTTATCTTTGAGGACAGCCAGGATCTGCAGCTCCATCCGAATTGGCTCCATTCATCAACAAGAGAGAGGCGTTTTAAATAATGGACCTGGTTATGTTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_303535_303957_1:0:0_0:0:0_c2df/2
+TTACATTTCTCACTCTACTCCTTATCTTAAACAGGTGAAACACTCTGTCTTCCTTCCTTTCTAGAGATTTTTGAACTCCTGACATCCTTGCCATTCCAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_605287_605680_1:0:0_0:0:0_3c970/1
+TTGCCTAGGATCCATACTGTGTTCCCAAGATAAAACTTTTGCCACTAAATGCACTGCTCCAGTGAGCCGAAGAATCCTTGTATGTGTCTATATCAGGGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_815853_816323_2:0:0_0:0:0_3d55b/2
+GCTGGGAAATGGGGCTTGAACTTTCTTTCCTCTGCCACTGTTGTAGTTCAGGAAGAGTGAGACCAGCCAAGCTGTTCAGTGAGCAGATAAATATAAGCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1292908_1293296_1:0:0_0:0:0_6d17/2
+GACCTGTAATTTAAACCTCTCCAGCTAGATACAAAAATTAATTTATAATAAGACTCGATGTCCATTGGGAATAGAAATGACTCTTTCTTTAGACAATTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1249686_1250190_0:0:0_1:0:0_1078c/2
+TGTAAAAGGGAAGGTAGAGACAAACAAGTAGCTGAGAGGGATTAAGTATGCAAATGAATGCAGTGTCTCCGCCTACGCTATCCTAAACAGCCTACGTATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1067767_1068279_1:0:0_2:0:0_30c74/1
+TACAAAGAAATAAACCTGTAAATTCACATACTTTCATTACGCATTTTCGAGGGTGGCGAGGTTGGGATGGCTCTCTTATGTATATTATAAACGGCCAGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1380175_1380595_3:0:0_1:0:0_46335/2
+AAGTCAGAATGAAAATTCAAGAAGAACTATTTTATTGTTTTACACACACAACTTCATTATCCCACTAGGGGGGAGGCAGGCCAAGGGAGGCCACCCCGAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2397625_2398090_1:0:0_0:0:0_5ad13/2
+CAGCATTTCATGTCTTCTGGCATATAAAGAAGGAGTGAGGGGGGCATGGTTTTGGTTCCTGTCTCACATTAAATGAGTCATTTCCTTATTCTATGTTGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_899551_900056_1:0:0_0:0:0_357ce/1
+TTTTGTTGTTCAATAGAATATTATATTTGAAATATATTCCTATCGGCCTCTCACTTGAGTAGCTCCGTCCAGGCTTCTGAAGTCAAGATAAAAAACAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1776520_1776987_1:0:0_1:0:0_43701/2
+GTTTTTATGTGTTCTAATTTCAGCTTTCCCTTTCCCTCTAAGTAGAGGACATCGCCAACACCTCAGCAGATCTACAGTAAGCTTTAGAAAGATGGGGATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2046302_2046797_0:0:0_1:0:0_1172/2
+ACCAAATCTGGGCTTGTCTAACCATTACCATGCCCAGGAGGAGGAGCTGAGGCAGCCATATACTGATAGTCTTACATTCCCTTCAACTGTGTAATATTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1119650_1120139_1:0:0_1:0:0_1c961/2
+TGGAGTCGGTGCTGGCAAAACAAAATTCTGTTTCTTATTATTGTATTCCTTCCTCTGGTGAAAAAAAAAAAAAAAAATGTCTAGCATCTGTCTCCCTCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1292498_1292986_1:0:0_0:0:0_340dc/2
+AGAGATGTTAGATCAAGTTCTTAAAAATAAGGCTTTGGGAACCAGGACCAGGCTACTCGGGGGACACGTGGGCAGAAGGAAATAGATGGGGAGGAGGAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1259207_1259700_1:0:0_0:0:0_3afa9/2
+TATTGTAGAGCAGAGGCGGGAGAAAGGTGGGCCTGCTTGGTACTGGCATGTTGTTGCAATTAGGTAATACTTGTGATACCTTAGATGGGCATGCCATCCG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1037956_1038373_1:0:0_0:0:0_2fe3/2
+CTCTTCTGGCAGAAACACATCCCAAACCCCACAAGATCATCAACAACCTCTATGTCCTTTTTTTGTTAGTTTGAATTGATTATCGGCTAACACACAGACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_931695_932073_0:0:0_1:0:0_4f028/2
+TGTACTTCTCTCTCTACATGGAGAGATAAATTTCTGATTAAATCAGTCAGGAGTTGAAATATAAAGCCCTGACCTCCAGGGACCCCAGCACCTGAATTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2204000_2204469_1:0:0_0:0:0_5068b/1
+GAAAATTTCGTTCTGGCTAGCAGGGTTCCTGTAACCTTAATAACCTATTATCTCAGCGAGAAGGAAGAAATCTTCCTAGTCAATCCTGGCAATAAACGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_290219_290714_2:0:0_0:0:0_54768/1
+CCCAACATTCCAGCACTACGTTGTTGTTAGAAAAGCAAGCAGCCTGGTTGTCTCTTCTATAAATAAGATGGGATTACATCTTTTTCATATGATTTATGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1186536_1187041_0:0:0_1:0:0_2a1b2/2
+TTATAAAATGGGATTGGAATCAATATCAGAGTAACCTAACTAAGATTCTGGGTGCATTGATAGAAGCCAGGAAAGTACTTATTGTCTCGAAACTCTCCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2025593_2026080_1:0:0_1:0:0_3e822/2
+CTCCTGCCTCAGTGTATTTAATTATGGTTACTCTTGCCATAGGCCGAGTAGACGAGAATACTGTTCTGCAAATGGTTTTCTAAGCTGCCTTTTTTTTCCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1577683_1578137_1:0:0_0:0:0_1d150/2
+TATTTTTTTTTCCCAATTCCCACAATTTTTTCAACTATACAAAAACATAAAAACTTCTAGTAATTTCCAGTCTAGTGAACCAATACAGTCTTTGATTAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_48412_48893_1:0:0_1:0:0_1214/1
+ATACTTGGAGTGCATTTTAGATTTCAAAAGAGAGAACAAAGCTATATCTGCAATCAGAAATATTCGATTTTGTTTATCTGAAAAAGGAAAAAGATATGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1964341_1964781_4:0:0_1:0:0_da7b/1
+AGTGAGACCATCCTTAGGCTGTGAAGTTTAACTCTAGCATACTCAACCATCTACTAGAATGACATAATAAACACACATTTCAACTTGAGGTAGCTAACAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_850526_850996_0:0:0_2:0:0_2c62c/2
+AGACAGGAATGCATGGTGCAGGAATCTTTGTGCCACTGCTTGATCTTCGATTTATATCACTAACAGAGTGATATGAGTGGTCTTTAACCCCAGGCTTTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_816525_816953_3:0:0_1:0:0_29e4f/2
+CTATAGAGACCTCACTCCGTCCTCCCAGCATCTTGGAATAAATAAGCAGTTTTGTGTTCTCGGAACTTAAGGCTGACTTTAGATAGGAGCACCACTTATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1701506_1702012_0:0:0_1:0:0_3cbd3/2
+AAAACTGAATTCCTCCCAAAATTATTCCTTTGGCTTCAAGGACCCAAATATTAACGGAGCCAACTCAGAAGTAGGGATCTGCAGTTTCAACATACCCTAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1552200_1552614_0:0:0_3:0:0_5b454/2
+AAGGCTTTTTTTGAGCCGATGTGCTGTGCCCACACAAGCTGTACAAGTAGATCGCGCGGTGGCCACAGTCTATTTGGCATGACCTTTCTCATATTTTGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_700555_701040_1:0:0_0:0:0_2b200/2
+CTCCCAAGGATCCCAATTACATTTTACATAATAGTGATTCCAGTTGTCTGGCCTAGCTGACAACAGACCATCTCAAAGACATTTCAAAAGACCCTCACAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2317745_2318238_0:0:0_1:0:0_15c8f/1
+AGTGACCCAGAAACTTAACTTGCCTCCTGGTCTCAAGCGTTTTCAACTGGCATACTCTTAAGTTAGTTTAAATGGAGTTAGGGTTTGGGTCCAAAGATAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2195396_2195845_2:0:0_1:0:0_274cf/1
+GTAACAGGCCTGCCTGAGAAAATTATAATTAGGTCTTCATATTTGAATTTGTTGATTATCCATTAGTTAAGATTGGTTCAAGGAAGGGCAATTGGGCTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_579920_580284_1:0:0_1:0:0_2ff43/2
+GGTAACTAAGTAAAGCACAAACGCAGGGAGAGTTGTTTGGAATCTGATAATATTTTCATCTGGGTTTTTGATAATCCTCTGCATGATTATTCTCTCAGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2211286_2211740_0:0:0_2:0:0_28cf6/2
+CAAGGAATCCAGCAATGTGCCTGGGTTTGTTATTTTTGGCACAAGGAGTTCTTTTGGGAGAGAAAAGCACACATGAACCTAGAGTTGAAAGAAGACCAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2173966_2174402_0:0:0_1:0:0_3aae7/2
+TGCCGCTACCAAAGTAATTGATATACAAACCCCGAGTAGGAGTATATTGATGTACACCTACTGCGCGCGCGTCCCTCCTGAATTTTTTGTGGACAATGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_246904_247427_0:0:0_1:0:0_50b5c/1
+TTTCACATATTACAATGATCACTCAAGGTTATGCCTTTATTTTTTTTTTGTAAGAGTAGCCCAGCTCCTCCTATTAGGACTTGTAACCTGAAGCTAGGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_558904_559414_0:0:0_1:0:0_1bee6/1
+CCCTGTAATGCTAGCGTGAGCTGCTGCTGATAGAGAACTCCTACATGACGATAAGTAAAAATGAAGTTGCTGGCCCTCCCCACCGTGAACTTCAAGGAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2242995_2243455_1:0:0_1:0:0_6333/1
+TGCTACACTGGGAGGCGGCAGCAGGCTGCCTGGGAAGCTGAATTGATCATGGCTGTTTTCTTCCTCACTGCAGATTCATTTTTTTTTAAATTCCAGGTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_87441_87939_3:0:0_0:0:0_23dee/1
+CATTTTTAAGACAGATATATATAGACAGAATTCTGAGGGAGACTCCTGCCCAAAAAAAACTGCACAATTTTGTAGTGATCCACCATCTATTCTTTGAAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_335056_335547_3:0:0_0:0:0_8f16/1
+CTGAAGGGAGCTTCCCCACGCTGAGTATCTTTGGAAATGATAAGCTACTCCACTCAAATTAGACAGGAGACCAGGCTGAGGTCCACTTTTAAGAAAAATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_473407_473828_2:0:0_1:0:0_274d2/2
+TAGAGGTTCCCCTTTTCAAAAACCCCGAGGTATCCCTTCCATGATTTGGTGTTAGAGACCAGGAGTTCAAATGTTTGCTCATCTAACTTTTGAGGATTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1417804_1418320_1:0:0_1:0:0_3ea1/1
+ACAAGTCTTAGTCTTTTGTTATTCAAAGGAATAATTCAAGTGAGTGGTAGCACCACCCGGACTCGCTTTGTCTATCCCCTTTTCATACCGCTTACACACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2154138_2154625_1:0:0_0:0:0_37ee7/2
+TTTATGGTTTCCTAAATTTATTATTACCCCTCCAGCAAAAGCTGCACTCCTGCACTGGGAAACCATACGAACAAGGGCTGCAGCAAGGGACTACTTTTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_417770_418135_1:0:0_0:0:0_3eafb/1
+CTTGAGCTGGGATTACAGATGGATCTAAAGGCTCTTGCTGTCTCAAATGCATGCACTCCTAAGAGAACTGAAGAAGTTGGACTATACTGCTGTTGCCCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_44822_45294_0:0:0_1:0:0_2b059/2
+CAGATACAGCTAACTTCCAGCCCTGCTTTAGTAGATGCAATGACTTCTAGTTATACCACTGTACTATTTTTGTAGCCAGAATAGCGCGCCCCCCAGAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_533193_533664_1:0:0_1:0:0_9ea0/2
+AGCAAGAGGCGTGCGGAGCCCAGCAATGAAATGACCTGCAGCCATTTGTTCTTAAATAGGGATTACAGTGGGCATGGTGAAATGGAGTGAAATTGTATTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1917558_1917994_1:0:0_1:0:0_17b8b/1
+TTAGCATCTGAAAGGAGGATATGAGGGCTCTCCATATGCGCCTGTCTTTAATTGGTTCGGGGCATTGGAATGAGGAAGGCAAAGCAGCCTCCCAAAGAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_57137_57584_1:0:0_0:0:0_1bbfa/2
+AAGAGTAAACCTAATGTAAAAGATTTGCCCAAGTAAGACCAACAGTTATTTAGTTCTGAATATAGAAAGAGGCAATCATTATCATCCTATTGACCCACCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1843587_1844058_2:0:0_0:0:0_39e25/1
+CTTTAGCTTTGGGGAGTTTTTTGTTATTAGATACGTTGAGACAGAATTGGCGCCACACAGACCAGCAACATCATCATTCTCGATTCAGATTAGGTACAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2452877_2453314_0:0:0_1:0:0_3dc34/1
+TTTATCATACATGTTCCTGGCAATAAATAAAACGAGAGCTTTGAATTTATATGGTGGCCAGTGGCTCACGTGCAAGACTTAAATATGTGAGCTATGGAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_835961_836482_1:0:0_1:0:0_dd75/1
+CAATCAATGAGGGGCTCCTATACGGAGTGGGGCCCTCAGCTCCTGTCGCCCACCTACTTTAAAAATCCCAGCTGATGGAGTCTTTTTAAAAAAAAAAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1631731_1632168_1:0:0_0:0:0_2fec0/2
+GCATTTCATGAGAATGTGAAGAATGTCTGAGTAGAACACTGCTGATAATTTCTTCTGACAAACGTACATTTCAATATTAATGTAAATCGACTCACCTTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2199133_2199556_1:0:0_1:0:0_456f5/1
+AATAATAATCTCATGGGATCATTTTATTCTCCTCAGCCTCCCGGGCGGGGGTGGTACTGCAGGGATTTCCCAAAATAAAACAATAGAAAGTTATTGCAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2083830_2084214_1:0:0_1:0:0_47258/1
+AACCCTCCAGCTCCTATCTTCATTTTCACCTAAATTTTCCATTGCCAGCTGAATGCATAAAGGATTGTGTTGCCATCCTCCATCTCAGTGGTAACTGGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1431454_1431833_0:0:0_1:0:0_7d2c/2
+TAATGCTACTAGACATGATGTTTTCCAGCCAAATAAAAATAGTTTCTATTGGGCTCACTGGCATGTTGTTTTCTTCAGAATATCTATCATTTCAAAGGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1547825_1548224_1:0:0_0:0:0_27d7c/2
+AGAAACTGTGATTGGTTATTTCTGTTGCCCAAGGAAAGATTTTGCAACCTATATTATTTGGATTGAGACTCAAGCAGCTACTTGGGCTGCTGCAGCGAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2055234_2055702_1:0:0_1:0:0_5950f/1
+GCTGTACTGGCTTCTCTTCTTTGTGTTTGTTTGGTTGCATTCAACCCATGCCAGAGCAGTTGTTGCCCAGACATGATCTGAATTTCTTCATTTTGCCACC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2202786_2203168_0:0:0_2:0:0_405a3/1
+GTGCTTTCAGTCAGGTGAAGCCTGACACTTTGTATATTTTAAATTGGACTCTATAACTGACAACAGATGGAGGCTGGTTTGGCCAGCATTTAAAGGCAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1364578_1365088_1:0:0_0:0:0_48768/1
+CTTAGGCATCCCAGGCTGGGCAACAACAACATGAGCCCGTTTATTATTAATTATTCCTGGATCAACTCACACACCACCACTGGCAGAGCTGGAGTCTTAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1357926_1358428_0:0:0_2:0:0_1fe0/1
+AAGATCTCCATGTGAATACAGAAAAAAAATATAAGGAAAAATCTATGTACTTTTGGGAGGCCCAGTTGGAAAGGCTTGACTGTTCATGTTCGTATTGGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1273041_1273526_1:0:0_1:0:0_37bf/1
+GAGGCATGCTGGGCAGAAGATTGAGTGATGCACCATCACAGTCTGCATATTAGGTTGGAAAACCCTATTGTGTTGAACAACACAAAATAGAAGATCCCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_584387_584851_1:0:0_1:0:0_58f97/1
+AAATGTAGTGGGAGGCTGAGGTCACTCCTTTTGTGACCATATCAAACTGTCTCAATGACAAATGCTGACCTGACCTCATACTGGGAATATCATGACGTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_512464_512924_1:0:0_0:0:0_53c7b/1
+GAACTTTAATTTGGCCCGGGAGCTGGCACACTCTATAGCTTCTAACCTAATCCCAGCACCAAAGTTTTTAAATTATTATAATTTTAATTAAGGGGAAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_939777_940171_1:0:0_1:0:0_bf66/2
+AGGTAAGGCTACAGTAGTTTAACTGTGCTCCAGCTAGAGCCCAGGCAATAGCCACGGAGGTTCACAGCCCCCTTACAGGCAGATCACCATTCTCTTAATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2287470_2287842_1:0:0_2:0:0_34669/1
+TGCTGGCATTTCTTTTGGAATTTCTCTCACTGATGTTAACGCCTCCTAAGAAGCCAACACGGCGCCCCGCTCCAGCATAGCTGGGGTGACTAGTCATCCG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_756038_756459_1:0:0_0:0:0_4cca2/1
+CCAAGGTTTTTTCAGGGCTTTGTTTCACCAGTAGGCAAGCCTTATTAAAATAACCAATAAAGTCAATACATATGCTTCTTGGCAGAAGGAGAGGCAGGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2021858_2022327_1:0:0_0:0:0_54a3b/1
+TATGGAGTGTGTGTGTCATGTGGAACAAAAATTGTATCTTGCCCATGTTTTTCTGTCCAGAGCTTCTACCACTGATTCGTTTATCTCATTGACTCACCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1648493_1648878_1:0:0_1:0:0_4207b/1
+GGAAATATTCAATTCCTAATTTCTTAATTCCCTCAGCACAAGTAAATTAAAAATGTTAATCCTTATTCTTTTATTTACATGAAAGCAAAGGCATGTGTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2496409_2496849_1:0:0_1:0:0_29d18/1
+TATCCTGTGGAGGCCCCAAAGTGGCTCCCTTCTGCCTCCCCGTGACCAATATAAGCAGAGGTATTTTACATTGCAATATTTGCCTCCCAGGCCGAGTCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_191446_191826_1:0:0_1:0:0_2ad14/1
+TGGGAGGAAGGCATGGATGGGAAAGGTTTTGTTTTAGTTTGAAATTGTTTTTTTTTTTATGGGATAGACTATTGTACCTATAAGGCTGAGACGGACACAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1606729_1607142_2:0:0_0:0:0_fcb3/1
+TCAGTGGGTATATTAATTTTTTTCCTGTCTCTACTCATCATCTTCTTATATAACGTCGGGCCACCATGTATGTACCCAGGTAGAAAATGCTATAATGTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1481988_1482393_0:0:0_2:0:0_35fe6/2
+ACAAGTGAAAGACAAAGAGAACGGGGTCTAGATTCATTTCACTAATTTTTATCATAATTGCGACAGTACGCTTTTGTTAATCCCTAACTCTTTGAAGACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1277404_1277789_1:0:0_2:0:0_2ddf5/1
+ATATTACTAGAGTAGCCAAGGTTAGCAGCTGTGACAGTGCAGTCTACATATACACACTCCCCTCAGGAATACATATCATTTCCCACAGCAGCCCATCTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_387170_387614_1:0:0_0:0:0_2f7b5/2
+TGAGACAAAGTTTGTATCTTGGAGTGTTAATTTATTACCTGGGATCTGTTCCATTAATTCTTTATTGAGCAACCCAAAGATATCTTGACTCCAGGAATTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_415706_416125_0:0:0_2:0:0_3b1db/2
+GTAAGCGCTTTCAAATAATTATATTGCACCACCCACCTCTTGAACTTCCAATATTTTTCCTTGTTACGCCTGTGGTGGGATAAGAAACCTTTCTTGCTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2212674_2213124_1:0:0_0:0:0_1118a/2
+GCAGTGATTTTAACGTACCCAAGGACAGTCCTTTCTGCTTAATTTTGATCACCACTATTCACAGGAAGGTCAAGGAATGGACATCTCCAGCTAAGGCAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_843043_843461_2:0:0_1:0:0_1ce66/2
+TAAAACACATAATTTTTACTCTAAGTAAGTTCCAATGCCCTCATTGGTTCCTAGACTTATAGCAAGTTGAGCATCCCGAGTGGTTAAATTACTGTAGGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2366901_2367350_1:0:0_0:0:0_2fc7a/2
+AAAGAGACAGGGGCAGGGTGAAATTAAATGAACATTTGGGATCACAGACACATGTAATGGTGGCTCGTGATCTAATGAAAATGCAACCTACAAATATTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_59901_60404_1:0:0_0:0:0_437a9/2
+CAATTTACTAAAAATATTTTTGAAACTGAAGGGAGAGGACAGGATCAGCTTCTATGTTCAACAGAGAGAGAAGCCTGTTTGTTTTATGCAAAATTCAGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_677810_678218_4:0:0_0:0:0_4c3c0/1
+CATGGAATTACCTTAATTTGTGCATCACCTTGGGCTCTCTTGAGCCAGGCTGAGTCAGAGGCACATTATTGTGTGTAAAAAAAATGGAGATTCTGGGATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_290825_291221_0:0:0_1:0:0_488d5/1
+CGAAACCAACACAATCCAGAATGTCTGTGTTTCATCTCTCGCTAACGTGGTGACTGCTTGTAGAGAGCCACCAAGTATAAATACAACATATATATTAGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2147111_2147464_1:0:0_3:0:0_2dc81/2
+TGGCCTGGAGTTTGGAATCCCATGTTTGATCTCTGCCTTTTCTTTCAATAATGAATGTACATGAGCAGAAACACAATAATAAGAGCATTTAGACTTGATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_24462_24815_1:0:0_0:0:0_34611/2
+TTTCAGGAAGGGGAAAGAAATGCCACTATTCACCCACTTCAAAAACTGATAAGTTCCACCCCAAAGACTGAGCAAGTGATCACCGTGTTAGTCAGGCTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_994230_994664_1:0:0_0:0:0_b041/1
+AAACAGAATAAGAAGGGAGAGCTCCCAAAGTTGGGTAGGGGGCGGCGGCTCCCGGGACCAGTCCAGGGTCTGCGCATGCCACTATAATCCTTCCTGACAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_178041_178411_0:0:0_1:0:0_1d11b/1
+GATGGGCTGCAGCATGGTGTGAATTGATCTTACAGTAATTGCAGGAGAATCTCAGGTTAACAAAAAAAGAATGCTCCTGACCCTATGCCTGTAGCATTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_644482_644956_2:0:0_1:0:0_2fae8/2
+TAAGACTCTCCCATGGGGCCAGGCTGATGTTTTTTAAGAAAAGGGGAGCTGTATTGATCTTTTCTGTCTTACTACCGCCTCTCTGAAGTTCTCTCATAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1636037_1636482_2:0:0_1:0:0_281ad/2
+TGGTGATGCAGTGGCTCCCCAAATGAAACCTAAGCCCCAGTGGGATCCCCTTTTTAGCAAAGGACATTCAGTATGGTAAGGCTCCAATTAATGTCCTTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2131759_2132133_1:0:0_2:0:0_31560/2
+CCCCCTGATGGTTAGCACTTTCCCTCTGTGCTCTATTGTCCAGATACCCTCCCATTAATTTCCAGAGGCGTATTTAAAACTGCAAGCATAACTGATGGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_146220_146604_1:0:0_1:0:0_4c244/1
+CACACTGTTCATGTAAAGCTAGAAATGGGAGGATGGTATTAAAGAGGACTCACAGAAGGCAGATGTCAGACTGTGTATATCTCTACATATTTTCTTTACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1473998_1474391_0:0:0_1:0:0_50b31/1
+CACGGTGAATAACACCAAAATGTATACCCTAGAAAATAAGCAAAGCCATAAGTATAGTGTCTGTGTCTGCCTTCAAAACTTCAACTAAAACATATTATAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_612558_612966_0:0:0_1:0:0_516a3/2
+AGTTTCATTTTCCTTATACATCCCTGCACCTCGGGAGGTGGATGTACACCAGGGGGTGATCCAAGTTTTAGAGAATCACTTCTTCTCTCCCTCTCAGGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_469182_469642_1:0:0_2:0:0_bf1b/1
+CCCCAGTGTGTGTGTGCCTTCTATATAGGTCACAGCAAGCTTGACCTCGTGATTATGGTGGGCAGATGATGACATTTCTAAAGCCAACCTGTAAAGATTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_221361_221783_0:0:0_1:0:0_9a72/2
+TCTGCAGCACTCTGTGTCTAATTTCTGGGGCGGCCAGCTGGAGTACAGTAGAGTTTATCTGAATCCTTGTTATAAACATTCCATACCAACTGAGGTCCCG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_223630_224006_1:0:0_0:0:0_34c67/1
+ATGAGATGGAGTCACCGGGATGATATGCAGCGTGAGCCACTGTTCAAGACGCGGGGCATGACTGATTTTTTTTTTTTATACAAAGTTTGTCTAACAAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_672671_673102_1:0:0_2:0:0_3f10/1
+GGGTGGGGACTTGGGAAGTTCCAGTCTGTGAAATTATATAAAGCAGGTTGGTAACCCGGGTGGTGGTACTTCTGTATCAAAATCACAAAACAATAACAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_224737_225156_0:0:0_1:0:0_2c0b2/2
+GTGAGGACTTATGTTGCCCACTATTCTTTAGAGATGGACCTGACCTCCCAGCATTATTTCAAAAAGAACGTAGGGAAAGAAAAAAATTGGATCATGAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2374370_2374902_0:0:0_1:0:0_22770/2
+TAGTCCCGAGTAGTGCTGCAACCACACGTTATAGGCAAAGATACACAAAGAATAACGAGGTGGCAGCGGGGTTGTATTCTTCAGGTCTTGTGATGGTCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2391193_2391610_3:0:0_0:0:0_279c9/2
+ATGAAGAATTTTAAGACTCTGATTATACAAAATTTTGTGTCCACGACTGGAAACAACTATATCCCCACACCATTCTGCATATGCCTAATTTAAAAAAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1215589_1216021_1:0:0_0:0:0_5b7c8/2
+TGTGCTTATTCCTACGTCTTGGTCTCAAACAGAGTTGTGATGGTGGTACCACTAAATACGACCCGTTGTCACGCCCCAAACATCTCTTCTTGGGAAAGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_198922_199410_1:0:0_0:0:0_2a844/1
+GCTAAGTCCGTAGGTAATCCTGGCATGATATAGTAGAATGGATAATAGCTCCCAAAGATATAGAAGGAACAGACTTTATTTGCTATAACATAGGTGTTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2041401_2041881_1:0:0_1:0:0_3b4e1/1
+GACTAGGGGGTAGTTTCATAAACTTAAATTTCCAGCTCATGGCTAGGGACAGGAGTTTGAAAACACATTACCATTAAAATTTGAATTAGTCTCAAAATGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_918748_919184_2:0:0_0:0:0_4f12a/1
+CTGTCTTTTTGGCTCAAGGCGAGCTGGCGGACTCGCCGGCCCTTTGAAAAAGTTTAAATTAGGAATGCTCGTGGGTAACATTTAGTAAAAATTTACAGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_321031_321389_2:0:0_0:0:0_4252d/1
+TACAAGGTAAGTTCGAGACTGGTAAAGTTTTAAGAAATAAAAATGTTCTCAGCCTCCCAATGTATATATATTAGTCAAATTGCGACACACGACAGTTTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_732010_732383_1:0:0_0:0:0_2b327/2
+AGATAGTTCAGTTTCTAATGTGATTCTGGCTATAATTGTCCATTTTTGATGGTTGTATTAATCAAGTGTGCAGAGTGACTTATACACTTACAACAACAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_299501_300013_0:0:0_2:0:0_5b890/2
+TATTATAGATTCTTCAAAATAGAAATAAGTTACAGGCCCTGCTTGTTCACGTGTTTCTTGCTCACCCCAACACCTAGGTGTGGCCACTGGAACCAGTGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1273692_1274120_1:0:0_1:0:0_3c68d/1
+CCCACAGCTCTCTCAGCTCAGAATCGATGGTCTCTATAATTGGCACTATAACAGTTGGGTGACCCCCCCATCCTCCTAGCATAGTTGGCAACATTGCATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2034453_2034842_1:0:0_1:0:0_32f99/1
+AATCTTCCAGTTCCTGTAAGCTGCCCAAATTCCACTCATGGGCCCTGGCAGAGAGAGGCCAGCACTTTTCCTATACATAGCTGGGAACTTGTCATTAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2310928_2311369_0:0:0_1:0:0_36241/2
+GAAGGCTGGGAAAATAGCATACCCAATTATGTTAAAAAATATCACAACCACAGCAAGATAAAGCAGGGCCGGGGGATAGTTCTTGAGTAGCTACTGGCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1476024_1476483_1:0:0_2:0:0_1b827/1
+TAAAGGTTTCTGTGATATGTAATTTTTCAGTAGAAGTTACACCAAGTAATATTTAGCATGTTGTCTAGTTTATAAAAGTGTCAGGTATCCTAGCATCTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2323852_2324306_1:0:0_0:0:0_58f12/2
+AGATTTGCATGACAGCAGCTCTTCTCTAAATGGGAGATAGATGGGGGTACACCATGACTAAGTCAAATTCCCTGAGGCCGAGGGGATGATGAAATATGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1401812_1402239_1:0:0_1:0:0_4fbbb/2
+CTCCCAAGTAGCGCAAACTCAAGGAGAAAAATGGAAAGCTGTTCCAGAGCCTCTGTGATTTTTATTTATTGTGAGATTTTTTAAATGCTTTGTTAGAGAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_488460_488957_3:0:0_1:0:0_5796c/1
+ATATGGGGTGGGGTTGGTTACAACCTGGCAAGCTAAATGGACTGAAGAAGAAAATTCCTGACTTGCATGTATATGTGCAGTGGCACTCTGCGTGTGTGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1408579_1409096_1:0:0_1:0:0_3f56b/1
+GATTGTGCTTGAGTTTTCCCTACTATTGCCACAATGGGTGGGCGACAGTTGTAGATTGCATACTGACTTCATTACTTTGGTGTATTGATCCATAGCATTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_4512_4895_0:0:0_1:0:0_1511f/1
+TTCTGATCCACAGAAGCAGCACCAAGACAGGAAGCGATTCATCTATCCAGTATGTGAATACTTAATTTTATACAAAACACTATAGGAAATGAGACATGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2481924_2482407_1:0:0_1:0:0_24f9b/2
+CCTGACCCTTCTTCTTCTCCTGATTGCCTGACTCGAACTCTGTGTCTACATAATAATGCCAATCTGTTGTAGTGGTGCTGGGATCCCCCTACCAAAGAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1797143_1797663_0:0:0_1:0:0_32c4d/2
+TAGATACCCGAAGTGGAAATCAACCTCAATTGGTATTTATAATGCTAAAACAAATGATATGACTAGAACCCAGGTGAATAGAGGTGGTATCTGTAGGTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1837865_1838346_1:0:0_0:0:0_37bef/1
+GTGACCAGCTCAGAGCTATCTGTGTTTTCAGTGGCTCACCCTGTTCAATCTGGATATGCTAAGAATTGACCTCTACTTGCTCTAACACACTTTCTTAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1019618_1020020_0:0:0_2:0:0_3a7b1/1
+AGATGAATGGCCTCAGTCTAAGACCTTTTACCCATTATGGATCACGGGGCTTGAATCCCAGAAATCGCTATATTTTAACCGATGATAATACAAAAAATTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2490439_2490814_2:0:0_0:0:0_53445/1
+CGAGACCAGACCGTGCCTGTTAGATACAGGTGAATGCCGAATTCCAATATTAAATATTGTTCTTATACACATGCATTTTGAATCCATGGCCTCACCTCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1279795_1280175_0:0:0_1:0:0_3aa03/1
+CAAAAAGCTGGGTATATGTTGATTCCCTCCTTCCTATGACACCAACATGTTCGCTCTGTGTGTGTGCATACACCCTCATCACGAGGTGACCAAGTTGAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_521313_521755_1:0:0_1:0:0_47e47/1
+AAATATATCATAAAAGCAAAGCAGGCGCTGTTAGGCAGAGGTGGTCCCAGCACTCCATGTCAAGAATTCTAATCCAGCTACTGAGGCAATACTTCACTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_17009_17483_1:0:0_0:0:0_481d/1
+ATAGTAGGGAATAGCCCTGAATTCTTTGACTTATTAAAAGGAACATTTGGTATAGCAGACAGTTTTGGTCATTTTCAAACCAAAGCACAATGGCTACTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1335281_1335804_0:0:0_1:0:0_18188/1
+GATATTTTTGTGTTCACTACGGTCAATCACCATGGTGAGGAATTTTTTTTTTTTTTTTCACAGAGTGAGATACAAAACTAATGAATTTTAATAAGATTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_628524_628976_1:0:0_1:0:0_1c80e/2
+AAAAAAAAGAAGAAAACAATAAGGACATTCCAAAACAGAATTTTATCCACCTGCCCATGAACCTGATCTCTTACTTTAAAGTACAAAGACCAGAAATAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2101478_2101802_0:0:0_1:0:0_116ed/1
+ATACAGAAATCTTTAAGAAAGATTAGAGGCAGTGGGCGACATACACCAGAAAGTTTTAGTATATTGCCTACCCGGGGACACCTAGCAACATGTGGGAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1323073_1323582_1:0:0_0:0:0_21a6b/1
+GCCCGTGTCTGGAACCCAGGGAGCACAAGGGCAGAGCCAACTGCATTTATGCTCAGTTTTAATTAACATGGCTGAAAGCTATCCTGCCTCATCTCACCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1972424_1972824_1:0:0_2:0:0_4abd/1
+CACGGCAGGGTTCCCCCGTCACTCTGGATCATCTCGGTCAGGACCAGCCCATATACCTATAAGGCATGGTGAGATGATGAGTGAAACTCAACACTTCCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_630439_630861_1:0:0_3:0:0_58ee1/2
+CTTAGTAAGATCCTCTCTACTATACAACAAAAGACTTGAGCCTGAATATTTAAAATTAACTTCATATCTAACCCACGCCAGATACCTCAGTGAATCTGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2480155_2480595_1:0:0_1:0:0_54aa2/2
+TGGAGAAATTAAGTGAAGCTATGTGCCTCAATACTGTTACCTTTAGACCCAACTCAGCAACCCATGCCTTGTAGATATGCAAAAAGATGAAGTCTTGTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_826556_827060_1:0:0_2:0:0_1af30/1
+CATTTTGCACTGAGTGACTGCTACATTGATTTAAACTGAAAATCTTCAATCCAGTGCCCCAGCTAGGCAATTCTTCGGGTTCAAACTCTTTTTCTGGGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_965211_965641_1:0:0_1:0:0_33332/2
+TAACTCACAAGCAGTCTTGGTCACATAGACGTGGGGATAATTTTCTAATTTTTATGTGAAGCTGTCTGGTCTCGAATCTCTATGCATATTGGGGGAATGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1453539_1453939_2:0:0_0:0:0_b01d/1
+TTCTAAAAAAAATTAATTAAAAAGGAAGAGACACTAGAAGTTTGCCTACAGTTGAAACACACATCCACAGTTTGTTTACATACATAGTTTCTATACCAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1057129_1057511_1:0:0_0:0:0_2f111/2
+TGTTTTCTTCTTTTAAAAAGAGGCCATTCTCCAGTGAGCTCCTCAACTCACTGGGATGCTTTCATGATCAGTTAGGAGGTTTTCAGAGGGTGGATACTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_909878_910330_2:0:0_0:0:0_228da/1
+TTTAAGTCCCAGCTCTCAAAATGCTTAGAGATTTGTCCAAATTATTCTCCTACAAGTGGTAGAAAGTCTCCTGTAAACAGGGGCTCTAGAAAGATGTTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_935146_935616_1:0:0_0:0:0_57c6d/2
+TCTCACTGAGTTAGTTTAAAATTTATACTGGGCGTGAGACAGTGGCTCACAGCCCAGGATCTAGCACATATCTTTGACCACAGGCACGAACCGGTGGCTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2349267_2349735_2:0:0_1:0:0_3fa8f/2
+CACACATCTGGATGTCTCTCTGCTTGAGAAAGAAAAGGAAAGATAACCACTGGAAACTGCAAAATGATGCTAATTTATATATATTTTGTTCAAATACATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1900209_1900575_0:0:0_1:0:0_2b80a/2
+TTGAGCTCCATTATTACACATTTTCAGCAGCAGCTATATATGTCTATTCTCCTCTTCCTGGGTATTAAGCAATCATTCACTGATAACCTTGAGAAATCGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1837073_1837499_1:0:0_1:0:0_515c0/2
+TGAACTCTTAATCATCTCAGCCACCCTGAAATTTTTGCTACACTATCATATAATGGAAGAGCAGTTTACAAAAGGGGACCGCGCGGAGGGAACCAAAATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1923283_1923824_1:0:0_1:0:0_8ea3/2
+CCCAGCAACTCCTGCCTCTTATAGTGCAGCTTGCAGTCCTTGCAAATCAGGAGCAGGGAGGCCATTGTTTGGATAGAGAATTGAGGTGGACATTGCCTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_580972_581415_1:0:0_0:0:0_38bb1/2
+GGGTATGCTTGAACATCTATAATGCAGAAAAATGAAAACTAAAAGTGTCAGCAGCACTCATTATTTCATACCTACAGACTTAGAACCTCCTGGCCTTTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2003405_2003818_0:0:0_2:0:0_24d0d/1
+CTACTCAGGCGTGCCTAGGGCCCCCTGTACTAGTCTAATATTTTGAAGTTTATGTATGAGTTGAGGAGTTTTAAGGCACGAAGTGGGGGGGGCCCCCTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1697527_1697942_2:0:0_0:0:0_ba2d/2
+GATCTCAAAAACACAGAAAATATTATCCGTTTATTATTTTTTTTGTCTTTTCAACAGACTTTATCCATCTCTGGAAGAAAAGATTTCGAGACTGTACTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1022313_1022832_1:0:0_2:0:0_373c5/1
+TCTATTTCAAGAAGCGGGGACCGGTAGTAATGAAAGTTGTCTCCGCCATTCATAGAATGTGGCATGCACGTGAAGTTGCAGTGAGCCACCTGTCCCTAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2220719_2221146_1:0:0_2:0:0_1b958/2
+TTAGTTGAAGTTGTTCTGTTAGATTTGGACTGGAAAGAGACCTGGGTGTCATGTATACTTGGTACCGGGGCGTGGATAGCTAAAGCATTCAGGAGCCTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_929019_929458_0:0:0_2:0:0_41756/2
+GGGTATCCCAGTCTGCCTCAGGTATATTTGAAGTCCCTGGTAATGCAGTGCACGCCTAGTAATCTGCCATTTGAGAGTATATGCCCTACCCTGTCACTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1309558_1310045_2:0:0_2:0:0_3e8e9/2
+TGAGGTCTCAACACTGAACGTCAAATTGCTGTAATAGGCCTACAACATCATTCTAATCAACTGAAAACATATGTGTTCAACATGATATATAGGTTTGATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1861707_1862144_0:0:0_1:0:0_421e5/1
+AAAGGGACTGCATTGTCTTCCTGAAAGATAAACAAAAGCCAGACTGAAGCTAATAATCTAAAAAGTATCTAGACACATTGTTGCAGAGACCATGTAGAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1860222_1860598_1:0:0_1:0:0_db08/2
+TATAGCCAGAAAATTCTTGTCCCTTTTTTGTATTCCAGGGTTTGGAAGGAAGTAACAAAAACAGAGTCCTGACACAAGTTGAACATTACTCACCAATCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1285975_1286428_0:0:0_1:0:0_254e5/1
+GAAATAAATAAACTTGCTTGACTACTCACTCACCTCCGCTGCCATAGGAGATACTATAATATTATGTTTCCATCTGCTTACAGTTCTTCCTAGGTATCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2220418_2220876_0:0:0_1:0:0_52a38/1
+TTGGGACCGGGGCGTGGATAGCTAAAGCATTCAGGAGCCTGTATTTTCTTTTTAAAATCACCATTGTCAAAGAATACAAAAAAATTTCTCCTTTTGAAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_882795_883319_1:0:0_0:0:0_d9bc/2
+CATAGACATGCACTCCTTTACCTCCAAGATATTCACAAGGAAGAATTATAAAATGGTGGTGCTTCCGCCTTCCCCAACACCACCAACTCCTTCACAAGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1975632_1976091_1:0:0_1:0:0_38660/2
+AAAAAAAAATTAGCTTGACTCACAGTTTTATGACATCAGATTGGACACAGTGGTCAGCCTCTGGATTACACATGTGGGATGGTGCCAGGCAGTCAAGCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2386554_2386942_0:0:0_2:0:0_513f6/2
+TATGGGAGGCATCAATGCTCTCTCTCAGGTTTGATCCTCCTTTTTTACTTCTTGCAAAATTTAATGTCACCATCATCTACATTTGTGCTGGCCTGTGAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1976376_1976788_0:0:0_1:0:0_585e6/2
+ACCACCATGTTATTCAATAAAAATCTCACCCTTTGTCCATCAAGAGGTGGTGCTGGGCCCACTTTCATCCGGGAGTCACTATCCTTTTCCCTTAGTGGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_980460_980867_0:0:0_1:0:0_55895/1
+GTAACTTGGAGACATTAAAACCTGGTCAGGAGAGGCAGGTTGTATCTTCTGCTCAAATCACAACAATAACTAGTCTTTGTTAAAACTGGCAACCCACAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2389624_2390047_1:0:0_2:0:0_20db5/2
+CTGCCATCTTTCAAGGGTAGGAAATAATGTAAGATAAATGACATTTTCTTTGTGTATTGAGGTTGCAGCCTAACAAAAAGGGTACCAATGCCAGCCTCCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_74893_75305_1:0:0_1:0:0_2bdcb/1
+GACTGCGCCCAGGGCATGGTGGAGGCCCTTCCTCCCAAACATAATAGTGGTAACTCAATTATAATTTTAATTAAATTCTCCCAGCACTCTTAGAAATACC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2008862_2009264_1:0:0_1:0:0_2dace/1
+AGAGAAGTAGCTGGAGACCATCTCTCTCGGGTTACGGATGAATAAATAGTTGAACTCTGATCTGCCCAGTGATACTTACTTGACACCACCCCACAGGGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2284052_2284422_3:0:0_0:0:0_5b29/1
+TCCGAGCAGGCCTTATTAAGTTTCCTACAACCCAGGAAGGCTCATGACTCCCAAGGCACTCCCAGCAGAAAATGGGGGGCCTGAAAAAAAAAATAGGTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2118224_2118773_1:0:0_1:0:0_2c9e0/1
+TATTGGTAAAAGGACTACAGAAATAAGTGGTTTCACCCGCCCCTCCTCACCCTGCGGGCACACCCTCCCACATTCAGGAGACCGCCTTGGAAGTCCAACC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1333851_1334173_1:0:0_1:0:0_2a366/1
+CTCCCAAACTGGAGCCATACGTTTAATGAGGGAGAAGGGCTTCATGCCAGACTTGTTTATTCACATCTACGATTGCTGTAGTTGAAGTGTGCCTGGTCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_34516_35004_1:0:0_1:0:0_1847/2
+ATTTTATGACCTCACAGTCAAACTGAAAGGGGGTAACAGGAAGGAGTGCAGATTCCCCCAGGCCTCCACTGCATTTAAGCCCAGCCGCCTTGTCTTGTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1049175_1049562_1:0:0_0:0:0_4e8bf/1
+TTGTGTGATCTGCATAGCGCTTTTTAGTGCAAGACCAATGTGTGGTTATATTCAAGAGAAACCCAAATTTTATCAGACCGCTATTGGTAGAATAAGAGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1960748_1961198_1:0:0_2:0:0_13068/2
+TCTCCACCCATTTTTATATTCACTTCCATTTCCCCAGCATGACAGAGCGTAGCATTCCAATCGAAGCCCAGTGTGGGACTTTTGAGACAGGTGAAAGAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2213354_2213843_1:0:0_0:0:0_123e7/1
+CCTGATAAATACAACTTCTTTTTCCTCCGTAACAAAATATACCATTATCAACACACAGCATGTTAATTTTGAGAAGGAACCTTATTTTTATTTTTCCTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2394832_2395220_2:0:0_0:0:0_25cf7/2
+AACAGAAAAGGTGAATTACTCAGAAAGGTGGGCATCTGAAAACAGGGGCTGCTTATGAGACACAGCTTTGCTGGGGACTACAGGCGAGCATATTTGGGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_776295_776804_1:0:0_1:0:0_3705/1
+TGTGAAAGTAAAAATATAGATTATAGAGTATCTTGCAAAAGAAGACAAATTATAATCTCATTGCAAGTTCCTATTGTGTGCATCCAGTTTCAGGAGAAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1959957_1960469_1:0:0_1:0:0_7db1/1
+AAATCTGCCATTTGTTTATGTTAAAACCATCGAAAAATAGATATGTCCAAACCTTGGAGCCTCCCCAGCCTGGCCAGGCTCAACAGAAGGACCTTTGAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_443793_444164_1:0:0_1:0:0_15f88/2
+GAACCATCAAATATGTGTAATGGTTAACTAAACAGACTCCTGACCTTTCGATGTTCTGTTTTTTTTTTCAACTTCTAGTTTGTATTTATTCTTCAAATTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1247124_1247595_1:0:0_1:0:0_4c1f9/2
+GTATGAGTGAAAATTACGTTTCCTCTTTTGGCTCAGGAACATTAAACGTCAGCCTATGGAAGGAGGGGCAGGGTAGCTTAAAGGTTTGCAGAAACACAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2057512_2057904_1:0:0_0:0:0_1e97/1
+GATTCAAGCTCCCTGCATATATGATTAAAACTTTGCACGTGCCGTGGCTCATGCAAGATGGCCTTGTATGTCCCTTTCTTGATAGAATGTTGGACCCATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1515197_1515664_1:0:0_0:0:0_39d27/1
+TTCCCAGGGCCTCCTATCAACATCTGGTTGGGCATGGTTCACATATAGAAATCTTTCCCTACTTACTTGCCAAGGACTGGTCTGATGAAAACAAACAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1350224_1350647_1:0:0_0:0:0_3728c/1
+CTTTGCTTGACCTGAGAACCTGTGTGTGTGTATAAATCAGGTTAGGTCACAGACCATTAGTCCATCCAGAGGCCGAGACTCTGGATGGTATCTGCTGGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_673621_674148_1:0:0_0:0:0_3d531/1
+TTTTAACAAATTCTGTAAAGAAAAAAAATAGTATACAAATAGAAATATCCCCCCAGAATACAAACCTGAGCACTTTTTTTAAGAACATCAATCCTTGAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1442844_1443260_0:0:0_2:0:0_4c804/2
+GACTTTCTTGTACCATTATTTCTTCTCCCCTTCACAGTGGCAGAGAGTGTTAAGTGCTGGGTGTATGATTTATTGACCAGCTCATTGCCCGGTCACCTGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_582470_582954_0:0:0_1:0:0_2e55b/1
+ATTACTCTCAAAAGAAATCACATAAACATTATCAAAGTGAGTTGAAATCTACATGAAATTGAAGCCCCTTAACCTGCTAAGCACATATAGCCAATACCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1823241_1823558_1:0:0_0:0:0_4360c/2
+TATGGGCTGATAAGCTAACAGAGGGACTCAGTAAGTTTATCATCCAGTTCGTTTTCAAATAGTCCAGTTAAGAGTTACCGTTCCCCTTGTTAGGCCAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_825953_826380_1:0:0_2:0:0_17b78/1
+GAAGATCCCTGGAGAACGATCTCTTCCTACTATATTACTTGTAGAAACATGTATGTCCTGGTGTTTTCAAGCTCCAGAATCTAACTTCTGAGACACCCGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1685961_1686412_1:0:0_1:0:0_b63c/1
+CTTCAGACTTCATATAAGTCATTAAAGTTTCACAAAACAAAAGGTACCTTACAAGGATTTATTTTGGTGGGCGAGATCACTTCGTTGGATTTCTCCCCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_693482_693919_1:0:0_2:0:0_1b9cc/2
+ATTTTAAATTATTCTGCTGATACCACAGAGACAGGTATTACAACTCATCCTCCTGATGAACCACAAGGAATTTTTGTTTTCCTGCAGAAGATATGATTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2334530_2335003_1:0:0_0:0:0_1ba75/2
+GATATAGAAATAGATACCGTTTTGAAGGGCTGTATATTTTCATCTGTTCGGCCTCCTGACTGAGGAGATGGTGAACACACCCAGGGGCACTGGTTATGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1850222_1850711_1:0:0_1:0:0_4dacf/1
+TCACTTGTGGAGCTGGGGAAAACATTGAGCAGGAAAGGAAATACATCTAGTTCTAAAGATTTCATAATGCCACCTTTAAATAGGAGAGGCTGGAGTTTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1012719_1013182_0:0:0_1:0:0_19848/1
+AAAATCAGCCAGCTGTTAAAATTTTAAAAATAAACTTTAAAATATGCTATTTGAGACTTCTCTTCTGCATTATAGTTTGAGTACAGCCCCTGACCAATGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2056865_2057356_2:0:0_0:0:0_4d8d8/2
+TTGGCAGATAGGGCTTTTAGAGGCACATGTCCCTGCATCCTTAAAGATCACGTGAGCCACGGCTAAGGTTGGTGTGTAGACATTTTCTCAAAATCATTGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_899543_899970_2:0:0_3:0:0_244d7/1
+ACAGTCATGACGAGTGCAGGTAGGGGACAAACACACACGTCTGCCTGGAGTGCTGCGACCTCAGTAGAGAGAGCAGTGCCGAGGTCACATACATATGTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_596479_596982_3:0:0_1:0:0_3bfe3/1
+ACATCGCCTCCCAGCACTTTTCAATTATCTACCATGCTTGTTGGCCGGGGTTTCATTCTCAGCTCTAACAGAGTCTCTCTTGTAAGAACTGACATTTCCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_991667_992119_1:0:0_1:0:0_27a5d/1
+AGAATCAGCTCTGTCCTCAAAACAAACAAGTTAGCTGTATTGTCATGCACATGTATTTGGACGTCTATGTCTTCTGCAAACTAATCTGTTTTTCCTGGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2332465_2332927_1:0:0_1:0:0_18fb3/1
+AACACAATGCTATGATCCCAGCTATGTGTGCGAGTCAATAGCTCTGAGTCTTGCTGGTCAGGTAGAGTCTCCAGCTAGTCCTAAAACTAAAAACTACCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_60324_60860_0:0:0_3:0:0_48482/2
+GTTGGGTTTAGAGCGAGAGTGGGTGAGAAAGAATACTATTGCCTACCCTTTCACAGTGTCACTGCAGTGCTATAAATTTTAAGTGTCTTCCCTCAGTGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2177876_2178269_1:0:0_0:0:0_d370/2
+CCATCTTAATTATTTGTCAGTATAATATTAACAAATTTTTTACAAGAACTTGTAAAAGGAGGAACCATTGTAGAGAGGCTTATTTGCCAAGGCATTATAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_410863_411283_1:0:0_1:0:0_42668/2
+CCTTAGAGTGGTCTCCTTTCTGTCAGATGATATCAAATCTCAAAATATTGATCTGAGCTTAGTTTCAGAGGAAGGGCATGGTGAATTAACTTTACTCATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2207769_2208278_2:0:0_2:0:0_2742e/1
+TCACTCCAGTTTATCTCATCTCTATCTTCCTGTAAATAACTCCCAGGTATGTAACACTTTGGGCCATGGGAGGGCCTGACCGGATGATTTGTTACCCCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1198873_1199271_1:0:0_0:0:0_42511/2
+CCTCGCTGTGTTGAGGCAGGATTCAGCATGTTCCTAGTCTCGATTGGAAACATAGGCATGGCTCGAACTGAACAAAAATGTGTAAGATTACAAGATGCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1066554_1066993_1:0:0_0:0:0_31fac/2
+ATAGAATAGGAGTGCCATAGTCTAGTCACAGGGCTTGACCCCCAGTCTCTTTTCCATGTTGCAGCTGTGTGTGTGTGTGCAAGTGAGCACAGCCTCCCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2460021_2460481_1:0:0_0:0:0_3cec/1
+TGGAGATACCAGTCTTTGACTGGATTATGTATGCTGACTCTTTGCATTCCTTACGTAATACAAATGCAACCTGGAATGCTTTGATTTTGTTCATTGTTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2028578_2029006_1:0:0_1:0:0_3faea/2
+AGAATGTTTATTTTCTGCATGATACGGGTTCAAACTGGGCTGCAGCATATCTTTTAATGCAAATATGCCAAGGTAGGGGGTGGGGGCCAGGATATATATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_539232_539684_1:0:0_1:0:0_f0/2
+GAAAACATCATACCTCCAGGTGGGGTCCTGAGACCATAAAATAAAAATAGTCAAAACCTGAATTTTTTGTTCTCACTTAAATATCTCCCTTTAAAAAGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1398135_1398582_1:0:0_1:0:0_2cba6/1
+CCCCTCAAGTGGACACAAAGTGCAATGATAATCCATTTATGAAACTCCAGCCAAAAGTTTAGACAGAAAGAAGAAGATTTCATAATTGGGCAGCAGAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2498629_2499045_0:0:0_1:0:0_2d813/1
+TGATAGGAAAATAGCATCAGGGGCTATTTGATTTTTAAACCCAGGACCTCTGAAGCTATTAAATATAACAGAGCTAACAGTTTTGTCTTGCAGCTCCACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1648231_1648613_1:0:0_1:0:0_58272/1
+TCTTAATTCCCTCAGCACATGTAAATTAAAAATGTTAATCCTTATTCTTTTATTTACATGAATGCAAAGGCATGTGTTTCCTAATCATGGTGCTCTCCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2165687_2166146_0:0:0_1:0:0_21c65/2
+TTCCAGGAGAACCTGTTAGAACTCGTCTGTGAGACCGCATTCCCTTAGTGATAGTCTTATCTACCTTGCTCTGGCGAGCTGGAGGCTGGAAATATCCAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_57075_57495_0:0:0_1:0:0_1264c/2
+AGAGTTTTAATAACCTTGGACATTGAATGCTTGTCCCTACCAAAAAAAAAATGGGATTTAATAACTCCTGCTGCAAGCAATATATGAGAGTTGGTGACAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_834277_834750_1:0:0_0:0:0_19c13/2
+TCCTAACTTCCTTGACTCCTGTTAGCTTGGAAGCAGTGGCAGGAGTAGCTGATGGGGTCTCGAACTCCTGGTGGTATTTACTATATTTTATGGTAAGATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2413883_2414378_0:0:0_1:0:0_318e6/2
+GGAGAAGCATAGGGAAGTGGTGATCCGCCCCCACAAGACAAAAAAGCTGCACTCTATGTATTAAGTGTCTCCACAGTTTAGGGAACCTGGATTTGCACTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_478960_479494_0:0:0_1:0:0_24622/2
+TGCCTGACAATCAGTAAACACACACAACAGGGGGAGGCTGGCTCACAGCCTTGCAGCTTTATCACAACATAAAATGGGAGAAAGCACCTAGTGAAAGCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_865890_866353_1:0:0_2:0:0_3dd67/2
+AAACAAGTTACAAAGAATAAGGCAATCCCGTTGCAGCTGTCAACCTTGTACCAGAGTTATTTTTGTTTCTCACTGGATGGGGGTGAAGGGAAGCACTATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1816089_1816530_1:0:0_1:0:0_3d56f/2
+TGTGCAACAGCACAGATTTCAATATGCCTGCACCTTGAAAAGAAAGAGGAGTTTGATTTAGGGAGGCACCTAACATTCACCGTCAGACCCAGGCTGGGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_360056_360506_1:0:0_0:0:0_d8bf/2
+TAACTAACATAAATTGAGTTATCTTTGGATGGACCTATCAATGGTAGATGCTTTTCTTGTATTCCATTGAGGAAGAACCACTGAAGATATTTTTTTGTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1177631_1178024_1:0:0_0:0:0_90e9/2
+CTCTACTGTAGTCAAGGAGCCACTTCTGAGGAAGATTTATTTTGGTGAAACCATGCCTGTGTTCGTGTTTGAGAGAGCTGAGGGTGGGATAGAATGTGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1769553_1770090_1:0:0_1:0:0_95f/2
+TGATGAGGAAACGCAAGGACACTAGCATCATCAATGCTGGGACCTAGATCACCTCTTCTAATCACAACATTCTAAACAACAAGCCTTATACCTAATATCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1574934_1575365_1:0:0_0:0:0_3059c/1
+TAGTCATAGGAAAGAACAGTGTGAATATATATAGGACATATGCTCCTCTACCCTAAAGCATTAAATATTCCTGACAGTGTCAGAATCAGCAAATAAAAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_952487_952911_2:0:0_0:0:0_109a5/1
+TCAGTCCTAATGTACAGAGTTACTATAGTCTACAGAGACTGTCAACCTTTCCTTTCCTTTTTCATCTTCTAGTTCTCTTTTAGAAGAGATGGCAGCTGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_338618_339092_1:0:0_0:0:0_4740e/1
+GGACAGAGCCTCTCCCCTTTAAAGTAGAATAACACAATATGCAGTGGTTTGAGGCGGGGGAGAGTAAAGAAAAGTGCTACTGGCTAAAGTTTTAATTCCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2199283_2199721_1:0:0_1:0:0_24761/2
+AACTAACCCTAATTACAATACCTCTACAAGGCTGTAATAGAAGTACAATATTGTATTTTAATTTTAAACTTCTTATTTATTCCAGTAGTTCAAAGTGCTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_20004_20474_2:0:0_0:0:0_49f77/2
+AGAGGCAGAGTTCCACTTCCATGTTGTCACTTAGACGTAGGCACATGATGACATGGTGCCACCACTGCGGCTGGGAGCAAACTTGCCAAGATCCTTCCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_805481_805957_1:0:0_1:0:0_51e29/2
+TATCTATATAGTAATTTTTTAAAATAGAACTTTACTAAGTCATCCGTCTCCCTGACATTTCAAGTAATGTAAACATGCAGTGATCCTGTTAAACTGCAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1054203_1054610_0:0:0_1:0:0_17ad1/2
+ATTTAGTGACTGCAACTAGCCCAGAGGGAGCCGGGCAGTGGAACTGTTCTATTCTTACAACGGTGGCACTTTGCAGTCTAAAATATCATGGGCGTTATTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1520441_1520883_0:0:0_1:0:0_5a5f/1
+AGCATTTTACTGCCACAAGTGACACGTTTAAACTGATTCCCAGCTTTTGCCCTTGCCTGGCAGAAACTGATGTCAGCAATTTCCAGGGAGTCTGCACCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2389966_2390349_1:0:0_1:0:0_4f6c7/2
+CTGTACTATGAATTAGAAAGAACACAAAGAATTTTGGTAGACATTGTAAGGAAGACCGGAAGGGGACCCTGTATAGAGAATCTACTAAAAGGCTGGTAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_379396_379833_2:0:0_1:0:0_3224f/1
+CTCCATGTTATGGGAAGTTGACGTTAACTTTGAATATATATAGTCTTTTTTTCTTGAACCCAATATCAAAAGAGGGAGGCTTCACCTGTCTCCCTCCAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_195433_195918_0:0:0_1:0:0_2d477/2
+CGGGGTGGGGGCTTGTTACACCAATACAGGGAACCTGTAAGGTTGATATTCTTTGTTGGAAAGGTTAACCTGAAAAGCAGAAATATTGTTTTATCTCTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1986994_1987412_1:0:0_0:0:0_338a/2
+GATGGCCCCACCCAATAATTTTCTCTGAACATCCCCTTCCCTGGGAACTCGTGTGAGCAAGTGTATTTAGACTGAATACTTTATTGCTTCTTGTCCTGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1874389_1874795_2:0:0_0:0:0_f784/1
+AGAGGTCGATGTCCCAGGAGTTCACAGTTCTATAACTTGGATGAAAGAGCTAATTTAAGTTGAAGCATCTGACCTCCTGACCTTTGTTTTCCTGACAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1968603_1969090_0:0:0_1:0:0_4e5f/2
+TACTTGAAGCCATGGGTGCCTGTGTTATTCAAGCAGAGGTTTCTTTGTGTGTCCCATTCAAAAGGAACCCAGCACAGTGGCATTTTGTTTGTATAATTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2091403_2091849_0:0:0_1:0:0_4b0fd/2
+CATAAGTAAATACATAAAATAGGTTTGGGAGGCTGAGGGAGAGGAGGAGAGTTGGAGGAAAGGCGTGAGCAAGTTGACACTGTTCCTAACTTCCTGTGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2143191_2143694_1:0:0_0:0:0_22a9e/2
+ATGAGAACAAAGTGACCAGGTGTGGTGCAGCATTCTCATCCTAGGTTCTGTAACTTTTTTATATATTTTTTTTTTTTTATTGGTAATACCACTTGGTTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1768777_1769157_1:0:0_0:0:0_4cf3e/1
+TGATTTGTGTTTATTTCTTCAACGGCAGCATCTAATTTCTCCAACCCTATGCAGAGTTCAGATCCATACTTAATCCACTTGTCATCATCACATAAAAGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_501967_502397_1:0:0_0:0:0_11414/2
+TTTAAGCTAGTTTGCAGTGACCCAGGTTTCCGACTAATTTTTATTCATCATCCTCAAGGGCTGGTCCCCTGCCTCAATGAGGCCTATGCTGGCAGCTCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_528082_528560_1:0:0_1:0:0_32706/1
+CCACTGAGACTCTTATAGCCATGCAAGCAGTTAAATTATATACCATGACACAGCAGTTTGAAACAGCATATTCACCCCATCAGAACACCGGGTTCCCATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_759520_759890_0:0:0_1:0:0_59537/2
+GCTTCGTGCCCCCACCCACAGACGCTGACTTCAGTGAGATATGAAGATACAGCAAGTGCAGCTGAGGAGAATTTTTAAAACAAACATTTCTCTTCAAGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_651017_651486_1:0:0_2:0:0_394b4/2
+TTTATGTGACACAATAAAGGAGCAGGCCAATACGTAATTTTGTAGAGGAACTTTTAGTGTAATTGACGATCATTCTTGTTTTGACCCGACCTTATGGCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1259969_1260453_2:0:0_0:0:0_47ac7/1
+TATGAATGCCTGCATTCATATTTTAAGAGCAATGTAGAACAAACCTGCCCACTCCAAAATTTAGTAGCCTCCCAATTTACTGTATGGTTATGTACGCAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_320228_320541_1:0:0_0:0:0_21f2c/1
+TGCTTTATTAGGAGGCCTTGGTCAGGAGGTGCTGACATATTGACTTGTTCATTTTTTCTAAAGAACTGGAGAACCAACCAAACATTGATTCTACAGTCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1144175_1144602_1:0:0_0:0:0_44efb/2
+GATGAATAAAATTTCAACTCAGGGGCCGCCTGTTAGCAACATCTAACACATATTTACTTATCGCATTGCTTTTCTTTGGGACTACAAATCAAACACAGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2039696_2040228_1:0:0_0:0:0_5056d/1
+AGTCATTTTTTTTTGATACAAAATGGATTTAGACTTGGGTGTGAGTAGGTTGCTCTTCAGGAAGACGAGAAACCAGCTAGGACACATTTTAACCACACCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1651944_1652398_1:0:0_0:0:0_56e60/2
+AGGTTGTATCCTGACCATTCAAATGAATTGGAAACACTTGACTATTAGTTATCATATTTCAGTTACTGCAGGCGTGGTGTGTCCCTTCTTCATAGAAGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_830122_830600_0:0:0_1:0:0_933d/2
+ATACCATGGTGTTACATTTCACCACTATGATCTATCTTTACTTTGTTCCAAAAAACTGTAATTTGGGCTTTGTTGTATGGCATGTTGAGCCTTTTATCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_961_1393_2:0:0_1:0:0_30229/2
+TAGGGGGTTAAATGTAATTCCATCCATACATTGGACAGCTACTTTAGGTCCAATGGGGAGAAGAGAATCATATAAAAGAAGAAAATGTTTGAGTATTGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_310814_311234_2:0:0_1:0:0_50fce/2
+TTTAGTAAGGGAGACTCAAGGGTTCACGGCTAAAATTGTAAAGCTTGTTACCTTTGAAATTTTTATTTAGACATTTACCACACAAAGCTTACTTGTTTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2175288_2175746_1:0:0_0:0:0_37e72/1
+CCTTTGCCCCTGACCAGAAAATATTATTATAATTGCTATTACTATTAATAAATGCCAGCCTCTGGGTACTCACACTTCATTTTTGCTATGTGAAAAACTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2259939_2260327_2:0:0_0:0:0_156f3/1
+TTGGTTCTGTGAGTCGACGGAATGAGAAATTTTTCATAGGGCTAACACTAGACCTACTGCCTTGCTTCCTATAAGTTTCTGCTGTAACATTATAAGTCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_739676_740152_1:0:0_1:0:0_3d068/1
+TTACATCACATGCATAACATGTCAGAAAGGAGTGAGGGTTCACCTTGCTGATGAATAAATTTAAAAATCAAATTAGTCAGTTTGTTGTTTTGAGACACAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2096628_2097016_0:0:0_1:0:0_4db55/2
+ACGTTCTGTAGGTAACAGGGGCTGAGTATGTGCGTTGGAAAAAAATTAAAATCTGCCCTACCTGGCTTGGTAGATGAAACCCTGTGAACATCGTAGGCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_870057_870422_0:0:0_1:0:0_730/2
+ACAGCAATTTGGCTGGAAGACTGGAGATTACAGGTATTCTTTACAGGTACCTGAGAGCTAACAATGTGATACTAAAATTTCCAGGTGGTTGTCCAGCCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2094369_2094846_1:0:0_0:0:0_46865/1
+GATGTGGTCTTCTCTAAGCAAAACCAAAATTTCAGGACCAAAACAATGGGAAAGCTGCGAAACAGCATCTGCAAGCTCCCGCCACCCAGCCACATCACCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1204835_1205359_0:0:0_1:0:0_2df1d/1
+ATTTTTTTTTTTTATTCATATATGGGGACTTGAGCTCGCACGTTGCCATTAATTTCTCACTGAACTTCTATCATTTGAATGGTAATTGAAGTTGAAATGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_374330_374765_0:0:0_1:0:0_39deb/2
+ATTAGGCACAAGGTTAGATAGCCTACATGAATAATGGAGTGTGTGTTTTCCTTAATTCATAAGAGATTCAAGATCAGGTAAAAAATATATATTAATTATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_303974_304393_1:0:0_1:0:0_49065/1
+CAAAATTTCAAGAAGAGAAATATAATATAAGAAAGATCAATTTTTTACTCTCCAGCTATACCACTCTTGGAAGCATCTGGGGCTACCCGGCCTCGGGACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_409142_409620_1:0:0_0:0:0_6515/2
+CAGTGGTCATGATTATTGAGGTAACTGCAAGGCCTGGGTTTTCACATAGCATAATAGAATAATCAGGCACATGAGCATGACCCTGGACAAGGGCTCCCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_667599_667940_0:0:0_1:0:0_e804/2
+TTCTTCAGTGGTGTGATGACTCAAGGACACATCATGAAGATTGTGGGATGCGGCAGCTTTCTTTTATTACCTTCCGAACAGAGTAGCTGTGCAAAAATTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1937338_1937715_1:0:0_1:0:0_344e4/2
+GATTTTGTCAGAACTGAAGAAACATTTTTTGAGTCTTTCCTTTTCTTTGCTGAGGCTGAGGAGCTTCTGTAGCATGTTGAACATTCCACAAGGGGTTGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_417841_418282_0:0:0_1:0:0_3251c/1
+AATCTCCGTCTCAAAAGAACCAAACTGTTGCCACTGACTGCAGTAAAAACCAAGTGATTCTCCCCTTGCGAAGGACAGGAGTATCTGTGGGGGCTTGTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1720232_1720689_2:0:0_1:0:0_30fdb/1
+CCAGGCTGAGTAAAGGACCATGCCAAAATGAACGCCACGTCTTTCCCTCTAATTTTGCTAACTGACAAGCACCGGAGGGAAAGAAAAAAAAGACCTACAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1819040_1819482_1:0:0_0:0:0_3db05/2
+GTGCCTGCAATGGAACAATAATTGCCAAAGGGAATCCTGTTAATGAAGCTAAGGTTTTTATGGGACACAGTCTCTCATCCACTGCACAATAGAACTTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_705144_705544_1:0:0_2:0:0_c4c5/1
+TATATTGAAACAGTTTGAGAAGAGGGGATTGGTACCAGAGCTGGGCTAACAACATTTCTTCTTTTTTTTCCTGTGCTGCCACCGAGCTTCTGCATACTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_923772_924219_1:0:0_0:0:0_551e0/2
+TTCCACAATCCAGCACAGAGTCACACTATGTTTGTTTTCTTCTCATATGTTGGGTACTAAACTATAGTTTAAAATCACACCTGATGAACAGCTATACAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1003404_1003893_0:0:0_1:0:0_85c5/2
+CAAGATTGCTCTGATAATACATATCAGAAACTGTGCTCAGACAGGAGATGATGACATTTTTATAGGCAGCTTGAATTCACTGTTAATCAAAACCATTCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2253069_2253473_1:0:0_0:0:0_5bc4/1
+ACTGTTCTAGACACACCTGTGAAAGAAAGAGGCAACAGATATTTAATAAGGATTGTTTATCACATGGGGACCACTAGCTGCTGAGGCCGTGCTGTCAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1553487_1553940_0:0:0_4:0:0_1e6a1/2
+TCTCAAGAGATTAAATCTGCCTGACGTCACAGGAACCTTAACTCAATCCCCTCCTGTCAAGCAGTTATGGTGAGCCAGGAAACTAAAAATAGTGAACCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_936902_937406_0:0:0_2:0:0_c316/1
+ACTTAATACAATTATTCATCAGTACCATCTTATTGTCTTTCTCTAGAAATGGATTGCTCAGAGAGCATTTCAATTTTGTGTGTGTGAAGAAATATAAAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1543739_1544079_1:0:0_1:0:0_51418/2
+CAGAGCAGTTACCTGAACGTCTGTGGAGCATGAGGGCGGGCCCCCATGAACTAAGAAGTTCTAATGATTCTTTAGTATCTGGGCCCACAGCTCTGTTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1970673_1971140_0:0:0_2:0:0_32e5/1
+TCTGCCCGACCCCAGAACTCCTAAAGAATGTGAGAAATAATAATGGGCTGTTGTCTTTAACAAGATGCTTGTTTTCCAGAAGCTGTATATAGACTCCGAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2248332_2248678_1:0:0_1:0:0_17693/1
+ATAGTTTCTTTGTGTATATTCTTCCTGCTATAGGTGTCAGGAGGGAGCATTGTATTAAGTAGTAAGTAGCTGGGACTACTTGTCCTACCAAACTACAGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1204896_1205371_1:0:0_1:0:0_630e/1
+GCCCCTTCCCCATTACTGTCAGGAGATTTCTTTTAGAAGGGGAAACACAGCATGCGCAGACATTTGTCCTCCAAGCCAGGGCTCCCACAGTATTTGGCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_772728_773185_1:0:0_2:0:0_1adca/1
+CCCCATTTTACCACAAGGTGACTAGGAACATGTGACACAGGTAGGAAATGAAAAGAAATGGAATACCTGTTCATTTTCTCCTGCAGAAAAGAGATGCCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2050864_2051323_1:0:0_0:0:0_614b/1
+AGTAGTTGTGTAGATAGTGATAATGAACACCCTCCAGGCGTGAGGAGAACCTGCTTTTCCTTTTAGTATCTATATTTAATACCGAGGGCAGAAGAGCACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1648231_1648613_1:0:0_1:0:0_58272/2
+CATGGCACAGCGCTGCATGCATTCTTTTGGAGGTATTCATGTATACACTGTTGACACTATATATATGTTTGTCCAACAAGCCAAGATGCGGTGAGGCGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_134685_135093_1:0:0_1:0:0_40590/1
+AACCACTGTTCACGGAAAATGGTTATTTATATTTATCCTGTCTTCTGAGTTCGAAAGTTTCTTTGTCATTCTGACAGTTTCGACATGACTTTGACCAGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1039136_1039473_1:0:0_0:0:0_23950/2
+TTTGTTAGAGGGAATATTGTGCACTGACCGGTCCCCCGGCTTAGGTTCCACCCAGGCTGGTCTTGCTATCCCTGTCTGTATATATGAAGTCTTGTGGGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2127110_2127662_1:0:0_0:0:0_90c2/1
+CCTCACTCATTTCTTTTCTCAAATAAGTGTATAAAAGTTGGTGCCATGATTGCCCAGCTCATTTACATTTATTATTGCACCATGCCATCTCAATCCATGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_20400_20926_2:0:0_0:0:0_46b24/1
+CTTCCTGTCATTTCCTAGAGGATCAGAGTCACTAGAATGCTGAGTCTTAACTCTCTTGTTCCCCGTCCACGCCAGACTGTCTCCTGCTGACCTATACAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1089903_1090352_1:0:0_1:0:0_19dc3/2
+TAGGCAGGAACCAATGAGATCAGAAAGTCTGTCTCAAGGGTACAATATTTTAGCATACCAGCCAGGAGATGATTTCAAGTTCTCTCTAACTTAGCAAGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1523450_1523860_0:0:0_1:0:0_519f7/2
+ATGGCTCACCCACTATACACTATAAAAATGATCCATAACAACTATAGGTAACTGTTATAAAGACAGAGCGGATGTAGGTTAGAGGCTTTCCAGGAGTTAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_678555_678973_1:0:0_1:0:0_566a8/2
+GCTTGATGGAATGCAAGTGTTTTAAGTATAGTGTACTCCAGCCTGATTTTTTTAAAATTAATGTGCTGTCAGCTTCAACAAGTAATAATTATTAAAAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2038585_2039084_1:0:0_1:0:0_2239f/1
+TCCTCAGGCAACCCTATAGGTTCCCAACTTTGCAACCTAGAGATTTACAAATATTTGGCGAAAAAAAGTACTGGCTTCTGACCTCAGCACTGTGATCAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_847215_847687_1:0:0_0:0:0_c983/2
+CTGTGTGTGAGATTTTGTTGACAAAAAACTAGTCTCTTCCTGAGGCCGTATTTTAAGCAATTCTAATCAATATAATCTCAACAGGAAGACAAAATGGGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_103009_103477_2:0:0_1:0:0_16295/1
+ATTGGCACCTCCAAAATTGACGTTTGCCAGGTTTAATATTGACAAATAAAAGCACAATCAAATCTATATGCATTGCCTTCCAGCCTATTAGCCAAGACAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_114705_115191_0:0:0_1:0:0_342d9/1
+TAGGCTCTGAGGTCCATTCTCTCCCTGTCCTAGAAAGAAATCACAGGAAAAGAATATATGTACCTTTCTTTTCACTCCCAAGTGTGATATATACAATTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1447420_1447880_2:0:0_0:0:0_25c23/1
+ACTAATTTGGTTAAAAGCGTTCATCTCCCACATGTGGTTCCATTTTACAAGGCCAGGCATTCATTGTCCTAATGTCAAGAGCTACCAGCTGCTCCAGTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_719216_719567_1:0:0_0:0:0_37ecc/1
+AGCTGCTCTTACTTGAGTAAATTTCTTAGTAGGCTGAGAAGCTCCTCGCTCTTTTCACCTCTTCCTAGCAAACACCTGGAATAGAAACGCCCCAAGGTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_960684_961179_3:0:0_4:0:0_24781/2
+AGAGCGCTGGCCCCCAGCAGACGGGGCTGTGTCTAGTCACAAAAGAAACGAGTGTGATATGTTGCATTTAAAAATATAGTGCCATCACCTCTGTATTAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1021254_1021655_2:0:0_0:0:0_2197a/2
+AATCACAGCAAAGCCTATCGCAGCTTCCACATCATATATAAAACCCAATGCTTCCTTGCACCCTTTCCAAGGTACGTTTCCCATGCCAGCAGCAAGGGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1035634_1036094_1:0:0_0:0:0_414c7/2
+TCAACAGGCACTCTGTCTCAGGTGTATATTACCAATTCAGGCCAGGGAGAATTGCCATGAAGTGCTTCTTACCAGAGGCCAGGCGGCCAGATAGATTCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2138865_2139332_1:0:0_2:0:0_2c376/1
+TTTTGTCAGAACAACTTTTGATCTAGTATTTATCCATAGATGAGGTTTATACAGAGCTGTCTCTGACAACAGTATCCTAGGAAAAGAGGGATTGGCATTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_142867_143326_1:0:0_3:0:0_8551/2
+AGGCTAGGCCTCAAGCGCAAAAAAGAAACATTTGAGACGGTCTCCTTCTCTACCATCGTGCGTTTCTCTTTCCTTTCCTGGGATTAGCTTTCTATATCTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1787165_1787613_0:0:0_1:0:0_31dae/2
+ACATACAGATGTGGCTGCAGTGTGTAAAAAGAACACCAACATCTACAAATTCTAGTTCACATACAATACTGTGTTGAGGACTCTCACAGGGTGGTAGGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1343428_1343940_0:0:0_1:0:0_17532/2
+ATATAAAGGGAAGATGAGTGAGTCCATGTGGAGAGTGGAAGAAGCTTAATGATTCCAGATTATGTAATCCCTGTGAGGGTACAAGGGGTAGGTGTTTCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1977611_1978071_0:0:0_2:0:0_32136/1
+TTTAATAATGCTGCAGGGCATGCCTTCCTTTGTTTAGCCAGCCTGGCCATTTGAACCTGTTTTGAAAAAAAATTATGATGGAATGGTAATTAACCCCATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1043464_1043978_1:0:0_1:0:0_56ac1/1
+TCTTTTCCCCCCTTTCCATGAGGCTGGAACTCAGTTCTGGCCTGGACTGCATCAAGCGACGGAACAGGTGTGTGTAATCAAGGCAGATGTAAGGTATTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1590756_1591225_1:0:0_0:0:0_2829d/1
+TCCTTGATTTGGGTGATGACAGAGTGATGACTGGATTCAATATGGAACTGGATGGGGCAGCCTAACACTGCTCCTTATTTTATTTATTTAAAAGTCCATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_686650_687150_0:0:0_1:0:0_53b8f/1
+CAAGTAGTGGGGCAATCAAATTTACTCCTGGGGCCCCTTCTACATCTCCGCGCCCAGTTCCTCTGCCCCCACTCTTTCTTGCACAGGGTAAAATAATGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1947279_1947711_1:0:0_0:0:0_21183/2
+CCACAGAGACTTTTGTTGACATCAGTGAGGGTTCTCCTGAGGGAGCTTGCAGGCTTAGGTAAAGTCTGACAGAGTTTTAACAGATCTAATACAGAATAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2040248_2040732_1:0:0_0:0:0_4f989/2
+TTTGACCCCATCTCAGGAGTCTCGCTGGCAGCTCTCCTTTTGAGACGGGGTTTCGCAGAGACCATTCCTTGGATATTCTCATTTTAAAAAATGCTGGAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_547624_548131_0:0:0_1:0:0_2a3f8/2
+GGGCAGGAAAGACAGTTAACCTTAAAAACATTAGGAGGCTCACGGGTATAGCAGGAAACAACATTCATGAATGGTAGATCAGCACCACGTGTGCTGCTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2419067_2419519_1:0:0_0:0:0_1f38f/2
+TGGGAGTCTTAAAAGAAAACTCAAGCCACAGGTTTCAACTAACTCATCTGTGAGCAATTGATTTATATTAAGACCTTATCAAAACCTAAAATATTTGTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1086988_1087452_2:0:0_0:0:0_42a4f/2
+CTATAAGTTATATGAACACCTGTAATCCCCGCTATACAACACAGAAGAACTCAAAACTAATAGAGGTGGATATTCACAGCTCCACGCTGTCCTTATCAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1976426_1976858_0:0:0_1:0:0_1370b/1
+GGGAGTCACTATCCTTTTCCCTTAGTGGTGGTGAAGTCCAAAGTGCTTGGGTCATTTTGACATGGCAGCTACATTAATGCAAGGTTCATAGTATATGATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2112616_2113084_0:0:0_2:0:0_573cd/1
+CACCACAATATTGTATTTTACTCCCACTAATACCACCAGATAAATAAATGAAATGCCAGTTAGATTTAATCATATGTATTCCATACAGCTGTCTGTTGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1366835_1367235_0:0:0_1:0:0_4622c/1
+GAGTCAGCTGAATGGGAAGCAACCTGAATTTCTAGGTACTCTGGGGATACATTTGACTCATTGTCACAGGTGGATGGGGTTGGACGGCCTGAGGCGGGAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_898781_899224_1:0:0_0:0:0_1eddd/1
+GCTTTACAGAAGAGAACACTACTTCTTATTTATGCCTTCAAGGACCTACAGTGAAACAAAGCTATCATTCAGTTAATAGATGGCAGCAGGCGTGAGAGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_15504_15894_1:0:0_1:0:0_2cc83/1
+AGCAGGAGTCTCCCTGTCTCTGAATTGGACTTGAAAAATCCCAGTCTGTCATTATCTTGATCGGTTGGGCAGGAGTGCATTTTAAATGTTGAATAATTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1876818_1877234_1:0:0_0:0:0_188ec/2
+TTACTGAAAATCTGGAGGAACTGACAATGAGAGTTTCGCTGCCTCAAGCTACTAGAATGGACACCACTTTGCAATAACAGAAGGGGTGGGTGACAGCCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1534537_1534960_1:0:0_0:0:0_3cc36/1
+CCTCCTCTCAAAATTACTATACATGCCTTAGACCATGCACCAACAAGATCTCAGATTAAAATTTATTTTCATCAGAAAAAGAATTTCAGGGGTGGGAGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_259799_260125_0:0:0_3:0:0_4c65e/1
+TTGCACTGCCTTGATGGCTGGTCAGCCTGTTGATGTTCTTCAAGGTCCCTTGCCTATGTTACCCTCGCTCAGGACCCACTACCCAATTGAAACCTGATCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2470375_2470749_0:0:0_3:0:0_2f09c/1
+AACAAACAAAGACTTTTCCTTTTCTTCTCAGGGAATGATGGCTTGCTACATTAAGAAACTTAAACTGGGAATCTGTGCATTTTGCTTGGCTAATATTTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_544758_545246_1:0:0_1:0:0_15132/2
+ACTCATCCCAAGATTTTATACTTATATGGGGCTCACTGCTTCAACCTCTAGGTGCTAAGTAGAAAGAAAGGAACAACTTCTGATGTTTTAAAAAAAAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1109023_1109453_1:0:0_1:0:0_3d7d4/2
+GATCTTCTAAAGAAATGAAAGCCTTTTGGCTATCAACCCTGCCTGCACATCAAAATACTAAAAAAAAGTTCTGGGGAGGCTGTGGCCCTTCAAGATCTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_626273_626720_1:0:0_0:0:0_40777/2
+AACAATGAATAGGAGATTGTTCAAGAAGCACCAAATGGTTCTCCACAAAAAAGAGGGAGTACTTCTTTTCTTCATTGTAGGCCACACAGATATATTGCCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_317921_318408_0:0:0_1:0:0_2ff66/2
+TATCTTCAAGGCATGCTCCCCACAATACAATCCAACTTTAACTTACCAAAAGGGCTGTTCCACTCCTGCAAACTCATGACATAAGGAAGGTACCATTTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2412845_2413418_1:0:0_2:0:0_1d113/1
+AAGTGCTTCCTAACTGTAGCAATCTCAAATTTCTCACTCCAGCCAGCCGGGCCACAGGTGAAAAAAAAAACCATAATAATACCTGGTTCCAAGTTATTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2452116_2452541_1:0:0_0:0:0_39776/1
+TTTTAGTGTGTGCATGCCGTTTCTTTTTCTTACAGTAATATTTAAGACCAGCCAGGCCTCCCATTCAATTTCCACATCATATACATCAATAAGCTTTGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1731740_1732147_0:0:0_1:0:0_5b467/2
+TCCCAACAGATCCCAAGAGTTTACGGAAGGAAAGAGTGAGAAATAGCAATCTAAAATCTGTAGCTGAGGCGGAGTGCAGATCCTCCTCTGTCTCTTCATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2066475_2066961_1:0:0_1:0:0_c29/1
+GTGGGATGTGCAGCCACATACACCGCGCCCGCCCACCCGCAGGAAATCTTTGCCAGGCTGCCCTATGAGCCAAGTATTTCAGGATTGTGACTGCTTCTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_994765_995136_1:0:0_1:0:0_5506f/2
+GGCATATCTTGTCCGGCCTGAGCTGAGTTAGATTTGGGTACCAATCCCAGCCGCCCAGAATCTACACATCAGTGAGTCTTGAGCAAGGGCCACAGAAGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1838142_1838596_0:0:0_1:0:0_dc9b/1
+TCGTGCCCCCTCTCTCAAAACCAAAATTTCTTGAATATCTAATTGTTCCCCCAGCACTTTTTGTACATGTAAGATCATTAACTGGGATTACGGAGCTCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1186642_1187016_0:0:0_1:0:0_b36b/1
+ATTAACCACAGCAGAGAAATAAAAATTATAAAATGGCATTGGAATCAATATCAGAGTAACCTAACTAAGATTCTGTGTGCATTGATAGAAGCCAGGAAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_186276_186725_0:0:0_1:0:0_157c3/1
+CTTCATCCCTGGGCTGAGCAGCAGTACAATTTCATTTCTGTTGCCCAGGTTGTGATCTAGAAAAAGTTGAACAGAAACAGAAATAGCATTTATTTAAATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_903734_904207_0:0:0_1:0:0_55d5b/2
+CACCCACGCCTGGTCATTGTTGAAGGCATACATCCAGGTTCAACCCTGCTCCAGGAAAATCCCCAGGACCTGGTTCCCTCCTTGTGCAGTGTGCAGTGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_714584_715065_1:0:0_1:0:0_55d29/2
+TCCTTTCCAAAGTGGAGGTCAAGACAGTCATTGTGTGACTACAAGGATGTCCCTTTCCAAAATTATTTGCGCCAGGCCACAGAATCTCTCCATAGAGCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1816827_1817370_2:0:0_2:0:0_125a4/2
+ACAGGATGTGACCACAATTTTCGTAGTAGAAGAGGAAACATATTTTGAAATGGGAAGGGCAGGGACCCCCACTCCCCAACGAATGGATCATATCTTGATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_878609_879023_3:0:0_3:0:0_4f212/1
+GTCTATGAATGACTCTACATTCACTGCACTTATTTTTTTATTTCCTGTAGGGTTAGCCCAATCTATATACACCACTTGGTCTCTTTATAATCCTACCTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_934357_934697_0:0:0_1:0:0_17aa3/2
+TTTCTCTGTAATAAAAGAGTATACCGAGTCTCACTCCAGGCTTTTGATCACAGGGGTCCCTGCCTTTCTAACAGTGGTCCTCACCATAACATTATAAGAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1808413_1808894_0:0:0_1:0:0_29cbe/2
+AAGAAGCTCACTCTTAGAGAATCATAATGTTTGTTCAACCTAAGATTTCGATGTTAAAGGACACGCCGGTGTCCTCTCTCAGAAGTTCATGTGTGCCCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2136858_2137254_2:0:0_1:0:0_337ef/1
+GCCAGGCCTCAAGAGAATGTGCATCCTCTCTCAAAAACTGAATTGTTCTTTTATGGCAGAGGCCTGTAGGGCCAAGGGTAGATGGCAGGACTGATTCTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_203135_203533_2:0:0_0:0:0_2f4c1/1
+TATAAGTGGATCAATAGACAAACTAAAAGCTAGAAATACTATAGTTCTGCCTCAGGCCTGCCCGTCTCACTGGAACAGAAAATGTGATTATCCTAGAGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_829852_830280_0:0:0_2:0:0_49bda/2
+TAATAGGAGACTATAAAAACTAAAAAAGTTTTCCCACCATGAGCCATTTTCCATTTTCGTTTCGCTCCAGCTAGTCCTTTTGGCGTTTACCACTATTTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1748780_1749255_0:0:0_2:0:0_12969/1
+CGTTCTCCTGATCAATAGATCTAGGAGTTCGATTAGAAGAAAACTTAAACAGAAAGTGTAAGCTAATATCTCATCAGTAAAACAAATACAATGTCAGTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1638429_1638931_1:0:0_1:0:0_409e3/2
+TTCCGTCTCCAGGCTGATGTTTCTCTTTTTTTTAGTGCTAAGGTCAGCTAAATTATAAACAAATGTACACAGGAGGGTCTGGGGAGGTGGCGCATTCTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2001568_2002028_3:0:0_0:0:0_13a11/2
+AATACTTATTGGTAAGGAATTCAAGTGATGAGATCACGCCTGTCTACTGCCTAGCTGCCAGCACTTTTCTTTGAGGAAATAGACAAAATACCACTACAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_240105_240514_0:0:0_1:0:0_23dfa/2
+AGATATGTTAAATTTTATTGGTATGAAAGCTTAAGGGTAATGCAACCTTATTTAAAAGTACACACACAATCTGTATACTTTACTTAAATGTTGAAATTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2262197_2262670_1:0:0_0:0:0_1d3ce/1
+GTAATTTATCTGCGGGGCGGCCACTGCATAGGTACTGTCTTGAAGAAAGTTGGACTATCTATTCTTCCTTGAACCCATTGATCATGAAAGTGGTGGTCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1743004_1743492_2:0:0_0:0:0_435f4/2
+GGAATTACTGACTCTGAAATCAGCAATTTGATCTCTATAATCTCTTTCAGTTTTGATGGTAATTCTTATTTAGGTCAGGACCAGGGTGACTTACAGATTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1175006_1175480_1:0:0_1:0:0_13094/2
+ACTCAGGAGGAAGAAGCAGACATTGCTGAAATCTCTTTAGAACATTACAGACTTCACAGATGGTTAATTGCCCCGACGAAGCTCCACTGGAGTATGTAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_105184_105582_2:0:0_1:0:0_32d21/1
+AGCCAACATTAGACACTGTGCCACTGCTCCAAAATACCTGTAATCATATTTTAATTTTAAAAACTGATACTGTTTCAGCTACTTTTTCTGATTCCAGTAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1102573_1102971_1:0:0_0:0:0_4b846/1
+CAGGCAAAAGCTTTTATGACATCTCAACTTAGGACACAGTGTATTGGTATTCTATTTTTATCAGTGAACACCGTGCCAGAAGCATCCTGGACTCCAGGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_561620_562136_2:0:0_0:0:0_2c574/2
+GGAAATAAATGATATTTATACAAATTTTCAAGGCCTGATGGGAGGCTGGGCTTTTGTATTTTTATTCAACTCTGTTTTTGCAAAGGGGCCTATATTTCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1688213_1688683_1:0:0_0:0:0_24660/1
+GGAAATACTTTTTATCCTTTGCTGGTAGTATTGACTTAAGGGGATTACAATGCCGCCATTCCTTTTAGTTATCCCCTTTCTGAAGGGGGAACATTTTTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_163434_163915_1:0:0_1:0:0_56afb/2
+CCTAGACCTCTGGTGATGATCCCATTTTCTTCTTCAACATTCATATTTTGCGGTGGATATTCTATTTCATGTCTGAAAAACCCAGTGTTTGGGCTAATTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_837062_837512_0:0:0_2:0:0_202a8/1
+CCTTAGACCAGAGCCGTTCCCTGCTGGGAAGTGAATTGAGGCCGTTATTTATATACTTTCCTTATCCTGACCTCAGCTTCTCAAATTTAGTGCCAAATGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2290726_2291170_1:0:0_1:0:0_569c7/2
+TGCCTAAACAATATAGATTTGAATTATGCAGATCACTTAGGTAAGTTTTGCCTTGATTAAATACTTGTGTGCTGTGGCTATAGGGAATGGAGTCGTCTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_141848_142330_2:0:0_0:0:0_18178/1
+CAAGTTTGTGATAATGTTGAACTGCACCCCTCTTAGTTTTCCGGCCACGTCCAGACTCATAAACTTATATACTTATTTGTGTCCATTCCAAATCCTCAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_720784_721194_1:0:0_1:0:0_4c519/1
+AGAATTGGCAAAAAAAGATATGATAAAAATTGATGTTGGTCCTTTTCATATCTAGGCTAGACATAATTATGAAGGGGTTAGGAGTCCACTCCAAGAATTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2144586_2145059_1:0:0_0:0:0_283c5/1
+ACATGTTTGAAATAATTTATACTTCAGCTTCTTCTTTATATGAGATCGATCTCAAGAGTAGAGCTTAAACTTCATTTCTTGAAGCTGGGTATGAACTTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2305189_2305612_1:0:0_1:0:0_4c4ae/2
+TAAATCAGAATTTGTGCAGGGCTTGTATTATTTGATGATTGAGGGGGTTTGACAAAGAAGTCACCTATGTAATCCCTAGCATTGTGGAAACTTCTTATTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2090354_2090672_0:0:0_2:0:0_3aee1/2
+AAACAAGGTCCAGGAATTGCTGCTGTTTTTCTTGTAATTCACATATAATCCCAGCATAATTACTGCAGAGTGGCTCACCAAAATCAAATGGTCTGCACAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_320088_320475_1:0:0_0:0:0_3f016/1
+AGCAAGAACAAACTGCTCTGAGCTGAAGACTCTTTGTAATCCCATTTATCCTGCTCTGTGTCCATGGCAGTGAGGATGGGTTCAATACGCTTTTTTTTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1399689_1400130_1:0:0_1:0:0_d341/2
+ATTAGTACAAATAACACATGTCGGAGGGGGAAATTAGAGGTTGCATTTCTAAGATACTGGTCTTTTTTCATTAAGTTTTTGTGTCTGTCTTCCTTGATGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_268458_268784_0:0:0_1:0:0_44ab/1
+TTCCTAGAAGACTGTGCATTTCCTTGCCTATGTTCATATGTAAACTAGGAGAGCTGGAGACAGACTTATAATCTTGATCCCTGGCCAGGACCAGTTACTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1140017_1140415_0:0:0_1:0:0_2cb40/2
+GCAGAAAGAGCCTGGCACAAAGCCTCCTCTCCTGACCATTACATAGTTTGTTTATGTCTTTTCCCAAATTTTCTTTTCTAGTCATCTGTGTTTTTAATAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_452999_453371_1:0:0_1:0:0_4b28f/1
+GCTCATTGTGGTATCAATGTAATGAAATAGGGAAAGTAAGAGGCCATTTGAGATGGCAGTTCTGTAATTTTAAAAAGAGTCCTAAGGCAGAGGCCTCCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1179618_1180092_1:0:0_2:0:0_3026f/2
+CCTACTAAATGATTTCCAATATTTAGAATAGTAGAGTTAAATCTCAGAATCTGCAGAAATAATGAAAGAAGAGGAGAAGGAGAATGATGCTTCCAGTTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_977933_978346_1:0:0_0:0:0_2e112/2
+TTTGATAAATATTGGTGGCTCACGCCATGGAGTTACTCTTAGATGCTTTGGAATTCTTTTTATTTGTTTTACCATATCCATAATTGATTTTCCATTGTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_129945_130452_1:0:0_2:0:0_3e6dd/1
+AAAGGCTCACAGATGAGGGAGCACTTCCCTAACCATGAACCTGAAAATTATTGACTTTGACCTGGAGTACTCAGCCCCAGCATTTCACTCTGGGCAACAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2371888_2372348_1:0:0_0:0:0_4785f/2
+AACTTGCTGCTGTGTTTGGGAGCCAGGGTTATGATCTCGAACCCGGGGTGCTGACTATAAGAGATGTGGTTGTGTATAAACATTTTTCTGTAATCCAGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_148940_149327_1:0:0_0:0:0_2876e/1
+TGGGTTCTCCCTGAGTATCCAGACTGTAAGAAATAAAGTATATACACTCATTAGGACCAGCCTGAAATCTTCGGTCTGGAACTCCTGCCTGCACCACCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2227649_2228095_0:0:0_1:0:0_1357c/1
+AGTGGGAGGAGAGCTGCAAATACAGAGCCAAGGCCATGTGATGTGATGGTAAATATCTTCAAATATCATATATTTGTAAAGAGAAATTGAAAATGTCATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_390375_390782_0:0:0_1:0:0_54b96/1
+TATTTCATTGAAGCTCCTCTCCAACATTAGAAGATAATACAGTTCATGTGCAGTGGTGCAGTAATCCCAGATAGGGCCGCCCACAATCAGACATATAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1867980_1868347_0:0:0_1:0:0_5b0ae/1
+GGGATTTTAATATTTGTGACTGTTAATGCAGAAACAACGTTTGCAACCTCAAAGTAGAAATATTTATAAAGGCCTCTGAAACTGATTTTCCTTTATTTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1768174_1768735_1:0:0_1:0:0_4228d/2
+AGTTTTGTTGTTTCCTATAGTGCTGGGATTAAAAAAAAAATTTGTGAATCAGACTGGCTCACGCAGGACATGATATAACCAACACCGCTCCTGTGTTTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1831715_1832166_1:0:0_1:0:0_15eeb/1
+TTTTCTACCATAAATGGGCACCCACATTCCCGCCATTGTGATTTAGGACAGATTGATATGGAATTGGTGTAGAGAAAAAAGAATATTGTTGTTGAAAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_382686_383153_1:0:0_0:0:0_1d15d/1
+CGACGTGATTGCCCATTCTCAACTTACTAGAACATAAACTCAGCCTCAGAGGGCAGTAATCCCAAAAGATATATAATGGAAAAGGGCCTGGCTTGAGGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_669866_670340_0:0:0_1:0:0_5a820/1
+GGATAAAATTCGGAAAGGACAGCCAAACCAGTCTGTGCATCTATTTGGAATCGTCTGTTTTATGTGGAGGAAGGATAGATAAAGGAACACACACAGTGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1652598_1652964_1:0:0_0:0:0_22a6/2
+AGGGCTTAATACAAACTTTAAACACACACGTCAGCAACAAGTTATATTAAAGTCTGGATCTGCTTGGATATTTGACAGAAACCTTGACTTTCCACATTGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1563476_1563963_1:0:0_0:0:0_433c5/2
+TAATTCTACAAACTGTAGACATTTTCGCCATCGCACAATGTATGTCAAATGCAAGAGGTATCCTTCTGCCAGGGAGCAGATCCAAAGCCACTGCCCCTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_994979_995469_0:0:0_1:0:0_41031/1
+TGCTTATTGAATGGAATATAACTGAGCAAGAACTGTGAAGAGATTGGTACAGGCATAGGAAAGTGATCTTTGCCTGCGGCCTGATGAAATTGGTGGCGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2159308_2159817_1:0:0_0:0:0_2af14/1
+GGTAGGGCTGTAGGTTGCAGATGCTGTAAATAATAGCTTTCTGTGAAGGTTAAGGAGGCCCTCTCCTGATTTCAAATGCCTTACTTGTGAGCCCGGCCCG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_350854_351311_0:0:0_1:0:0_489cb/1
+TCTTCTGCTTTGAGAAATGATATGGAATCTAATAGACATTATCCTTTTCACTCCTGTAACAAGAAGGGAATTTGCTTTGAAAAGCTAAGCCAGCACTATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_760618_761059_0:0:0_1:0:0_38925/1
+ACCGTTGCCCACCTTCCAAAATGAGTCCATGACTTCAGGTAGGGGTTCTCTTTGTGAGACTGCGGCCAAGGTTATTGTAAAGTATAAAATCAAAAGTATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2435921_2436353_0:0:0_1:0:0_e557/1
+TTATCTATAGCCCCTCCCCTTGATTTTGTGTAATACGGCTTTGTTTTTGGTAGGCATAGCCACATAGTGGGGGGCAAGACCAGCACTTGTGGGCTGCAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1884220_1884677_1:0:0_1:0:0_4c8ce/1
+AGTGATCGTATGTTCAGTAAAGAATAACCTGGGAGCCAAGGGGCTTGTTTCTTAAGCAAATCTCAAACTGGCTGCTCACGCGTAGCTGAGGGACATGGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2106235_2106614_1:0:0_0:0:0_19c2b/1
+GCTTTTGATGTCTAGACAGCAGCAAGGCCCAATTTTTTTGATGATTAACCTGCCTCTGCCTTTGCTCTATTCTCTTATAGAATGGTTAATCCCCGCCATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1390874_1391419_1:0:0_1:0:0_49e88/2
+GCCAAAAATCTAGGTGGCAACATATACACCCACAGTGATCAGTGCTGTCCGAGCCTGATGTATTTACTCTCCATAGCTTAAGACTTATCTTTCAGGGGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_239439_239904_1:0:0_1:0:0_408ac/1
+CTGCAGGCCAGCTACAGATGCAATGGATGAGATCGCTTTCTGATTTTCACTTCTATCCTCAGCAAGACCCATTGTGGGAAGAGAAAGCAATAATTGGAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1452224_1452647_0:0:0_1:0:0_39831/1
+TTAGGGATAGCATGTGGTGTTACTGCCAATTCTGCATTCTCACTGCACTATCTTCAATTTAATAAAAAGCAAATATTGAGTGTCTAAAAAGAAGAGAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1626421_1626938_1:0:0_0:0:0_3192e/1
+GAAGGAAAAACTGTGAATGAACAATTTTCTTAAAATTGCTTAAGTCTAAAATGCCACTATCAGTTTAAGAAAGAAAAATTAAGTATACTTTTATGTGGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1446893_1447337_0:0:0_3:0:0_8afa/1
+CTATTGTGTTACCATCAATGTCTTTCTGTATTGGCACATTGAAATGTCAGTGCCACCATGCTGCCATGTTTCCAAACAATGCATATATTTACAAGTATGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1055821_1056246_0:0:0_1:0:0_43f64/2
+AAAAGAGAGTTGACCCACAGCTACTTGTACTAAAGGCTAGGAGAAGACCAATGCATGGTACCCCTGGTGGTCAATAAATTTCATTTTTGCAGAAGAATAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2493902_2494393_1:0:0_0:0:0_4ef1b/1
+AATGTGTTAGGACTTATAATTCATATAATTGCAGCCAAGATGAAGGAATTCTGTTGGATATAGGGCAGGAGTAGATTGATCATCAATAAAACACAACTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_339718_340154_0:0:0_1:0:0_2e6cb/1
+TACCATGTACCACATTTTTTTAAATGAGCCCACTCTTTTTAAAATATATATACAAAGAAAGCACTCCTAATTTTGAGAACCCGGCAGCGGGGCCCTTGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_879978_880470_1:0:0_1:0:0_57c28/1
+GGGCGTGCTGGGCATGAGACTCCAGCCCAGCCTTTTATTTCTCAAGTGACAGGTTGGAGGTATTGAATTTTGTTGCCCCAACACCTTAGATTTAGTAGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2116412_2116903_1:0:0_1:0:0_3181d/1
+TATTTAAATAAAGGTGGCGCAGCCCCTGTCAAAAACTAAGTAGAGATGAGGGGACGATGTATGTGAAACCCAAACAAATGCCTGTGGAGAGGCAGCATTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2138436_2138869_1:0:0_1:0:0_1d624/2
+AACTGCTTCAGTTCGGGAGTTCATGATTTTTATTAATATATCACTTGCTGGGAGGCGGGGACTACAGAACACAAAAAAAAAACAGAGACTGTAAGTGTGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1450503_1450970_0:0:0_3:0:0_37f75/1
+TATAAAATAAACACTGCAGTATTCATGACCTTCTATAAATATTAGACTCAGCCCTTTGAAGCCATCTGAATCTGTTACCTAAAGACATGAACTGAATTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1832412_1832816_1:0:0_1:0:0_54688/1
+TCGGGAAGGCAATGGGATTATATATACCCATCGGTGGTCTGTACCACTGGAAGTGAAATCCCAAAGTATGAAGCTTTTTAAAAATAGCAGGAGACTCACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1606284_1606687_1:0:0_2:0:0_55dee/1
+ATGTTTTTATTTGTTTGTGCACCTTGTTTGCATCCCAGCTACTTGATTACAGTATTTTATATAAGTGGATACAAATGATGGCATTGATTAACGAAAAATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1821398_1821908_0:0:0_2:0:0_4482f/1
+GTTGATTGTTCCTAGAAGAGTACACCCTATGAGAAAGTGGCATTTGGCTCATCCCTGGATTCACACCATTTCTTTTCTATGGTGAAAGAGATGTATTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_270186_270608_1:0:0_0:0:0_4590d/2
+ATAACACAGAATGGAAGCCATGATAGACATTTACCTGGTGTCGTCTGCAAGACAATCTGATTTGAGAAACTTAAAAGTCTTGATGGTGGAGCTTAAGTAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_489125_489614_1:0:0_0:0:0_30515/1
+ATCCACAGTAAAATTAGGTCAGATTCTCACCTTGCTCTGGAAGATTCATTTGGTTTTATAATATAAGAGAAATTTCACTGGCAATGGTATAAGAGTGGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1299906_1300337_1:0:0_0:0:0_26454/1
+GCTCCCATTGCTTTTCAAGTGAGCCAAAAATGTTAATCTAAGATGCGAAACGGGAAGTTGGGGTGTCTAATAACACCATGGTGACTAAGTGATCATTAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_317437_317894_1:0:0_0:0:0_3cd13/2
+ACCGCACAGCAGGCGTGAGTTGGCCAATAAATTATTGAGTCACCCCACACCTGCCTTTTTTTTGCTACCTGATAGCCAGTCAGCCTCTTGAAATGGACCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_170069_170488_0:0:0_1:0:0_44161/1
+TGCTGGCTATTTCTACTATTTTAGCTACTGAGCTGAGCTCGCACAATGCAACTTGTCCTGAGCAGGAGATCACAGCAATCACCAAAAATTAGTGGTAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2056153_2056580_1:0:0_1:0:0_20ac7/2
+ATCCTGCAGAAGATAGTTCACTCCCAAAGCAGCAAGATTCTCCTTCTGTGGCCAGGAAACAGCATCACCTCAGCCAAAGTGCTTAAACCTAAACTGTCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2496719_2497208_0:0:0_1:0:0_2e015/2
+ATACTTCAGGTTCCAAGAGAGAGTCCCTTATGCACAGTTTAAATGTTTTTAAATCTTAAACATAAATAATAGTGTAGGGGCAAGAGAAATTCCATTTCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1889693_1890076_1:0:0_0:0:0_34cf2/2
+TGGCCCCATCTAGTGATAAGCCAATCCCAAATATCAATCAAGAAGGTGATTCAATGGCTTGAGGTGTGCAGATGAGAAAGGAAAAGAGAAAAAAAAAATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_424924_425370_1:0:0_1:0:0_b519/1
+ACACTTCAGTTTGTCATATGAGAAAATGCCCACTTACGGACATTTCAAAACAAGGAATGGTCTCAAAATTAATTTCTTTAAACTCATCCATCGGGTGGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_469809_470234_2:0:0_1:0:0_2ada1/1
+TCTCCTTCTTTTGTTTTATTAATTTTATAAATTGAAAGAATAACATAGGCAACAGCAAAGGTTCTGGACTGGCCCCAGAACCCTTCTCCTACCCTGAAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_903637_904133_1:0:0_0:0:0_22b57/2
+AATACGCCAGGATAGTGAAGAATTTTTAGAAAAATAAGATCATTTACTAAGGTATGCATAATAAATGGCGAGCTCTGCTGAATGATCTTCAGATTCATGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_232483_232898_1:0:0_0:0:0_5a1c7/2
+CTCTACTATTAATTGACTTTAAGAAAAAGAAACAGGTTCAAGGAAGGTAGGCAATGCAGGACAGGAGCTGTGCAATCCTGGGGATAAGGAGTTTCTATCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_142132_142489_0:0:0_1:0:0_11265/2
+TTGCCTTTGAAGGCAACAATTTCTACACAGAAGAGTCTCTATAAATAAATAGCTTCCGGCCGCCGGTCTCATCAAGGCAGGGACATCACCTCCTTGAGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1683602_1684066_0:0:0_1:0:0_41d0b/1
+TCTGGCGGCAGCCACAGGTCAGGTGGCTCTCGTGCATTCAGTCAGTTATTCTTTTAATTTAACTGCAACAAGGCACGGAGTCTTGTGTTTATTATTGAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2450035_2450593_2:0:0_0:0:0_482bb/1
+ATTTTTTTGTATCTGATAGAGGAGCTGGAAACACTTTTCTGCTAGCTCTCTTGAAACTGCAACCACAGTCTGACGTGTGCTCCAACACTCACAAACGAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2140285_2140665_2:0:0_0:0:0_31cb8/2
+ATTTGGCAATCATGATCCACTACACCAAGGCCATGAATAAAATAGGTGATACACTCTTTTTGTTAGTCCACACGAACGGCTGTTCACATTTTTCCAGACG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1238862_1239429_1:0:0_1:0:0_2cbc7/2
+CAACTGCACCTACGGTGCTCTGTGCCCACCCTAGGAGTGGAAAAGATAATTAAAACCACGCAGGTAAGAAGAGGGATAATATTTGCACCTGAGATAGAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_421394_421866_1:0:0_1:0:0_44a91/2
+CAGGTGGGTTCAAGTTCTGTGTATCCCCAAAGTGACTTTTTTTTTTTAGTATGAATTGAATACAGGAAAGAATGTTTACAATCCTCTCAAAGCTGCTCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1045357_1045754_0:0:0_3:0:0_46a55/1
+CCAAATACGTTGTAAGGCAGATTTGAAACAAAAAATTTCTTCTTCAGGTTTTTATCTCTTACTAATACCATTTATATTAACTAATTTTAAAAGGCAGTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_779651_780097_0:0:0_1:0:0_1292e/2
+TGCTTTATCTTGACTTTGCTGCTGTTTTGAATCTTATTAAAAACGAAAATGGGGAAGGAAATATGAATTGGACAGAAGCATGTGGAAGCTCGCTCTTTGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2035124_2035647_1:0:0_1:0:0_30b1b/1
+ATTTGTCCAACCCTGTAGGGTTTACGAAACTGCCACAGAGCTAGGAGAGTTTTCTATGAAGGTGTCTGAGGTCGCCAAGATTACAATTCCATTGCCCCCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1771362_1771876_1:0:0_1:0:0_39cb6/2
+TCACATTTGTATGTCGGGTGTTATCGCATTGCAATTTGTATAATCAGCCTGGTGCCATGGCTTTGCTGGATCCAGGCAACCACTTTGGATGTCCTTGCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1093463_1093900_0:0:0_2:0:0_36e0a/1
+CCAGGGACAAAGAGTCGTGTAAGGGGACCGCTGCGGCAAAGAAGGTGCGCCTGTGTAAGGAAGAAAGCATTCTACTGGGTCTTACACTAACAGCTTATGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_145527_146036_0:0:0_1:0:0_f652/2
+GGTGAATCTGACTTTTAGCAGTCTATATGTTTCAATGAGTAGGGAGCATGTGAGTGGATCTACAACTGAGCACCATGGCCTAAGAATTCCCTATTGCAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1487362_1487746_0:0:0_1:0:0_4b850/2
+AAATGATCTGGCTGAAGAAGATTAGGTACAGCAATTCCACTTAACCTAAAAAGGAACAACTTAAAATACTCTTTGCATATTTATTTAAAATTCTGTGCTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1116347_1116814_0:0:0_1:0:0_24acd/2
+CAGAAATTAAAGTATGCGAGACCAGCCCTTTTCGTTTGCCTTCATCCAAATTCCACCTTCCTCAGCCCTTATGGACTACACTGTGTCCATCAGCAGTGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_156149_156528_0:0:0_1:0:0_3bcc0/2
+CAAGCCTCCGATTTTTAAAAACAAAGTGCTTTAAAGTCTATGCTTGCATCTTCTTTGTAGAAGCAAATGAATAGGTGCCTTTTGCTAGGATTGTTTATCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_858564_858941_1:0:0_0:0:0_534f8/1
+TTTCTTCCACATCGCCCACAAAGACTCAATATTTTGCTATATTTTCATAGTGATGAAATCTACTGTACCTACCTGTGACTCACATGGCAACAAAGTGTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2286940_2287409_1:0:0_0:0:0_32145/1
+GCACTGTTCTATCTTTTTGTATTGTAGGGTTTTTTAAAAGTGATGACTTTTTGGGTCTCCATCATCTGTAGCCAGAATCATTCCAAATAGATAATGTTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1726842_1727331_0:0:0_1:0:0_25efa/1
+CTGAGTTAACACCCATCTTACTTACAGTTTTTTTTTTTAGCAATTTCTCCTGGGCCCGGTTCCTGATCCTCCAGCCTTATTCTTTCTCAAAAATCCCTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_840656_841057_0:0:0_1:0:0_35330/1
+AACCAAGGTTCCTTATGTGGAAAAGTTGTAGATGTTACTGACTTTGAAATGAAATAAATTAAGGGCTCATGCTGAACCGAGCGCTTCCATTCTTCGTTAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1951759_1952286_0:0:0_1:0:0_3b2a2/2
+ATTTAGCATTCAAATTTACATAAGTGTGGCTCTCACTCGTCACTATAACACAGAGAGAAAGAACTAGATGAGTGAGTGTATGAACTCTGCACTCTCCCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2443908_2444360_0:0:0_1:0:0_3920a/1
+CCCTGCAGACCTTTGTCAGACCTTTGTAAATGCTCCACTGCAGAGAGCCTGAAGAGCAGTTGGATGCTAAGGCATGAGCAAATAATTTATTTGAATTACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1107522_1107917_0:0:0_1:0:0_48faf/1
+AGGTTTGTTGGTAGATAATTTATTCCTCTTTGATTGTTGGCCAAGTTGTTGGCCAGGGAGCCACACATTTATAGAACAGCTTATTTTTATCACAAGGAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1196919_1197445_1:0:0_0:0:0_497ec/1
+CCCTCACAGCCATAAGATAGCTTTGGGCAAAGTGGAGCAATTTAAGACTAACAAGCCACTGCCTGTAAACAAATCCAAGATTTAACTACCCTAGTTAATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_736698_737123_1:0:0_1:0:0_2c508/2
+TTTGTGAAAATTTAAAGGAAAAGTCAAATTGGAAAAGTTAAAGTGCTTCTGAGCCATGGTGATATAGTATAATAGGAATCAAGGACGGATTTCATCACTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1019558_1019991_0:0:0_2:0:0_4fd64/1
+CTAATTTTTCACTTACGGGTTTCATCAGCAGATGAATGGCCGCAGGCTAAGACCTTTTCCCCATAATGGATCACGGGGCTTGAATCCCAGAAATCGCTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1215358_1215859_0:0:0_1:0:0_3b4e2/1
+AGGGAGAGGCCAACAGTCAGGAGTTTATTAGTACTCCTGGAGAGCAACCTCCAGAGCTCCCGTTTCTGTGTCGTACACGAATCGCACCCGGGAGGGAAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1279610_1280074_1:0:0_1:0:0_3ab67/2
+GTGGGACCAACTTCCTTAGAGGTGTGACCCCCTTATTTAAGTTATCATATGACCTCGTCTTGTAGTCCAGAAAAAAGGAAGACACAAGTCAAGAATATGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2395249_2395690_0:0:0_1:0:0_3c8e6/2
+CCCGCGCCACCTGGCCAGAACCAAAATTTGTATGTGTAATCCCAGGGCCCCATTGGTCTCACACCCAGTACTTGCTGTTATGCCCATGATTAAAGATTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1436885_1437325_0:0:0_1:0:0_2d044/2
+GTGGTGCCTTTTCATCATTTTGGTAAAGACTACTAAATTTAAGTTTGGTGAATCCTGACAGTTTGACATTACCTTAACACTCTTCTCATGGGCATAACTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1631621_1631997_1:0:0_1:0:0_150b9/1
+AGTAAACTTCTCAGGATAGGTTTGGACTCCCCTCCCAAAAGTGCTGTAAGCATGATTGGGAAAGGATTTCATCCTTACTAGGTCATTCTCAACCGTAATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_585388_585827_0:0:0_1:0:0_2fb68/1
+GTAATTCCCACCGCAGACGTACAGGGAAAGTTGTGGAAGATAATGTAAAATGAGAGGCTTTTCAATTGCATAGCAGTTGGCCCCTACCTTCCTCAAGGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_788387_788859_1:0:0_1:0:0_5248f/1
+CCAGGGATAACTTTTTTTTTTTTGGTTTGTATCATCTCCGCCCCCACTCTGTCCTAGATATTGTCCATTACCTGTTTAAAACCCCCAGCTACTCGGCTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_572745_573140_1:0:0_1:0:0_2c6d/1
+TAGGAAGAGGCAACGCTCAATCCAAAGTGTAACCTGTGTGTGAGGGCACACACACATCCACCTCAAACAAGGTCTAATATCATATCACACGCTTGATCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2370250_2370760_1:0:0_1:0:0_423a7/1
+CCAGTCACACCCAACTCATGCCTTCCCATCAGAGAGAGGGGAGGAGGCTACTTTAACTTCAGTAAATGTGACTGGCAAAATGTCTTGATTTTAAGGTTGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_317771_318247_3:0:0_1:0:0_548da/1
+TATATTGGAGTAATTTCGCCCTTTTCTTTATTTCTTAAAGGAGGAGTTGAGGCACGGTGCCGTTTTGTGGAGTCCTCACGCCAGCTTCGTCACATAAGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_524020_524379_0:0:0_1:0:0_3b76c/1
+GAGTGTATCAAACATAGTTGAACCGCATTATGTGTCTCCTAAAGGCAGGCCCTCTCACTCTTCTTGTTGTGCATTCTGTTCTAACCAGGTTCTGACCCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_596063_596513_1:0:0_0:0:0_441b5/2
+CTCCATGTTATTCTTATGGAAACGGGTTTCAAGACTATCAACAGCAGCCACCAGGCTGTGCCTTCTGAAGCTGGCATCCTCCAGAGTCTCGGCCAAGGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1904876_1905318_1:0:0_0:0:0_29719/2
+AGAACTCTGATCCTCCTTGGTGAACTGAAAAGCATAATCTTTTTTTTTTTTCTATGATCTTGCTCCTCCTGACCCAGGGATGACATGGAAAGAAACTGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_307455_307972_0:0:0_1:0:0_58473/1
+ACTGTTGTATGGAAAGTCATAAATGGTTCCCAGCTATGCCTTTAAAAACAAACCAAAGGAATGGATGCAGAAGAAGTACTGCTGAGGCTTATGGATTAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_372162_372611_0:0:0_2:0:0_3da52/1
+ATTGTTACCAGTGGCTCATAGGGTATATATTATCTTGTTGCCTTGGCAGAAATCCATGTTGAGAGACAGAGTGGGGCAAGTAGGCAGATTTGCATGGTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_591113_591537_1:0:0_0:0:0_9238/1
+CACGCATGCCTGTCCTGTAATTTGAGCCTGCAAACTCCTCATTGCTGAAGCCCTTAACTTGAGCTCCCTCTCAGCTGTCTCACAAGCCTGTTAAGTGATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_522971_523421_1:0:0_0:0:0_45c9c/2
+ATCTGCGGGCACAGCAACTTAAAAAAAATTTGAAATTGGAGTGCAGTGAGATGTCAAAAAAGAATATTCCTAATTTTTATTTAGTATCTGGCCAAACATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2445503_2445939_1:0:0_0:0:0_50a69/1
+CAAATTCATAAGAAGGCTGAGGCATTTTTTTATTTTGAGATTTGATCATGAATAATATATGTGAATAATAACTCTACCTTTCTCCAATCAAACACTGGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1211790_1212285_1:0:0_1:0:0_230e5/2
+ACTTGAACCCCAGGGACGCCCTTATAATGGCCCAAGTCTAGGCAGCACTCTGCCGCGCCCCAGCTACTGCCTGACCATCTTCAATGAGGGACACTCTTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_673848_674235_1:0:0_1:0:0_512d5/1
+CCATCTGCAACAGTGTAAATATATATAATAATAATAAAATGGTTACTGGCTAAGGACTGGAATTCTCAGAATCAATACATAATTTTGGCAAGGATGAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_945226_945652_1:0:0_0:0:0_49058/2
+CAGGGCATCTGGGAAGGAGGCTACCTGAGCTTTATTTGTTATTACAAAATAGTAATGGAATGGTTACTTTGGTCTTGCTTCCAGGTTATATTGAGAAGCG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_298766_299307_1:0:0_1:0:0_523df/2
+TAATTTGGTGAGGAGTATCCAAAAATTATTCTTGTCATCCCAGCAGAAACCCTAAAAACATTCTCAGCCGGAATTGATCCACTAAAACTGCCTCAGCATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_835076_835501_1:0:0_0:0:0_30139/2
+TTTATTTACTGTGTGTGTGTGTGACATTTACGTCCCAGGCTCTGTTTGAGATGAGATAATAAATATTGATTGGGGCCTCGGCTCGCCACTAAACTCACTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1021158_1021624_2:0:0_1:0:0_128c6/2
+AAGACTTCCTGGAAAAGTCTAAAGTATTATGGCAGCTGGGTGACAGAGGACCTCCCAACTGTAATCATGTCTTACCCATACTCAGTTTACAGACAATGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_312903_313334_0:0:0_1:0:0_34340/1
+ATTTTTGCCCAAGCATCCATGAGTGGCACTGCAACAAAAGTTTAGAAATTATAAAAGGCAGGTGCCAAGGGCTCAAAAATAGGTGCAGTGGCACGCGTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_724194_724638_1:0:0_1:0:0_302c0/1
+TTATTTCTAACAGATCATGTAATCCTTCCTATTCCTTGCCCCCATCAAATCATGTATGTATACATCTATGTCCCTTGCCTACAGTGAAGGTTCCCTTAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_990982_991434_0:0:0_4:0:0_520dd/2
+TGAATAGAGGGCAGCAGATTCTTGGGAGCCTTTTATATAACCAGTCTGAGAATGATAATGGCCATGACCTCGAGTTTTGGGTATGTAACTTCAGTAGGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_698439_698757_1:0:0_1:0:0_45066/2
+TTTTCAATTTTGGGATGTAAGCAGAAAGTTAAATTATAAAAGAAAAGGAAGCATGGTTGAACAAGATGGACTAGTTTCTGCCATAATATTGATCTGGAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1621306_1621788_1:0:0_0:0:0_397cf/1
+ACCCCGCCCACTAACAGCAAACATCCCATGTCTGACCTCGGTTGTGTATCGGTGGAGTGTTCTGGCTCCCTTAAAGTCAGCTATAGGTTGGTATATTTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1477219_1477753_1:0:0_0:0:0_35abb/1
+CAAGAAGGCAGGATCTATGTTTTGAAAGCTACTCGGAGGTGTGCTGCAGAGGTCCTGTCACAGGTAGATTCTCTGATTTCTTTTGCAGCTTTAACTTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1224282_1224819_0:0:0_1:0:0_329f9/1
+TTGGAGAAAAAGGAAATTGTAGAGAAGGGGGTTTTGTTTTCATTCCAAATGACCATTTTGGTAATGGTAATGCCTGGCCCCTGCTGCAGCCGAGATCCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_690429_690835_1:0:0_0:0:0_1de68/1
+TGCCTTAAAATCCTGGAGGTCTAAATATAAAGTGCAGTATTTGTGTTTTTCCATATATTATTCTTTTTTTATAAATTAGTTTGCCGCCCACAATTCTGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_843568_844063_1:0:0_1:0:0_23f0c/1
+CCTGGTCACCTAATGCCCGCATGGCATTATTCCCTTTCCCCCGACCATTAATACATGTTACCAGCCTCCTTCCCTGGTTGAGCCACCTCTGTTCACCTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2331636_2332157_3:0:0_1:0:0_acb7/1
+GGATAAATTAGTTTATTCCTCTTGTGGTTCAAAGGGCCTCCCTAACCACAGCCAAATCCTCATGGTGGTGCACCACACGGTGGTGAATGAGTTGGACTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2455050_2455517_1:0:0_2:0:0_281ac/2
+TTTGATTTAAATAAAACAGAACAAACTCCAGACCCAATCTCAGCACTGCAGCCACACACCCAAATTTAAGCCCTCAGAAGGTTTTTGAATTGGAATTCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_353962_354395_2:0:0_1:0:0_791a/1
+CTTTGGATTGCCATCATGATTGAACCTCATGGAAAGAATCAACTGTTTTTGTGGTAAGCTTAGTCATTAGTCTGGGTCAATGTAGTATATACAAGGCCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_259905_260335_0:0:0_4:0:0_11e83/1
+AATCAAATACAGTTTAAACTCCCAATTTCCCACAAATTTATGCTGTTCTCCATCAGCAGACTGGATGTTATATTAAACCAATTGCTGTCTTTTCTGACCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_222226_222680_2:0:0_1:0:0_38ead/2
+CAGCATTTTATTATAGGAAGAAAGACGATCTGACCTGAAATAAAAATGGAATAAATGCATGCTTTTGGTGAGATATTATAGCCTTAGCCAAGGGCAGATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_928644_929041_1:0:0_3:0:0_31c32/2
+CAACTAGCATTGCAAACACTAAGTATATATTTTATGTCCTTTTATTTTTTTATCCAGGAGGCTGAAACTCCCCTTCGATTTCCATGTCGTGTGTGTTGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1795869_1796398_1:0:0_1:0:0_3c2c8/1
+TGGGATGAGGTAAGAAATCACATTTATATGTAAATAATTTTTTAGTTTTGTTAAGTACCTATGAAAATTCTGAGACAGGGCGGCTGTGCCTGTGAGGAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_123871_124343_4:0:0_0:0:0_5818e/1
+AGTTTTGTGGAAAGCGTGTATAGAAATAGACTGTTTGTTTTTTGTCACAAAAACACAGGAATGATGGCAACATGACTGTGCAGAATATCCTCGCAGGGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1389628_1390153_0:0:0_1:0:0_1b7f1/2
+CTCCCATTATTGTCTAAACTCGGGAGGAAACAATTATCAATTTTTAATAAATATATTATAAAATCCTCCATTTCAATGACATTCCACAACCTGTAACCTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2296130_2296617_1:0:0_1:0:0_3fccb/2
+ACATTAAGGTAGCCACCAGCTCCTAAACCTCCTCATCAATTCCCATTGAAGAAACACACAAAGTATCATTCTAGCTGTGCATTGTTCAGGAATCGACAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_895065_895595_0:0:0_1:0:0_56569/2
+GATTTAGTTTATGCCTAAGCTCTGGTTACAAAAACACTCACAACCCACCCTAGTAATACAAAAGATATTTTTTTCCAATATTTTTAGAAAGAAAAGTGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_206393_206803_1:0:0_0:0:0_41ef1/2
+CTTTGTTTGTGGGGACCAATAAAAAGGGAAAACCATCCACTGCGCCACTGCAATCTACTGGCAAACATATAGGCAGCCTGGCTGAGATGGTGATCTACAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1661907_1662380_1:0:0_0:0:0_5b440/1
+AGGTATACAAAAGGAAGTGGTAAGGATAAGAAGGATCCACCTCCCGAGTCCTCTACTACAAATGCTCTAAAAGTCCCCCATAGATTTTAAACCAGACTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_142294_142760_0:0:0_1:0:0_49b6c/1
+GCCCTGGTGTTAGCAGTTCTTGACCACATGAATGTATATCTTATTCACTTTTAAAATCAAATGCCAGTTATATTCTCTCTGATCTCGGCCTCAGGGATAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1328880_1329349_1:0:0_0:0:0_1a786/1
+TCATGGGTTTCTCTGGCCTCCCAGGCATCAATAAGATAATAGAATCCGTTTGAGCAGTAAGGATCTCCCAATGAGACCCTAAAGGGCTTTGTGATTGTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1678712_1679147_0:0:0_1:0:0_420b8/2
+CATTAGTGATTGTGTATATACATACTTCCATTTTGAGATGTCCAACAGTAACTAGGTGGGAGTATAAAAATTATAAATATTTCACAGCATAAGTGTTACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_540473_540927_0:0:0_1:0:0_4c67f/1
+ATTTTCTGTTGATGAGGTGGGTACAGGCGTGGTGTTCTCAAAGCCCACCTCTTATTACAGCAGGTAATAGAGATGGAGGTTGCCCTGCCTCTGGAGTTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_437949_438370_1:0:0_1:0:0_41733/1
+TATTTTGTAGGGGCTCCATAGGAAAAGCCAACATAGATATCGTCCCCAGAATTAATTTCCTTAGTAGATGGGACTTGTATTCTGTGTATATGTTCAAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2008798_2009232_0:0:0_1:0:0_45c6/2
+ACCAATGGTGCTAATGGCCAGAGGCATTTGTTCATTCTGAGGGCCAGATATTTCCTAAAGGGTGGAATGGAGAGAGTAGAGAGTTCGTAGCAAAGATATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_905206_905688_1:0:0_1:0:0_dbf4/1
+TTCTGTAAGTAGTATAAAGTTGGCCCTTCCTTTACTACAGACAGTGACACTCATTGGGCTTCTGAGATGAGCTAAAATTATAAGGGAATGACAATAGGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1361173_1361624_0:0:0_1:0:0_18b97/2
+TCGATTTCTGGTGGCTCACATATGGACTGTCCGCTACTATCAGCAGCCATTTGTCTAATGGAAAGGAGAAGGATGCTATAGTAAAACAACAAAAAAAGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2401629_2402160_1:0:0_0:0:0_110e5/1
+TGGCATGGCTTTGTGTAAAGGGGGCTGCCTCAGTACATAGAGACGAGCCTGGACCAGCCTCAACTATTCTTACAAGGGGTGTTGTAGTCTTTACTGCTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2414808_2415177_1:0:0_0:0:0_38141/2
+CATGGGATAGTGGCATTTTGAGGACATCATTCAACAGAAATTCTTAAACAGTAGCTTGCCATATAACTGAGGCTGGGTTCCCTTTGTCCCAGCAGCTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_917041_917470_1:0:0_1:0:0_35f16/2
+CCTCCCAGGTTAGTATGCATGGTTTTTGTTTTTCACAATGAATATAAATGATACGTATTTAGCAGCTTTTAAGTTTGCAGAGCAGATAATATATAATAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_88047_88506_1:0:0_0:0:0_2874b/1
+TCGAACTCTAGTGCAGGAGAGGTTTTCCCACGTTTTGATGTGGCAGGAAAATGATATACAAAGACTCACTCTCATTATTGGTTGCCAGGGAGGAAACGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2001670_2002096_0:0:0_1:0:0_3b17/1
+CACAGAACTGCAATACATTTCTGAGCTACTCATGGAACAGGGACAAGACATGTGTCGAAGCATTTAGTAAGGAAAATATTTTGTATTTTATTTTGGATAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2418129_2418554_1:0:0_2:0:0_39ac5/2
+GACTTTGCCCATGCACACATGGTGGTTGTTAGCTATTAATCCCCCATCTTAAAGTACAGTGCGGTGGGACACACACACTACGCCTGCCCAGCCCAGCTGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_862607_863032_3:0:0_0:0:0_4bb63/2
+GGCAAAGACATAGTGGAAAAGAATCTTAATGTGGACATCTATAGAAGAGCTTATGAGCCTGCTTTAATTTCCCTAAAAAGGAAGTAAGCCAAAGTGGCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_477542_477908_0:0:0_2:0:0_2e677/1
+TACGCAACCTCCCACACCGGGCCTGAGGAAAAGGAAAGTTTTCTGGAGAGAAAAATTAGCAAATTGAGGTTTTTATTTTCCTGTCTATTTTGTTTTCCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_568979_569381_1:0:0_1:0:0_2bbbb/2
+ACAAAAGAAATAAATTGAAACACAAACATTTTAGTTCAAGGCAAGATGGGTCTTGGTTAAAAATTCAGTGCTAGCAAAGAAAAAAGTAAAAACAAAAATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1858882_1859369_2:0:0_1:0:0_ac/1
+TTTTTAACATGGCACCAGGAATCCCAGGCTCACAGGGGCCAGGAAAGCATTTCCACACAAAAAGCCCAACAGTGAGAATATATGCTGAGGAACTGGAGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_45857_46260_1:0:0_0:0:0_29cae/1
+GTTATTTATATGGAAACAAACATTAATATTAATGTTTTTATTGTACAGTGGCTCACTGCAAAGAGAAGGAAAGGGACCCACCTTTATGATACTTTCTTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1441578_1441983_0:0:0_2:0:0_29849/1
+GTGATTAAAAGAGATGAACATTTTCTTTATTTTGCCTCCCCGCCATTTATTATTTATTGTTTGAGACCACATGGTTTTTTTTTGAGGCGGGCGTTGGATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_250422_250818_0:0:0_2:0:0_125e/1
+AAAGACACTACCTCAGTAGCCAGGTACGTTTCCCTTTTGTCTTAGCTATACTTTGTAACCCTTGGAAGAAGTTTATAAGCTCGAGGTAATCCCAGCTCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1614135_1614494_0:0:0_1:0:0_1660d/2
+GGCCCCATCACCATGCCTATCAGTACCTTTTCTCTCAGGTTAAATCCAGGGAAGGCCTTTTTCATTCTGAGATGCTGGGCGGGGAGTTTCACCATGGCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_112208_112677_0:0:0_1:0:0_1e662/1
+CACTGTGACAGACATAGTTGAGCCGAAGAAAAGAACATGGACATATGGCATGGTGGGGCGGTATCTGTCCTTCTAACTTTTACATCTAAAAACGTGCTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_429639_430070_1:0:0_0:0:0_62f2/2
+TGGCCCCCATGCACTGTAAATATTTTTCACTGCAGTTTGTTTAACTTGGGGACCTACAGTGGAACAAAACACCTGAGTGACAAAGTTTTTTGATATTCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_964427_964862_1:0:0_0:0:0_7ed0/1
+ATAGAAAATATTTTATAAATTATGACTATAGCCTGTAAGTCTACGGCCCCTAGGAGACAGGGCAATGTGTGTGGGTTTCAGTCAAGACTAATTGGGATTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2352208_2352623_1:0:0_1:0:0_12ea9/2
+AGGAACATTCCATTATATTGAAATCTTGGTTTCACCAAAAAAAAAGAAAGGTGAAAGTCACAGAAACTTAATCACAAGAACAAAGCTTGTGAAGAGGTTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1345809_1346272_0:0:0_1:0:0_28199/1
+CCGAGGCTCCAAGTAAACCCTGTTCGTATCTCAGAGCTGTAATCGAAGAGAAGCTTCATAGTTTACATAGAGCAAACAAAAAAAAAACTCCCGGTGACAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_290653_291086_1:0:0_0:0:0_323cf/1
+TTACAGCTTTTTTGGATTATAGGTAAGGTAATTGGGGATGGATTCCAGCCTTTCTGTCTGACAAAGATTGGGCTTGTCTCGAAGTGGGTGTGACCTTTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2241312_2241719_0:0:0_2:0:0_2d9d3/2
+CTGTGTAGAAATCTCAAAGTGGGCAACACTTCATATATTTGTTAACGTCGCAGACAGCATAAACAACAAGAGTTGTAGAGACGGAGTAAGATTTTCTCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1617577_1618070_1:0:0_1:0:0_5143d/2
+GTGCTCTCTCACAGAGAATATTGATGATCTTCTCACACTGGGCTGGGAATGGCCCAGATTTAAAATAATTCAACCTAAACTGACATAGTTCTTTGTAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2331261_2331747_1:0:0_0:0:0_36b5e/2
+CGTCTCTGGCTGCTGAGGGGTGGCATAGAGCAAATCCCACCACGTGCAGTAGAGTAGGGTGTGCGCACCCAGCAAATCAAAATTCTATACCATAGTTGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1689283_1689709_1:0:0_1:0:0_34527/1
+TAGACTTAAAGAGTGCCCACTAAGCATTTATTGGACTCCCTAAATTTCTTTTCCTTTGGAGGGGTAGAAAATAAAATCTGCCAAATGCATTCCAATGGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2210425_2210886_0:0:0_2:0:0_17eb9/1
+AAGCCACGCCAGCCTGTGCAGTGTGTGTGCACATCATTAAATCACACTCCCTCATTGGAATCACCAGAATCAATAAATCAATACTTATAAAAAAAGTGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1078152_1078670_0:0:0_1:0:0_584be/2
+TCCCACTAGCTTGTATATTTATTTATAAAACGTTTAAACCACCACGCCCAAGCAGTAGAGTTTCTTATTTTAGGTCAGGAGTTGGTGTGTGAGCCATTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1488018_1488458_1:0:0_1:0:0_1942d/1
+AACCTCCGCCTCAGCCAAAGCACACACAAGGACTGAAAAGAAACAATTTTCAAAGTTTATTTATTATGCTTTTTCATGTCTATGTTGGAGTCAGGGATAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_342638_343165_1:0:0_0:0:0_36735/2
+TAGAGTTCAGGTGGATCACCTGGCTGGCCTGGCCTGCCCAGCTTCTTTCTTTACTTCTAAGACATGGGAGTGGGCACAAGCTGAAATAGTGGCCTGACCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_879160_879557_0:0:0_1:0:0_13022/2
+GCCAGGCCTCAGGGCTCCAGGTGAAGGTCTGTGGAAATGAACAGATTCTAGATGTCCCAGAGCTGGAGATCACTGAAATCAAAGTGTATATGGTTTTAGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_107358_107834_0:0:0_2:0:0_17951/2
+GGAAAACTTTAAAGTGCTGTTATAGTTGCAGTCTTGTTGCAGGCGCCCTTCCAGAACGACAAGTCAATGTAGTCACAGTTGAACCCTATACCCTCAGGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_885234_885719_1:0:0_0:0:0_241e1/1
+AGTTTGGATTTACTTCGCATGCTATGAATATTCTGTCACCTAGAGAACAAACCTAACTAATTACCAGGAGCTCAGGCCCCAGGATCAACATCAGCTAAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1263254_1263650_0:0:0_2:0:0_5b7b/2
+CTCCTGGAAAGGTAGTGTGATGGAAGGTCTAGAGCACCAGAACACTGGGTAATATTGCTGTATCAGTATTTTCCTCACACTTTTGGAGGTTAAACTATTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1446080_1446606_1:0:0_1:0:0_41ee2/2
+AAACTGACGAAGTCAGGGGTGGAAACGTTTCAACAATTCTAACTCTGTTTGCTCACTTTTTAATATGTATTCTTCTGGAAGAGACACTCTATAAACATGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_464792_465208_1:0:0_1:0:0_16e8e/1
+AAAGCTTTCACCATTTTCAGTAAATGAAGAGTTCCAAAACAGGTTTCCAAAACAGATTGCTCTGCTGCTGAAGCTAGGGTTTTAGCTTTCTGCCCTGGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2231334_2231741_1:0:0_0:0:0_158d4/1
+GGGATTCCAGCATAAAAGAAGAAGTCCCCTGTTACTATTCATGAAGAGTGCAACAGCTTTTTGTTGTCAGTGGGAACAAATCTCATGTTGTCTGTGTCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_808101_808587_1:0:0_0:0:0_1842e/1
+GGACCAGCAGAGACTGCTGCTCCATCTTGCCGGCCAGGGGCTTGAAAAATATACATCTAAACACTCTATATCTTCCCAGTAGATTCCCTTTGATGAGCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_568930_569444_1:0:0_0:0:0_54bab/2
+ATACTCCAGAGCCGCCCAGCAAACCTGATGGGGTTTGGCAGATCTCCATGCGACCCAATATCCTTTCTCAGAAGTGATTCCTAGCACAGAGTAATCAATC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2200077_2200494_0:0:0_1:0:0_361ee/1
+GCCAGAAATTCATTGCTTTCTTATTCCTATGATGTTAAGGCCAGCACTGTGCTGAAATAAGCTTCCCTCTGGATTTTAGTTTATCAGAGCCATCATCTAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2137691_2138111_1:0:0_1:0:0_1fa28/2
+TGAGTTCCTGCATATAGTGCAGTTGTCACCCTCTTCATTGGGGTGGAGTAAGAAACTGATGCAAAGTCAAAGGTAATGAAGACAGAAAAATTAGTTGCCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1069914_1070344_1:0:0_0:0:0_18538/2
+ACCAAGGCACTGCTTTAAGCTCTCATATTCAGTCTCGCAGCTACTCCCAGGTATAGTATAGCTAGAGGCTGGGACTACAAATTTATAATAATCATATAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_592694_593057_2:0:0_1:0:0_33cf8/1
+TTCCAAAAAAAAAAAATAATAAATAGCTTGGCGCCCTCACCCGGGCGAATTACTTACGCTATTGGTATATTTAGAACCAAGTTCTTAAATGATAGCACCG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_74105_74495_1:0:0_2:0:0_2cd63/1
+TTACATATGTCACATCACCAAAAGAAACATTATCGCTGTCCTTTTTTAGATTTGTTCTAAGCTGAATTTCTTCCTTCACATTGTTTTTTTTCCAGGGCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1211268_1211747_0:0:0_1:0:0_134ae/1
+TACCAGTCAAAAAAATATCTTTCATTTTAAAATTAATCCTCAGGCATTGCCATCGAGTCCCTCCCCCACAGAACACTAGAGATCCTCTTGAGATACTAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1585984_1586383_1:0:0_1:0:0_5564/1
+CTCCATCTTTACAAGCCACTTCATTCCACATTGAACCCTTAGAATAAAAGCAGTGGAATCACTTCATGACAGAAAGGTACTGTAGTATATGGTCAATTAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2079683_2080063_1:0:0_0:0:0_a6c9/2
+TGTTTTCAGCAAAAAGATAAACTTCCCACCTGGGTATCTACAAAAAAAAATTAAAACAGATCAAGTAAAGAGGAGAGGTAGGCCATTGGTTGAATGGTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_564982_565536_2:0:0_0:0:0_5a5ac/2
+ATTGAGACAATAACGCTCCCCATTACTTTCTTCTTTCAATTGTTTCTTCCACAGCTTCAGTGAGACACCCACCTTCAATTTGAGACCAAACAGACGAATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_62796_63167_0:0:0_1:0:0_5148b/2
+TATTATCTATTATAGGATGTTGTAGAAAACTATAAGGTGGGGTCTCAAATGCTTTAACACTTCTTGCTTTTTGTATTGCTCATGCCAAAACACTCTGGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1110768_1111201_1:0:0_1:0:0_45a86/2
+ACTGGTATATACATTGGGTGCACGATGATCTTAAAAACTCTATTCAATCATGCAAAGCTGTTTTTAAATGTAGGACCTTTCTATAGTTAAATTAGAACGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_864919_865327_0:0:0_1:0:0_ae0d/1
+AGGGTTGAACCTCCCCTTAAATCCCAAAAATATCTGTTGCAGTATCTCCACTGTATATCTACAGAGTCATGTTACTATATATATATATATACGTATATAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1859405_1859802_2:0:0_0:0:0_4384b/1
+TTTATCATTACTTCTCCACACGAACAGTATTATGTCAGACCCTTCTGAACACATTACAGGGCATTTTGCTGATGAATTAAAGTCCTATGCATCTTCAGGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2391318_2391742_1:0:0_1:0:0_4a33b/1
+CATAATGGCCGGAATGATATGATATATGAAACTGTTTTGATTATTTCATAAGGTGCTTACTATCTCTTACCCTAATTACATGGGGAATGCTGTAACAACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1023082_1023511_2:0:0_2:0:0_266b9/1
+CATGCGTGTGCTGGTTTCTTGCAGCCTGAAGACAGCCCAGCAGGAGTGTGTCTTGGGCCTGGCACTTTGTAAACAGGATAAGGAACTGATTCTATTTAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_329397_329814_1:0:0_2:0:0_28f/1
+AAGTGAGCCGGAGACTTGGTTTTGCCAAAGTTGTGGGAGGAAAGGTTCCCTCCCAGGACAAATATGTAACTGCATCACGAGGTCTTACCCTGCTCAAAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_340314_340776_1:0:0_2:0:0_1f671/1
+TATTATATTGTTGTAATGATTTCAGGTATTCCTGAGTTGATATAGGAGGGTGGAGATGCTGTAGATGCAGCAGAGTAAGAAGAAACTAACTGATAGGACT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1702563_1703067_1:0:0_0:0:0_91b7/2
+GCCTGTTAGTCTTTGCATCTGTTAAGGCAAAATGATGCTGTCTATGAAGACTACTGTAATGGGTATATGTAACTTTTTCCTTGAATGAGAAGAAACTGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_435685_436146_0:0:0_1:0:0_4cb2f/2
+GGAGAAACAGAAATATTTATTCCATTTACAGCAAATAACGCTTATTATGGTATTTTTATGACACATTTGGAGCCACCCACACTGCACATATATTTTCCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1652696_1653177_1:0:0_1:0:0_23603/2
+GCTGGGACATTTTTTTCCATCAGTGAGGTGGAAAGACTAAAAAAAAATTAGACCCCTTGTTATCAGACTGGCTTCTGCCTGGAGATTTCAGCTTTATCCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2454383_2454933_0:0:0_2:0:0_41d6/2
+ATAGGTCTGGGTCTTTATAGATGTCTTTATTGCTTATTTGCCGAGAGGGTTAATTTTGATGCCTGGCAACACTGTATTTTTAATTTTGTATGTTTCTTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2378016_2378467_0:0:0_1:0:0_ba5a/2
+TTAATATTAGGTGGGAAACAAAGTTATTGGGCAAGATATATGATCACAGCTCATTTTTTTTTTTTTTGAGGTGGCACATCTTTATGTCTGGTCTTCCATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1348377_1348853_0:0:0_1:0:0_ab3c/1
+GGTTTGAGGACCTCTGGTCTCATGGTAGAAGTGTAGGGGGTTTTATTTCATGTCTTGAGCTCTGTGCCCTGTCTTCCTTACCTAGTTTGGATAGCGATCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1462518_1462983_1:0:0_1:0:0_26888/1
+ACTTATTATACCCAAACAAACAGATAAAAATAAAAGAAAAACAAACCTTATTAGAGGTATTTGATTGCAACAGATCACTTTTATACAGTGTTTTTGGATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1502077_1502561_0:0:0_2:0:0_18f1f/1
+GGACTAAACTCAACGTAATCCCAGAGGTTCCTGTCCCGGAGGAGGACATGGCCATTTGTCAGTATGGGAATCTACCAACACAATTTTGAGTGTCGAGTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1423245_1423595_1:0:0_0:0:0_bac8/1
+ATTAAATTCACCAGCCGGGTTCCACCTTCCTGGGACTAAGCTTTATTTTTCTCTCCAGCCTGGACTGAGGCGGAGATGTAAATAACATTTTCGCTGCTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_458509_458991_2:0:0_0:0:0_5b54b/2
+ACCACCATCATGTGCGCAGAGGAAAGCAGGAGGGGTTATTTATAGCTGGAGTGCCCTATTAACTCTTCTAAACCTCCAATAGGTCCCCAAGCCCCTGTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1586413_1586859_0:0:0_1:0:0_a207/1
+ATCACTGCCTACAGCTGCACTAACGAAATATCAGATTTTTTTGAGAATGGGGTGGGTTCACCCAAGCACTATAAGGCATAGTTTTTTTGCATCCAGCTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1836529_1836957_1:0:0_0:0:0_30ebc/1
+TTTTATTTTCTACTCTAATTTTTGAAATGATAATATGTTAATGAGTTGAAACGGGGTTCATCCTCCAAAGACAACATAATTACCAATTTCTGTAGTTATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1721682_1722090_1:0:0_1:0:0_25d05/1
+CTTCTAGAGGTTATTACTGAACAAGACGGAGTTCTATTATTTCAATGGATCCATGTAGCCTGCTCCCCCTGGAATTTATAAAAAAATAAATCCAGTTATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_874381_874812_2:0:0_1:0:0_110b3/1
+TTGCTCAAGTTGGCAGAAGAGAATAGATCCACCAGTTCCATTGTCCCCTCTGAAATGAGTAGTTAAACCAGGTGGGCAGCAGCTTCCAATCTCAAATGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2480183_2480598_0:0:0_1:0:0_38e36/2
+AGAAATTAAGTGAAGCTATGTGCCTCAATACTGTTTCCTTTAGACCCAACTCAGCAACCCATGCCTTGAAGATATGCAAAAAGATGAAGTCTTGTGTCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_989022_989353_1:0:0_1:0:0_34b05/2
+AGCAATTTCTTTTTTGTGTGTGCCTGACCACATCGCCCTCTCTCTAAAGTGGATATGTTTGAACTGAAGATATTTTTAGTAGTTGGATCCCGCCGGAGCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_471502_472007_1:0:0_2:0:0_47a77/2
+AGTCATTAAGATCGCCAAAGATGAAGAAAACGTTATTCCCAGTCCTTACAGCCACTATTGCATAATTTCCTGGGTTATCATAAAATTTGATGTTGTGATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_224255_224677_1:0:0_2:0:0_47341/2
+CAGATCCTTATTCAAGTCCCCGTAAAAGTCAAGAAGTGCTCTCATTCTTTTAGTGCAGATGCTCTAGGGAACGGTGAAAGCTAGTCACTCATGTAAAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_906351_906838_1:0:0_0:0:0_c57b/2
+GTGTCTAGTCTCCACCTCCTTACAGTGAACGCTAACAAACCTGGGCTTAGCAGTTACTCTAAAAACTAGAAATTCCCATATCTTAATCTTGGTAGAGTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_900755_901177_0:0:0_2:0:0_14e7f/1
+AATGAATCAATGCCAATATGTTGCCTGTCATTGCACCAGATGCCACCTGTAAGTGCTTCTGTCTTTGTAGTGTGTGCGTTGCAGTGTACAAATGCAATGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2250463_2250862_1:0:0_0:0:0_5675f/1
+AGATTCTAAGTGCTGATAAGTTGACATTATTATTCATATATATTGTGGAGTGGGTCTAGGTATATATTTTTTTATCTTCTAGACATTTCTTTAAACTGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_985682_986188_1:0:0_1:0:0_279a/2
+CCTGCCTCTGGAACCACAAACACATGGGTCAGACAGAAAAGACCAAGTCCATTCCATTTATTGTTGTACATAAATATGAAAGACACAGAGGGAAGTGGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1445304_1445776_0:0:0_1:0:0_1aa19/2
+GGAGGAGTTTATTCCTTTTCAAAGTGTCTAAACAGCAGTTTGTTAGAAGTCTACTTCTAGGGTGCATCTCTTGTGACAGAAGAGGAAGCACTTTGGGTGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1385014_1385524_1:0:0_0:0:0_37c8a/2
+GCTCTGTCAGAAACAAATGCATTGGAACTCCTCCTGACCTTATAAGTAAACATAAGCTGAGGCCCTGGATTTCTTTGTAGTTGTTATTTATATATATAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2115089_2115507_1:0:0_1:0:0_db68/2
+ATCACATGTACCCATTTTGAAACTTCCCGGGAGCCCCGCCAGCAGCGTACACAACCCGCCTCACTCAAAAATAATCTACTAATCATCAAAACTCTCTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2371658_2371991_2:0:0_1:0:0_6653/1
+TGCTGATGTGTTTGGGAGCCAGGGTTATGATCTCGAACCCGGGGTGCTGACTATAAGAGATGTGGTTGTGTATAAACATTTTTCTGTAATCCAGTAGTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2253648_2254127_1:0:0_0:0:0_39c89/2
+ATCTTAGGAAGTTCTGAGCAGGGTTTTTCATGACAACTACGTCCCAGCCACCACACGTAATTTCCATGGATGAGAGAGAGTGAAAAAAAAAAAGCTGAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2106773_2107275_1:0:0_0:0:0_35c71/2
+AGAAAGAAATAAGGTTTGTTCTCACACAGGAATATGTGGGTTGTCTGGATACTATATGTGTTCTCAGAACCCAGTTCACACTTATGTCATCCCAGTACAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1864796_1865328_1:0:0_1:0:0_1ead/1
+AGGCTCTTAAAAATTACATTTCCAAGACATTCTAATTGAATGGACTTTTTGTGAGAAGTAGTTGGGAGGCACTGTAATCAGTGGGCCTGCCCTGAACTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_380482_381014_1:0:0_1:0:0_48c2f/1
+ATTGTATATGACTCAGAAAATTAGCTGAAATTACCTTAGAAAAAAATCACCTTCTGCCCAGAGTGGGCACCCAAATGGATGATCCTTCAATCATCTATGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_87549_88003_2:0:0_0:0:0_1a61b/1
+AATTACTGCAGCCGACACCCATTCGGAGCACCTGAAAGTTGCGCTGGCTCACTAGCATTATTTTGTTTATAGGACTTCATCCTTTGAATGTACACAGCTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2196395_2196891_2:0:0_1:0:0_103a7/1
+AGTACACTTCCATCAGGAGTGACTACAAAGGTTAGCTATAACTACCGTTGAGCGGGGACAGAACATCTCACTTACATTTGTGCTGAGGTCATCAATGATG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1373406_1373815_0:0:0_1:0:0_93ea/1
+CTGCCTCACTGCAATCGAAAAGAAGCATGCTATTACTACCGTTGCACTGGGCAACCCAGGAAACAGAGAAAAAAAAAAAAAAAAAAAAATAAAAATTCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_542509_543084_2:0:0_2:0:0_45c2/2
+TGCAAAACTTCATTCTCGTGTGTAGAGAACACGAAGCGACAGTAAACATTATTTTGGGATTAAAAGGATATTAACAACTACAGCCTTATAACACCGTTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1234506_1234990_2:0:0_1:0:0_4d7f4/2
+ATAAGCAGGTCAGGAGGAGAAGAAGCCCCAGTGGCACGCGCGCAGGTAATAAACTTCTCCCACCTCACCCCAGGTATTAATAAAAGTAATACTGATTTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1405731_1406157_1:0:0_0:0:0_4d40b/2
+CACACCCTGGCCAACCAATCTGTTTCATTTTCATGTCCAGCCCATATTTGTTAGCCTTGGCCAGGGTCTCCCTGATTCCATTAAAAATATTTGTTTTTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1243614_1244082_2:0:0_0:0:0_245b0/2
+TATAAGTAAGATTAGGAAGTTCTAAGAATGAAACGTAATAGAAGTTTTTTACAATACAAACCCATTTGAGAAATTTCTTCTCTACAAGATCGGCTCACTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2158019_2158417_2:0:0_1:0:0_1065e/2
+CTTAAATACTCATTGAAACACAAAACCCTAAGACCTCGTCAACATCATAGCGTAGCTGTGCTGGCGTTTTAGCTGTACTTTCTAACAGAACTTCATTTTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_626249_626668_2:0:0_0:0:0_47524/2
+AAAACTTTTGCTGCTCTCTTGGCCAACAATGAATAGGAGATTGTTCAAGAAGCACCAAATGGTTCTCCAAAAAAAAGAGGGAGTACTTCTTATCTTCAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_466558_467005_1:0:0_2:0:0_4ab80/2
+TTTCTTTTTCTAGTCCCGTAGGAGTGTTTCAACTTAGATTGCAAATGCATTTACATCTGGAAGTCTGCAAAAAGTAGCAGTAACAGAAAATGCACTCCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_697138_697495_2:0:0_0:0:0_15c94/1
+GGTGGATCTTCCTACCCCAAGTCTGTTAATTGGTTCTACCATTTATAAGATGTGTAATATACAGGCGCCTCGGCCTCAGTTTAAATGCTCATGATTGCCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1537351_1537783_1:0:0_0:0:0_446e8/1
+TCCCCTTTTTATTCATTTTGAGTTGAAGGAAAACAGGAATTAGGTTACTTATTCACTGCAAAGCCAGACCATCTCTATCTTCTCCCTGTGATCTCAGAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_503605_504048_1:0:0_0:0:0_7004/2
+ACCACACACACTCTGCTATGTTAACTTCTCTACAAAATTAAAAGTGAAGGGTTTTTGCGTGAGCCTCTTCTGAGGATGCATCATGGACGCCGACATGGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_851948_852377_1:0:0_0:0:0_34c84/2
+AATTGCTTTTTTTATTGAATGCAAGGAGAGAGACGGGGTTTCTTTGTCTTTGAGGTTGAATCTGGTAAACCCTATAAAATGGAGGAATAAATTGAGGACA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1773494_1773912_2:0:0_2:0:0_11ec0/2
+AACTTTAAGAAAAAGTACCCTGGGAGGCATGGCCCTGGATATTTAAAACATGTTGAATACGGCAGGTGCCATGATATGGACCTGCCTAGACCCCTCCCTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2204275_2204807_0:0:0_3:0:0_5f25/1
+TATGTAAGTTTATTGAAACATCCTGCCTGACTCAGAAGCAGGCTGGATCCAATTTCTGTCTATCATTAAATACAAAGCAAATTTATGCAGCAAAGAGGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2304990_2305446_1:0:0_1:0:0_7716/1
+TGGCTATTATTAACTGTTTTGACACATTTCTATGGTTTGTTCACTGGGATGGCTTGCCTACTTGAACTACAGTGGTTATTATTTGATAAAGTTTTTAGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_535388_535821_1:0:0_0:0:0_3e3a5/2
+TCTGCTTAGACCATTGTGGTGTGGCAGTGGCTCTGCCTGACCTGCTTACTAAGGGTGCAGGCGTACGAGTTGGAAGGATGACAGAGTAGAGCTACTTCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1480185_1480615_1:0:0_1:0:0_baf1/1
+CATACCTCCCGGTCCCCTAAATGGCGGTGTCAGTTTTGCCACCTTGAGCCCTTTTTAACTATTACCAATCCATCTAACTGTAATTTGGGTAAGCAGGATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1927851_1928347_1:0:0_1:0:0_13904/2
+GCTGAGGCACCTGAGTCAAAGGGACCGGACAGAGGATACCTTTTCAGTCAGGAGGAGTATTTAAGCCATCACCCCTGCTGCACCTGGAAACAGCACAAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2058874_2059343_0:0:0_1:0:0_4c064/1
+CAGATGGCTTATGTATTTTTTCGATTTTATTGCCTGGTCACCTCTAATCTTTTTACCCTAATATAGAGTATCTATAGTTAAATAATGTTTTCAAAATTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_808808_809219_2:0:0_0:0:0_3dd3a/2
+TGCTGATTGACTATAAGAACTTGACTGCAGATAGGTTAAATTTTGGACTCAGGGGTTACTTTGATTGAAGTGCACTTAACTAATTAGAACAAAAGGTACC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2405329_2405787_0:0:0_1:0:0_48159/2
+ATCCTCGCCTGTAATACCTGGAGGGCTAAATATTTCCAGTGGTTCTCTGCACTTTGGCTTGAACCGTTTCTACTGAATTCAGAAATTGCCTTCCTCCAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1810568_1811063_1:0:0_0:0:0_42dfd/1
+TGACATTTTGTGCAGTTCAGCAAATGGTAGGATAAAATTGGGTACCCCAGATGAGGAATTTCAACCTTGCCATTTTTATAAATATTGTTAAAATATTTAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2176141_2176586_1:0:0_1:0:0_1cb7e/1
+GATTCTATGAGAGGAAAAACAGAGATCTGTGGTCAAAACAAATCCCAGGCAGGAGTTTTGAACAGAGAAAAGCCATAATAGAGCCTGGCCCATCTGTTCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1655860_1656303_2:0:0_1:0:0_30062/1
+AAAAGGGATGTCCCCACCTTCCCAAAGATATGCCGAATAATTAGGTTTTTCTACCTTGAACCTGAGGCCTGCGGCGATTGGCAGTGGCACCCACAGGGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1025306_1025733_2:0:0_0:0:0_5b642/2
+AAGACTCTGAGCCACCTGACATCGATCTTATTTATAGTATTTTTTTATAGTCCCAGGGGCCCCGTCTGACAATCCTTGTAGAGAATTCTCCTATCTATAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1409802_1410347_0:0:0_1:0:0_33df9/2
+TCTGATTCCCTACTCGGCCTCACCATTGCGTCCGGTGAAGGAGGGCAGAGTGTTTCCTTCTTTATCCCTTTAGGATTTGCCCTCCCCGGAAAGCAAAGGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2352289_2352792_2:0:0_2:0:0_2af5a/1
+TTTTATTCTTAGTCTTAATTGTCAGCTTCTTTTTTAGCTCTGCCAATGACCCTCAGTAGCTTACCTATGGGAATGCAGGTTGGGCACACATAAGTTTAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_865287_865691_0:0:0_1:0:0_4d4ac/2
+CACCAATAGTATACCAAGTAATCCCAGCTAAATGAGGACTACAGCTGTTCTTGTTGCCTTCGCCGTCTCTCACCTGCACAGGTGCCACCCCACCAAAGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_587217_587659_2:0:0_1:0:0_3d816/2
+ATAGTTTAATATAGCACTATAAACAACATTTTGGTGCACCATCTCAAAAGTCCAGTGCGGGTGTCCGGGTGTACCCCCACAGAATGGAACTATCAGACTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1648315_1648785_1:0:0_0:0:0_d604/1
+GATGCGGTGAGGCGGGTCAGGAGCTCTGCTGCTGTAATTAAGACAAAATGTCAATATTTTTACCTCAATGCAGGTAAGACAGAATCTTCCAAAAAACATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1310862_1311242_1:0:0_0:0:0_18c51/2
+CCACAGCTGCTGGTTTATAGTGTGTGTGTGCTACAATTCTTGAACGGGAGTTTGTGGTTGGGCAACAAGATTATATTCTGTTTTCTCTAACTACAGAGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1865007_1865424_1:0:0_1:0:0_14d67/2
+TCTATTTATGTGTATGACCATTTCTTTTCTACTAAGTGATTGAAGAGTGGGGAAAGAGGGGCTGACCACCAAGGACCCCGTTTCAGTTAAAGTTCATCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1599350_1599723_0:0:0_1:0:0_3888a/1
+ACATTTTAGATCATGTGTCCCTTAGAAAGAACTTGGCATAATTGTATTTCTTTCTCTCAAACAAGAACAGTATTAGAACATCAGACCAGGTTGTGGCCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_163084_163551_1:0:0_0:0:0_3597f/2
+CCTATCACTGGGTAACCCCAGCAATGGTTACACCAGAGGAGAATTCATAAAAGTAAATCTCAAAAATTAACAAGCAACCTGGAGTGCAAAAAGAAATTAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_124243_124768_1:0:0_1:0:0_2fbab/2
+AGATGAGTAGCAGAACTATAGGTCTACATTATTATTCAGTACAATTAATAATAGAAAATGAGTTATTTTTACGCTGGGATTTGTATATTGATGCAGTTCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_38956_39473_2:0:0_2:0:0_4575c/2
+CCAAATACCAAGGTGTGAAATCTACTATTCTGAAGCACTTTACCCAATTAAATAACGAGCTCATCATGCTTTGCAGAAAAGGTAGCTGGGGTAATGAGTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_106130_106576_1:0:0_1:0:0_780e/1
+CACTCTGTGTCAGTGTCGTGTAATTTTATAACAAAAAAAACTCCTGCACAGGCTCCTTCTTATTCTTCTTTTTTTTAACCACCTACCTACTAACTTCCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_569064_569467_0:0:0_1:0:0_4fb07/2
+TTAAAACAAAAATTGGTGCCCTTTCTCACCTCTCTTTGAGACTGTCCCAGAGACAGTTTCCTTATCCCTTACTATTATTCAATGTAACCTTCTTTTCTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1021207_1021603_0:0:0_1:0:0_51b38/1
+AGCAGATCAGTAGGCTTGATGAAGACTTCCTGGAAAAGTCTAAAGTATTATGGCAGCTGGGTGACAGAGGACCTCCCAACTGTAATCATGTCTTACCCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2367899_2368224_2:0:0_0:0:0_2c903/1
+CTTTACCTATTACAGCAAGAGCTCTAGAAGGCCAAATGCTTTTATAAGTGTGCAGGTTGGTGGCTTAAGGAAAAGAATGTTTACAAAAACCTCCCACAGT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1626614_1626986_1:0:0_1:0:0_102be/1
+GTGGAAGAAAAGGCCACCACCCCACCTGGCTATAACAATTAACCTTTTGTCTCTACGAACAGCAAAGATAAATAAGGTTGCATTTATTTCCACAACCAAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1097917_1098430_1:0:0_2:0:0_2255b/2
+TATTGGTGAAAAGGGATCTCACTGGGCTTACTATCCAAGTTATCACAGCAAGCTCCAAAGCCTTAGTCAGGAAAGGGCAGGAGATGCGGCCGTGCGTCAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1853638_1854075_1:0:0_0:0:0_5ada2/1
+ACATGCACATACAGCATAGGGAGCAGCACTTTTTAGAATGCTCAATTATCTAAAAGTAGAGACCTCCAGGGTTGAATGGAAGATTCTTCTGAGTGAATGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2223063_2223500_1:0:0_0:0:0_95e3/1
+ACTTCTCTCTCAAAATCAGAAAATCCTAAGTTGATGAAACATGCGCTGGCTCTCATTCAGACCTGGGCTCGTTTTGAATATCATTTAGCTTTAGGGAGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_164283_164731_0:0:0_1:0:0_11baf/1
+TAGGAAGAAGTTCATTCCTTCTTTCACCATGGAAGCAAAGGTTTGGTTCGGGGCAGAGGGCCTCCCTGTTTACAGGCAGGACAGTGAGACTGGGATATTG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_248261_248633_1:0:0_1:0:0_23859/1
+GAATCAATTAGACACTTGAACTTTGGGTTTTCCAGCAAACCCACAAACCTTCCAAAATTAGCAGCTCCTCTGTCACATAGTTTTGCCTGACCTGAGTCTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2468744_2469159_1:0:0_1:0:0_3033a/1
+TGAATTATGGAATGAATCAAAAAGTACAGCAGCTTTCTTTACTTTTTCCTCTTTTTATTCAACAATATAACTCTGATATTATTTCCTTCTCAGTTCACCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_70651_71102_0:0:0_1:0:0_22eab/1
+GCCAGGAGCTTAGTTAAACAACCTCTAGTCTGCTGCAAATCAACTTACCATTATTTATACAGCTTGCCATGATGAGAATTCCCTGGCAATATTTTGTGTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1154476_1154965_1:0:0_1:0:0_2cf63/1
+TATCCAAGTAGCTGAGGATTGTCCAGTTCTTGTCGGAGTATAGTAATGGTTGTTTCAGCTCTTTTGTATTATCATGTAGTCTGTGGAGGCACTATGAGCC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_693481_693922_0:0:0_1:0:0_27b6f/2
+TAAAATTATTCGGCTGATACCACAGAGACAGGTATTACAACTCATCCTCCTGATGAACCACAAGGAATTTTTGTTTTCCTGCATAAGATATGATTTTATA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1583289_1583701_1:0:0_0:0:0_2cef3/2
+ACCATCCTTTAACAAGGCAGGAGGGTGCCTCAACTCCGTGCGGGAGGGAGCAGTGGCAGTCACAGGACAATGTGAGTAACCTTCCTGTTTGTTTTCTTGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1291093_1291555_1:0:0_0:0:0_2ef54/1
+CTTTATGGCGACGTCAACCTGGTGCCTCAGGAGCAGCTTTCAAAAATAGGAAGACACAGATCCTTAAAATATGGAGAGAGAAGAGGTTGGCCAGTTATTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1241874_1242334_1:0:0_1:0:0_2b9a9/2
+CTTGCAGAGCTTCAGCGGCGCCGGTGTACACTTTGGCTTTTGTTCTATCTTTTCTAGGAAGCCCATGGATGTTGTAAGGTATATATTCACACCCTGAGTC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2131320_2131797_0:0:0_2:0:0_29e92/1
+TTACAGATGAACTACCCCAACAGATAATCCACACCCTATTGTGATACTCCAGCACTTGCTCACTTCTGCTTCTTGGTAGATTCGCATGCAGGAGCTCTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1477564_1478074_2:0:0_0:0:0_26b1/1
+AGAAATAATTTACCTAGGACATGTCTGCTCATGCATGAGATAGAAGGGACACCTGACCTTGATGCCTGTGCCATGATATATATAAAAAATTAAAAAGGGA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_870926_871400_1:0:0_1:0:0_4c482/1
+AGGTAAGCTAACATACAGGCAGGAACAACAGATAATTGTTAATTTCATGTTCAACCCATATCCTAGGACATTCTGAGAAACTCTTGTCGTAAAGGATGAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_265232_265661_0:0:0_2:0:0_22a60/1
+GATGTCCTGTTTTAAAGCTCACTGTGTTAGGTTTTCAACTGATGGCTATGGATCTTGTGACCCGCTCTTAAAAACTCAGCCTTTGAATGATGAGATGGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_659348_659925_0:0:0_3:0:0_44742/2
+AGTGCTATACCACTATGCAGGTATTGATAATAAGTTTTACAGATGGTTATTTTGATTGTCTGTCTCTCTGTTTCTACAGGCGGGCTCTCTATACAAACCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1010930_1011381_1:0:0_0:0:0_2cf81/1
+CAACTAAAAATGTTTTTTTAATGATTTTTTAGATCAAGCAACTGCATTCACTTTGTCCCCCTTGGTGGCAGACTCCAGGCATCACCTGCTGATGAATTTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_494895_495352_0:0:0_1:0:0_1a857/2
+ATCTCAGCAGGGAAATCCTTGATGTTGTTAGTCTGGGATCCTTTACTTCTGATAGAGCGTACGCAAGAGACTGTCATCTGCCATCCTTTTCAGTAATTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1570983_1571363_1:0:0_1:0:0_3d218/2
+GGGCCCTGCCGAAGAGGCCTTGCATATAGATGAAGACTGTGCTGGGGCTGTGTAAAAAGTATAAAGTGTTGCAGTAAGCAACTATTTGTTATGTTCATGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1594819_1595244_1:0:0_0:0:0_2539c/1
+AATGTTAGAGATTCCATCCTGCCTCCCGAACTCCTGACTTTGAGGTTGTATTTCTTCGACCTCAAGATTCCATTTTATTGCTAGAAAAGTACCCTGTCTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_157504_157968_2:0:0_1:0:0_2d61/2
+CGTGCCCAGTGTGGTAGGTGTGAGTCCAGTCTCTTGAACCAGAGCAGTTTGTTATATGGTGTGGACATACACTTTAGTGGCTCTATAACTACAAAGATAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1594544_1594996_1:0:0_1:0:0_3a266/2
+AATATTACATAATAATTATTTATCAGCTGGGGCAGGGACAATATACAAATGTTATGATCCAAATGCTTCTGAATAAAGGGGGGTTTTAAACAGGGCGGGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_194905_195339_0:0:0_3:0:0_36c83/2
+TATATAATTTGCCATTTCCCACATTGAACATATTCAGGCTCCTGAGGGCCTGTAGATAATTAAGCGATGTGTATTTTATTTTTTTAGTTAAATAGGCCTA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2449081_2449526_2:0:0_1:0:0_e729/1
+TGACCTAGTTGCAATGTGGCAGGAAAGGTTTGTAATCCTTAAAAGTGTGGGGCGAGCACTGAGGTATGTCCACACTGGACATCCTCACATGTACCATCAA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_777001_777383_1:0:0_1:0:0_1ab68/2
+AGAAATTATACATTTAGAACATTCAGTTGTTAAGCCAGCATAATTCACTGAATGTGACATCAAAATAAAGCAGTTTCCAGTGGCCCAATAAGAGGTTACC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_909623_910009_0:0:0_3:0:0_92b0/2
+TTGTCCAAATTATTATCCTAAAAGTGGTACAAAGTCTCCTGTAAACAGGGGCTCTAGAAAGATGTTTGCTTTGTCTTGCTATGGCATTTTTGTTTTTTTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1793437_1793885_2:0:0_2:0:0_f48/1
+ACGTCCAAAGTCACACACAGTCTTGTGTTTCTGAAATTTCCATGAAAAATACTTTGGGAGAAATGGGCCTAAACTTGAAATGTATATGGAGAATCGCTGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2270614_2271102_1:0:0_2:0:0_36c81/1
+TCCCGCAGTTCCAGGAGACTGAATTAATTATCTGCAACTGCCACGGTGAAAGGATCTAGGATAAAGACAACAGTAGCATTGAGGTTTGATGAGAATGATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1429060_1429520_2:0:0_0:0:0_1eb11/1
+CTGCACTCCGGAAGCTGGAGGTGGAGGGCTGCACTCCAGCAAAACTACTTGAAGGCACAAAGACTCAGGTGTCAGCTAAGAAGAGATTTTCTCAAAATAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1693860_1694289_1:0:0_1:0:0_16edf/2
+CTGAAGGACCTATTCAATGCCGCTCCTAGAACAGACCTTAAGACCACCTTGAGTTCCAAATTTTTATACTTTTGGGGGTGGCTCAACGCCTGTCTGCTGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_129382_129773_1:0:0_1:0:0_2ae5a/2
+ATAGGTAGGGCTGTAAAAGGCATTTAAAATAACGTATGTATGAGTATGCGATCACTTATTATTTTACAATATTCATCCAGGATATTTAATGAAATTTACG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_358100_358584_1:0:0_0:0:0_2523e/2
+ATTTCTGAGTAGCACACACAAGATGTGACAGGGCCATAGTATATGAACCTCTGAAAAATTTCAACTGAAGTATTTCATTCAAGACCAAATTGCAGTGGCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1089892_1090349_0:0:0_1:0:0_1b8ae/2
+AAGTAGGCAGGAACCAATGAGATCAGAAAGTCTGTCTCAAGGGTTCAATATTTTAGCATACCAGCCAGGAGATGATTTCAAGTTCTCTCTAACTTAGCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1879035_1879519_0:0:0_1:0:0_1648e/2
+TGATGGGTGATCCAGTCCATTGCATAGAATATATAGCAGATCCCAGCCAAACCTGCTTCACATTTCTACCAAAAGGCATATACATTAAAATTTTAATAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2291075_2291506_1:0:0_1:0:0_59c62/2
+TAAACAATATCGATTTGAATTATGCAGATCACTTAGGTAATTTTTGCCTTGATTAAATACTTGTGTGCTGTGGCTATAGGGAATGGAGTCGTCTCAACAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1985021_1985496_1:0:0_2:0:0_1934f/2
+TGCCCCCTCTTGGGAAGCGGTGGGAAGACAGAGAGACGAGGGCCAAGCAGGATTAGCTCCTGATTAAGTAAATATTACCTTTGAGAGCTGCCCCAGAGTT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_508474_509017_0:0:0_3:0:0_5655a/1
+TGTTTCTTTCCAGGCTGGGTCATGAGATGGAACATTGTCTGTCTTAGCCGGGCTTGTATTTGCCCTGTGGATTTATTTCTAACCCTGTGAGGACTTACAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1587117_1587643_0:0:0_1:0:0_1c05e/2
+CCAAGGCCATCCTGTGTGTGTCCATTGCGCCACCACCAGTGAGCTATCTGTCTTCAAATCATTCCAGTCTCAAATGGTTACTACAAAATTCTCAGGCTGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2306413_2306928_1:0:0_1:0:0_131a/1
+CATAAAGCCAAAGTGCAACGTCTCAGATTTTTGACACAGAGTTGTCAAGCCAGTCATCTCTCATGAGCCCCGGGGGGAAATGTCTTAGACCAGTCTCTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1202422_1202893_0:0:0_1:0:0_fef9/2
+AATTGAATGATCTATAGACAAGTAGGACAGGGGTCATGTTGTATGATGGTCGGGGCGACAGAACCCCTTCCTCACCCTGTCTCCTGCTACTAATGGCCAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1658612_1659014_1:0:0_0:0:0_21d1d/2
+TGCCTGAGCTTAGCACTAATAAGGCTATACCCGAAAAAGTATCTCGCTCCAGATTTTATTCAGCCCCATTCGATTTAGACCAGATTTAGATGACCTTTCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1910468_1910916_1:0:0_1:0:0_53372/1
+TCAACTCAATCTCTTCACAGAGCAGTTCAGAGGAAAGCCCATGTGGCTTAAAAGTCACCATAGAAGAAGTATATTTAATTATCTCATGCTCTTAGGGAGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_846316_846782_1:0:0_1:0:0_3dc5b/2
+TACTCTTCACAATCAAAAGAGCTAGACATGACTGTGTCTGTATTGCAAGATTTCATATGAGTTTAAATTCTCCTAAAGCAAGAATAATATTCTAGATAAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2370809_2371204_1:0:0_2:0:0_d5af/1
+CCCTGTCACTGCCTCACAGGCGCCGTGCATGAGAATTTTCTGGGATTGGCCACCGCATAGTTTACATACCTTTCTTCCTCACCAAATAGGACTTGGGGAG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_696567_696973_1:0:0_0:0:0_18dc1/1
+AAGTTGGTGAAAACCCCTCACCTGTGTGCTCTCAGAGCAGATTACATTCCAATGTTAGGACCCAAATCAGCTTAGATAATAAATAAAATTCTACTATAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_489813_490315_1:0:0_1:0:0_4546/2
+CTCGTGGATCATTGTACTTTGTCCTCCCATAGTGTACAGATTGGGAGGCAGGCAAAGATTATGATTTTGGTGTGTAAGGCAGGATGAACTTGTTAATTAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1234911_1235396_1:0:0_1:0:0_17506/1
+ACAGGGGGGTGGACAAGAGAACGCAGGATAACCCTAGATGCTAAACTTTCCCTTCTATGATTTCTCCTACAAAATGTATCAGTTTCCAGACAACACAAAC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1852557_1852988_1:0:0_2:0:0_1c8f5/2
+GTATCTTCCATAGAAATAATAATAAGCTGAAGCAGAAGTGTTAGATATTACCTTTCCATATACCAAAATGACTTGAAATGTGTTCATCATCACGGCTCAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_610564_611039_1:0:0_1:0:0_2e270/2
+TTTTTGAGATTAAATTTCATACACATGAACAGAGCAGCTCATGTGTGTCCTCCTTCACAAGTCACTCTTTTTTCCCCACAGCCCCGTCTCAGGTAAGCGG
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_997524_997975_1:0:0_1:0:0_5b4ef/2
+CATGAAATGAGAAAATAACCCCGTCCCTAACATGAGACAGGGTCACGGCAGGGAGCCCTTAATTCCATCCCTACAGGCGTGAACGTCCATGGATTGTCCA
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2465370_2465761_1:0:0_1:0:0_30d05/2
+AGCGTTCCTTCAAACATGCTATTGCTTTCTGAATTTTTGCTTGACCTTATTTAGTGACTTGTGTCGAAAAAATCAGATGGGGCTGCACTCGAACATGGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_1793636_1794107_1:0:0_1:0:0_3f5d7/2
+TGGAATTCTTAGCAAGTGAAATGTTTAGGAAGTGCTTGAGTCTCAATAATCAAAGATGTTTAAACAGTGAGTGGCTGCCAGATTTAAGTATAGAGCAAGC
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_573140_573512_1:0:0_1:0:0_117c8/1
+GAATCTAGTCCTCCAAACAGTATATGTAACCAGGAATCTCAAAGAAAGGTGATTTATGTTGAAACAGCAGGGTGTGGCCCTGTATCACCATATGCCCATT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_162650_163129_1:0:0_0:0:0_15177/2
+CTGAGACTATTATCCAGCGGGACAGGGCCCTCAGTTACAAGATCACGCCATGCCTCCCATGTCCAAGAGCTTGGCATTCAAATTTATGGCTGCCCCAGAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_2376608_2377066_0:0:0_1:0:0_5a94f/2
+AACTTTTTCACCTCAACCAGAGACAGAGATATCAAAACACCACTTCCAACTGTAAGGGGAGACTATTATTCTCATTACCTGTCTTCAGCCTCCCCAATCT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
+ at seq1_188443_188931_1:0:0_2:0:0_41895/2
+TGAAATATAGTCACTGGCAGGAAGGATTTCTGCTTACTCTGGTATCTCACTCTCTGTCGCCCAGGCTTTTCACTGCCCATGCATTCTAGAACAGTTAAAT
++
+8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
diff --git a/tests/test-data/bogus.fa b/tests/test-data/bogus.fa
new file mode 100644
index 0000000..915f756
--- /dev/null
+++ b/tests/test-data/bogus.fa
@@ -0,0 +1,2 @@
+>Specicus_bogusii
+GTACGGCTATTATCTGAGCTCAAGACTAATACGCGCTGGCCACTGGTA
diff --git a/tests/test_banding.py b/tests/test_banding.py
new file mode 100644
index 0000000..cbd163e
--- /dev/null
+++ b/tests/test_banding.py
@@ -0,0 +1,158 @@
+# This file is part of khmer, https://github.com/dib-lab/khmer/, and is
+# Copyright (C) 2017, The Regents of the University of California.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of the Michigan State University nor the names
+# of its contributors may be used to endorse or promote products
+# derived from this software without specific prior written
+# permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Contact: khmer-project at idyll.org
+# pylint: disable=missing-docstring,protected-access,no-member,invalid-name
+from __future__ import print_function
+from __future__ import absolute_import, division
+
+import screed
+import khmer
+from . import khmer_tst_utils as utils
+import pytest
+
+
+ at pytest.mark.parametrize('ksize,memory,epsilon,numbands', [
+ (21, 5e6, 1, 2),
+ (21, 5e6, 1, 4),
+ (21, 5e6, 1, 8),
+ (21, 5e6, 1, 16),
+])
+def test_banding_in_memory(ksize, memory, epsilon, numbands):
+ """
+ Test accuracy of banding functionally.
+
+ Tests whether k-mer counts loaded into separate counttables in bands gives
+ reasonable behavior compared to k-mer counts computed in the normal
+ fashion.
+ """
+ infile = utils.get_test_data('banding-reads.fq')
+
+ ct_normal = khmer.Counttable(ksize, memory / 4, 4)
+ ct_normal.consume_seqfile(infile)
+
+ ct_banded = list()
+ for band in range(numbands):
+ ct = khmer.Counttable(ksize, memory / 4 / numbands, 4)
+ ct.consume_seqfile_banding(infile, numbands, band)
+ ct_banded.append(ct)
+
+ for n, record in enumerate(screed.open(infile)):
+ if not (n > 0 and n % 100 == 0):
+ continue
+ for kmer in ct_normal.get_kmers(record.sequence):
+ abund_normal = ct_normal.get(kmer)
+ abunds_banded = [ct.get(kmer) for ct in ct_banded]
+ # Ideally, we'd like to enforce that these are equal. Practically,
+ # with false positives, we have to allow for a small difference.
+ assert abs(sum(abunds_banded) - abund_normal) <= epsilon
+
+ nonzeros = [a for a in abunds_banded if a > 0]
+ # False positives shouldn't be appearing in multiple bands
+ assert len(nonzeros) <= 2
+ # False positives shouldn't have high abundance
+ if len(nonzeros) > 1:
+ assert min(nonzeros) == 1
+
+
+ at pytest.mark.parametrize('ksize,memory,numbands', [
+ (21, 5e6, 3),
+ (21, 5e6, 11),
+ (21, 5e6, 23),
+ (21, 5e6, 29),
+])
+def test_banding_to_disk(ksize, memory, numbands):
+ """
+ Test accuracy of banding in terms of the data structure contents.
+
+ Stronger than the functional in-memory test, this function tests whether
+ a computing k-mer abundances in banding mode produces the same data
+ structure as counting k-mer abundances in the normal fashion.
+ """
+ infile = utils.get_test_data('banding-reads.fq')
+ path1 = utils.get_temp_filename('normal.ct')
+ path2 = utils.get_temp_filename('banding.ct')
+
+ ct = khmer.Counttable(ksize, memory / 4, 4)
+ ct.consume_seqfile(infile)
+ ct.save(path1)
+ fpr = khmer.calc_expected_collisions(ct)
+ print('FPR', fpr)
+
+ ct = khmer.Counttable(ksize, memory / 4, 4)
+ for band in range(numbands):
+ ct.consume_seqfile_banding(infile, numbands, band)
+ ct.save(path2)
+ fpr = khmer.calc_expected_collisions(ct)
+ print('FPR', fpr)
+
+ with open(path1, 'rb') as f1, open(path2, 'rb') as f2:
+ assert f1.read() == f2.read()
+
+
+ at pytest.mark.parametrize('sketchclass', [
+ (khmer.Nodetable),
+ (khmer.Counttable),
+])
+def test_banding_bad_params(sketchclass):
+ sketch = sketchclass(31, 1e5, 4)
+
+ # Fails because 13 > 8
+ with pytest.raises(ValueError) as ve:
+ infile = utils.get_test_data('bogus.fa')
+ _ = sketch.consume_seqfile_banding(infile, 8, 13)
+ assert "'band' must be in the interval [0, 'num_bands')" in str(ve)
+
+ # Fails because file does not exist
+ with pytest.raises(OSError) as ose:
+ nreads, kmersconsumed = \
+ sketch.consume_seqfile_banding('file-no-exist.fa', 16, 3)
+ assert 'does not exist' in str(ose)
+
+
+ at pytest.mark.parametrize('sketchclass,num_batches,batch', [
+ (khmer.Nodetable, 8, 3),
+ (khmer.Counttable, 8, 3),
+])
+def test_banding(sketchclass, num_batches, batch):
+ sketch = sketchclass(31, 1e5, 4)
+ infile = utils.get_test_data('bogus.fa')
+ nreads, kmersconsumed = \
+ sketch.consume_seqfile_banding(infile, num_batches, batch)
+ assert nreads == 1
+ assert kmersconsumed == 3
+ assert sketch.get('CGGCTATTATCTGAGCTCAAGACTAATACGC') == 1
+ assert sketch.get('TATTATCTGAGCTCAAGACTAATACGCGCTG') == 1
+ assert sketch.get('TGAGCTCAAGACTAATACGCGCTGGCCACTG') == 1
+ assert sketch.get('GTACGGCTATTATCTGAGCTCAAGACTAATA') == 0
+ assert sketch.get('TTATCTGAGCTCAAGACTAATACGCGCTGGC') == 0
+ assert sketch.get('GCTCAAGACTAATACGCGCTGGCCACTGGTA') == 0
diff --git a/tests/test_countgraph.py b/tests/test_countgraph.py
index 0e3763d..cd1cb30 100644
--- a/tests/test_countgraph.py
+++ b/tests/test_countgraph.py
@@ -889,12 +889,6 @@ def test_find_spectral_error_positions_err():
except ValueError:
pass
- try:
- hi.find_spectral_error_positions("ACGTACGN", 1)
- assert 0, "should raise ValueError; contains N"
- except ValueError:
- pass
-
def test_maxcount():
# hashtable should saturate at some point so as not to overflow counter
diff --git a/tests/test_cython_assembly.py b/tests/test_cython_assembly.py
new file mode 100644
index 0000000..c9a76c4
--- /dev/null
+++ b/tests/test_cython_assembly.py
@@ -0,0 +1,441 @@
+# -*- coding: UTF-8 -*-
+#
+# This file is part of khmer, https://github.com/dib-lab/khmer/, and is
+# Copyright (C) 2010-2015, Michigan State University.
+# Copyright (C) 2015-2016, The Regents of the University of California.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of the Michigan State University nor the names
+# of its contributors may be used to endorse or promote products
+# derived from this software without specific prior written
+# permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Contact: khmer-project at idyll.org
+# pylint: disable=missing-docstring,protected-access,no-member,invalid-name
+
+from __future__ import print_function
+from __future__ import absolute_import
+
+import itertools
+import random
+
+import khmer
+from khmer.khmer_args import estimate_optimal_with_K_and_f as optimal_fp
+from khmer import ReadParser
+from khmer import reverse_complement as revcomp
+from . import khmer_tst_utils as utils
+from khmer._oxli.assembly import LinearAssembler
+
+import pytest
+import screed
+
+from .graph_features import *
+from .graph_features import K
+
+
+def teardown():
+ utils.cleanup()
+
+
+ at pytest.mark.parametrize("assembler", [LinearAssembler])
+class TestNonBranching:
+
+ def test_all_start_positions(self, linear_structure, assembler):
+ # assemble entire contig, starting from wherever
+ graph, contig = linear_structure
+ asm = assembler(graph)
+
+ for start in range(0, len(contig), 150):
+ path = asm.assemble(contig[start:start + K])
+ assert utils._equals_rc(path, contig), start
+
+ def test_all_left_to_beginning(self, linear_structure, assembler):
+ # assemble directed left
+ graph, contig = linear_structure
+ asm = assembler(graph)
+
+ for start in range(0, len(contig), 150):
+ path = asm.assemble_left(contig[start:start + K])
+ print(path, ', ', contig[:start])
+ assert utils._equals_rc(path, contig[:start + K]), start
+
+ def test_all_right_to_end(self, linear_structure, assembler):
+ # assemble directed right
+ graph, contig = linear_structure
+ asm = assembler(graph)
+
+ for start in range(0, len(contig), 150):
+ path = asm.assemble_right(contig[start:start + K])
+ print(path, ', ', contig[:start])
+ assert utils._equals_rc(path, contig[start:]), start
+
+ def test_circular(self, circular_linear_structure, assembler):
+
+ graph, contig = circular_linear_structure
+ asm = assembler(graph)
+
+ path = asm.assemble_right(contig[:K])
+ print(path, ',', contig)
+ assert utils._equals_rc(path, contig[:len(path)])
+
+
+class TestLinearAssembler_RightBranching:
+
+ def test_branch_point(self, right_tip_structure):
+ graph, contig, L, HDN, R, tip = right_tip_structure
+
+ assert graph.kmer_degree(HDN) == 3
+
+ def test_beginning_to_branch(self, right_tip_structure):
+ # assemble from beginning of contig, up until branch point
+ graph, contig, L, HDN, R, tip = right_tip_structure
+ asm = khmer.LinearAssembler(graph)
+ path = asm.assemble(contig[0:K])
+
+ assert len(path) == HDN.pos + K
+ assert utils._equals_rc(path, contig[:len(path)])
+
+ def test_beginning_to_branch_revcomp(self, right_tip_structure):
+ # assemble from beginning of contig, up until branch point
+ # starting from rev comp
+ graph, contig, L, HDN, R, tip = right_tip_structure
+ asm = khmer.LinearAssembler(graph)
+ path = asm.assemble(revcomp(contig[0:K]))
+
+ assert len(path) == HDN.pos + K
+ assert utils._equals_rc(path, contig[:len(path)])
+
+ def test_left_of_branch_to_beginning(self, right_tip_structure):
+ # start from HDN (left of branch)
+ graph, contig, L, HDN, R, tip = right_tip_structure
+ asm = khmer.LinearAssembler(graph)
+ path = asm.assemble(L)
+
+ assert len(path) == HDN.pos + K
+ assert utils._equals_rc(path, contig[:len(path)])
+
+ def test_left_of_branch_to_beginning_revcomp(self, right_tip_structure):
+ # start from revcomp of HDN (left of branch)
+ graph, contig, L, HDN, R, tip = right_tip_structure
+ asm = khmer.LinearAssembler(graph)
+ path = asm.assemble(revcomp(L))
+
+ assert len(path) == HDN.pos + K
+ assert utils._equals_rc(path, contig[:len(path)])
+
+ def test_right_of_branch_outwards_to_ends(self, right_tip_structure):
+ # assemble from right of branch point (at R)
+ # Should get the *entire* original contig, as the assembler
+ # will move left relative to the branch, and not consider it
+ # as a high degree node
+ graph, contig, L, HDN, R, tip = right_tip_structure
+ asm = khmer.LinearAssembler(graph)
+ path = asm.assemble(R)
+
+ assert len(path) == len(contig)
+ assert utils._equals_rc(path, contig)
+
+ def test_end_to_beginning(self, right_tip_structure):
+ # should have exact same behavior as right_of_branch_outwards
+ graph, contig, L, HDN, R, tip = right_tip_structure
+ asm = khmer.LinearAssembler(graph)
+ path = asm.assemble(contig[-K:])
+
+ assert len(path) == len(contig)
+ assert utils._equals_rc(path, contig)
+
+
+class TestLinearAssembler_LeftBranching:
+
+ def test_branch_point(self, left_tip_structure):
+ graph, contig, L, HDN, R, tip = left_tip_structure
+
+ assert graph.kmer_degree(HDN) == 3
+
+ def test_end_to_branch(self, left_tip_structure):
+ # assemble from end until branch point
+ # should include HDN
+ graph, contig, L, HDN, R, tip = left_tip_structure
+ asm = khmer.LinearAssembler(graph)
+ path = asm.assemble(contig[-K:])
+
+ assert len(path) == len(contig) - HDN.pos
+ assert utils._equals_rc(path, contig[HDN.pos:])
+
+ def test_branch_to_end(self, left_tip_structure):
+ # assemble from branch point until end
+ graph, contig, L, HDN, R, tip = left_tip_structure
+ asm = khmer.LinearAssembler(graph)
+ path = asm.assemble(HDN)
+
+ assert len(path) == len(contig) - HDN.pos
+ assert utils._equals_rc(path, contig[HDN.pos:])
+
+ def test_from_branch_to_ends_with_stopbf(self, left_tip_structure):
+ # block the tip with the stop_filter. should return a full length
+ # contig.
+ graph, contig, L, HDN, R, tip = left_tip_structure
+
+ stop_filter = khmer.Nodegraph(K, 1e5, 4)
+ stop_filter.count(tip)
+
+ asm = khmer.LinearAssembler(graph, stop_filter=stop_filter)
+
+ path = asm.assemble(HDN)
+
+ assert len(path) == len(contig)
+ assert utils._equals_rc(path, contig)
+
+ def test_from_branch_to_ends_with_stopbf_revcomp(self, left_tip_structure):
+ # block the tip with the stop_filter. should return a full length
+ # contig.
+ graph, contig, L, HDN, R, tip = left_tip_structure
+
+ stop_filter = khmer.Nodegraph(K, 1e5, 4)
+ stop_filter.count(tip)
+ asm = khmer.LinearAssembler(graph, stop_filter=stop_filter)
+
+ path = asm.assemble(revcomp(HDN))
+
+ assert len(path) == len(contig)
+ assert utils._equals_rc(path, contig)
+
+ def test_end_thru_tip_with_stopbf(self, left_tip_structure):
+ # assemble up to branch point, and include introduced branch b/c
+ # of stop bf
+ graph, contig, L, HDN, R, tip = left_tip_structure
+
+ stop_filter = khmer.Nodegraph(K, 1e5, 4)
+ stop_filter.count(L) # ...and block original path
+ asm = khmer.LinearAssembler(graph, stop_filter=stop_filter)
+
+ path = asm.assemble(contig[-K:])
+ assert len(path) == len(contig) - HDN.pos + 1
+
+ # should be the tip k-kmer, plus the last base of the HDN thru
+ # the end of the contig
+ assert utils._equals_rc(path, tip + contig[HDN.pos + K - 1:])
+
+ def test_single_node_flanked_by_hdns(self, left_tip_structure):
+ # assemble single node flanked by high-degree nodes
+ # we'll copy the main nodegraph before mutating it
+ graph, contig, L, HDN, R, tip = left_tip_structure
+ asm = khmer.LinearAssembler(graph)
+
+ graph.consume(mutate_position(contig, HDN.pos + K))
+
+ path = asm.assemble(HDN)
+
+ assert len(path) == K
+ assert utils._equals_rc(path, HDN)
+
+
+class TestLabeledAssembler:
+
+ def test_beginning_to_end_across_tip(self, right_tip_structure):
+ # assemble entire contig, ignoring branch point b/c of labels
+ graph, contig, L, HDN, R, tip = right_tip_structure
+ lh = khmer._GraphLabels(graph)
+ asm = khmer.SimpleLabeledAssembler(lh)
+ hdn = graph.find_high_degree_nodes(contig)
+ # L, HDN, and R will be labeled with 1
+ lh.label_across_high_degree_nodes(contig, hdn, 1)
+
+ path = asm.assemble(contig[:K])
+
+ assert len(path) == 1, "there should only be one path"
+ path = path[0] # @CTB
+
+ assert len(path) == len(contig)
+ assert utils._equals_rc(path, contig)
+
+ def test_assemble_right_double_fork(self, right_double_fork_structure):
+ # assemble two contigs from a double forked structure
+ graph, contig, L, HDN, R, branch = right_double_fork_structure
+ lh = khmer._GraphLabels(graph)
+ asm = khmer.SimpleLabeledAssembler(lh)
+
+ hdn = graph.find_high_degree_nodes(contig)
+ hdn += graph.find_high_degree_nodes(branch)
+ print(list(hdn))
+ lh.label_across_high_degree_nodes(contig, hdn, 1)
+ lh.label_across_high_degree_nodes(branch, hdn, 2)
+ print(lh.get_tag_labels(list(hdn)[0]))
+
+ paths = asm.assemble(contig[:K])
+ print('Path lengths', [len(x) for x in paths])
+
+ assert len(paths) == 2
+
+ assert any(utils._equals_rc(path, contig) for path in paths)
+ assert any(utils._equals_rc(path, branch) for path in paths)
+
+ def test_assemble_right_triple_fork(self, right_triple_fork_structure):
+ # assemble three contigs from a trip fork
+ (graph, contig, L, HDN, R,
+ top_sequence, bottom_sequence) = right_triple_fork_structure
+ lh = khmer._GraphLabels(graph)
+ asm = khmer.SimpleLabeledAssembler(lh)
+
+ hdn = graph.find_high_degree_nodes(contig)
+ hdn += graph.find_high_degree_nodes(top_sequence)
+ hdn += graph.find_high_degree_nodes(bottom_sequence)
+ print(list(hdn))
+ lh.label_across_high_degree_nodes(contig, hdn, 1)
+ lh.label_across_high_degree_nodes(top_sequence, hdn, 2)
+ lh.label_across_high_degree_nodes(bottom_sequence, hdn, 3)
+ print(lh.get_tag_labels(list(hdn)[0]))
+
+ paths = asm.assemble(contig[:K])
+ print([len(x) for x in paths])
+
+ assert len(paths) == 3
+
+ assert any(utils._equals_rc(path, contig) for path in paths)
+ assert any(utils._equals_rc(path, top_sequence) for path in paths)
+ assert any(utils._equals_rc(path, bottom_sequence) for path in paths)
+
+ def test_assemble_left_double_fork(self, left_double_fork_structure):
+ # assemble entire contig + branch points b/c of labels; start from end
+ graph, contig, L, HDN, R, branch = left_double_fork_structure
+ lh = khmer._GraphLabels(graph)
+ asm = khmer.SimpleLabeledAssembler(lh)
+
+ # first try without the labels
+ paths = asm.assemble(contig[-K:])
+
+ assert len(paths) == 1
+ # without labels, should get the beginning of the HDN thru the end
+ assert paths[0] == contig[HDN.pos:]
+
+ # now add labels and check that we get two full length paths
+ hdn = graph.find_high_degree_nodes(contig)
+ hdn += graph.find_high_degree_nodes(branch)
+ print(list(hdn))
+ lh.label_across_high_degree_nodes(contig, hdn, 1)
+ lh.label_across_high_degree_nodes(branch, hdn, 2)
+ print(lh.get_tag_labels(list(hdn)[0]))
+
+ paths = asm.assemble(contig[-K:])
+
+ assert len(paths) == 2
+
+ assert any(utils._equals_rc(path, contig) for path in paths)
+ assert any(utils._equals_rc(path, branch) for path in paths)
+
+ def test_assemble_snp_bubble_single(self, snp_bubble_structure):
+ # assemble entire contig + one of two paths through a bubble
+ graph, wildtype, mutant, HDN_L, HDN_R = snp_bubble_structure
+ lh = khmer._GraphLabels(graph)
+ asm = khmer.SimpleLabeledAssembler(lh)
+
+ hdn = graph.find_high_degree_nodes(wildtype)
+ assert len(hdn) == 2
+ lh.label_across_high_degree_nodes(wildtype, hdn, 1)
+
+ paths = asm.assemble(wildtype[:K])
+
+ assert len(paths) == 1
+ assert utils._equals_rc(paths[0], wildtype)
+
+ def test_assemble_snp_bubble_both(self, snp_bubble_structure):
+ # assemble entire contig + both paths
+ graph, wildtype, mutant, HDN_L, HDN_R = snp_bubble_structure
+ lh = khmer._GraphLabels(graph)
+ asm = khmer.SimpleLabeledAssembler(lh)
+
+ hdn = graph.find_high_degree_nodes(wildtype)
+ hdn += graph.find_high_degree_nodes(mutant)
+ assert len(hdn) == 2
+ lh.label_across_high_degree_nodes(wildtype, hdn, 1)
+ lh.label_across_high_degree_nodes(mutant, hdn, 2)
+
+ paths = asm.assemble(wildtype[:K])
+
+ assert len(paths) == 2
+
+ assert any(utils._contains_rc(wildtype, path) for path in paths)
+ assert any(utils._contains_rc(mutant, path) for path in paths)
+ # assert all(path[:HDN_L.pos+K][-K:] == HDN_L for path in paths)
+ # assert all(path[HDN_R.pos:][:K] == HDN_R for path in paths)
+ # assert paths[0][:HDN_L.pos+K] == paths[1][:HDN_L.pos+K]
+ # assert paths[0][HDN_R.pos:] == paths[1][HDN_R.pos:]
+
+ def test_assemble_snp_bubble_stopbf(self, snp_bubble_structure):
+ # assemble one side of bubble, blocked with stop_filter,
+ # when labels on both branches
+ # stop_filter should trip a filter failure, negating the label spanning
+ graph, wildtype, mutant, HDN_L, HDN_R = snp_bubble_structure
+ stop_filter = khmer.Nodegraph(K, 1e5, 4)
+ lh = khmer._GraphLabels(graph)
+ asm = khmer.SimpleLabeledAssembler(lh, stop_filter=stop_filter)
+
+ hdn = graph.find_high_degree_nodes(wildtype)
+ hdn += graph.find_high_degree_nodes(mutant)
+ assert len(hdn) == 2
+ lh.label_across_high_degree_nodes(wildtype, hdn, 1)
+ lh.label_across_high_degree_nodes(mutant, hdn, 2)
+
+ # do the labeling, but block the mutant with stop_filter
+ stop_filter.count(mutant[HDN_L.pos + 1:HDN_L.pos + K + 1])
+ paths = asm.assemble(wildtype[:K])
+
+ assert len(paths) == 1
+ assert any(utils._equals_rc(path, wildtype) for path in paths)
+
+ # @pytest.mark.skip(reason='destroys your computer and then the world')
+ def test_assemble_tandem_repeats(self, tandem_repeat_structure):
+ # assemble one copy of a tandem repeat
+ graph, repeat, tandem_repeats = tandem_repeat_structure
+ lh = khmer._GraphLabels(graph)
+ asm = khmer.SimpleLabeledAssembler(lh)
+ paths = asm.assemble(repeat[:K])
+
+ assert len(paths) == 1
+ # There are K-1 k-mers spanning the junction between
+ # the beginning and end of the repeat
+ assert len(paths[0]) == len(repeat) + K - 1
+
+
+class TestJunctionCountAssembler:
+
+ def test_beginning_to_end_across_tip(self, right_tip_structure):
+ # assemble entire contig, ignoring branch point b/c of labels
+ graph, contig, L, HDN, R, tip = right_tip_structure
+ asm = khmer.JunctionCountAssembler(graph)
+ asm.consume(contig)
+ asm.consume(contig)
+ asm.consume(contig)
+
+ path = asm.assemble(contig[:K])
+ print('P:', path[0])
+ print('T:', tip)
+ print('C:', contig)
+ assert len(path) == 1, "there should only be one path"
+ path = path[0] # @CTB
+
+ assert len(path) == len(contig)
+ assert utils._equals_rc(path, contig)
diff --git a/tests/test_cython_parsing.py b/tests/test_cython_parsing.py
new file mode 100644
index 0000000..1c2aa40
--- /dev/null
+++ b/tests/test_cython_parsing.py
@@ -0,0 +1,442 @@
+from __future__ import print_function
+from __future__ import absolute_import
+
+import gc
+import itertools
+import random
+
+import khmer
+from khmer._oxli.parsing import Sequence, FastxParser, SanitizedFastxParser
+from khmer._oxli.parsing import BrokenPairedReader, Alphabets, check_is_pair
+from khmer._oxli.parsing import check_is_right, check_is_left
+from khmer.khmer_args import estimate_optimal_with_K_and_f as optimal_fp
+from khmer import reverse_complement as revcomp
+from khmer import reverse_hash as revhash
+from . import khmer_tst_utils as utils
+
+import pytest
+import screed
+
+
+def teardown():
+ utils.cleanup()
+
+
+ at pytest.fixture
+def create_fastx(tmpdir, as_str=True):
+ def func(reads, fmt='fa'):
+ assert fmt in ['fa', 'fq']
+ fastx_fn = tmpdir.join('test.' + fmt)
+ for record in reads:
+ if fmt == 'fa':
+ fastx_fn.write('>{0}\n{1}\n'.format(record.name,
+ record.sequence),
+ mode='a')
+ else:
+ fastx_fn.write('@{0}\n{1}\n+\n{2}\n'.format(record.name,
+ record.sequence,
+ record.quality),
+ mode='a')
+ return str(fastx_fn) if as_str else fastx_fn
+ return func
+
+
+def sequences_eq(seqs_A, seqs_B):
+ for seq1, seq2 in zip(seqs_A, seqs_B):
+ if seq1 is None:
+ assert seq1 is seq2
+ else:
+ assert seq1.name == seq2.name
+ assert seq1.sequence == seq2.sequence
+
+
+def test_FastxParser(create_fastx):
+ expected = [Sequence('seq1/1', 'A' * 5),
+ Sequence('seq1/2', 'A' * 4),
+ Sequence('seq2/1', 'A' * 5),
+ Sequence('seq3/1', 'A' * 3),
+ Sequence('seq3/2', 'A' * 5)]
+ parser = FastxParser(create_fastx(expected))
+ result = list(parser)
+
+ assert len(expected) == len(result)
+ assert all((x == y) for x, y in zip(expected, result))
+
+
+def test_SanitizedFastxParser_convert_Ns(create_fastx):
+ '''Test that A's are converted to N's'''
+ expected = [Sequence('seq1/1', 'N' * 5),
+ Sequence('seq1/2', 'N' * 4)]
+ parser = SanitizedFastxParser(create_fastx(expected),
+ alphabet='DNAN_SIMPLE')
+ result = list(parser)
+
+ assert parser.n_bad == 0
+ assert len(result) == 2
+ assert result[0].sequence == 'A' * 5
+ assert result[1].sequence == 'A' * 4
+
+
+def test_SanitizedFastxParser_no_convert_Ns(create_fastx):
+ expected = [Sequence('seq1/1', 'N' * 5),
+ Sequence('seq1/2', 'N' * 4)]
+ parser = SanitizedFastxParser(create_fastx(expected),
+ alphabet='DNAN_SIMPLE',
+ convert_n=False)
+ result = list(parser)
+
+ assert parser.n_bad == 0
+ assert len(result) == 2
+ assert result[0].sequence == 'N' * 5
+ assert result[1].sequence == 'N' * 4
+
+
+def test_SanitizedFastxParser_invalid(create_fastx):
+ '''Test that parser detects invalid sequence'''
+ expected = [Sequence('seq1/1', 'XXX'),
+ Sequence('seq1/2', 'A' * 4)]
+ parser = SanitizedFastxParser(create_fastx(expected))
+ result = list(parser)
+
+ assert parser.n_bad == 1
+ assert len(result) == 1
+ assert result[0].sequence == 'A' * 4
+
+
+def test_SanitizedFastxParser_lowercase(create_fastx):
+ reads = [Sequence('seq1/1', 'acgtn'),
+ Sequence('seq1/2', 'AcGtN'),
+ Sequence('seq1/2', 'aCgTn')]
+
+ parser = SanitizedFastxParser(create_fastx(reads), convert_n=False)
+ result = list(parser)
+
+ assert result[0].sequence == 'ACGTN'
+ assert result[1].sequence == 'ACGTN'
+ assert result[2].sequence == 'ACGTN'
+
+
+def test_alphabet_wrapper():
+ dna_simple = Alphabets.get('DNA_SIMPLE')
+ assert len(dna_simple) == 4
+ for b in 'ACGT':
+ assert b in dna_simple
+
+ with pytest.raises(ValueError):
+ Alphabets.get('TEST')
+
+
+def gather_paired(stream, **kw):
+ itr = BrokenPairedReader(stream, **kw)
+
+ x = []
+ m = 0
+ num = 0
+ for num, is_pair, read1, read2 in itr:
+ x.append((read1.name if read1 is not None else None,
+ read2.name if read2 is not None else None))
+ m += 1
+
+ return x, num, m
+
+
+class Test_BrokenPairedReader(object):
+ reads = [Sequence(name='seq1/1', sequence='A' * 5),
+ Sequence(name='seq1/2', sequence='A' * 4),
+ Sequence(name='seq2/1', sequence='A' * 5),
+ Sequence(name='seq3/1', sequence='A' * 3),
+ Sequence(name='seq3/2', sequence='A' * 5)]
+
+ @pytest.mark.parametrize("parser", [FastxParser, SanitizedFastxParser])
+ def testDefault(self, parser, create_fastx):
+ x, n, m = gather_paired(parser(create_fastx(self.reads)),
+ min_length=1)
+
+ expected = [('seq1/1', 'seq1/2'),
+ ('seq2/1', None),
+ ('seq3/1', 'seq3/2')]
+ assert x == expected, x
+ assert m == 3
+ assert n == 3, n
+
+ @pytest.mark.parametrize("parser", [FastxParser, SanitizedFastxParser])
+ def testMinLength(self, parser, create_fastx):
+ x, n, m = gather_paired(parser(create_fastx(self.reads)),
+ min_length=3)
+
+ expected = [('seq1/1', 'seq1/2'),
+ ('seq2/1', None),
+ ('seq3/1', 'seq3/2')]
+ assert x == expected, x
+ assert m == 3
+ assert n == 3, n
+
+ @pytest.mark.parametrize("parser", [FastxParser, SanitizedFastxParser])
+ def testMinLength_2(self, parser, create_fastx):
+ x, n, m = gather_paired(parser(create_fastx(self.reads)),
+ min_length=4)
+
+ expected = [('seq1/1', 'seq1/2'),
+ ('seq2/1', None),
+ (None, 'seq3/2')]
+ assert x == expected, x
+ assert m == 3
+ assert n == 3, n
+
+ @pytest.mark.parametrize("parser", [FastxParser, SanitizedFastxParser])
+ def testForceSingle(self, parser, create_fastx):
+ x, n, m = gather_paired(parser(create_fastx(self.reads)),
+ force_single=True)
+
+ expected = [('seq1/1', None),
+ ('seq1/2', None),
+ ('seq2/1', None),
+ ('seq3/1', None),
+ ('seq3/2', None)]
+ assert x == expected, x
+ assert m == 5
+ assert n == 4, n
+
+ @pytest.mark.parametrize("parser", [FastxParser, SanitizedFastxParser])
+ def testForceSingleAndMinLength(self, parser, create_fastx):
+ x, n, m = gather_paired(parser(create_fastx(self.reads)),
+ min_length=5, force_single=True)
+
+ expected = [('seq1/1', None),
+ ('seq2/1', None),
+ ('seq3/2', None)]
+ assert x == expected, x
+ assert m == 3, m
+ assert n == 2, n
+
+ @pytest.mark.parametrize("parser", [FastxParser, SanitizedFastxParser])
+ def testRequirePairedAndMinLength_HalfPass(self, parser, create_fastx):
+ reads = [Sequence('seq1/1', 'A' * 5),
+ Sequence('seq1/2', 'A' * 4),
+ Sequence('seq3/1', 'A' * 3),
+ Sequence('seq3/2', 'A' * 5)]
+
+ reader = BrokenPairedReader(parser(create_fastx(reads)),
+ min_length=4, require_paired=True)
+
+ result = []
+ for n, paired, first, second in reader:
+ result.append((first, second))
+
+ assert len(result) == 1
+ assert n == 0
+ l, r = result[0]
+ assert l == reads[0]
+ assert r == reads[1]
+
+ @pytest.mark.parametrize("parser", [FastxParser, SanitizedFastxParser])
+ def testRequirePairedAndMinLength_SwappedHalfPass(self, parser,
+ create_fastx):
+ reads = [Sequence('seq1/1', 'A' * 5),
+ Sequence('seq1/2', 'A' * 4),
+ Sequence('seq3/1', 'A' * 5),
+ Sequence('seq3/2', 'A' * 3)]
+
+ reader = BrokenPairedReader(parser(create_fastx(reads)),
+ min_length=4, require_paired=True)
+
+ result = []
+ for n, paired, first, second in reader:
+ result.append((first, second))
+
+ assert n == 0
+ assert len(result) == 1
+ l, r = result[0]
+ assert l == reads[0]
+ assert r == reads[1]
+
+ @pytest.mark.parametrize("parser", [FastxParser, SanitizedFastxParser])
+ def testRequirePairedAndMinLength_NeitherPass(self, parser, create_fastx):
+ reads = [Sequence('seq1/1', 'A' * 5),
+ Sequence('seq1/2', 'A' * 4),
+ Sequence('seq3/1', 'A' * 3),
+ Sequence('seq3/2', 'A' * 3)]
+
+ reader = BrokenPairedReader(parser(create_fastx(reads)),
+ min_length=4, require_paired=True)
+
+ result = []
+ for n, paired, first, second in reader:
+ result.append((first, second))
+
+ assert n == 0
+ assert len(result) == 1
+ l, r = result[0]
+ assert l == reads[0]
+ assert r == reads[1]
+
+ @pytest.mark.parametrize("parser", [FastxParser, SanitizedFastxParser])
+ def testRequirePairedAndMinLength_SwappedNeitherPass(self, parser,
+ create_fastx):
+ reads = [Sequence('seq1/1', 'A' * 3),
+ Sequence('seq1/2', 'A' * 3),
+ Sequence('seq3/1', 'A' * 5),
+ Sequence('seq3/2', 'A' * 5)]
+
+ reader = BrokenPairedReader(parser(create_fastx(reads)),
+ min_length=4, require_paired=True)
+
+ result = []
+ for n, paired, first, second in reader:
+ result.append((first, second))
+
+ assert n == 0
+ assert len(result) == 1
+ l, r = result[0]
+ assert l == reads[2]
+ assert r == reads[3]
+
+
+def test_check_is_pair_1():
+ read1 = Sequence(name='seq', quality='###', sequence='AAA')
+ read2 = Sequence(name='seq2', quality='###', sequence='AAA')
+
+ assert not check_is_pair(read1, read2)
+
+
+def test_check_is_pair_2():
+ read1 = Sequence(name='seq/1', quality='###', sequence='AAA')
+ read2 = Sequence(name='seq/2', quality='###', sequence='AAA')
+
+ assert check_is_pair(read1, read2)
+
+
+def test_check_is_pair_3_fq():
+ read1 = Sequence(name='seq 1::', quality='###', sequence='AAA')
+ read2 = Sequence(name='seq 2::', quality='###', sequence='AAA')
+
+ assert check_is_pair(read1, read2)
+
+
+def test_check_is_pair_3_broken_fq_1():
+ read1 = Sequence(name='seq', quality='###', sequence='AAA')
+ read2 = Sequence(name='seq 2::', quality='###', sequence='AAA')
+
+ assert not check_is_pair(read1, read2)
+
+
+def test_check_is_pair_3_broken_fq_2():
+ read1 = Sequence(name='seq 1::', quality='###', sequence='AAA')
+ read2 = Sequence(name='seq', quality='###', sequence='AAA')
+
+ assert not check_is_pair(read1, read2)
+
+
+def test_check_is_pair_3_fa():
+ read1 = Sequence(name='seq 1::', sequence='AAA')
+ read2 = Sequence(name='seq 2::', sequence='AAA')
+
+ assert check_is_pair(read1, read2)
+
+
+def test_check_is_pair_4():
+ read1 = Sequence(name='seq/1', quality='###', sequence='AAA')
+ read2 = Sequence(name='seq/2', sequence='AAA')
+
+ try:
+ check_is_pair(read1, read2)
+ assert False # check_is_pair should fail here.
+ except ValueError:
+ pass
+
+
+def test_check_is_pair_4b():
+ read1 = Sequence(name='seq/1', sequence='AAA')
+ read2 = Sequence(name='seq/2', quality='###', sequence='AAA')
+
+ try:
+ check_is_pair(read1, read2)
+ assert False # check_is_pair should fail here.
+ except ValueError:
+ pass
+
+
+def test_check_is_pair_5():
+ read1 = Sequence(name='seq/1', sequence='AAA')
+ read2 = Sequence(name='seq/2', sequence='AAA')
+
+ assert check_is_pair(read1, read2)
+
+
+def test_check_is_pair_6():
+ read1 = Sequence(name='seq1', sequence='AAA')
+ read2 = Sequence(name='seq2', sequence='AAA')
+
+ assert not check_is_pair(read1, read2)
+
+
+def test_check_is_pair_7():
+ read1 = Sequence(name='seq/2', sequence='AAA')
+ read2 = Sequence(name='seq/1', sequence='AAA')
+
+ assert not check_is_pair(read1, read2)
+
+
+def test_check_is_right():
+ assert not check_is_right('seq1/1')
+ assert not check_is_right('seq1 1::N')
+ assert check_is_right('seq1/2')
+ assert check_is_right('seq1 2::N')
+
+ assert not check_is_right('seq')
+ assert not check_is_right('seq 2')
+
+
+def test_check_is_left():
+ assert check_is_left('seq1/1')
+ assert check_is_left('seq1 1::N')
+ assert not check_is_left('seq1/2')
+ assert not check_is_left('seq1 2::N')
+
+ assert not check_is_left('seq')
+ assert not check_is_left('seq 1')
+
+ assert check_is_left(
+ '@HWI-ST412:261:d15khacxx:8:1101:3149:2157 1:N:0:ATCACG')
+
+
+class Test_Sequence(object):
+
+ name = 'Test'
+ sequence = 'ACGT'
+ quality = '####'
+ description = 'The nucleotides'
+ cleaned = 'aaaa'
+
+ def test_init_name_and_sequence(self):
+ s = Sequence(name=self.name, sequence=self.sequence)
+ assert s.name == self.name
+ assert s.sequence == self.sequence
+ assert s.quality is None
+ assert s.description is None
+ assert s.cleaned_seq == self.sequence
+
+ def test_init_name_only(self):
+ s = Sequence(name=self.name)
+ assert s.name is None
+ assert s.sequence is None
+ assert s.quality is None
+ assert s.description is None
+ assert s.cleaned_seq is None
+
+ def test_init_sequence_only(self):
+ s = Sequence(sequence=self.sequence)
+ assert s.name is None
+ assert s.sequence is None
+ assert s.quality is None
+ assert s.description is None
+ assert s.cleaned_seq is None
+
+ def test_init_with_cleaned_seq(self):
+ s = Sequence(name=self.name, sequence=self.sequence,
+ cleaned_seq=self.cleaned)
+ assert s.name == self.name
+ assert s.sequence == self.sequence
+ assert s.quality is None
+ assert s.description is None
+ assert s.cleaned_seq == self.cleaned
diff --git a/tests/test_filter_abund.py b/tests/test_filter_abund.py
index 99e2970..c12a847 100644
--- a/tests/test_filter_abund.py
+++ b/tests/test_filter_abund.py
@@ -410,6 +410,7 @@ def test_filter_abund_1_quiet():
status, out, err = utils.runscript(script, args, in_dir)
assert len(err) == 0
+ assert len(out) < 1000
outfile = infile + '.abundfilt'
n_outfile = n_infile + '.abundfilt'
@@ -427,6 +428,7 @@ def test_filter_abund_1_singlefile_quiet():
(status, out, err) = utils.runscript(script, args, in_dir)
assert len(err) == 0
+ assert len(out) < 1000
outfile = infile + '.abundfilt'
assert os.path.exists(outfile), outfile
diff --git a/tests/test_functions.py b/tests/test_functions.py
index 483b0e1..a88fd52 100644
--- a/tests/test_functions.py
+++ b/tests/test_functions.py
@@ -42,8 +42,7 @@ import os
import sys
import pytest
from . import khmer_tst_utils as utils
-from khmer.utils import (check_is_pair, broken_paired_reader, check_is_left,
- check_is_right, clean_input_reads)
+
from khmer.kfile import check_input_files, get_file_writer
try:
from StringIO import StringIO
@@ -281,295 +280,3 @@ def test_check_file_status_kfile_force():
sys.stderr = old_stderr
assert "does not exist" in capture.getvalue(), capture.getvalue()
-
-
-def test_check_is_pair_1():
- read1 = screed.Record(name='seq', quality='###', sequence='AAA')
- read2 = screed.Record(name='seq2', quality='###', sequence='AAA')
-
- assert not check_is_pair(read1, read2)
-
-
-def test_check_is_pair_2():
- read1 = screed.Record(name='seq/1', quality='###', sequence='AAA')
- read2 = screed.Record(name='seq/2', quality='###', sequence='AAA')
-
- assert check_is_pair(read1, read2)
-
-
-def test_check_is_pair_3_fq():
- read1 = screed.Record(name='seq 1::', quality='###', sequence='AAA')
- read2 = screed.Record(name='seq 2::', quality='###', sequence='AAA')
-
- assert check_is_pair(read1, read2)
-
-
-def test_check_is_pair_3_broken_fq_1():
- read1 = screed.Record(name='seq', quality='###', sequence='AAA')
- read2 = screed.Record(name='seq 2::', quality='###', sequence='AAA')
-
- assert not check_is_pair(read1, read2)
-
-
-def test_check_is_pair_3_broken_fq_2():
- read1 = screed.Record(name='seq 1::', quality='###', sequence='AAA')
- read2 = screed.Record(name='seq', quality='###', sequence='AAA')
-
- assert not check_is_pair(read1, read2)
-
-
-def test_check_is_pair_3_fa():
- read1 = screed.Record(name='seq 1::', sequence='AAA')
- read2 = screed.Record(name='seq 2::', sequence='AAA')
-
- assert check_is_pair(read1, read2)
-
-
-def test_check_is_pair_4():
- read1 = screed.Record(name='seq/1', quality='###', sequence='AAA')
- read2 = screed.Record(name='seq/2', sequence='AAA')
-
- try:
- check_is_pair(read1, read2)
- assert False # check_is_pair should fail here.
- except ValueError:
- pass
-
-
-def test_check_is_pair_4b():
- read1 = screed.Record(name='seq/1', sequence='AAA')
- read2 = screed.Record(name='seq/2', quality='###', sequence='AAA')
-
- try:
- check_is_pair(read1, read2)
- assert False # check_is_pair should fail here.
- except ValueError:
- pass
-
-
-def test_check_is_pair_5():
- read1 = screed.Record(name='seq/1', sequence='AAA')
- read2 = screed.Record(name='seq/2', sequence='AAA')
-
- assert check_is_pair(read1, read2)
-
-
-def test_check_is_pair_6():
- read1 = screed.Record(name='seq1', sequence='AAA')
- read2 = screed.Record(name='seq2', sequence='AAA')
-
- assert not check_is_pair(read1, read2)
-
-
-def test_check_is_pair_7():
- read1 = screed.Record(name='seq/2', sequence='AAA')
- read2 = screed.Record(name='seq/1', sequence='AAA')
-
- assert not check_is_pair(read1, read2)
-
-
-def test_check_is_right():
- assert not check_is_right('seq1/1')
- assert not check_is_right('seq1 1::N')
- assert check_is_right('seq1/2')
- assert check_is_right('seq1 2::N')
-
- assert not check_is_right('seq')
- assert not check_is_right('seq 2')
-
-
-def test_check_is_left():
- assert check_is_left('seq1/1')
- assert check_is_left('seq1 1::N')
- assert not check_is_left('seq1/2')
- assert not check_is_left('seq1 2::N')
-
- assert not check_is_left('seq')
- assert not check_is_left('seq 1')
-
- assert check_is_left(
- '@HWI-ST412:261:d15khacxx:8:1101:3149:2157 1:N:0:ATCACG')
-
-
-def gather(stream, **kw):
- itr = broken_paired_reader(stream, **kw)
-
- x = []
- m = 0
- num = 0
- for num, is_pair, read1, read2 in itr:
- if is_pair:
- x.append((read1.name, read2.name))
- else:
- x.append((read1.name, None))
- m += 1
-
- return x, num, m
-
-
-class Test_BrokenPairedReader(object):
- stream = [screed.Record(name='seq1/1', sequence='A' * 5),
- screed.Record(name='seq1/2', sequence='A' * 4),
- screed.Record(name='seq2/1', sequence='A' * 5),
- screed.Record(name='seq3/1', sequence='A' * 3),
- screed.Record(name='seq3/2', sequence='A' * 5)]
-
- def testDefault(self):
- x, n, m = gather(self.stream, min_length=1)
-
- expected = [('seq1/1', 'seq1/2'),
- ('seq2/1', None),
- ('seq3/1', 'seq3/2')]
- assert x == expected, x
- assert m == 3
- assert n == 3, n
-
- def testMinLength(self):
- x, n, m = gather(self.stream, min_length=3)
-
- expected = [('seq1/1', 'seq1/2'),
- ('seq2/1', None),
- ('seq3/1', 'seq3/2')]
- assert x == expected, x
- assert m == 3
- assert n == 3, n
-
- def testMinLength_2(self):
- x, n, m = gather(self.stream, min_length=4)
-
- expected = [('seq1/1', 'seq1/2'),
- ('seq2/1', None),
- ('seq3/2', None)]
- assert x == expected, x
- assert m == 3
- assert n == 3, n
-
- def testForceSingle(self):
- x, n, m = gather(self.stream, force_single=True)
-
- expected = [('seq1/1', None),
- ('seq1/2', None),
- ('seq2/1', None),
- ('seq3/1', None),
- ('seq3/2', None)]
- assert x == expected, x
- assert m == 5
- assert n == 4, n
-
- def testForceSingleAndMinLength(self):
- x, n, m = gather(self.stream, min_length=5, force_single=True)
-
- expected = [('seq1/1', None),
- ('seq2/1', None),
- ('seq3/2', None)]
- assert x == expected, x
- assert m == 3, m
- assert n == 2, n
-
-
-def test_BrokenPairedReader_OnPairs():
- stream = [screed.Record(name='seq1/1', sequence='A' * 5),
- screed.Record(name='seq1/2', sequence='A' * 4),
- screed.Record(name='seq3/1', sequence='A' * 3),
- screed.Record(name='seq3/2', sequence='A' * 5)]
-
- x, n, m = gather(stream, min_length=4, require_paired=True)
-
- expected = [('seq1/1', 'seq1/2')]
- assert x == expected, x
- assert m == 1
- assert n == 0, n
-
-
-def test_BrokenPairedReader_OnPairs_2():
- stream = [screed.Record(name='seq1/1', sequence='A' * 5),
- screed.Record(name='seq1/2', sequence='A' * 4),
- screed.Record(name='seq3/1', sequence='A' * 5), # switched
- screed.Record(name='seq3/2', sequence='A' * 3)] # wrt previous
-
- x, n, m = gather(stream, min_length=4, require_paired=True)
-
- expected = [('seq1/1', 'seq1/2')]
- assert x == expected, x
- assert m == 1
- assert n == 0, n
-
-
-def test_BrokenPairedReader_OnPairs_3():
- stream = [screed.Record(name='seq1/1', sequence='A' * 5),
- screed.Record(name='seq1/2', sequence='A' * 4),
- screed.Record(name='seq3/1', sequence='A' * 3), # both short
- screed.Record(name='seq3/2', sequence='A' * 3)]
-
- x, n, m = gather(stream, min_length=4, require_paired=True)
-
- expected = [('seq1/1', 'seq1/2')]
- assert x == expected, x
- assert m == 1
- assert n == 0, n
-
-
-def test_BrokenPairedReader_OnPairs_4():
- stream = [screed.Record(name='seq1/1', sequence='A' * 3), # too short
- screed.Record(name='seq1/2', sequence='A' * 4),
- screed.Record(name='seq3/1', sequence='A' * 4),
- screed.Record(name='seq3/2', sequence='A' * 5)]
-
- x, n, m = gather(stream, min_length=4, require_paired=True)
-
- expected = [('seq3/1', 'seq3/2')]
- assert x == expected, x
- assert m == 1
- assert n == 0, n
-
-
-def test_BrokenPairedReader_lowercase():
- stream = [screed.Record(name='seq1/1', sequence='acgtn'),
- screed.Record(name='seq1/2', sequence='AcGtN'),
- screed.Record(name='seq1/2', sequence='aCgTn')]
- stream = clean_input_reads(stream)
-
- results = []
- for num, is_pair, read1, read2 in broken_paired_reader(stream):
- results.append((read1, read2))
-
- a, b = results[0]
- assert a.sequence == 'acgtn'
- assert a.cleaned_seq == 'ACGTA'
- assert b.sequence == 'AcGtN'
- assert b.cleaned_seq == 'ACGTA'
-
- c, d = results[1]
- assert c.sequence == 'aCgTn'
- assert c.cleaned_seq == 'ACGTA'
- assert d is None
-
-
-def test_BrokenPairedReader_lowercase_khmer_Read():
- # use khmer.Read objects which should automatically have a `cleaned_seq`
- # attribute
- stream = [khmer.Read(name='seq1/1', sequence='acgtn'),
- khmer.Read(name='seq1/2', sequence='AcGtN'),
- khmer.Read(name='seq1/2', sequence='aCgTn')]
-
- results = []
- for num, is_pair, read1, read2 in broken_paired_reader(stream):
- results.append((read1, read2))
-
- a, b = results[0]
- assert a.sequence == 'acgtn'
- assert a.cleaned_seq == 'ACGTA'
- assert b.sequence == 'AcGtN'
- assert b.cleaned_seq == 'ACGTA'
-
- c, d = results[1]
- assert c.sequence == 'aCgTn'
- assert c.cleaned_seq == 'ACGTA'
- assert d is None
-
-
-def test_clean_input_reads():
- # all Read attributes are read only
- stream = [khmer.Read(name='seq1/1', sequence='ACGT')]
- with pytest.raises(AttributeError):
- next(clean_input_reads(stream))
diff --git a/tests/test_scripts.py b/tests/test_scripts.py
index 18a1eec..16a2a5b 100644
--- a/tests/test_scripts.py
+++ b/tests/test_scripts.py
@@ -78,6 +78,20 @@ def test_load_into_counting():
assert os.path.exists(outfile)
+def test_load_into_counting_smallcount():
+ script = 'load-into-counting.py'
+ args = ['-x', '1e3', '--small-count']
+
+ outfile = utils.get_temp_filename('out.ct')
+ infile = utils.get_test_data('test-abund-read-2.fa')
+
+ args.extend([outfile, infile])
+
+ (status, out, err) = utils.runscript(script, args)
+ assert 'Total number of unique k-mers: 83' in err, err
+ assert os.path.exists(outfile)
+
+
def test_load_into_counting_quiet():
script = 'load-into-counting.py'
args = ['-q', '-x', '1e3', '-N', '2', '-k', '20']
@@ -1429,6 +1443,17 @@ def test_abundance_dist_single_nobigcount():
assert line == '255,2,98,1.0', line
+def test_abundance_dist_single_smallcount():
+ infile = utils.copy_test_data('test-abund-read-2.fa')
+ outfile = utils.get_temp_filename('test.dist')
+ in_dir = os.path.dirname(infile)
+
+ script = 'abundance-dist-single.py'
+ args = ['-x', '1e7', '-N', '2', '-k', '17', '-z', '--small-count',
+ infile, outfile]
+ utils.runscript(script, args, in_dir)
+
+
def test_abundance_dist_single_nosquash():
infile = utils.copy_test_data('test-abund-read-2.fa')
outfile = utils.get_temp_filename('test-abund-read-2.fa')
diff --git a/tests/test_sequence_validation.py b/tests/test_sequence_validation.py
index d3ac8af..c645b8f 100644
--- a/tests/test_sequence_validation.py
+++ b/tests/test_sequence_validation.py
@@ -87,11 +87,11 @@ def test_read_cleaning_consume_seqfile(Countingtype):
# the 2nd read with this k-mer in it has an N in it.
kmer = "CCTCATCGGCACCAG"
- assert x.get(kmer) == 1 # this should be 2 in the future
+ assert x.get(kmer) == 2
# the 2nd read with this k-mer in it has a Z in it
kmer = "ACTGAGCTTCATGTC"
- assert x.get(kmer) == 1 # this should be 2 in the future
+ assert x.get(kmer) == 2
def test_read_cleaning_consume_read_by_read(Countingtype, reads):
@@ -142,8 +142,8 @@ def test_read_cleaning_abundance_distribution(Countingtype):
x.consume_seqfile(infile)
dist = x.abundance_distribution(infile, y)
- assert dist[1] == 41
- assert dist[2] == 42
+ assert dist[1] == 35 # k-mers with non-ACGTN => ignored.
+ assert dist[2] == 69
def test_read_cleaning_trim_functions_lowercase(Tabletype, reads):
@@ -152,51 +152,60 @@ def test_read_cleaning_trim_functions_lowercase(Tabletype, reads):
for read in reads:
x.consume(read.cleaned_seq) # consume cleaned_seq
+ # all of these functions will fail to do anything, b/c lowercase != valid
+ # BUT they will not raise an exception, either.
+
s = "caggcgcccaccaccgtgccctccaacctgatggt"
_, where = x.trim_on_abundance(s, 1)
- assert where == 35 # in future, should be '0'
+ assert where == 0
- _, where = x.trim_below_abundance(s, 2)
- assert where == 35 # in future, should be ?? @CTB
+ _, where = x.trim_below_abundance(s, 0)
+ print(x.get_kmer_counts(s))
+ assert where == 35 # stays at 35 (abunds all == 0)
posns = x.find_spectral_error_positions(s, 1)
- assert posns == [] # in future, should do same
+ assert posns == []
-def test_read_cleaning_trim_functions_N(Tabletype, reads):
+def test_read_cleaning_trim_functions_N(Countingtype, reads):
# read this in using "approved good" behavior w/cleaned_seq
- x = Tabletype(8, PRIMES_1m)
+ x = Countingtype(8, PRIMES_1m)
for read in reads:
x.consume(read.cleaned_seq) # consume cleaned_seq
s = "ACTGGGCGTAGNCGGTGTCCTCATCGGCACCAGC"
_, where = x.trim_on_abundance(s, 1)
- assert where == 0 # in future, should be ??
+ assert where == 11
_, where = x.trim_below_abundance(s, 2)
- assert where == 0 # in future, should be ??
+ assert where == 34
- with pytest.raises(ValueError):
- posns = x.find_spectral_error_positions(s, 1)
- # assert posns == [] # in future, should return []
+ posns = x.find_spectral_error_positions(s, 1)
+ assert posns == [11]
-def test_read_cleaning_trim_functions_bad_dna(Tabletype, reads):
+def test_read_cleaning_trim_functions_bad_dna(Countingtype, reads):
# read this in using "approved good" behavior w/cleaned_seq
- x = Tabletype(8, PRIMES_1m)
+ x = Countingtype(8, PRIMES_1m)
for read in reads:
x.consume(read.cleaned_seq) # consume cleaned_seq
+ # the precise behavior of these functions is all *undefined*
+ # because different hash functions do different things with
+ # non-ACTG characters. So all we want to do is verify that the
+ # functions execute w/o error on the k-mers before the "bad" DNA,
+ # and don't return positions in the "good" DNA.
+
s = "CCGGCGTGGTTZZYAGGTCACTGAGCTTCATGTC"
_, where = x.trim_on_abundance(s, 1)
- assert where == 0 # in future, should be ??
+ assert where >= 11
_, where = x.trim_below_abundance(s, 2)
- assert where == 0 # in future, should be ??
+ assert where >= 11
- with pytest.raises(ValueError):
- posns = x.find_spectral_error_positions(s, 1)
- # assert posns == [] # in future, should return [11]
+ posns = x.find_spectral_error_positions(s, 1)
+ for p in posns:
+ assert p >= 11
def test_read_cleaning_output_partitions(Graphtype):
@@ -224,7 +233,7 @@ def test_read_cleaning_output_partitions(Graphtype):
read_names = [read.name for read in ReadParser(savepath)]
print(read_names)
- assert len(read_names) == 4
+ assert len(read_names) == 6
print(read_names)
assert '895:1:1:1246:14654 1:N:0:NNNNN\t1\t1' in read_names
@@ -232,9 +241,8 @@ def test_read_cleaning_output_partitions(Graphtype):
assert '895:1:1:1252:19493 1:N:0:NNNNN\t3\t3' in read_names
assert 'lowercase_to_uppercase\t5\t1' in read_names
-
- assert 'n_in_read\t6\t2' not in read_names
- assert 'zy_in_read\t7\t3' not in read_names
+ assert 'n_in_read\t6\t2' in read_names
+ assert 'zy_in_read\t7\t3' in read_names
def test_read_cleaning_trim_on_stoptags(Graphtype):
@@ -256,13 +264,13 @@ def test_read_cleaning_trim_on_stoptags(Graphtype):
x.add_stop_tag(kmer)
_, pos = x.trim_on_stoptags('caggcgcccaccaccgtgccctccaacctgatggt')
- assert pos == 6 # should be ?? in future
+ assert pos == 35 # no stoptag b/c lowercase => no trim
- _, pos = x.trim_on_stoptags('CCGGCGTGGTTZZYAGGTCACTGAGCTTCATGTC')
- assert pos == 0 # should be 6 in future
+ _, pos = x.trim_on_stoptags('ACTGGGCGTAGNCGGTGTCCTCATCGGCACCAGC')
+ assert pos == 6 # N ignored
_, pos = x.trim_on_stoptags('CCGGCGTGGTTZZYAGGTCACTGAGCTTCATGTC')
- assert pos == 0 # should be 6 in future
+ assert pos == 6 # ZZY ignored
def test_consume_seqfile_and_tag(Graphtype):
@@ -272,7 +280,7 @@ def test_consume_seqfile_and_tag(Graphtype):
x = Graphtype(8, PRIMES_1m)
x.consume_seqfile_and_tag(infile)
_, n_tags = x.count_partitions()
- assert n_tags == 4 # total # of tags
+ assert n_tags == 5 # total # of tags
def test_consume_partitioned_seqfile(Graphtype):
@@ -282,7 +290,7 @@ def test_consume_partitioned_seqfile(Graphtype):
x = Graphtype(15, PRIMES_1m)
x.consume_partitioned_fasta(infile)
n_partitions, n_tags = x.count_partitions()
- assert n_partitions == 4
+ assert n_partitions == 6
assert n_tags == 0
@@ -299,11 +307,14 @@ def test_output_partitioned_file(Graphtype):
read_names = set(read_names)
good_names = ['895:1:1:1246:14654 1:N:0:NNNNN\t1\t5',
- '895:1:1:1248:9583 1:N:0:NNNNN\t2\t2',
+ '895:1:1:1248:9583 1:N:0:NNNNN\t2\t6',
'895:1:1:1252:19493 1:N:0:NNNNN\t3\t3',
'895:1:1:1255:18861 1:N:0:NNNNN\t4\t8',
'lowercase_to_uppercase\t5\t5',
- '895:1:1:1255:18861 1:N:0:NNNNN\t8\t8']
+ '895:1:1:1255:18861 1:N:0:NNNNN\t8\t8',
+ 'n_in_read\t6\t6',
+ 'zy_in_read\t7\t7',
+ 'bad_dna_in_beginning\t9\t9']
good_names = set(good_names)
assert good_names == read_names
@@ -317,7 +328,7 @@ def test_consume_seqfile_and_tag_with_labels(Graphtype):
x = _GraphLabels(graph)
x.consume_seqfile_and_tag_with_labels(infile)
- assert x.n_labels() == 6
+ assert x.n_labels() == 9
def test_consume_partitioned_seqfile_and_label(Graphtype):
@@ -328,7 +339,7 @@ def test_consume_partitioned_seqfile_and_label(Graphtype):
x = _GraphLabels(graph)
x.consume_partitioned_fasta_and_tag_with_labels(infile)
- assert x.n_labels() == 6
+ assert x.n_labels() == 9
# vim: set filetype=python tabstop=4 softtabstop=4 shiftwidth=4 expandtab:
diff --git a/tests/test_subset_graph.py b/tests/test_subset_graph.py
index bab7b62..bbbadbb 100644
--- a/tests/test_subset_graph.py
+++ b/tests/test_subset_graph.py
@@ -557,6 +557,7 @@ def test_output_partitions():
assert parts[1] == '3'
assert parts[2] == '4'
+
test_output_partitions.runme = True
@@ -610,6 +611,7 @@ def test_small_real_partitions():
assert len(set(parts)) == 1
assert set(parts) != set(['0'])
+
test_small_real_partitions.runme = True
first = """\
diff --git a/tests/test_tabletype.py b/tests/test_tabletype.py
index 0bbc280..68c522e 100644
--- a/tests/test_tabletype.py
+++ b/tests/test_tabletype.py
@@ -36,6 +36,7 @@ PRIMES_1m = [1000003, 1009837]
def tabletype(request):
return request.param
+
# For map(long, [list of ints]) cross-version hackery
if sys.version_info.major > 2:
long = int # pylint: disable=redefined-builtin
@@ -411,8 +412,8 @@ def test_set_bigcount(tabletype):
tt.set_use_bigcount(True)
for i in range(300):
- tt.add('G'*12)
- assert tt.get('G'*12) == 300
+ tt.add('G' * 12)
+ assert tt.get('G' * 12) == 300
else:
with pytest.raises(ValueError):
diff --git a/tests/test_threaded_sequence_processor.py b/tests/test_threaded_sequence_processor.py
index aaa7b37..16de18f 100644
--- a/tests/test_threaded_sequence_processor.py
+++ b/tests/test_threaded_sequence_processor.py
@@ -67,6 +67,7 @@ def load_records_d(stringio_fp):
def idem(record):
return record['name'], record['sequence']
+
# keep every *other* sequence
odd_counter = 0
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/khmer.git
More information about the debian-med-commit
mailing list