diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..a90f2a3 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,41 @@ +name: Deploy Sphinx docs to Pages + +on: + push: + branches: [main] + paths: + - "src/pmotools/**" + - "man/**" + - ".github/workflows/docs.yml" + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.11" + - name: Install dependencies + run: | + pip install -e . + pip install -r man/requirements.txt + - name: Regenerate autodocs and build + run: | + cd man + make update_autodocs + make html + - uses: actions/upload-pages-artifact@v3 + with: + path: man/build/html + - id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/test-docs.yml b/.github/workflows/test-docs.yml new file mode 100644 index 0000000..bb4a8de --- /dev/null +++ b/.github/workflows/test-docs.yml @@ -0,0 +1,31 @@ +name: Check documentation build + +on: + pull_request: + +permissions: + contents: read + +jobs: + build-docs: + name: Build Sphinx docs + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Install dependencies + run: | + pip install -e . + pip install -r man/requirements.txt + + - name: Regenerate autodocs and build + run: | + cd man + make update_autodocs + make html diff --git a/README.md b/README.md index c274320..8c08c2b 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ A collection of tools to interact with [portable microhaplotype object (pmo) fil # Setup -Install using pip +Install using pip. Currently only supports python 3.11+ ```bash pip install . ``` @@ -124,3 +124,23 @@ git add . git commit -m "Your message" git push origin feature/my-feature ``` + +### Documentation updating + +Documentation for pmotools is automatically generated from docstring under `man/`. This is automatically built and deployed through GitHub actions on merging to main. + +You should check documentation before deployment. To update the documentation locally make sure you have pmotools-python installed. + +Next, from your development environment, install sphinx and its dependencies using the following command: + +```bash +pip install -r man/requirements.txt +``` + +Build the documentation using the following commands +```bash +cd man +make update_autodocs +make html +``` +You can open the html to review changes. diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index d4bb2cb..0000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index be05304..0000000 --- a/docs/conf.py +++ /dev/null @@ -1,95 +0,0 @@ -# Configuration file for the Sphinx documentation builder. -# -# For the full list of built-in configuration values, see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Project information ----------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information - -import os -import sys - -sys.path.insert(0, os.path.abspath("..")) - -project = "pmotools-python" -copyright = "2024, Plasmogenepi" -author = "Plasmogenepi" -release = "0.1.0" - -# -- General configuration --------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration - -extensions = [ - "sphinx.ext.duration", # will report duration while building - "sphinx.ext.doctest", # can run doc checks - "sphinx.ext.autodoc", # allows for autofucntion documentation from documented code - "sphinx.ext.autosummary", # allows for doing a summary of code with autodoc from code - "sphinx.ext.githubpages", # add .nojekyll to gh-pages - "sphinx_copybutton", # add copy button to code chunks - "sphinx_toolbox.github", # link to github - "sphinx_licenseinfo", # add license information - "notfound.extension", # 404 page - "sphinx.ext.autosectionlabel", # reference sections using their title - "sphinx.ext.coverage", - "sphinx.ext.napoleon", - "sphinx.ext.viewcode", - "sphinx.ext.linkcode", -] - -templates_path = ["_templates"] -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - - -# -- Options for HTML output ------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output - -html_theme = "alabaster" -html_static_path = ["_static"] - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = "sphinx_rtd_theme" - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - -html_context = { - "display_github": True, - "github_user": "PlasmoGenEpi", - "github_repo": "pmotools-python", - "github_version": "main/docs/", -} - - -# -- Sphinx Toolbox configuration----------------------------------------------- -github_username = "PlasmoGenEpi" -github_repository = "pmotools-python" - - -# -- 404 Page configuration----------------------------------------------------- -notfound_urls_prefix = "/pmotools-python/" - - -# -- Auto Section configuration------------------------------------------------- -# Make sure the target is unique -autosectionlabel_prefix_document = True - - -# -- linkcode configuration ---------------------------------------------------- -def linkcode_resolve(domain, info): - if domain != "py": - return None - if not info["module"]: - return None - filename = info["module"].replace(".", "/") - return ( - "https://github.com/PlasmoGenEpi/pmotools-python/tree/develop/%s.py" % filename - ) - - -# code blocks -pygments_style = "sphinx" diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index 26f1a0c..0000000 --- a/docs/index.rst +++ /dev/null @@ -1,37 +0,0 @@ -.. pmotools-python documentation master file, created by - sphinx-quickstart on Sun Jul 21 20:06:33 2024. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -pmotools-python documentation -============================= - - -**pmotools-python** is a Python library for managing the file format `portable microhaplotype object `_ - -.. note:: - - This project is under active development. - -.. toctree:: - :caption: Contents - :maxdepth: 2 - - - -.. toctree:: - :caption: Scripts - :maxdepth: 3 - - scripts/Converting_data_into_PMO.rst - - - - -.. toctree:: - :caption: Usages - :maxdepth: 3 - - usages/extract_from_pmo - usages/json_convertors - usages/utils diff --git a/docs/scripts/Converting_data_into_PMO.rst b/docs/scripts/Converting_data_into_PMO.rst deleted file mode 100644 index 3afdbac..0000000 --- a/docs/scripts/Converting_data_into_PMO.rst +++ /dev/null @@ -1,48 +0,0 @@ -Converting data into PMO format -================================ - -The data for the input into the portable microhaoplotype object is often in several files which can either be text file or excel (especially for meta data). pmotools comes with several tools to help convert this input into the various parts of the pmo format and a function to wrap them all together. - - -Sample Metadata --------------------------------- -Sample metadata can often be in either text files or excel sheets. There two tools that can convert either one into json. - -Excel into json - -.. code-block:: bash - - pmotools-runner.py excel_meta_to_json_meta -h - - -Output - - usage: pmotools-runner.py excel_meta_to_json_meta [-h] --file FILE [--sheet SHEET] [--index_col_name INDEX_COL_NAME] --output OUTPUT [--overwrite] - - options: - -h, --help show this help message and exit - --file FILE Input excel file path - --sheet SHEET The sheet to convert, if none provided will default to first sheet - --index_col_name INDEX_COL_NAME - by default output is a list, if an index column name is supplied it will be a dict with this column as index - --output OUTPUT Output json file path - --overwrite If output file exists, overwrite it - - -By default it will convert sheet one into json - -.. code-block:: bash - - pmotools-runner.py excel_meta_to_json_meta --file metadata.xlsx --output metadata.json --overwrite - -To convert a specific sheet supply the sheet name - -.. code-block:: bash - - pmotools-runner.py excel_meta_to_json_meta --file metadata.xlsx --output metadata.json --overwrite --sheet Sheet2 - -By default it will convert the data into a list of objects of the input data, to make it a key dictionary of objects, supply the key/index column - -.. code-block:: bash - - pmotools-runner.py excel_meta_to_json_meta --file metadata.xlsx --output metadata.json --overwrite --sheet Sheet2 --index_col_name experiment_id diff --git a/docs/usages/extract_from_pmo.rst b/docs/usages/extract_from_pmo.rst deleted file mode 100644 index 05b8820..0000000 --- a/docs/usages/extract_from_pmo.rst +++ /dev/null @@ -1,24 +0,0 @@ -Getting info out of PMO files or loaded objects -=============================================== - -PMOExtractor --------------------- - -Extracting info out of a loaded PMO object - -.. automodule:: pmotools.extract_from_pmo.PMOExtractor - :members: - -PMOReader --------------------- -Reading into python from a PMO file - -.. automodule:: pmotools.extract_from_pmo.PMOReader - :members: - -PMOWriter --------------------- -Writing out to a PMO file from a PMO python object - -.. automodule:: pmotools.extract_from_pmo.PMOWriter - :members: diff --git a/docs/usages/json_convertors.rst b/docs/usages/json_convertors.rst deleted file mode 100644 index f0cd37d..0000000 --- a/docs/usages/json_convertors.rst +++ /dev/null @@ -1,17 +0,0 @@ -Json Convertors -=============== - -Microhaplotype Table --------------------- - -Converting a microhaplotype table to dictionary for json export - -.. automodule:: pmotools.json_convertors.microhaplotype_table_to_pmo_dict - :members: - -Metadata Table --------------------- -Converting a meta data from a table to dictionary for json export - -.. automodule:: pmotools.json_convertors.metatable_to_json_meta - :members: diff --git a/docs/usages/utils.rst b/docs/usages/utils.rst deleted file mode 100644 index 7ec50b0..0000000 --- a/docs/usages/utils.rst +++ /dev/null @@ -1,27 +0,0 @@ -Python Utilities -================ - - -Output to the terminal color utils ----------------------------------- - -Modifying text or background color when printing to the terminal - -.. automodule:: pmotools.utils.color_text - :members: - -PMO Checker Utilities ------------------------- - -Various small utilities around checking the format of PMO - -.. automodule:: pmotools.utils.PMOChecker - :members: - -Miscellaneous Utilities ------------------------- - -Various small utilities - -.. automodule:: pmotools.utils.small_utils - :members: diff --git a/man/Makefile b/man/Makefile new file mode 100644 index 0000000..4fd3bdb --- /dev/null +++ b/man/Makefile @@ -0,0 +1,35 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Paths relative to this Makefile (which lives in man/) +PACKAGEDIR = ../src/pmotools +CLIGEN = gen_cli_docs.py + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +# Regenerate all auto-generated .rst sources: the API stubs (sphinx-apidoc) +# and the per-command CLI pages (gen_cli_docs.py). Run this after adding or +# renaming modules or CLI commands, then build with `make html`. +APIDIR = $(SOURCEDIR)/api +CLIDIR = $(SOURCEDIR)/commands + +update_autodocs: + rm -rf "$(APIDIR)" "$(CLIDIR)" + sphinx-apidoc -f -e -o "$(APIDIR)/" "$(PACKAGEDIR)/" + python "$(CLIGEN)" + +.PHONY: help Makefile update_autodocs + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/man/gen_cli_docs.py b/man/gen_cli_docs.py new file mode 100755 index 0000000..d268906 --- /dev/null +++ b/man/gen_cli_docs.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python3 +""" +Generate Sphinx .rst pages documenting every pmotools-python CLI command, +using the sphinx-argparse `.. argparse::` directive. + +Walks REGISTRY from the main CLI module, finds the parser-builder function +for each command, and writes one .rst page per command group. + +Run from the project root: + python man/gen_cli_docs.py + +Then make sure man/source/index.rst includes `commands/index` in a toctree. +""" + +from __future__ import annotations + +import importlib +from pathlib import Path + +# --- adjust this import to wherever REGISTRY actually lives ------------------ +from pmotools.cli import REGISTRY +# ---------------------------------------------------------------------------- + +# Where to write the generated pages (mirrors your man/source layout) +OUTPUT_DIR = Path(__file__).parent / "source" / "commands" + +# How the tool is invoked on the command line +PROG = "pmotools-python" + + +def parser_func_candidates(command_name: str) -> list[str]: + """ + Candidate names for the parser-building function inside a leaf module, + tried in order; the first that exists wins. Lets you migrate commands + to a uniform ``get_parser`` convention one at a time. + """ + return ["get_parser", f"get_parser_{command_name}", "build_parser"] + + +def find_parser_func(module_name: str, command_name: str) -> str | None: + """Return the name of the parser-builder in module_name, or None.""" + module = importlib.import_module(module_name) + for candidate in parser_func_candidates(command_name): + if hasattr(module, candidate): + return candidate + return None + + +def rst_header(text: str, char: str) -> str: + return f"{text}\n{char * len(text)}" + + +def group_title(group_key: str) -> str: + # "convertors_to_json" -> "Convertors To Json" + return group_key.replace("_", " ").title() + + +def main() -> int: + OUTPUT_DIR.mkdir(parents=True, exist_ok=True) + + group_pages: list[str] = [] + missing: list[str] = [] + + for group, commands in REGISTRY.items(): + lines = [rst_header(group_title(group), "="), ""] + + for name, cmd in commands.items(): + module_name = cmd.func.__module__ + func_name = find_parser_func(module_name, name) + + if func_name is None: + missing.append(f"{name} ({module_name})") + continue + + lines.append(rst_header(name, "-")) + lines.append("") + lines.append(".. argparse::") + lines.append(f" :module: {module_name}") + lines.append(f" :func: {func_name}") + lines.append(f" :prog: {PROG} {name}") + lines.append("") + + (OUTPUT_DIR / f"{group}.rst").write_text("\n".join(lines)) + group_pages.append(group) + + # write the index that ties the group pages together + index_lines = [ + rst_header("Command-line reference", "="), + "", + ".. toctree::", + " :maxdepth: 2", + "", + ] + index_lines += [f" {g}" for g in group_pages] + index_lines.append("") + (OUTPUT_DIR / "index.rst").write_text("\n".join(index_lines)) + + print(f"Wrote {len(group_pages)} group pages to {OUTPUT_DIR}") + if missing: + print("\nNo parser-builder found for these commands (skipped):") + for m in missing: + print(f" - {m}") + print("\nAdd a get_parser() to each, then re-run.") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/docs/make.bat b/man/make.bat similarity index 90% rename from docs/make.bat rename to man/make.bat index 32bb245..747ffb7 100644 --- a/docs/make.bat +++ b/man/make.bat @@ -7,8 +7,8 @@ REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) -set SOURCEDIR=. -set BUILDDIR=_build +set SOURCEDIR=source +set BUILDDIR=build %SPHINXBUILD% >NUL 2>NUL if errorlevel 9009 ( diff --git a/docs/requirements.txt b/man/requirements.txt similarity index 94% rename from docs/requirements.txt rename to man/requirements.txt index 42d6671..64ad7bb 100644 --- a/docs/requirements.txt +++ b/man/requirements.txt @@ -5,3 +5,4 @@ sphinx-toolbox==3.7.0 # many useful tools for sphinx sphinx-licenseinfo==0.5.0 # license info sphinx-notfound-page==1.0.2 # 404 page sphinx-autodoc-typehints==1.23.0 # auto type hinting +sphinx-argparse diff --git a/man/source/conf.py b/man/source/conf.py new file mode 100644 index 0000000..f474485 --- /dev/null +++ b/man/source/conf.py @@ -0,0 +1,39 @@ +import os +import sys + +sys.path.insert(0, os.path.abspath("../../src")) + +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = "pmotools-python" +copyright = "2026, Nicholas Hathaway, Kathryn Murie" +author = "Nicholas Hathaway, Kathryn Murie" +release = "v1.1.0" + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [ + "sphinx.ext.autodoc", # pulls in docstrings + "sphinx.ext.napoleon", # understands Google/NumPy-style docstrings + "sphinx.ext.viewcode", # adds links to highlighted source + "sphinx.ext.todo", # enables .. todo:: and .. todolist:: + "sphinxarg.ext", +] + +templates_path = ["_templates"] +exclude_patterns = [] + +todo_include_todos = True + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = "sphinx_rtd_theme" +html_static_path = ["_static"] diff --git a/man/source/index.rst b/man/source/index.rst new file mode 100644 index 0000000..714c9fa --- /dev/null +++ b/man/source/index.rst @@ -0,0 +1,22 @@ +.. pmotools-python documentation master file, created by + sphinx-quickstart on Fri May 29 11:54:11 2026. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to pmotools-python's documentation! +=========================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + api/modules + commands/index + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/pyproject.toml b/pyproject.toml index b3eb42f..0f20290 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,8 @@ dependencies = [ "pandas>=2.2.2", "biopython>=1.83", "jsonschema>=4.23.0", - "pre-commit" + "pre-commit", + "openpyxl>=3.1.5", ] [project.scripts] diff --git a/src/pmotools/__init__.py b/src/pmotools/__init__.py index 135b967..30d85c6 100644 --- a/src/pmotools/__init__.py +++ b/src/pmotools/__init__.py @@ -1,26 +1,33 @@ # pmotools/__init__.py from __future__ import annotations -try: - # Python 3.8+ - from importlib.metadata import version, PackageNotFoundError -except Exception: # pragma: no cover - # Very old Pythons can fallback to pkg_resources if you ever needed it - from pkg_resources import get_distribution as _gd # type: ignore - - class PackageNotFoundError(Exception): - ... - - def version(pkg: str) -> str: # type: ignore - try: - return _gd(pkg).version - except Exception as e: # noqa: BLE001 - raise PackageNotFoundError from e +from importlib.metadata import version, PackageNotFoundError +#: Version of the PMO schema this package targets. Single source of truth; +#: bump when the schema changes. Independent of the package release version. +__schema_version__ = "1.0.0" try: - # Use the installed distribution name (matches [project].name) + # Distribution version from installed metadata (matches [project].version) __version__ = version("pmotools") except PackageNotFoundError: - # When running from a source tree without being installed + # Running from a source tree without being installed __version__ = "0+local" + + +def get_pmotools_version() -> str: + """Return the installed pmotools package version (e.g. '1.0.0').""" + return __version__ + + +def get_pmo_schema_version() -> str: + """Return the PMO schema version this package targets (e.g. '1.0.0').""" + return __schema_version__ + + +__all__ = [ + "__version__", + "__schema_version__", + "get_pmotools_version", + "get_pmo_schema_version", +] diff --git a/src/pmotools/cli.py b/src/pmotools/cli.py index ce368ac..3e9a87f 100644 --- a/src/pmotools/cli.py +++ b/src/pmotools/cli.py @@ -37,9 +37,7 @@ from pmotools.scripts.extractors_from_pmo.extract_pmo_with_read_filter import ( extract_pmo_with_read_filter, ) -from pmotools.scripts.pmo_to_tables.extract_allele_table import ( - extract_for_allele_table, -) + # pmo_utils from pmotools.scripts.pmo_utils.combine_pmos import combine_pmos @@ -75,6 +73,9 @@ # pmo to tables +from pmotools.scripts.pmo_to_tables.export_pmo_into_xlsx import ( + export_pmo_into_xlsx, +) from pmotools.scripts.pmo_to_tables.export_specimen_meta_table import ( export_specimen_meta_table, ) @@ -90,12 +91,24 @@ from pmotools.scripts.pmo_to_tables.export_specimen_travel_meta_table import ( export_specimen_travel_meta_table, ) +from pmotools.scripts.pmo_to_tables.export_bioinformatics_run_info_meta_table import ( + export_bioinformatics_run_info_meta_table, +) +from pmotools.scripts.pmo_to_tables.export_bioinformatics_methods_info_meta_table import ( + export_bioinformatics_methods_info_meta_table, +) +from pmotools.scripts.pmo_to_tables.export_targeted_genomes_meta_table import ( + export_targeted_genomes_meta_table, +) from pmotools.scripts.pmo_to_tables.export_target_info_meta_table import ( export_target_info_meta_table, ) from pmotools.scripts.pmo_to_tables.export_panel_info_meta_table import ( export_panel_info_meta_table, ) +from pmotools.scripts.pmo_to_tables.extract_allele_table import ( + extract_for_allele_table, +) @dataclass(frozen=True) @@ -131,7 +144,7 @@ class PmoCommand: ), "extract_pmo_with_select_library_sample_names": PmoCommand( extract_pmo_with_select_library_sample_names, - "Extract experiment sample names from experiment_info table", + "Extract library sample names from library_sample_info table", ), "extract_pmo_with_select_targets": PmoCommand( extract_pmo_with_select_targets, "Extract specific targets" @@ -148,7 +161,7 @@ class PmoCommand: "extract_basic_info_from_pmo": { "list_library_sample_names_per_specimen_name": PmoCommand( list_library_sample_names_per_specimen_name, - "List experiment_sample_ids per specimen_id", + "List library_sample_names per specimen_name", ), "list_specimen_meta_fields": PmoCommand( list_specimen_meta_fields, @@ -156,7 +169,7 @@ class PmoCommand: ), "list_bioinformatics_run_names": PmoCommand( list_bioinformatics_run_names, - "List all tar_amp_bioinformatics_info_ids in a PMO", + "List all tar_amp_bioinformatics_info_names in a PMO", ), "count_specimen_meta": PmoCommand( count_specimen_meta, "Count values of selected specimen meta fields" @@ -174,6 +187,9 @@ class PmoCommand: ) }, "pmo_to_table": { + "export_pmo_into_xlsx": PmoCommand( + export_pmo_into_xlsx, "export all parts of a PMO into a .xlsx file" + ), "export_specimen_meta_table": PmoCommand( export_specimen_meta_table, "export the specimen meta table from a PMO file" ), @@ -193,6 +209,10 @@ class PmoCommand: export_specimen_travel_meta_table, "export the specimen travel_info meta table from a PMO file", ), + "export_targeted_genomes_meta_table": PmoCommand( + export_targeted_genomes_meta_table, + "export the targeted genomes info meta table from a PMO file", + ), "export_target_info_meta_table": PmoCommand( export_target_info_meta_table, "export the target info meta table from a PMO file", @@ -201,6 +221,14 @@ class PmoCommand: export_panel_info_meta_table, "export the panel info meta table from a PMO file", ), + "export_bioinformatics_run_info_meta_table": PmoCommand( + export_bioinformatics_run_info_meta_table, + "export the bioinformatics_run_info meta table from a PMO file", + ), + "export_bioinformatics_methods_info_meta_table": PmoCommand( + export_bioinformatics_methods_info_meta_table, + "export the bioinformatics_methods_info meta table from a PMO file", + ), "extract_allele_table": PmoCommand( extract_for_allele_table, "Extract allele tables for tools like dcifer or moire", diff --git a/src/pmotools/pmo_builder/json_convert_utils.py b/src/pmotools/pmo_builder/json_convert_utils.py index e64c063..e1127f6 100644 --- a/src/pmotools/pmo_builder/json_convert_utils.py +++ b/src/pmotools/pmo_builder/json_convert_utils.py @@ -1,3 +1,6 @@ +import math + + def check_additional_columns_exist(df, additional_column_list): if additional_column_list: missing_cols = set(additional_column_list) - set(df.columns) @@ -9,25 +12,24 @@ def remove_optional_null_values(json_data, optional_columns): """ Remove empty values from optional fields in a list of dictionaries. - :param json_data: List of dictionaries to process - :param optional_columns: List of optional field names to check for empty values - :return: List of dictionaries with empty optional fields removed - - Empty values include: None, empty strings (''), empty dicts ({}), and empty lists ([]) + Empty values include: None, empty strings (''), empty dicts ({}), empty lists ([]), and NaN. """ - # Convert optional_columns to a set for faster lookup optional_fields_set = set(optional_columns) if optional_columns else set() for item in json_data: - # Collect keys to remove to avoid modifying dict while iterating keys_to_remove = [] for key, value in item.items(): if key in optional_fields_set: - # Check if value is empty: None, empty string, empty dict, or empty list - if value is None or value == "" or value == {} or value == []: + is_empty = ( + value is None + or value == "" + or value == {} + or value == [] + or (isinstance(value, float) and math.isnan(value)) + ) + if is_empty: keys_to_remove.append(key) - # Remove the empty optional fields for key in keys_to_remove: del item[key] diff --git a/src/pmotools/pmo_builder/merge_to_pmo.py b/src/pmotools/pmo_builder/merge_to_pmo.py index c52d7b3..3842cbe 100644 --- a/src/pmotools/pmo_builder/merge_to_pmo.py +++ b/src/pmotools/pmo_builder/merge_to_pmo.py @@ -2,6 +2,13 @@ from datetime import date import numpy as np from pmotools import __version__ as __pmotools_version__ +from pmotools import __schema_version__ + +from pmotools.pmo_builder.mhap_table_to_pmo import ( + create_minimum_library_specimen_dict_from_mhap_table, +) +import warnings +import copy def _convert_numpy_scalars(obj): @@ -16,63 +23,163 @@ def _convert_numpy_scalars(obj): def merge_to_pmo( - specimen_info: list, - library_sample_info: list, - sequencing_info: list, - panel_info: dict, mhap_info: dict, - bioinfo_method_info: list, - bioinfo_run_info: list, - project_info: list, + panel_target_info: dict, + specimen_info: list | None = None, + library_sample_info: list | None = None, + sequencing_info: list | None = None, + bioinfo_method_info: list | None = None, + bioinfo_run_info: list | None = None, + project_info: list | None = None, read_counts_by_stage_info: list | None = None, ): """ - Merge components into PMO, replacing names with indeces. - - :param specimen_info (list): a list of all the specimens within this project - :param library_sample_info (list) : a list of library samples within this project - :param sequencing_info (list) : a list of sequencing info for this project - :param panel_info (list) : a dictionary containing the panel and target information for this project - :param mhap_info (list) : a dictionary containing the microhaplotypes within this project, both detected and representative - :param bioinfo_method_info (list) : the bioinformatics pipeline/methods used to generated the amplicon analysis for this project - :param bioinfo_run_info (list) : the runtime info for the bioinformatics pipeline used to generated the amplicon analysis for this project - :param project_info (list) : the information about the projects stored in this PMO - :param read_counts_by_stage_info (Optional[list]) : the read counts by stage information for this project - - :return: a json formatted PMO string. + Merge components into PMO, replacing names with indices. + + The required input are ``mhap_info`` (must have fields:detected_microhaplotypes and representative_microhaplotypes) and ``panel_target_info`` (must have fields: target_info and panel_info). If no ``library_sample_info`` or ``specimen_info`` are provided, they will be automatically generated from the detected_microhaplotypes. Is also possible to provide only ``specimen_info`` or ``library_sample_info`` but their names must match up with the detected_microhaplotypes names. + + Args: + mhap_info (dict): microhaplotypes within this project, both detected + and representative; must contain ``detected_microhaplotypes`` and + ``representative_microhaplotypes``. + panel_target_info (dict): panel and target information; must contain + ``target_info`` and ``panel_info``. + specimen_info (list, optional): all the specimens within this project. + library_sample_info (list, optional): library samples within this project. + sequencing_info (list, optional): sequencing info for this project. + bioinfo_method_info (list, optional): bioinformatics pipeline/methods. + bioinfo_run_info (list, optional): runtime info for the pipeline. + project_info (list, optional): info about projects stored in this PMO. + read_counts_by_stage_info (list, optional): read counts by stage. + + Returns: + str: a JSON-formatted PMO string. """ - # Make copies to avoid editing input - specimen_info = [dict(d) for d in specimen_info] - library_sample_info = [dict(d) for d in library_sample_info] - sequencing_info = [dict(d) for d in sequencing_info] - bioinfo_method_info = [dict(d) for d in bioinfo_method_info] - bioinfo_run_info = [dict(d) for d in bioinfo_run_info] - project_info = [dict(d) for d in project_info] - panel_info = _convert_numpy_scalars(panel_info) + + # Deep copy every provided input up front so the caller's objects are never + # mutated by anything below (name replacement, appends, numpy conversion, + # etc.). All work happens on these local copies. + mhap_info = copy.deepcopy(mhap_info) + panel_target_info = copy.deepcopy(panel_target_info) + specimen_info = copy.deepcopy(specimen_info) if specimen_info is not None else None + library_sample_info = ( + copy.deepcopy(library_sample_info) if library_sample_info is not None else None + ) + sequencing_info = ( + copy.deepcopy(sequencing_info) if sequencing_info is not None else None + ) + bioinfo_method_info = ( + copy.deepcopy(bioinfo_method_info) if bioinfo_method_info is not None else None + ) + bioinfo_run_info = ( + copy.deepcopy(bioinfo_run_info) if bioinfo_run_info is not None else None + ) + project_info = copy.deepcopy(project_info) if project_info is not None else None + read_counts_by_stage_info = ( + copy.deepcopy(read_counts_by_stage_info) + if read_counts_by_stage_info is not None + else None + ) + + missing_fields = [] + if "panel_info" not in panel_target_info: + missing_fields.append("panel_info") + if "target_info" not in panel_target_info: + missing_fields.append("target_info") + if "representative_microhaplotypes" not in mhap_info: + missing_fields.append("representative_microhaplotypes") + if "detected_microhaplotypes" not in mhap_info: + missing_fields.append("detected_microhaplotypes") + if missing_fields: + raise ValueError( + f"Missing required fields for panel_target_info or mhap_info: {missing_fields}" + ) + + if bioinfo_run_info is not None and bioinfo_method_info is None: + raise ValueError( + "bioinfo_method_info must be provided if bioinfo_run_info is provided" + ) + if specimen_info is not None and library_sample_info is None: + spec_and_lib_info = create_minimum_library_specimen_dict_from_mhap_table( + mhap_info["detected_microhaplotypes"], + panel_target_info["panel_info"][0]["panel_name"], + ) + library_sample_info = spec_and_lib_info["library_sample_info"] + + # Validate that library_sample_info and specimen_info have matching names + library_sample_names = { + item["library_sample_name"] for item in library_sample_info + } + specimen_names = {item["specimen_name"] for item in specimen_info} + + # Check for names in library_sample_info that are not in specimen_info + # Check for names in specimen_info that are not in library_sample_info + missing_in_specimen = library_sample_names - specimen_names + missing_in_library = specimen_names - library_sample_names + for missing_lib_name in missing_in_specimen: + specimen_info.append({"specimen_name": missing_lib_name}) + if missing_in_specimen: + warnings.warn( + f"library_sample_names found in the detected_microhaplotypes that don't have corresponding supplied specimen_names: {sorted(missing_in_specimen)}, will be added to specimen_info with no meta" + ) + if missing_in_library: + warnings.warn( + f"specimen_name were supplied that don't have corresponding library_sample_names in detected_microhaplotypes: {sorted(missing_in_library)}" + ) + + # names match, so the supplied specimen_info names will match up with the names in library_sample_info + if specimen_info is None and library_sample_info is None: + if len(panel_target_info["panel_info"]) > 1: + raise Exception( + "If multiple panels are included in the panel information,specimen_info and library_sample_info must also be provided to indicate which panel was used for each specimen. Otherwise, provide only a single panel. Panels found: " + + str(len(panel_target_info["panel_info"])) + ) + spec_and_lib_info = create_minimum_library_specimen_dict_from_mhap_table( + mhap_info["detected_microhaplotypes"], + panel_target_info["panel_info"][0]["panel_name"], + ) + specimen_info = spec_and_lib_info["specimen_info"] + library_sample_info = spec_and_lib_info["library_sample_info"] + elif specimen_info is None: + # if giving only library sample info can default to the specimen being + # just the library_sample_names + for library_sample in library_sample_info: + library_sample["specimen_name"] = library_sample["library_sample_name"] + specimen_info = [ + {"specimen_name": library_sample["library_sample_name"]} + for library_sample in library_sample_info + ] + + panel_target_info = _convert_numpy_scalars(panel_target_info) mhap_info = _convert_numpy_scalars(mhap_info) + # optional + if sequencing_info is not None: + sequencing_info = _convert_numpy_scalars(sequencing_info) + if bioinfo_method_info is not None: + bioinfo_method_info = _convert_numpy_scalars(bioinfo_method_info) + if bioinfo_run_info is not None: + bioinfo_run_info = _convert_numpy_scalars(bioinfo_run_info) + if project_info is not None: + project_info = _convert_numpy_scalars(project_info) # Handle read_counts_by_stage_info if provided if read_counts_by_stage_info is not None: read_counts_by_stage_info = [ - _convert_numpy_scalars(dict(d)) for d in read_counts_by_stage_info + _convert_numpy_scalars(d) for d in read_counts_by_stage_info ] specimen_info = _convert_numpy_scalars(specimen_info) library_sample_info = _convert_numpy_scalars(library_sample_info) - sequencing_info = _convert_numpy_scalars(sequencing_info) - bioinfo_method_info = _convert_numpy_scalars(bioinfo_method_info) - bioinfo_run_info = _convert_numpy_scalars(bioinfo_run_info) - project_info = _convert_numpy_scalars(project_info) _replace_names_with_IDs( - specimen_info, - project_info, - library_sample_info, - sequencing_info, - panel_info, - mhap_info, - bioinfo_run_info, - read_counts_by_stage_info, + specimen_info=specimen_info, + project_info=project_info, + library_sample_info=library_sample_info, + sequencing_info=sequencing_info, + panel_target_info=panel_target_info, + mhap_info=mhap_info, + bioinfo_run_info=bioinfo_run_info, + read_counts_by_stage_info=read_counts_by_stage_info, ) # Build PMO @@ -82,15 +189,20 @@ def merge_to_pmo( "pmo_header": pmo_header, "library_sample_info": library_sample_info, "specimen_info": specimen_info, - "sequencing_info": sequencing_info, - "bioinformatics_methods_info": bioinfo_method_info, - "bioinformatics_run_info": bioinfo_run_info, - "project_info": project_info, } - | panel_info + | panel_target_info | mhap_info ) + if sequencing_info: + pmo["sequencing_info"] = sequencing_info + if bioinfo_method_info: + pmo["bioinformatics_methods_info"] = bioinfo_method_info + if bioinfo_run_info: + pmo["bioinformatics_run_info"] = bioinfo_run_info + if project_info: + pmo["project_info"] = project_info + # Add read_counts_by_stage_info if provided if read_counts_by_stage_info is not None: pmo["read_counts_by_stage"] = read_counts_by_stage_info @@ -118,15 +230,16 @@ def _replace_key_with_id(target_list, reference_list, name_key, id_key, lookup=N return missing_items -def _generate_pmo_header(): +def _generate_pmo_header( + pmotools_version=__pmotools_version__, pmo_schema_version=__schema_version__ +): today = date.today().isoformat() - # TODO: update to grab pmo version - will put this in a seperate PR pmo_header = { - "pmo_version": __pmotools_version__, + "pmo_version": pmo_schema_version, "creation_date": today, "generation_method": { "program_name": "pmotools-python", - "program_version": __pmotools_version__, + "program_version": pmotools_version, }, } return pmo_header @@ -185,53 +298,81 @@ def _report_missing_IDs( def _replace_names_with_IDs( - specimen_info, - project_info, - library_sample_info, - sequencing_info, - panel_info, - mhap_info, - bioinfo_run_info, - read_counts_by_stage_info, + specimen_info: list, + panel_target_info: dict, + mhap_info: dict, + project_info: list | None = None, + library_sample_info: list | None = None, + sequencing_info: list | None = None, + bioinfo_run_info: list | None = None, + read_counts_by_stage_info: list | None = None, ): # SPECIMEN INFO # replace name with project ID - missing_projects = _replace_key_with_id( - specimen_info, project_info, "project_name", "project_id" - ) + any_missing_project_names = False + missing_projects = [] + if project_info is not None: + for spec in specimen_info: + if "project_name" not in spec: + any_missing_project_names = True + break + if not any_missing_project_names: + missing_projects = _replace_key_with_id( + specimen_info, project_info, "project_name", "project_id" + ) # LIBRARY SAMPLE INFO # replace with sequencing_info_id, specimen_id, panel_id - missing_sequencing = _replace_key_with_id( - library_sample_info, - sequencing_info, - "sequencing_info_name", - "sequencing_info_id", - ) missing_specimen = _replace_key_with_id( library_sample_info, specimen_info, "specimen_name", "specimen_id" ) missing_panels = _replace_key_with_id( - library_sample_info, panel_info["panel_info"], "panel_name", "panel_id" + library_sample_info, + panel_target_info["panel_info"], + "panel_name", + "panel_id", ) + any_missing_sequence_info_names = False + missing_sequencing = [] + if sequencing_info is not None: + for lib_sample in library_sample_info: + if "sequencing_info_name" not in lib_sample: + any_missing_sequence_info_names = True + break + if not any_missing_sequence_info_names: + missing_sequencing = _replace_key_with_id( + library_sample_info, + sequencing_info, + "sequencing_info_name", + "sequencing_info_id", + ) # REP MHAPS # replace target_name with ID missing_targets = _replace_key_with_id( mhap_info["representative_microhaplotypes"]["targets"], - panel_info["target_info"], + panel_target_info["target_info"], "target_name", "target_id", ) # DETECTED MHAPS # Replace library_sample_name and bioinformatics_run_name - missing_bioinfo_runs = _replace_key_with_id( - mhap_info["detected_microhaplotypes"], - bioinfo_run_info, - "bioinformatics_run_name", - "bioinformatics_run_id", - ) + any_missing_bioinfo_run_names = False + missing_bioinfo_runs = [] + if bioinfo_run_info is not None: + for detected in mhap_info["detected_microhaplotypes"]: + if "bioinformatics_run_name" not in detected: + any_missing_bioinfo_run_names = True + break + if not any_missing_bioinfo_run_names: + missing_bioinfo_runs = _replace_key_with_id( + mhap_info["detected_microhaplotypes"], + bioinfo_run_info, + "bioinformatics_run_name", + "bioinformatics_run_id", + ) + lib_sample_lookup = _make_lookup(library_sample_info, "library_sample_name") missing_libs = [] for detected in mhap_info["detected_microhaplotypes"]: @@ -248,15 +389,24 @@ def _replace_names_with_IDs( missing_read_counts_bioinfo_runs = [] missing_read_counts_libs = [] missing_read_counts_targets = [] - target_lookup = _make_lookup(panel_info["target_info"], "target_name") + target_lookup = _make_lookup(panel_target_info["target_info"], "target_name") + any_read_counts_by_stage_missing_bioinfo_run_names = False if read_counts_by_stage_info is not None: - # Replace bioinformatics_run_name with bioinformatics_run_id - missing_read_counts_bioinfo_runs = _replace_key_with_id( - read_counts_by_stage_info, - bioinfo_run_info, - "bioinformatics_run_name", - "bioinformatics_run_id", - ) + for read_counts_run in read_counts_by_stage_info: + if "bioinformatics_run_name" not in read_counts_run: + any_read_counts_by_stage_missing_bioinfo_run_names = True + break + if not any_read_counts_by_stage_missing_bioinfo_run_names: + if bioinfo_run_info is not None: + # Replace bioinformatics_run_name with bioinformatics_run_id + missing_read_counts_bioinfo_runs = _replace_key_with_id( + read_counts_by_stage_info, + bioinfo_run_info, + "bioinformatics_run_name", + "bioinformatics_run_id", + ) + else: + missing_read_counts_bioinfo_runs = [] # Replace library_sample_name with library_sample_id in each run and map targets for read_counts_run in read_counts_by_stage_info: @@ -280,7 +430,28 @@ def _replace_names_with_IDs( target_entry["target_id"] = target_lookup[target_name] else: missing_read_counts_targets.append(target_name) - + merging_warnings = [] + if any_missing_project_names and project_info: + merging_warnings.append( + "project_info provided but there are specimens missing project_name field" + ) + if any_missing_sequence_info_names and sequencing_info: + merging_warnings.append( + "sequencing_info provided but there are library samples missing sequencing_info_name field" + ) + if any_missing_bioinfo_run_names and bioinfo_run_info: + merging_warnings.append( + "bioinformatics_run_info provided but there are detected microhaplotypes missing bioinformatics_run_name field" + ) + if any_read_counts_by_stage_missing_bioinfo_run_names and bioinfo_run_info: + merging_warnings.append( + "bioinformatics_run_info provided but there are read counts by stage missing bioinformatics_run_name field" + ) + if merging_warnings: + warnings_text = "\n".join(merging_warnings) + raise Exception( + f"The following warnings were encountered during merging:\n{warnings_text}" + ) # If any names were missing from reference tables error _report_missing_IDs( missing_projects, diff --git a/src/pmotools/pmo_builder/metatable_to_pmo.py b/src/pmotools/pmo_builder/metatable_to_pmo.py index ab1e5ad..4162c22 100644 --- a/src/pmotools/pmo_builder/metatable_to_pmo.py +++ b/src/pmotools/pmo_builder/metatable_to_pmo.py @@ -33,9 +33,9 @@ def custom_object_hook(d): def library_sample_info_table_to_pmo( contents: pd.DataFrame, library_sample_name_col: str = "library_sample_name", - sequencing_info_name_col: str = "sequencing_info_name", specimen_name_col: str = "specimen_name", panel_name_col: str = "panel_name", + sequencing_info_name_col: str = None, alternate_identifiers_col: str = None, experiment_accession_col: str = None, fastqs_loc_col: str = None, @@ -47,43 +47,65 @@ def library_sample_info_table_to_pmo( parasite_density_method_col: str = None, run_accession_col: str = None, additional_library_sample_info_cols: list | None = None, + list_values_library_values: list | None = ["alternate_identifiers"], + list_values_library_values_delimiter: str = ",", ): """ - Converts a DataFrame containing library information into JSON. - - :param contents (pd.DataFrame): Input DataFrame containing library data. - :param library_sample_name_col (str): Column name for library sample names. Default: library_sample_name - :param sequencing_info_name_col (str): Column name for sequencing information names. Default: sequencing_info_name - :param specimen_name_col (str): Column name for specimen IDs. Default: specimen_name - :param panel_name_col (str): Column name for panel IDs. Default: panel_name - :param alternate_identifiers_col (Optional[str]): Column name for alternate identifiers. - :param experiment_accession_col (Optional[str]): Column name for experiment accession information. - :param fastqs_loc_col (Optional[str]): Column name for location of fastqs. - :param library_prep_plate_name_col (Optional[str]): Column name containing plate name for sequencing. - :param library_prep_plate_col_col (Optional[str]): Column name for col of sample on sequencing plate. - :param library_prep_plate_row_col (Optional[str]): Column name for row of sample on sequencing plate. - :param library_prep_plate_position_col (Optional[str]): Column name for position on sequencing plate (e.g. A01). Can't be set if library_prep_plate_col_col and library_prep_plate_row_col are specified. - :param parasite_density_col (Optional[str, list[str]]): The parasite density in parasites per microliters - :param parasite_density_method_col (Optional[str or list[str]]): The method of how the density was obtained. If set parasite_density_col must also be specified. - :param run_accession_col (Optional[str]): Column name for run accession information. - :param additional_library_sample_info_cols (Optional[List[str], None]]): Additional column names to include. - - :return: JSON format where keys are `library_sample_id` and values are corresponding row data. + Convert a DataFrame containing library information into JSON. + + :param contents: input DataFrame containing library data + :type contents: pd.DataFrame + :param library_sample_name_col: column name for library sample names. Default: library_sample_name + :type library_sample_name_col: str + :param specimen_name_col: column name for specimen names. Default: specimen_name + :type specimen_name_col: str + :param panel_name_col: column name for panel names. Default: panel_name + :type panel_name_col: str + :param sequencing_info_name_col: column name for sequencing information names + :type sequencing_info_name_col: str, optional + :param alternate_identifiers_col: column name for alternate identifiers + :type alternate_identifiers_col: str, optional + :param experiment_accession_col: column name for experiment accession information + :type experiment_accession_col: str, optional + :param fastqs_loc_col: column name for location of fastqs + :type fastqs_loc_col: str, optional + :param library_prep_plate_name_col: column name containing plate name for sequencing + :type library_prep_plate_name_col: str, optional + :param library_prep_plate_col_col: column name for the column of the sample on the sequencing plate + :type library_prep_plate_col_col: str, optional + :param library_prep_plate_row_col: column name for the row of the sample on the sequencing plate + :type library_prep_plate_row_col: str, optional + :param library_prep_plate_position_col: column name for position on the sequencing plate (e.g. A01). Can't be set if library_prep_plate_col_col and library_prep_plate_row_col are specified. + :type library_prep_plate_position_col: str, optional + :param parasite_density_col: the parasite density in parasites per microliter + :type parasite_density_col: str or list of str, optional + :param parasite_density_method_col: the method of how the density was obtained. If set, parasite_density_col must also be specified. + :type parasite_density_method_col: str or list of str, optional + :param run_accession_col: column name for run accession information + :type run_accession_col: str, optional + :param additional_library_sample_info_cols: additional column names to include + :type additional_library_sample_info_cols: list of str, optional + :param list_values_library_values: columns that contain values that could be a list, delimited by list_values_library_values_delimiter + :type list_values_library_values: list of str, optional + :param list_values_library_values_delimiter: delimiter between list_values_library_values. Default: ',' + :type list_values_library_values_delimiter: str + :return: JSON format where keys are ``library_sample_id`` and values are corresponding row data + :rtype: dict """ # Check contents is a dataframe if not isinstance(contents, pd.DataFrame): raise ValueError("contents must be a pandas DataFrame.") copy_contents = contents.copy() - column_mapping = { - library_sample_name_col: "library_sample_name", - specimen_name_col: "specimen_name", - panel_name_col: "panel_name", - sequencing_info_name_col: "sequencing_info_name", - } + column_mapping = {library_sample_name_col: "library_sample_name"} required_columns = list(column_mapping.keys()) + recommended_columns = [specimen_name_col, panel_name_col, sequencing_info_name_col] + # Add optional columns optional_column_mapping = { + specimen_name_col: "specimen_name", + panel_name_col: "panel_name", + sequencing_info_name_col: "sequencing_info_name", alternate_identifiers_col: "alternate_identifiers", experiment_accession_col: "experiment_accession", fastqs_loc_col: "fastqs_loc", @@ -112,8 +134,14 @@ def library_sample_info_table_to_pmo( ) check_columns_exist(copy_contents, list(column_mapping.keys())) - # Check for null values in required columns - check_null_values(copy_contents, required_columns) + # Check for null values in required columns and recommended columns + columns_to_check = required_columns + recommended_columns_present = list( + set(recommended_columns) & set(column_mapping.keys()) + ) + if len(recommended_columns_present) > 0: + columns_to_check.extend(recommended_columns_present) + check_null_values(copy_contents, columns_to_check) # Rename and subset columns selected_pmo_fields = list(column_mapping.values()) @@ -140,6 +168,22 @@ def library_sample_info_table_to_pmo( "library_sample_name", entry_name="parasite_density_info", ) + # listify columns that contain values that could be list, are delimited by the argument list_values_library_values_delimiter + primitives = (int, float, str, bool, complex) + for col in list_values_library_values: + if col in copy_contents.columns: + for lib in meta_json: + if isinstance(lib[col], str): + lib[col] = lib[col].split(list_values_library_values_delimiter) + elif isinstance(lib[col], list): + pass + elif isinstance(lib[col], primitives): + lib[col] = [lib[col]] + else: + raise ValueError( + f"Column '{col}' must contain either strings or lists of strings." + ) + meta_json = remove_optional_null_values( meta_json, list(optional_column_mapping.values()) ) @@ -149,11 +193,11 @@ def library_sample_info_table_to_pmo( def specimen_info_table_to_pmo( contents: pd.DataFrame, specimen_name_col: str = "specimen_name", - specimen_taxon_id_col: int = "specimen_taxon_id", - host_taxon_id_col: str = "host_taxon_id", - collection_date_col: str = "collection_date", - collection_country_col: str = "collection_country", - project_name_col: str = "project_name", + specimen_taxon_id_col: str = None, + host_taxon_id_col: str = None, + collection_date_col: str = None, + collection_country_col: str = None, + project_name_col: str = None, alternate_identifiers_col: str = None, blood_meal_col: str = None, drug_usage_col: str = None, @@ -183,57 +227,96 @@ def specimen_info_table_to_pmo( specimen_type_col: str = None, treatment_status_col: str = None, additional_specimen_cols: list | None = None, - list_values_specimen_columns: list | None = [ - "alternate_identifiers_col", - "drug_usage_col", - "specimen_comments_col", - "treatment_status_col", + list_values_specimen_values: list | None = [ + "alternate_identifiers", + "drug_usage", + "specimen_comments", + "treatment_status", + "specimen_taxon_id", ], - list_values_specimen_columns_delimiter: str = ",", + list_values_specimen_values_delimiter: str = ",", ): """ - Converts a DataFrame containing specimen information into JSON. - - :param contents (pd.DataFrame): The input DataFrame containing library data. - :param specimen_name_col (string): The column name for specimen sample IDs. Default: specimen_id - :param specimen_taxon_id_col (string): NCBI taxonomy number of the organism. Default: samp_taxon_id - :param host_taxon_id_col (string): NCBI taxonomy number of the host. Default: host_taxon_id - :param collection_date_col (string): Date of the sample collection. Default: collection_date - :param collection_country_col (string): Name of country collected in (admin level 0). Default : collection_country - :param project_name_col (string): Name of the project. Default : project_name - :param alternate_identifiers_col (Optional[str]): List of optional alternative names for the samples - :param blood_meal_col (Optional[str]): Whether host specimen has had a recent blood meal - :param drug_usage_col (Optional[str]): Any drug used by subject and the frequency of usage; can include multiple drugs used - :param env_broad_scale_col (Optional[str]): The broad environment from which the specimen was collected - :param env_local_scale_col (Optional[str]): The local environment from which the specimen was collected - :param env_medium_col (Optional[str]): The environment medium from which the specimen was collected from - :param geo_admin1_col (Optional[str]): Geographical admin level 1 - :param geo_admin2_col (Optional[str]): Geographical admin level 2 - :param geo_admin3_col (Optional[str]): Geographical admin level 3 - :param gravid_col (Optional[str]): Whether host specimen is pregnant - :param gravidity_col (Optional[str]): The number of previous pregnancies - :param has_travel_out_six_month_col (Optional[str]): Whether host specimen has travelled out from local region in the last six months - :param host_age_col (Optional[str]): The age in years of the person - :param host_sex_col (Optional[str]): If specimen is from a person, the sex of that person - :param host_subject_id (Optional[str]): ID for the individual a specimen was collected from - :param lat_lon_col (Optional[str]): Latitude and longitude of the collection site - :param parasite_density_col (Optional[str, list[str]]): The parasite density in parasites per microliters - :param parasite_density_method_col (Optional[str or list[str]]): The method of how the density was obtained. If set parasite_density_col must also be specified. - :param specimen_accession_col (Optional[str]): The accession number of the specimen - :param storage_plate_col_col (Optional[str]): Column the specimen was in in the plate. If set storage_plate_row_col must also be specified. - :param storage_plate_name_col (Optional[str]): Name of plate the specimen was in - :param storage_plate_row_col (Optional[str]): Row the specimen was in in the plate. If set storage_plate_col_col must also be specified. - :param storage_plate_position_col (Optional[str]): Position of the specimen on the plate (e.g. A01). Can't be set if storage_plate_col_col and storage_plate_row_col are specified. - :param specimen_collect_device_col (Optional[str]): The way the specimen was collected - :param specimen_comments_col (Optional[str]): Additional comments about the specimen - :param specimen_store_loc_col (Optional[str]): Specimen storage site - :param specimen_type_col (Optional[str]): Type of specimen, e.g. negative_control, positive_control, field_sample - :param treatment_status_col (Optional[str]): If person has been treated with drugs, what was the treatment outcome - :param additional_specimen_cols (Optional[List[str], None]]): Additional column names to include - :param list_values_specimen_columns (Optional[List[str], None]): columns that contain values that could be list, are delimited by the argument list_values_specimen_columns_delimiter - :param list_values_specimen_columns_delimiter (','): delimiter between list_values_specimen_columns - - :return: JSON format where keys are `specimen_name_col` and values are corresponding row data. + Convert a DataFrame containing specimen information into JSON. + + :param contents: the input DataFrame containing specimen data + :type contents: pd.DataFrame + :param specimen_name_col: the column name for specimen names. Default: specimen_name + :type specimen_name_col: str + :param specimen_taxon_id_col: NCBI taxonomy number of the organism + :type specimen_taxon_id_col: str, optional + :param host_taxon_id_col: NCBI taxonomy number of the host + :type host_taxon_id_col: str, optional + :param collection_date_col: date of the sample collection + :type collection_date_col: str, optional + :param collection_country_col: name of country collected in (admin level 0) + :type collection_country_col: str, optional + :param project_name_col: name of the project + :type project_name_col: str, optional + :param alternate_identifiers_col: list of optional alternative names for the samples + :type alternate_identifiers_col: str, optional + :param blood_meal_col: whether the host specimen has had a recent blood meal + :type blood_meal_col: str, optional + :param drug_usage_col: any drug used by the subject and the frequency of usage; can include multiple drugs used + :type drug_usage_col: str, optional + :param env_broad_scale_col: the broad environment from which the specimen was collected + :type env_broad_scale_col: str, optional + :param env_local_scale_col: the local environment from which the specimen was collected + :type env_local_scale_col: str, optional + :param env_medium_col: the environment medium from which the specimen was collected + :type env_medium_col: str, optional + :param geo_admin1_col: geographical admin level 1 + :type geo_admin1_col: str, optional + :param geo_admin2_col: geographical admin level 2 + :type geo_admin2_col: str, optional + :param geo_admin3_col: geographical admin level 3 + :type geo_admin3_col: str, optional + :param gravid_col: whether the host specimen is pregnant + :type gravid_col: str, optional + :param gravidity_col: the number of previous pregnancies + :type gravidity_col: str, optional + :param has_travel_out_six_month_col: whether the host specimen has travelled out from the local region in the last six months + :type has_travel_out_six_month_col: str, optional + :param host_age_col: the age in years of the person + :type host_age_col: str, optional + :param host_sex_col: if the specimen is from a person, the sex of that person + :type host_sex_col: str, optional + :param host_subject_id: ID for the individual a specimen was collected from + :type host_subject_id: str, optional + :param lat_lon_col: latitude and longitude of the collection site + :type lat_lon_col: str, optional + :param parasite_density_col: the parasite density in parasites per microliter + :type parasite_density_col: str or list of str, optional + :param parasite_density_method_col: the method of how the density was obtained. If set, parasite_density_col must also be specified. + :type parasite_density_method_col: str or list of str, optional + :param specimen_accession_col: the accession number of the specimen + :type specimen_accession_col: str, optional + :param storage_plate_col_col: column the specimen was in on the plate. If set, storage_plate_row_col must also be specified. + :type storage_plate_col_col: str, optional + :param storage_plate_name_col: name of the plate the specimen was in + :type storage_plate_name_col: str, optional + :param storage_plate_row_col: row the specimen was in on the plate. If set, storage_plate_col_col must also be specified. + :type storage_plate_row_col: str, optional + :param storage_plate_position_col: position of the specimen on the plate (e.g. A01). Can't be set if storage_plate_col_col and storage_plate_row_col are specified. + :type storage_plate_position_col: str, optional + :param specimen_collect_device_col: the way the specimen was collected + :type specimen_collect_device_col: str, optional + :param specimen_comments_col: additional comments about the specimen + :type specimen_comments_col: str, optional + :param specimen_store_loc_col: specimen storage site + :type specimen_store_loc_col: str, optional + :param specimen_type_col: type of specimen, e.g. negative_control, positive_control, field_sample + :type specimen_type_col: str, optional + :param treatment_status_col: if the person has been treated with drugs, what the treatment outcome was + :type treatment_status_col: str, optional + :param additional_specimen_cols: additional column names to include + :type additional_specimen_cols: list of str, optional + :param list_values_specimen_values: columns that contain values that could be a list, delimited by list_values_specimen_values_delimiter + :type list_values_specimen_values: list of str, optional + :param list_values_specimen_values_delimiter: delimiter between list_values_specimen_values. Default: ',' + :type list_values_specimen_values_delimiter: str + :return: JSON format where keys are ``specimen_name`` and values are corresponding row data + :rtype: dict """ # Check contents is a dataframe if not isinstance(contents, pd.DataFrame): @@ -241,16 +324,21 @@ def specimen_info_table_to_pmo( copy_contents = contents.copy() - column_mapping = { - specimen_name_col: "specimen_name", + column_mapping = {specimen_name_col: "specimen_name"} + required_columns = list(column_mapping.keys()) + recommended_columns = [ + specimen_taxon_id_col, + host_taxon_id_col, + collection_date_col, + collection_country_col, + project_name_col, + ] + optional_column_mapping = { specimen_taxon_id_col: "specimen_taxon_id", host_taxon_id_col: "host_taxon_id", collection_date_col: "collection_date", collection_country_col: "collection_country", project_name_col: "project_name", - } - required_columns = list(column_mapping.keys()) - optional_column_mapping = { alternate_identifiers_col: "alternate_identifiers", drug_usage_col: "drug_usage", blood_meal_col: "blood_meal", @@ -324,12 +412,19 @@ def specimen_info_table_to_pmo( ) check_columns_exist(copy_contents, list(column_mapping.keys())) - # Check for null values in required columns - check_null_values(copy_contents, required_columns) + # Check for null values in required columns and recommended columns + columns_to_check = required_columns + recommended_columns_present = list( + set(recommended_columns) & set(column_mapping.keys()) + ) + if len(recommended_columns_present) > 0: + columns_to_check.extend(recommended_columns_present) + check_null_values(copy_contents, columns_to_check) # Rename and subset columns selected_pmo_fields = list(column_mapping.values()) copy_contents = copy_contents.rename(columns=column_mapping) + subset_contents = copy_contents[selected_pmo_fields] meta_json = pandas_table_to_json(subset_contents) meta_json = add_parasite_density_info( @@ -352,11 +447,21 @@ def specimen_info_table_to_pmo( entry_name="storage_plate_info", ) - for col in list_values_specimen_columns: - if col in meta_json: - meta_json[col] = meta_json[col].split( - list_values_specimen_columns_delimiter - ) + # listify columns that contain values that could be list, are delimited by the argument list_values_specimen_values_delimiter + primitives = (int, float, str, bool, complex) + for col in list_values_specimen_values: + if col in copy_contents.columns: + for spec in meta_json: + if isinstance(spec[col], str): + spec[col] = spec[col].split(list_values_specimen_values_delimiter) + elif isinstance(spec[col], list): + pass + elif isinstance(spec[col], primitives): + spec[col] = [spec[col]] + else: + raise ValueError( + f"Column '{col}' must contain either strings or lists of strings." + ) meta_json = remove_optional_null_values( meta_json, list(optional_column_mapping.values()) diff --git a/src/pmotools/pmo_builder/mhap_table_to_pmo.py b/src/pmotools/pmo_builder/mhap_table_to_pmo.py index df8256f..be0ae34 100644 --- a/src/pmotools/pmo_builder/mhap_table_to_pmo.py +++ b/src/pmotools/pmo_builder/mhap_table_to_pmo.py @@ -7,12 +7,12 @@ def mhap_table_to_pmo( microhaplotype_table: pd.DataFrame, - bioinformatics_run_name: str, + bioinformatics_run_name: str | None = None, library_sample_name_col: str = "library_sample_name", target_name_col: str = "target_name", seq_col: str = "seq", reads_col: str = "reads", - genome_id=0, + genome_id: int = 0, umis_col: str | None = None, chrom_col: str | None = None, start_col: str | None = None, @@ -27,58 +27,81 @@ def mhap_table_to_pmo( microhaplotype_name_col: str | None = None, pseudocigar_col: str | None = None, quality_col: str | None = None, - additional_representative_mhap_cols: str | None = None, + additional_representative_mhap_cols: list | None = None, additional_mhap_detected_cols: list | None = None, ): """ - Convert a dataframe of a microhaplotype calls into a dictionary containing a dictionary for the haplotypes_detected and a dictionary for the representative_haplotype_sequences. - - :param microhaplotype_table (pd.DataFrame): The dataframe containing microhaplotype calls - :param bioinformatics_run_name (str) : Unique name for the bioinformatics run that generated the data (column name or individual run name). - :param library_sample_name_col (str) : the name of the column containing the experiment sample names. Default: library_sample_name - :param target_name_col (str) : the name of the column containing the targets. Default: target_name - :param seq_col (str) : the name of the column containing the microhaplotype sequences. Default: seq - :param reads_col (str) : the name of the column containing the reads counts. Default: reads - :param genome_id (int) : the ID of the genome used as reference. Default: 0 - :param umis_col (Optional[str]) : the name of the column with unique molecular identifier count associated with this microhaplotype - :param chrom_col (Optional[str]) : the name of the column containing the chromosome name of the microhaplotype - :param start_col (Optional[str]) : the name of the column containing the start of the microhaplotype - :param end_col (Optional[str]) : the name of the column containing the end of the microhaplotype - :param ref_seq_col (Optional[str]) : the name of the column containing the reference sequence for the microhaplotype - :param strand_col (Optional[str]) : the name containing the strand of the microhaplotype - :param alt_annotations_col (Optional[str]) : the name of the column containing any alternative annotations - :param masking_seq_start_col (Optional[str]) : the name ofthe column containing a list of start positions for masking - :param masking_seq_segment_size_col (Optional[str]) : the name of the column containing a list of lengths of the segments in seq being masked - :param masking_replacement_size_col (Optional[str]) : the name of the column containing a list of lengths of the masking replacements - :param masking_delim (Optional[str]) : delim of the masking information. Default: ',' - :param microhaplotype_name_col (Optional[str]) : the name of the column containing an optional name for this microhaplotype - :param pseudocigar_col (Optional[str]) : the name of the column containing a pseudocigar for the microhaplotype - :param quality_col (Optional[str]) : the name of the column containing the ansi fastq per base quality score for this sequence - :param additional_representative_mhap_cols (Optional[List[str], None]]): additional columns to add to the representative microhaplotypes table. - :param additional_mhap_detected_cols (Optional[List[str], None]]): additional columns to add to the detected microhaplotypes table. - + Convert a dataframe of microhaplotype calls into a dictionary containing a dictionary for the haplotypes_detected and a dictionary for the representative_haplotype_sequences. + + :param microhaplotype_table: the dataframe containing microhaplotype calls + :type microhaplotype_table: pd.DataFrame + :param bioinformatics_run_name: unique name for the bioinformatics run that generated the data (column name or individual run name). Default: None + :type bioinformatics_run_name: str, optional + :param library_sample_name_col: the name of the column containing the library sample names. Default: library_sample_name + :type library_sample_name_col: str + :param target_name_col: the name of the column containing the targets. Default: target_name + :type target_name_col: str + :param seq_col: the name of the column containing the microhaplotype sequences. Default: seq + :type seq_col: str + :param reads_col: the name of the column containing the read counts. Default: reads + :type reads_col: str + :param genome_id: the ID of the genome used as reference. Default: None + :type genome_id: int, optional + :param umis_col: the name of the column with the unique molecular identifier count associated with this microhaplotype + :type umis_col: str, optional + :param chrom_col: the name of the column containing the chromosome name of the microhaplotype + :type chrom_col: str, optional + :param start_col: the name of the column containing the start of the microhaplotype + :type start_col: str, optional + :param end_col: the name of the column containing the end of the microhaplotype + :type end_col: str, optional + :param ref_seq_col: the name of the column containing the reference sequence for the microhaplotype + :type ref_seq_col: str, optional + :param strand_col: the name of the column containing the strand of the microhaplotype + :type strand_col: str, optional + :param alt_annotations_col: the name of the column containing any alternative annotations + :type alt_annotations_col: str, optional + :param masking_seq_start_col: the name of the column containing a list of start positions for masking + :type masking_seq_start_col: str, optional + :param masking_seq_segment_size_col: the name of the column containing a list of lengths of the segments in seq being masked + :type masking_seq_segment_size_col: str, optional + :param masking_replacement_size_col: the name of the column containing a list of lengths of the masking replacements + :type masking_replacement_size_col: str, optional + :param masking_delim: delimiter of the masking information. Default: ',' + :type masking_delim: str, optional + :param microhaplotype_name_col: the name of the column containing an optional name for this microhaplotype + :type microhaplotype_name_col: str, optional + :param pseudocigar_col: the name of the column containing a pseudocigar for the microhaplotype + :type pseudocigar_col: str, optional + :param quality_col: the name of the column containing the ANSI FASTQ per-base quality score for this sequence + :type quality_col: str, optional + :param additional_representative_mhap_cols: additional columns to add to the representative microhaplotypes table + :type additional_representative_mhap_cols: list of str, optional + :param additional_mhap_detected_cols: additional columns to add to the detected microhaplotypes table + :type additional_mhap_detected_cols: list of str, optional :return: a dict of both the haplotypes_detected and representative_haplotype_sequences + :rtype: dict """ representative_microhaplotype_dict = create_representative_microhaplotype_dict( - microhaplotype_table, - target_name_col, - seq_col, - genome_id, - chrom_col, - start_col, - end_col, - ref_seq_col, - strand_col, - alt_annotations_col, - masking_seq_start_col, - masking_seq_segment_size_col, - masking_replacement_size_col, - masking_delim, - microhaplotype_name_col, - pseudocigar_col, - quality_col, - additional_representative_mhap_cols, + microhaplotype_table=microhaplotype_table, + target_name_col=target_name_col, + seq_col=seq_col, + genome_id=genome_id, + chrom_col=chrom_col, + start_col=start_col, + end_col=end_col, + ref_seq_col=ref_seq_col, + strand_col=strand_col, + alt_annotations_col=alt_annotations_col, + masking_seq_start_col=masking_seq_start_col, + masking_seq_segment_size_col=masking_seq_segment_size_col, + masking_replacement_size_col=masking_replacement_size_col, + masking_delim=masking_delim, + microhaplotype_name_col=microhaplotype_name_col, + pseudocigar_col=pseudocigar_col, + quality_col=quality_col, + additional_representative_mhap_cols=additional_representative_mhap_cols, ) detected_mhap_dict_list = [] @@ -88,28 +111,28 @@ def mhap_table_to_pmo( microhaplotype_table[bioinformatics_run_name] == bioinfo_run ] detected_mhap_dict = create_detected_microhaplotype_dict( - microhaplotype_table_per_run, - bioinfo_run, - representative_microhaplotype_dict, - library_sample_name_col, - target_name_col, - seq_col, - reads_col, - umis_col, - additional_mhap_detected_cols, + microhaplotype_table=microhaplotype_table_per_run, + representative_microhaplotype_dict=representative_microhaplotype_dict, + bioinformatics_run_name=bioinfo_run, + library_sample_name_col=library_sample_name_col, + target_name_col=target_name_col, + seq_col=seq_col, + reads_col=reads_col, + umis_col=umis_col, + additional_mhap_detected_cols=additional_mhap_detected_cols, ) detected_mhap_dict_list.append(detected_mhap_dict) else: detected_mhap_dict = create_detected_microhaplotype_dict( - microhaplotype_table, - bioinformatics_run_name, - representative_microhaplotype_dict, - library_sample_name_col, - target_name_col, - seq_col, - reads_col, - umis_col, - additional_mhap_detected_cols, + microhaplotype_table=microhaplotype_table, + representative_microhaplotype_dict=representative_microhaplotype_dict, + bioinformatics_run_name=bioinformatics_run_name, + library_sample_name_col=library_sample_name_col, + target_name_col=target_name_col, + seq_col=seq_col, + reads_col=reads_col, + umis_col=umis_col, + additional_mhap_detected_cols=additional_mhap_detected_cols, ) detected_mhap_dict_list.append(detected_mhap_dict) @@ -143,26 +166,44 @@ def create_representative_microhaplotype_dict( """ Convert the read-in microhaplotype calls table into a representative microhaplotype JSON-like dictionary. - :param microhaplotype_table (pd.DataFrame): The dataframe containing microhaplotype calls - :param target_name_col (str) : the name of the column containing the targets. Default: target_name - :param seq_col (str) : the name of the column containing the microhaplotype sequences. Default: seq - :param genome_id (int) : the genome ID - :param chrom_col (Optional[str]) : the name of the column containing the chromosome name of the microhaplotype - :param start_col (Optional[str]) : the name of the column containing the start of the microhaplotype - :param end_col (Optional[str]) : the name of the column containing the end of the microhaplotype - :param ref_seq_col (Optional[str]) : the name of the column containing the reference sequence for the microhaplotype - :param strand_col (Optional[str]) : the name containing the strand of the microhaplotype - :param alt_annotations_col (Optional[str]) : the name of the column containing any alternative annotations - :param masking_seq_start_col (Optional[str]) : the name ofthe column containing a list of start positions for masking - :param masking_seq_segment_size_col (Optional[str]) : the name of the column containing a list of lengths of the segments in seq being masked - :param masking_replacement_size_col (Optional[str]) : the name of the column containing a list of lengths of the masking replacements - :param masking_delim (Optional[str]) : delim of the masking information. Default: ',' - :param microhaplotype_name_col (Optional[str]) : the name of the column containing an optional name for this microhaplotype - :param pseudocigar_col (Optional[str]) : the name of the column containing a pseudocigar for the microhaplotype - :param quality_col (Optional[str]) : the name of the column containing the ansi fastq per base quality score for this sequence - :param additional_representative_mhap_cols (Optional[List[str], None]]): additional columns to add to the representative microhaplotypes table. - - :return: A dictionary formatted for JSON output with representative microhaplotype sequences. + :param microhaplotype_table: the dataframe containing microhaplotype calls + :type microhaplotype_table: pd.DataFrame + :param target_name_col: the name of the column containing the targets. Default: target_name + :type target_name_col: str + :param seq_col: the name of the column containing the microhaplotype sequences. Default: seq + :type seq_col: str + :param genome_id: the genome ID + :type genome_id: int + :param chrom_col: the name of the column containing the chromosome name of the microhaplotype + :type chrom_col: str, optional + :param start_col: the name of the column containing the start of the microhaplotype + :type start_col: str, optional + :param end_col: the name of the column containing the end of the microhaplotype + :type end_col: str, optional + :param ref_seq_col: the name of the column containing the reference sequence for the microhaplotype + :type ref_seq_col: str, optional + :param strand_col: the name of the column containing the strand of the microhaplotype + :type strand_col: str, optional + :param alt_annotations_col: the name of the column containing any alternative annotations + :type alt_annotations_col: str, optional + :param masking_seq_start_col: the name of the column containing a list of start positions for masking + :type masking_seq_start_col: str, optional + :param masking_seq_segment_size_col: the name of the column containing a list of lengths of the segments in seq being masked + :type masking_seq_segment_size_col: str, optional + :param masking_replacement_size_col: the name of the column containing a list of lengths of the masking replacements + :type masking_replacement_size_col: str, optional + :param masking_delim: delimiter of the masking information. Default: ',' + :type masking_delim: str, optional + :param microhaplotype_name_col: the name of the column containing an optional name for this microhaplotype + :type microhaplotype_name_col: str, optional + :param pseudocigar_col: the name of the column containing a pseudocigar for the microhaplotype + :type pseudocigar_col: str, optional + :param quality_col: the name of the column containing the ANSI FASTQ per-base quality score for this sequence + :type quality_col: str, optional + :param additional_representative_mhap_cols: additional columns to add to the representative microhaplotypes table + :type additional_representative_mhap_cols: list of str, optional + :return: a dictionary formatted for JSON output with representative microhaplotype sequences + :rtype: dict """ if additional_representative_mhap_cols: @@ -299,8 +340,8 @@ def warn_if_duplicated_seqs(df, target_col, seq_col): def create_detected_microhaplotype_dict( microhaplotype_table: pd.DataFrame, - bioinformatics_run_name: str, representative_microhaplotype_dict: dict, + bioinformatics_run_name: str | None = None, library_sample_name_col: str = "library_sample_name", target_name_col: str = "target_name", seq_col: str = "seq", @@ -312,13 +353,13 @@ def create_detected_microhaplotype_dict( Convert the read-in microhaplotype calls table into the detected microhaplotype dictionary. :param microhaplotype_table: Parsed microhaplotype calls table. - :param bioinformatics_run_name: Unique name for the bioinformatics run that generated the data. :param representative_microhaplotype_dict: Dictionary of representative microhaplotypes. + :param bioinformatics_run_name: Optional Unique name for the bioinformatics run that generated the data. :param library_sample_name_col: Column containing the sample IDs. :param target_name_col: Column containing the locus IDs. :param seq_col: Column containing the microhaplotype sequences. :param reads_col: Column containing the read counts. - :param umis_col: : Ccolumn with unique molecular identifier count associated with this microhaplotype + :param umis_col: Optional Column with unique molecular identifier count associated with this microhaplotype :param additional_mhap_detected_cols: Optional additional columns to add to the microhaplotypes detected, the key is the pandas column and the value is what to name it in the output. :return: A dictionary of detected microhaplotype results. """ @@ -356,9 +397,10 @@ def build_detected_mhap_dict( always_include = ["mhap_id", "reads"] mhap_detected = { - "bioinformatics_run_name": bioinformatics_run_name, "library_samples": [], } + if bioinformatics_run_name is not None: + mhap_detected["bioinformatics_run_name"] = bioinformatics_run_name for sample, sample_df in df.groupby("library_sample_name"): target_results = [] @@ -411,3 +453,107 @@ def get_mhap_index_in_representative_mhaps(df, representative_dict): f"Some seq values not found in representative microhaplotype table:\n{missing_seqs}" ) return df + + +def create_minimum_library_specimen_dict_from_mhap_table( + detected_microhaps: list[dict], + panel_name: str, + library_sample_field_name: str = "library_sample_name", + library_sample_specimen_key: dict[str, str] | pd.DataFrame | None = None, + library_sample_name_col: str = "library_sample_name", + specimen_name_col: str = "specimen_name", + missing_library_sample_becomes_specimen_name: bool = False, +): + """ + Create a minimum library_sample_info and specimen_info dicts from the detected microhaps + + :param detected_microhaps: the detected microhaps object created by create_detected_microhaplotype_dict + :param panel_name: the panel_name for the library_sample + :param library_sample_field_name: the field name to use to extract the library_sample_name from the detected_michrohaplotypes + :param library_sample_specimen_key: a dict mapping library_sample_name -> specimen_name, + or a pandas DataFrame with two columns for renaming controlled by library_sample_name_col and specimen_name_col + if None, specimen_name == library_sample_name + :param library_sample_name_col: the column name in library_sample_specimen_key that contains the library_sample_name + :param specimen_name_col: the column name in library_sample_specimen_key that contains the specimen_name + :param missing_library_sample_becomes_specimen_name: if True and a library_sample_name is missing + from library_sample_specimen_key, fall back to + using the library_sample_name as the specimen_name; + if False, raise an error + :return: dict with keys 'library_sample_info' and 'specimen_info' + """ + # Collect all sample dicts across every entry in detected_microhaps + all_samples: list[dict] = [] + for entry in detected_microhaps: + all_samples.extend(entry.get("library_samples", [])) + + # check that every sample has the expected key + missing_key_indices = [ + i for i, s in enumerate(all_samples) if library_sample_field_name not in s + ] + if missing_key_indices: + raise KeyError( + f"The following sample indices are missing the field name '{library_sample_field_name}': " + f"{missing_key_indices}" + ) + + # check that all library_sample_name values are unique + raw_names: list[str] = [s[library_sample_field_name] for s in all_samples] + seen: set[str] = set() + duplicates: set[str] = set() + for name in raw_names: + if name in seen: + duplicates.add(name) + seen.add(name) + if duplicates: + raise ValueError(f"Duplicate library sample names found: {sorted(duplicates)}") + actual_library_sample_specimen_key = None + if library_sample_specimen_key is not None and isinstance( + library_sample_specimen_key, dict + ): + actual_library_sample_specimen_key = library_sample_specimen_key + elif library_sample_specimen_key is not None and isinstance( + library_sample_specimen_key, pd.DataFrame + ): + actual_library_sample_specimen_key = library_sample_specimen_key.set_index( + library_sample_name_col + )[specimen_name_col].to_dict() + # now construct library_sample_info + library_sample_info: list[dict] = [] + for sample in all_samples: + lib_name: str = sample[library_sample_field_name] + # use look up table to get specimen_name if provided, otherwise use library_sample_name as specimen_name + if actual_library_sample_specimen_key is not None: + if lib_name in actual_library_sample_specimen_key: + specimen_name = actual_library_sample_specimen_key[lib_name] + elif missing_library_sample_becomes_specimen_name: + # if not in key but allowing missing to become specimen_name, use library_sample_name as specimen_name + specimen_name = lib_name + else: + raise KeyError( + f"library_sample_name '{lib_name}' not found in library_sample_specimen_key " + f"and missing_library_sample_becomes_specimen_name is False." + ) + else: + specimen_name = lib_name + + library_sample_info.append( + { + "library_sample_name": lib_name, + "panel_name": panel_name, + "specimen_name": specimen_name, + } + ) + + # build specimen_info from unique specimen_names (preserving first-seen order) + seen_specimens: set[str] = set() + specimen_info: list[dict] = [] + for entry in library_sample_info: + sp = entry["specimen_name"] + if sp not in seen_specimens: + seen_specimens.add(sp) + specimen_info.append({"specimen_name": sp}) + + return { + "library_sample_info": library_sample_info, + "specimen_info": specimen_info, + } diff --git a/src/pmotools/pmo_builder/panel_information_to_pmo.py b/src/pmotools/pmo_builder/panel_information_to_pmo.py index 6c462ec..949fd8c 100644 --- a/src/pmotools/pmo_builder/panel_information_to_pmo.py +++ b/src/pmotools/pmo_builder/panel_information_to_pmo.py @@ -6,113 +6,53 @@ import pandas as pd import warnings +from .json_convert_utils import remove_optional_null_values from ..pmo_builder.json_convert_utils import check_additional_columns_exist -from ..pmo_engine.pmo_processor import PMOProcessor -def panel_info_table_to_pmo( - target_table: pd.DataFrame, - panel_name: str, - genome_info: dict | list, - target_name_col: str = "target_name", - forward_primers_seq_col: str = "fwd_primer", - reverse_primers_seq_col: str = "rev_primer", - reaction_name_col: str | None = None, - forward_primers_start_col: int | None = None, - forward_primers_end_col: int | None = None, - reverse_primers_start_col: int | None = None, - reverse_primers_end_col: int | None = None, - insert_start_col: int | None = None, - insert_end_col: int | None = None, - chrom_col: str | None = None, - strand_col: str | None = None, - ref_seq_col: str | None = None, - gene_name_col: str | None = None, - genome_id_col: str | None = None, - target_attributes_col: str | None = None, - additional_target_info_cols: list | None = None, -): +class PMOPanelBuilder: """ - Convert a dataframe containing panel information into dictionary of targets and reference information - - - :param target_table: The dataframe containing the target information - :param panel_name: the panel ID assigned to the panel - :param genome_info: A dictionary or list of dictionaries containing the genome information - :param target_name_col: the name of the column containing the target IDs - :param forward_primers_seq_col: the name of the column containing the sequence of the forward primer - :param reverse_primers_seq_col: the name of the column containing the sequence of the reverse primer - :param reaction_name_col: the name of the column containing which reaction the target was part of. By default they will all be put in one reaction. - :param forward_primers_start_col (Optional): the name of the column containing the 0-based start coordinate of the forward primer - :param forward_primers_end_col (Optional): the name of the column containing the 0-based end coordinate of the forward primer - :param reverse_primers_start_col (Optional): the name of the column containing the 0-based start coordinate of the reverse primer - :param reverse_primers_end_col (Optional): the name of the column containing the 0-based end coordinate of the reverse primer - :param insert_start_col (Optional): the name of the column containing the 0-based start coordinate of the insert - :param insert_end_col (Optional): the name of the column containing the 0-based end coordinate of the insert - :param chrom_col (Optional): the name of the column containing the chromosome for the target - :param gene_name_col (Optional): the name of the column containing the gene id - :param strand_col (Optional): the name of the column containing the strand for the target - :param target_attributes_col (Optional): a list of classification type for the primer target - :param genome_id_col (Optional): the name of the column containing the genome ID (default is 0) - :param additional_target_info_cols (Optional): dictionary of optional additional columns to add to the target information dictionary. Keys are column names and values are the type. - :return: a dict of the panel information + Build PMO ``target_info`` and ``panel_info`` structures from a target table. + + Wraps a dataframe of one-row-per-target panel data and converts it into the + nested dictionaries a PMO expects. Most users should call + :func:`panel_info_table_to_pmo` instead of using this class directly. + + :param target_table: dataframe with one row per target + :param panel_name: name assigned to the panel + :param target_name_col: column holding the target names. Default: ``target_name`` + :param forward_primers_seq_col: column holding the forward primer sequence. Default: ``fwd_primer`` + :param reverse_primers_seq_col: column holding the reverse primer sequence. Default: ``rev_primer`` + :param reaction_name_col: optional column naming which reaction each target + belongs to; if omitted, all targets go in a single reaction + :param reaction_name_col_delimiter: delimiter splitting the reaction column + into multiple reactions. Default: ``,`` + :param forward_primers_start_col: optional column with the 0-based forward primer start + :param forward_primers_end_col: optional column with the 0-based forward primer end + :param reverse_primers_start_col: optional column with the 0-based reverse primer start + :param reverse_primers_end_col: optional column with the 0-based reverse primer end + :param insert_start_col: optional column with the 0-based insert start + :param insert_end_col: optional column with the 0-based insert end + :param chrom_col: optional chromosome column; required if any location columns are set + :param strand_col: optional strand column + :param ref_seq_col: optional reference-sequence column for the insert + :param gene_name_col: optional gene-name column + :param target_attributes_col: optional column of target attribute classifications + :param target_attributes_col_delimiter: delimiter splitting the attributes + column into multiple attributes. Default: ``,`` + :param additional_target_info_cols: optional list of extra column names to + copy verbatim into each target dict """ - if not isinstance(target_table, pd.DataFrame): - raise ValueError("target_table must be a pandas DataFrame.") - - # Convert genome_info to list if it's a dict - if isinstance(genome_info, dict): - genome_info = [genome_info] - - check_genome_info(genome_info) - - # Check additional columns if any are added - check_additional_columns_exist(target_table, additional_target_info_cols) - builder = PMOPanelBuilder( - target_table, - panel_name, - genome_info, - target_name_col, - forward_primers_seq_col, - reverse_primers_seq_col, - reaction_name_col, - forward_primers_start_col, - forward_primers_end_col, - reverse_primers_start_col, - reverse_primers_end_col, - insert_start_col, - insert_end_col, - chrom_col, - strand_col, - ref_seq_col, - gene_name_col, - target_attributes_col, - additional_target_info_cols, - ) - - # Create dictionary of targets and panels - targets_dict = builder.create_targets_dict(genome_id_col) - panel_dict = builder.build_panel_info(targets_dict) - # Put together components - panel_info_dict = { - "panel_info": [panel_dict], - "targeted_genomes": genome_info, - "target_info": targets_dict, - } - return panel_info_dict - - -class PMOPanelBuilder: def __init__( self, target_table: pd.DataFrame, panel_name: str, - genome_info: dict | list, target_name_col: str = "target_name", forward_primers_seq_col: str = "fwd_primer", reverse_primers_seq_col: str = "rev_primer", reaction_name_col: str | None = None, + reaction_name_col_delimiter: str = ",", forward_primers_start_col: int | None = None, forward_primers_end_col: int | None = None, reverse_primers_start_col: int | None = None, @@ -124,15 +64,16 @@ def __init__( ref_seq_col: str | None = None, gene_name_col: str | None = None, target_attributes_col: str | None = None, + target_attributes_col_delimiter: str = ",", additional_target_info_cols: list | None = None, ): self.target_table = target_table self.panel_name = panel_name - self.genome_info = genome_info self.target_name_col = target_name_col self.forward_primers_seq_col = forward_primers_seq_col self.reverse_primers_seq_col = reverse_primers_seq_col self.reaction_name_col = reaction_name_col + self.reaction_name_col_delimiter = reaction_name_col_delimiter self.forward_primers_start_col = forward_primers_start_col self.forward_primers_end_col = forward_primers_end_col self.reverse_primers_start_col = reverse_primers_start_col @@ -144,11 +85,21 @@ def __init__( self.ref_seq_col = ref_seq_col self.gene_name_col = gene_name_col self.target_attributes_col = target_attributes_col + self.target_attributes_col_delimiter = target_attributes_col_delimiter self.additional_target_info_cols = additional_target_info_cols self.location_info_cols = self.check_location_columns() def check_location_columns(self): + """ + Validate the optional genomic-location column configuration. + + If any location column is set, enforces that ``chrom_col`` is present and + that primer/insert start and end columns are supplied as pairs. + + :raises ValueError: if location columns are set inconsistently + :return: the list of location columns if any were provided, otherwise None + """ location_cols = [ self.forward_primers_start_col, self.forward_primers_end_col, @@ -190,7 +141,12 @@ def check_location_columns(self): return location_cols return None - def check_targets_are_unique(self): + def check_target_names_are_unique(self): + """ + Raise an exception if the target names are not unique + + :return: Nothing + """ duplications = self.target_table[ self.target_table[self.target_name_col].duplicated(keep=False) ] @@ -200,6 +156,12 @@ def check_targets_are_unique(self): ) def check_unique_target_info(self, columns_to_check): + """ + Raise an exception if the target info is not unique + + :param columns_to_check: the columns to check to ensure the target info is unique + :return: Nothing + """ groups = ( self.target_table.groupby(columns_to_check)[self.target_name_col] .apply(list) @@ -219,6 +181,17 @@ def check_unique_target_info(self, columns_to_check): raise ValueError("\n".join(msg_lines)) def summarise_targets_missing_optional_info(self): + """ + Warn about targets missing optional location fields. + + For each of insert, forward-primer, and reverse-primer locations that was + requested, finds targets with empty coordinate fields and emits a warning. + Targets listed here are skipped when their location block is built. + + :return: a tuple ``(missing_insert_loc, missing_fwd_primer_loc, + missing_rev_primer_loc)``; each element is a list of target names, or + None if that location type was not requested + """ missing_insert_loc = None missing_fwd_primer_loc = None missing_rev_primer_loc = None @@ -264,13 +237,23 @@ def check_missing(name, cols): if self.reverse_primers_start_col else None ) - return missing_insert_loc, missing_fwd_primer_loc, missing_rev_primer_loc - def create_targets_dict( + def build_target_info_dict( self, genome_id_col: str | None = None, ): + """ + Build the list of target_info dictionaries from the target table. + + Validates target-name uniqueness and primer/location uniqueness, then + assembles one dict per target including primer sequences and, where + available, insert and primer genomic locations. + + :param genome_id_col: optional column holding the genome id for each + target; if omitted, a genome_id of 0 is used + :return: a list of target_info dictionaries + """ # Check targets before putting into JSON ( forward_primers_start_col, @@ -285,7 +268,7 @@ def create_targets_dict( ) = self.location_info_cols if self.location_info_cols else [None] * 9 # Check target information in the dataframe - self.check_targets_are_unique() + self.check_target_names_are_unique() columns_to_check = [self.forward_primers_seq_col, self.reverse_primers_seq_col] if self.location_info_cols: columns_to_check += [col for col in self.location_info_cols if col] @@ -296,7 +279,7 @@ def create_targets_dict( missing_rev_primer_loc, ) = self.summarise_targets_missing_optional_info() - # Put targets together in dictionary + # Put targets together in a dictionary targets_dicts = [] for _, row in self.target_table.iterrows(): target_name = row[self.target_name_col] @@ -306,7 +289,9 @@ def create_targets_dict( if self.gene_name_col: target_dict["gene_name"] = row[self.gene_name_col] if self.target_attributes_col: - target_dict["target_attributes"] = row[self.target_attributes_col] + target_dict["target_attributes"] = row[ + self.target_attributes_col + ].split(self.target_attributes_col_delimiter) if self.additional_target_info_cols: for col in self.additional_target_info_cols: value = row[col] @@ -372,28 +357,72 @@ def create_targets_dict( return targets_dicts - def build_panel_info(self, targets_dict): + def build_panel_info_dict(self, targets_dict): + """ + Build the panel_info dictionary, grouping targets into reactions. + + If no reaction column was configured, all targets are placed in a single + reaction named ``full``. + + :param targets_dict: the target_info list from :meth:`build_target_info_dict` + :return: a panel_info dictionary with ``panel_name`` and ``reactions``, + where each reaction lists target indices into ``targets_dict`` + """ panel_dict = {"panel_name": self.panel_name, "reactions": []} + target_indices = dict() + for i, target_dict in enumerate(targets_dict): + target_indices[target_dict["target_name"]] = i + if self.reaction_name_col: - reactions = self.target_table[self.reaction_name_col].unique() + reactions = ( + self.target_table[self.reaction_name_col] + .str.split(self.reaction_name_col_delimiter) + .explode() + .str.strip() # Remove leading/trailing whitespace + .unique() + ) else: - reactions = ["1"] - self.target_table["reaction"] = "1" + reactions = ["full"] + self.target_table["reaction"] = "full" self.reaction_name_col = "reaction" + for reaction in reactions: - reaction_target_table = self.target_table[ - self.target_table[self.reaction_name_col] == reaction + # Filter rows where the reaction column contains this reaction + matching_rows = self.target_table[ + self.target_table[self.reaction_name_col] + .str.split(self.reaction_name_col_delimiter) + .apply( + lambda x: reaction in [item.strip() for item in x] + if isinstance(x, list) + else False + ) + ] + # Get the indices for these targets + target_indices_for_reaction = [ + target_indices[target_name] + for target_name in matching_rows[self.target_name_col] ] - target_indeces = PMOProcessor.get_index_of_target_names( - {"target_info": targets_dict}, - reaction_target_table[self.target_name_col].to_list(), + panel_dict["reactions"].append( + { + "reaction_name": reaction, + "panel_targets": target_indices_for_reaction, + } ) - reaction_dict = {"reaction_name": reaction, "panel_targets": target_indeces} - panel_dict["reactions"].append(reaction_dict) return panel_dict def check_genome_info(genome_info): + """ + Validate that genome info contains the required keys. + + Accepts either a single genome dict or a list of them, and checks each for + the keys ``name``, ``genome_version``, ``taxon_id``, and ``url``. + + :param genome_info: a genome dict or list of genome dicts + :raises TypeError: if genome_info is not a dict or list, or a list element is not a dict + :raises ValueError: if the list is empty or any entry is missing required keys + :return: Nothing + """ if isinstance(genome_info, dict): required_keys = {"name", "genome_version", "taxon_id", "url"} missing_keys = required_keys - genome_info.keys() @@ -428,6 +457,13 @@ def merge_panel_info_dicts(panel_info_dicts: list[dict]) -> dict: Target lists are concatenated (deduplicated by target_name) and all genome references are collapsed so that genome identifiers remain valid across the merged structure. + + :param panel_info_dicts: a list of panel_info dicts, each with ``target_info`` + and ``panel_info`` (and optionally ``targeted_genomes``) + :raises ValueError: if the list is empty, a dict lacks ``target_info``, or a + target has location data without accompanying ``targeted_genomes`` + :return: a merged dict with ``panel_info`` and ``target_info`` keys, plus + ``targeted_genomes`` if any genomes were present """ if not panel_info_dicts: raise ValueError("panel_info_dicts must contain at least one entry.") @@ -459,16 +495,14 @@ def remap_genome_ids(target_entry: dict, mapping: dict[int, int]) -> None: primer_loc["genome_id"] = mapping[old_id] for panel_dict in panel_info_dicts: - if "targeted_genomes" not in panel_dict: - raise ValueError("panel_info_dict missing 'targeted_genomes'.") - genome_mapping: dict[int, int] = {} - for idx, genome in enumerate(panel_dict["targeted_genomes"]): - signature = canonicalise_genome(genome) - if signature not in genome_signature_to_index: - genome_signature_to_index[signature] = len(merged_genomes) - merged_genomes.append(genome) - genome_mapping[idx] = genome_signature_to_index[signature] + if "targeted_genomes" in panel_dict: + for idx, genome in enumerate(panel_dict["targeted_genomes"]): + signature = canonicalise_genome(genome) + if signature not in genome_signature_to_index: + genome_signature_to_index[signature] = len(merged_genomes) + merged_genomes.append(genome) + genome_mapping[idx] = genome_signature_to_index[signature] if "target_info" not in panel_dict: raise ValueError("panel_info_dict missing 'target_info'.") @@ -480,7 +514,28 @@ def remap_genome_ids(target_entry: dict, mapping: dict[int, int]) -> None: if target_name not in target_name_to_index: target_copy = copy.deepcopy(target) - remap_genome_ids(target_copy, genome_mapping) + if "targeted_genomes" in panel_dict: + remap_genome_ids(target_copy, genome_mapping) + else: + # check to see if there is location data but no genomes loaded + if "insert_location" in target_copy: + raise ValueError( + "target" + + target_name + + " has insert_location but no targeted_genomes information is included" + ) + if "location" in target_copy["forward_primer"]: + raise ValueError( + "target" + + target_name + + " has forward primer location but no targeted_genomes information is included" + ) + if "location" in target_copy["reverse_primer"]: + raise ValueError( + "target" + + target_name + + " has reverse primer location but no targeted_genomes information is included" + ) target_name_to_index[target_name] = len(merged_targets) merged_targets.append(target_copy) @@ -498,9 +553,160 @@ def remap_genome_ids(target_entry: dict, mapping: dict[int, int]) -> None: } ) merged_panels.append(remapped_panel) + ret = {"panel_info": merged_panels, "target_info": merged_targets} + if len(merged_genomes) > 0: + ret["targeted_genomes"] = merged_genomes + return ret + + +def panel_info_table_to_pmo( + target_table: pd.DataFrame, + panel_name: str, + genome_info: dict | list | None = None, + target_name_col: str = "target_name", + forward_primers_seq_col: str = "fwd_primer", + reverse_primers_seq_col: str = "rev_primer", + reaction_name_col: str | None = None, + reaction_name_col_delimiter: str = ",", + forward_primers_start_col: str | None = None, + forward_primers_end_col: str | None = None, + reverse_primers_start_col: str | None = None, + reverse_primers_end_col: str | None = None, + insert_start_col: str | None = None, + insert_end_col: str | None = None, + chrom_col: str | None = None, + strand_col: str | None = None, + ref_seq_col: str | None = None, + gene_name_col: str | None = None, + genome_id_col: str | None = None, + target_attributes_col: str | None = None, + target_attributes_col_delimiter: str = ",", + additional_target_info_cols: list | None = None, +): + """ + Convert a dataframe containing panel information into dictionary of targets and reference information - return { - "panel_info": merged_panels, - "target_info": merged_targets, - "targeted_genomes": merged_genomes, + :param target_table: the dataframe containing the target information + :type target_table: pd.DataFrame + :param panel_name: the panel ID assigned to the panel + :type panel_name: str + :param genome_info: reference genome information, needed if the target info contains genome location + :type genome_info: dict or list, optional + :param target_name_col: the name of the column containing the target IDs. Default: target_name + :type target_name_col: str + :param forward_primers_seq_col: the name of the column containing the sequence of the forward primer. Default: fwd_primer + :type forward_primers_seq_col: str + :param reverse_primers_seq_col: the name of the column containing the sequence of the reverse primer. Default: rev_primer + :type reverse_primers_seq_col: str + :param reaction_name_col: the name of the column containing which reaction the target was part of. By default they will all be put in one reaction. + :type reaction_name_col: str, optional + :param reaction_name_col_delimiter: the delimiter used to split the reaction name column into multiple reactions. Default is a comma. + :type reaction_name_col_delimiter: str + :param forward_primers_start_col: the name of the column containing the 0-based start coordinate of the forward primer + :type forward_primers_start_col: str, optional + :param forward_primers_end_col: the name of the column containing the 0-based end coordinate of the forward primer + :type forward_primers_end_col: str, optional + :param reverse_primers_start_col: the name of the column containing the 0-based start coordinate of the reverse primer + :type reverse_primers_start_col: str, optional + :param reverse_primers_end_col: the name of the column containing the 0-based end coordinate of the reverse primer + :type reverse_primers_end_col: str, optional + :param insert_start_col: the name of the column containing the 0-based start coordinate of the insert + :type insert_start_col: str, optional + :param insert_end_col: the name of the column containing the 0-based end coordinate of the insert + :type insert_end_col: str, optional + :param chrom_col: the name of the column containing the chromosome for the target + :type chrom_col: str, optional + :param gene_name_col: the name of the column containing the gene id + :type gene_name_col: str, optional + :param strand_col: the name of the column containing the strand for the target + :type strand_col: str, optional + :param ref_seq_col: the name of the column containing the reference sequence for the insert + :type ref_seq_col: str, optional + :param target_attributes_col: a list of classification type for the primer target + :type target_attributes_col: str, optional + :param target_attributes_col_delimiter: the delimiter used to split the target attributes column into multiple attributes. Default is a comma. + :type target_attributes_col_delimiter: str + :param genome_id_col: the name of the column containing the genome ID (default is 0) + :type genome_id_col: str, optional + :param additional_target_info_cols: a list of additional column names to copy verbatim into each target information dictionary + :type additional_target_info_cols: list, optional + :return: a dict of the panel information + :rtype: dict + """ + + if not isinstance(target_table, pd.DataFrame): + raise ValueError("target_table must be a pandas DataFrame.") + + # Check additional columns if any are added + check_additional_columns_exist(target_table, additional_target_info_cols) + builder = PMOPanelBuilder( + target_table=target_table, + panel_name=panel_name, + target_name_col=target_name_col, + forward_primers_seq_col=forward_primers_seq_col, + reverse_primers_seq_col=reverse_primers_seq_col, + reaction_name_col=reaction_name_col, + reaction_name_col_delimiter=reaction_name_col_delimiter, + forward_primers_start_col=forward_primers_start_col, + forward_primers_end_col=forward_primers_end_col, + reverse_primers_start_col=reverse_primers_start_col, + reverse_primers_end_col=reverse_primers_end_col, + insert_start_col=insert_start_col, + insert_end_col=insert_end_col, + chrom_col=chrom_col, + strand_col=strand_col, + ref_seq_col=ref_seq_col, + gene_name_col=gene_name_col, + target_attributes_col=target_attributes_col, + target_attributes_col_delimiter=target_attributes_col_delimiter, + additional_target_info_cols=additional_target_info_cols, + ) + + # check and process genome_info if given + # Convert genome_info to list if it's a dict + if genome_info and isinstance(genome_info, dict): + genome_info = [genome_info] + + if genome_info: + check_genome_info(genome_info) + + # Create a dictionary of targets and panels + targets_dict = builder.build_target_info_dict(genome_id_col) + if not genome_info: + for target in targets_dict: + if "insert_location" in target: + raise Exception( + "insert_location is provided for " + + target["target_name"] + + " but no targeted_genomes is not provided." + ) + if "location" in target["forward_primer"]: + raise Exception( + "location is provided for " + + target["target_name"] + + " but no targeted_genomes is not provided." + ) + if "location" in target["reverse_primer"]: + raise Exception( + "location is provided for " + + target["target_name"] + + " but no targeted_genomes is not provided." + ) + panel_dict = builder.build_panel_info_dict(targets_dict) + # Put together components + panel_info_dict = { + "panel_info": [panel_dict], + "target_info": targets_dict, } + remove_optional_null_values( + panel_info_dict["target_info"], + ["gene_name", "insert_location", "markers_of_interest", "target_attributes"], + ) + + if genome_info: + panel_info_dict["targeted_genomes"] = genome_info + remove_optional_null_values( + panel_info_dict["target_info"], ["chromosomes", "gff_url"] + ) + + return panel_info_dict diff --git a/src/pmotools/pmo_builder/pmo_updater.py b/src/pmotools/pmo_builder/pmo_updater.py index 7291f09..c0f9305 100644 --- a/src/pmotools/pmo_builder/pmo_updater.py +++ b/src/pmotools/pmo_builder/pmo_updater.py @@ -3,13 +3,19 @@ import pandas as pd from pmotools.pmo_engine.pmo_processor import PMOProcessor from datetime import datetime +import copy +import logging +from typing import Any + +logger = logging.getLogger(__name__) class PMOUpdater(object): @staticmethod - def check_if_date_yyyy_mm_or_yyyy_mm_dd(date_string: str) -> bool: + def _check_if_date_yyyy_mm_or_yyyy_mm_dd(date_string: str) -> bool: """ Checks if a string is in YYYY-MM or YYYY-MM-DD format. + :param date_string: the string to be checked """ try: @@ -39,6 +45,7 @@ def update_specimen_meta_with_traveler_info( ): """ Update a PMO's specimen's metadata with travel info + :param pmo: the PMO to update, will directly modify this PMO :param traveler_info: the traveler info :param specimen_name_col: the specimen name column within the traveler input table @@ -112,7 +119,7 @@ def update_specimen_meta_with_traveler_info( f"Missing required date value in column '{date_col}' for specimen '{specimen_name}'" ) val_str = str(val) - if not PMOUpdater.check_if_date_yyyy_mm_or_yyyy_mm_dd(val_str): + if not PMOUpdater._check_if_date_yyyy_mm_or_yyyy_mm_dd(val_str): raise ValueError( f"Invalid date format in '{date_col}' for specimen '{specimen_name}': '{val_str}'. " f"Expected YYYY-MM or YYYY-MM-DD" @@ -123,3 +130,106 @@ def update_specimen_meta_with_traveler_info( "travel_out_six_month" ].append(travel_rec) return pmo + + @staticmethod + def merge_dicts_by_key( + main_list: list[dict], + update_list: list[dict], + key_field: str, + replace: bool = False, + ignore_fields: list[str] | None = None, + ) -> list[dict]: + """ + Merge two lists of dicts by a shared key field. + + The first list is treated as the main/base data source. The second list + provides updates that are applied on top. Both input lists are left + untouched (deep copies are used internally). + + Args: + main_list: The primary list of dicts (source of truth). + update_list: The list of dicts whose values will be merged in. + key_field: The dict key used to match records across lists. + replace: If True, existing values in main are overwritten by + update values. If False, a conflict raises a ValueError. + ignore_fields: Optional list of field names to skip entirely during + the merge (they are never read from update_list). + + Returns: + A new list of dicts with updates applied. + + Raises: + ValueError: If either list contains duplicate values for key_field. + KeyError: If any dict in either list is missing key_field. + KeyError: If update_list contains a key_field value that does not + exist in main_list. + ValueError: If replace=False and an update would overwrite an + existing field. + """ + ignore_fields = set(ignore_fields or []) + + # check to see if any of the input (the main or the update lists) have missing key_field + def _check_missing_key(lst: list[dict], label: str) -> None: + bad = [i for i, d in enumerate(lst) if key_field not in d] + if bad: + raise KeyError(f"{label} is missing '{key_field}' at index(es): {bad}") + + _check_missing_key(main_list, "main_list") + _check_missing_key(update_list, "update_list") + + # check if there are duplicate key_field values + def _check_duplicates(lst: list[dict], label: str) -> None: + seen: set = set() + dupes: set = set() + for d in lst: + val = d[key_field] + (dupes if val in seen else seen).add(val) + if dupes: + raise ValueError( + f"{label} contains duplicate '{key_field}' values: {sorted(dupes)}" + ) + + _check_duplicates(main_list, "main_list") + _check_duplicates(update_list, "update_list") + + # Build lookup from deep copies + main_map: dict[Any, dict] = {d[key_field]: copy.deepcopy(d) for d in main_list} + update_map: dict[Any, dict] = { + d[key_field]: copy.deepcopy(d) for d in update_list + } + + # update keys must exist in main + extra_keys = set(update_map) - set(main_map) + if extra_keys: + raise KeyError( + f"update_list contains '{key_field}' values not found in " + f"main_list: {sorted(extra_keys)}" + ) + + # Warn if any of the main keys absent from update, this way can update some of the values but + # not necessary to update all of them + missing_from_update = set(main_map) - set(update_map) + if missing_from_update: + logger.warning( + "The following '%s' values are in main_list but not in " + "update_list (skipping): %s", + key_field, + sorted(missing_from_update), + ) + + # now merge + for key, update_dict in update_map.items(): + main_dict = main_map[key] + for field, value in update_dict.items(): + if field == key_field or field in ignore_fields: + continue + if field in main_dict: + if not replace: + raise ValueError( + f"Field '{field}' already exists in record " + f"'{key_field}={key}' and replace=False." + ) + main_dict[field] = value + else: + main_dict[field] = value + return list(main_map.values()) diff --git a/src/pmotools/pmo_builder/read_count_by_stage_table_to_pmo.py b/src/pmotools/pmo_builder/read_count_by_stage_table_to_pmo.py index 8877412..4383531 100644 --- a/src/pmotools/pmo_builder/read_count_by_stage_table_to_pmo.py +++ b/src/pmotools/pmo_builder/read_count_by_stage_table_to_pmo.py @@ -5,8 +5,8 @@ def read_count_by_stage_table_to_pmo( - bioinformatics_run_name: str, total_raw_count_table: pd.DataFrame, + bioinformatics_run_name: str | None = None, reads_by_stage_table: pd.DataFrame | None = None, library_sample_name_col: str = "library_sample_name", target_name_col: str = "target_name", @@ -19,22 +19,37 @@ def read_count_by_stage_table_to_pmo( """ Convert tables of read counts by stage into PMO read_counts_by_stage format. - :param bioinformatics_run_name (str): Name for the bioinformatics run (column name or individual run name) - :param total_raw_count_table (pd.DataFrame): Table with total raw counts per sample - :param reads_by_stage_table (Optional[pd.DataFrame]): Table of reads per sample, per locus, per stage. Can be long format (single stage column) or wide format (multiple stage columns) - :param library_sample_name_col (str): Column name for library sample names. Default: library_sample_name - :param target_name_col (str): Column name for target names. Default: target_name - :param total_raw_count_col (str): Column name for total raw counts. Default: total_raw_count - :param stage_col (str or list): Column name for pipeline stages (long format), or list of stage column names for wide format. Default: stage - :param read_count_col (str): Column name for read counts. Default: read_count - :param additional_library_sample_cols (Optional[List[str]]): Additional columns to include for library samples - :param additional_target_cols (Optional[List[str]]): Additional columns to include for targets - - :return: list of dicts formatted for PMO read_counts_by_stage section. Always returns a list, with one - entry for single runs or multiple entries when bioinformatics_run_name is a column in total_raw_count_table. - - Note: For wide format data, provide stage_col as a list of column names. The function will use pd.melt() - to convert wide format to long format before processing. + + :param total_raw_count_table: table with total raw counts per sample + :type total_raw_count_table: pd.DataFrame + :param bioinformatics_run_name: name for the bioinformatics run (column name or individual run name) + :type bioinformatics_run_name: str, optional + :param reads_by_stage_table: table of reads per sample, per locus, per stage. Can be long + format (single stage column) or wide format (multiple stage columns) + :type reads_by_stage_table: pd.DataFrame, optional + :param library_sample_name_col: column name for library sample names. Default: library_sample_name + :type library_sample_name_col: str + :param target_name_col: column name for target names. Default: target_name + :type target_name_col: str + :param total_raw_count_col: column name for total raw counts. Default: total_raw_count + :type total_raw_count_col: str + :param stage_col: column name for pipeline stages (long format), or list of stage column + names for wide format. Default: stage + :type stage_col: str or list + :param read_count_col: column name for read counts. Default: read_count + :type read_count_col: str + :param additional_library_sample_cols: additional columns to include for library samples + :type additional_library_sample_cols: list of str, optional + :param additional_target_cols: additional columns to include for targets + :type additional_target_cols: list of str, optional + :return: list of dicts formatted for the PMO read_counts_by_stage section. Always returns + a list, with one entry for single runs or multiple entries when bioinformatics_run_name + is a column in total_raw_count_table. + :rtype: list of dict + + .. note:: + For wide-format data, provide ``stage_col`` as a list of column names. The function + uses ``pd.melt()`` to convert wide format to long format before processing. """ # Validate input @@ -56,7 +71,10 @@ def read_count_by_stage_table_to_pmo( check_additional_columns_exist(reads_by_stage_table, additional_target_cols) # Check if bioinformatics_run_name is a column in total_raw_count_table - if bioinformatics_run_name in total_raw_count_table.columns: + if ( + bioinformatics_run_name is not None + and bioinformatics_run_name in total_raw_count_table.columns + ): # Create separate entries for each unique run output_data_list = [] unique_runs = total_raw_count_table[bioinformatics_run_name].unique() @@ -278,14 +296,14 @@ def _process_reads_by_stage_table( def _build_read_counts_by_stage_output( library_sample_data: dict, reads_by_stage_data: dict | None, - bioinformatics_run_name: str, + bioinformatics_run_name: str | None = None, ) -> dict: """ Build the final output structure for read_counts_by_stage. :param library_sample_data: Dictionary with library sample data :param reads_by_stage_data: Optional dictionary with reads by stage data - :param bioinformatics_run_name: Name for the bioinformatics run + :param bioinformatics_run_name: Optional name for the bioinformatics run :return: Dictionary formatted for PMO read_counts_by_stage section """ @@ -330,8 +348,8 @@ def _build_read_counts_by_stage_output( # Build the final output structure output_data = { - "bioinformatics_run_name": bioinformatics_run_name, "read_counts_by_library_sample_by_stage": read_counts_by_library_sample_by_stage, } - + if bioinformatics_run_name is not None: + output_data["bioinformatics_run_name"] = bioinformatics_run_name return output_data diff --git a/src/pmotools/pmo_engine/pmo_checker.py b/src/pmotools/pmo_engine/pmo_checker.py index 46186ba..475190a 100644 --- a/src/pmotools/pmo_engine/pmo_checker.py +++ b/src/pmotools/pmo_engine/pmo_checker.py @@ -1,7 +1,60 @@ #!/usr/bin/env python3 - from jsonschema import Draft7Validator, validate +import json +import importlib.resources as resources +from pmotools import __schema_version__ + + +def load_schema(name: str) -> dict: + """ + Load a JSON schema from the pmotools.schemas package. + + Parameters + ---------- + name : str + The filename of the schema (e.g. "pmo_schema.json"). + + Returns + ------- + dict + Parsed JSON schema as a Python dictionary. + + Raises + ------ + FileNotFoundError + If the schema file does not exist. + json.JSONDecodeError + If the schema file is not valid JSON. + """ + with resources.files("pmotools.schemas").joinpath(name).open( + "r", encoding="utf-8" + ) as f: + return json.load(f) + + +def load_schema_by_version(version: str) -> dict: + """ + Load a JSON schema from the pmotools.schemas package. + + Parameters + ---------- + version : str + The version of the schema to be loaded (e.g. "1.0.0", "1.1.0"). + + Returns + ------- + dict + Parsed JSON schema as a Python dictionary. + + Raises + ------ + FileNotFoundError + If the schema file does not exist. + json.JSONDecodeError + If the schema file is not valid JSON. + """ + return load_schema(f"portable_microhaplotype_object_v{version}.schema.json") class PMOChecker: @@ -9,7 +62,7 @@ class PMOChecker: A class to house utilities to help check the formatting of read in PMO files. """ - def __init__(self, pmo_jsonschema: dict): + def __init__(self, pmo_jsonschema: dict | None = None): """ Constructor for PMOChecker with the json read from the json schema file @@ -19,6 +72,8 @@ def __init__(self, pmo_jsonschema: dict): or use loader PMOChecker checker(load_schema("portable_microhaplotype_object_v1.0.0.schema.json") """ + if pmo_jsonschema is None: + pmo_jsonschema = load_schema_by_version(__schema_version__) self.pmo_jsonschema = pmo_jsonschema self.pmo_validator = Draft7Validator(pmo_jsonschema) # below assumes the jsonschema loaded is a specific pmo jsonschema and assumes these fields exist @@ -31,6 +86,7 @@ def __init__(self, pmo_jsonschema: dict): def get_required_fields_for_pmo_class(self, pmo_class): """ Get the required fields for the pmo_class from the pmo_jsonschema + :param pmo_class: the class to get a required fields for, will throw an exception if class is not found within the schema :return: the required fields for the pmo_class """ @@ -44,6 +100,8 @@ def get_required_fields_for_pmo_class(self, pmo_class): def validate_pmo_json(self, pmo_json): """ Validate the PMO json file with loaded schema + + :param pmo_json: the pmo json to validate """ validate(pmo_json, self.pmo_jsonschema) diff --git a/src/pmotools/pmo_engine/pmo_exporter.py b/src/pmotools/pmo_engine/pmo_exporter.py index 1a39282..361ebd7 100644 --- a/src/pmotools/pmo_engine/pmo_exporter.py +++ b/src/pmotools/pmo_engine/pmo_exporter.py @@ -5,25 +5,40 @@ from collections import defaultdict from typing import NamedTuple import pandas as pd +from openpyxl.utils import get_column_letter +from dataclasses import dataclass from pmotools.pmo_engine.pmo_checker import PMOChecker from pmotools.pmo_engine.pmo_processor import PMOProcessor from pmotools import __version__ as __pmotools_version__ -bed_loc_tuple = NamedTuple( - "bed_loc", - [ - ("chrom", str), - ("start", int), - ("end", int), - ("name", str), - ("score", float), - ("strand", str), - ("ref_seq", str), - ("extra_info", str), - ], -) + +class BedLoc(NamedTuple): + """ + A single BED-format genomic location. + + Used when extracting target / panel insert locations out of a PMO so they + can be written to a BED file. + + :ivar chrom: chromosome / contig name + :ivar start: 0-based start position + :ivar end: end position (exclusive) + :ivar name: target name + :ivar score: BED score column; here the insert length (``end - start``) + :ivar strand: ``+`` or ``-`` + :ivar ref_seq: reference sequence for the insert, empty string if not loaded + :ivar extra_info: free-text key/value annotation, e.g. genome name/version + """ + + chrom: str + start: int + end: int + name: str + score: float + strand: str + ref_seq: str + extra_info: str class PMOExporter(object): @@ -32,18 +47,40 @@ class PMOExporter(object): """ @staticmethod - def is_primitive(x) -> bool: + def _is_primitive(x) -> bool: + """ + Check whether a value is a primitive that can be written directly to a table cell. + + :param x: the value to check + :return: True if ``x`` is a str, int, float, bool, or None + """ return isinstance(x, (str, int, float, bool)) or x is None @staticmethod - def is_primitive_list(x) -> bool: + def _is_primitive_list(x) -> bool: + """ + Check whether a value is a list or tuple containing only primitives. + + :param x: the value to check + :return: True if ``x`` is a list/tuple and every element is a primitive + (see :meth:`is_primitive`) + """ return isinstance(x, (list, tuple)) and all( - PMOExporter.is_primitive(i) for i in x + PMOExporter._is_primitive(i) for i in x ) @staticmethod - def is_exportable(x) -> bool: - return PMOExporter.is_primitive(x) or PMOExporter.is_primitive_list(x) + def _is_exportable(x) -> bool: + """ + Check whether a value can be exported to a flat table. + + A value is exportable if it is a primitive or a list/tuple of primitives; + complex nested objects (e.g. TravelInfo, parasite densities) are not. + + :param x: the value to check + :return: True if ``x`` is a primitive or a primitive list + """ + return PMOExporter._is_primitive(x) or PMOExporter._is_primitive_list(x) @staticmethod def export_specimen_travel_meta_table( @@ -52,6 +89,7 @@ def export_specimen_travel_meta_table( """ Export the specimen meta information of a PMO to a dataframe Currently avoiding exporting values of complex object types like TravelInfo or Parasite densities, best to export such values in their own tables + :param pmodata: the pmo export the information from :param separator: the separator to use for list values :return: a pandas dataframe of the specimen metadata @@ -62,9 +100,9 @@ def export_specimen_travel_meta_table( for travel_meta in specimen["travel_out_six_month"]: export_row = {"specimen_name": specimen["specimen_name"]} for key, value in travel_meta.items(): - if PMOExporter.is_primitive(value): + if PMOExporter._is_primitive(value): export_row[key] = value - elif PMOExporter.is_primitive_list(value): + elif PMOExporter._is_primitive_list(value): export_row[key] = separator.join(str(v) for v in value) rows.append(export_row) return pd.DataFrame(rows) @@ -74,6 +112,7 @@ def export_specimen_meta_table(pmodata, separator: str = ",") -> pd.DataFrame: """ Export the specimen meta information of a PMO to a dataframe Currently avoiding exporting values of complex object types like TravelInfo or Parasite densities, best to export such values in their own tables + :param pmodata: the pmo export the information from :param separator: the separator to use for list values :return: a pandas dataframe of the specimen metadata @@ -86,9 +125,9 @@ def export_specimen_meta_table(pmodata, separator: str = ",") -> pd.DataFrame: export_row["project_name"] = pmodata["project_info"][value][ "project_name" ] - elif PMOExporter.is_primitive(value): + elif PMOExporter._is_primitive(value): export_row[key] = value - elif PMOExporter.is_primitive_list(value): + elif PMOExporter._is_primitive_list(value): export_row[key] = separator.join(str(v) for v in value) rows.append(export_row) return pd.DataFrame(rows) @@ -97,6 +136,7 @@ def export_specimen_meta_table(pmodata, separator: str = ",") -> pd.DataFrame: def export_library_sample_meta_table(pmodata, separator: str = ",") -> pd.DataFrame: """ Export the library_sample meta information of a PMO to a dataframe + :param pmodata: the pmo export the information from :param separator: the separator to use for list values :return: a pandas dataframe of the library_sample metadata @@ -117,30 +157,97 @@ def export_library_sample_meta_table(pmodata, separator: str = ",") -> pd.DataFr export_row["panel_name"] = pmodata["panel_info"][value][ "panel_name" ] - elif PMOExporter.is_primitive(value): + elif PMOExporter._is_primitive(value): export_row[key] = value - elif PMOExporter.is_primitive_list(value): + elif PMOExporter._is_primitive_list(value): export_row[key] = separator.join(str(v) for v in value) rows.append(export_row) return pd.DataFrame(rows) + @staticmethod + def export_bioinformatics_run_info_meta_table( + pmodata, separator: str = "," + ) -> pd.DataFrame: + """ + Export the bioinformatics_run_info meta information of a PMO to a dataframe + + :param pmodata: the pmo export the information from + :param separator: the separator to use for list values + :return: a pandas dataframe of the library_sample metadata + """ + rows = [] + if "bioinformatics_run_info" not in pmodata.keys(): + raise ValueError("no bioinformatics_run_info found in input PMO") + run_id = 0 + for bioinformatics_run_info in pmodata["bioinformatics_run_info"]: + export_row = {} + export_row["run_id"] = run_id + run_id += 1 + for key, value in bioinformatics_run_info.items(): + if PMOExporter._is_primitive(value): + export_row[key] = value + elif PMOExporter._is_primitive_list(value): + export_row[key] = separator.join(str(v) for v in value) + rows.append(export_row) + return pd.DataFrame(rows) + + @staticmethod + def export_bioinformatics_methods_info_meta_table( + pmodata, separator: str = "," + ) -> pd.DataFrame: + """ + Export the bioinformatics_methods_info meta information of a PMO to a dataframe + + :param pmodata: the pmo export the information from + :param separator: the separator to use for list values + :return: a pandas dataframe of the library_sample metadata + """ + # @todo write pytest export_bioinformatics_methods_info_meta_table + rows = [] + if "bioinformatics_methods_info" not in pmodata.keys(): + raise ValueError("no bioinformatics_methods_info found in input PMO") + bioinformatics_methods_id = 0 + for bioinformatics_methods_info in pmodata["bioinformatics_methods_info"]: + bioinformatics_methods_id += 1 + export_row = {} + for key, value in bioinformatics_methods_info.items(): + export_row["bioinformatics_methods_id"] = bioinformatics_methods_id + if PMOExporter._is_primitive(value): + export_row[key] = value + elif PMOExporter._is_primitive_list(value): + export_row[key] = separator.join(str(v) for v in value) + + method_count = 0 + for method in bioinformatics_methods_info["methods"]: + method_count += 1 + method_export_row = copy.deepcopy(export_row) + method_export_row["method_id"] = method_count + for method_key in method.keys(): + method_export_row[method_key] = method[method_key] + rows.append(method_export_row) + return pd.DataFrame(rows) + @staticmethod def export_sequencing_info_meta_table( pmodata, separator: str = "," ) -> pd.DataFrame: """ Export the sequencing_info meta information of a PMO to a dataframe + :param pmodata: the pmo export the information from :param separator: the separator to use for list values :return: a pandas dataframe of the sequencing_info metadata """ + # check to see sequencing_info is loaded + if "sequencing_info" not in pmodata.keys(): + raise ValueError("no sequencing_info found in input PMO") rows = [] for sequencing_info in pmodata["sequencing_info"]: export_row = {} for key, value in sequencing_info.items(): - if PMOExporter.is_primitive(value): + if PMOExporter._is_primitive(value): export_row[key] = value - elif PMOExporter.is_primitive_list(value): + elif PMOExporter._is_primitive_list(value): export_row[key] = separator.join(str(v) for v in value) rows.append(export_row) return pd.DataFrame(rows) @@ -149,17 +256,21 @@ def export_sequencing_info_meta_table( def export_project_info_meta_table(pmodata, separator: str = ",") -> pd.DataFrame: """ Export the project_info meta information of a PMO to a dataframe + :param pmodata: the pmo export the information from :param separator: the separator to use for list values :return: a pandas dataframe of the project_info metadata """ + # check to see sequencing_info is loaded + if "project_info" not in pmodata.keys(): + raise ValueError("no project_info found in input PMO") rows = [] for project_info in pmodata["project_info"]: export_row = {} for key, value in project_info.items(): - if PMOExporter.is_primitive(value): + if PMOExporter._is_primitive(value): export_row[key] = value - elif PMOExporter.is_primitive_list(value): + elif PMOExporter._is_primitive_list(value): export_row[key] = separator.join(str(v) for v in value) rows.append(export_row) return pd.DataFrame(rows) @@ -168,6 +279,7 @@ def export_project_info_meta_table(pmodata, separator: str = ",") -> pd.DataFram def export_panel_info_meta_table(pmodata, separator: str = ",") -> pd.DataFrame: """ Export the panel meta information of a PMO to a dataframe + :param pmodata: the pmo export the information from :param separator: the separator to use for list values :return: a pandas dataframe of the panel metadata @@ -176,9 +288,9 @@ def export_panel_info_meta_table(pmodata, separator: str = ",") -> pd.DataFrame: for panel_info in pmodata["panel_info"]: export_row = {} for key, value in panel_info.items(): - if PMOExporter.is_primitive(value): + if PMOExporter._is_primitive(value): export_row[key] = value - elif PMOExporter.is_primitive_list(value): + elif PMOExporter._is_primitive_list(value): export_row[key] = separator.join(str(v) for v in value) reactions_for_target = defaultdict(list) for reaction in panel_info["reactions"]: @@ -197,34 +309,129 @@ def export_panel_info_meta_table(pmodata, separator: str = ",") -> pd.DataFrame: def export_target_info_meta_table(pmodata, separator: str = ",") -> pd.DataFrame: """ Export the target meta information of a PMO to a dataframe + :param pmodata: the pmo export the information from :param separator: the separator to use for list values :return: a pandas dataframe of the panel metadata """ rows = [] - for panel_info in pmodata["target_info"]: + for target_info in pmodata["target_info"]: export_row = {} - for key, value in panel_info.items(): + for key, value in target_info.items(): if "forward_primer" == key: - export_row["forward_primer_seq"] = panel_info["forward_primer"][ + export_row["forward_primer_seq"] = target_info["forward_primer"][ "seq" ] + if "location" in target_info["forward_primer"]: + for primer_loc_key in target_info["forward_primer"][ + "location" + ].keys(): + export_row[ + "forward_primer_" + primer_loc_key + ] = target_info["forward_primer"]["location"][ + primer_loc_key + ] elif "reverse_primer" == key: - export_row["reverse_primer_seq"] = panel_info["reverse_primer"][ + export_row["reverse_primer_seq"] = target_info["reverse_primer"][ "seq" ] - elif PMOExporter.is_primitive(value): + if "location" in target_info["reverse_primer"]: + for primer_loc_key in target_info["reverse_primer"][ + "location" + ].keys(): + export_row[ + "reverse_primer_" + primer_loc_key + ] = target_info["reverse_primer"]["location"][ + primer_loc_key + ] + elif "insert_location" == key: + for insert_key in value.keys(): + export_row["insert_" + insert_key] = value[insert_key] + elif PMOExporter._is_primitive(value): export_row[key] = value - elif PMOExporter.is_primitive_list(value): + elif PMOExporter._is_primitive_list(value): export_row[key] = separator.join(str(v) for v in value) rows.append(export_row) - return pd.DataFrame(rows) + + df = pd.DataFrame(rows) + + priority_cols = ["target_name", "forward_primer_seq", "reverse_primer_seq"] + leading = [c for c in priority_cols if c in df.columns] + rest = sorted(c for c in df.columns if c not in priority_cols) + + return df[leading + rest] + + @staticmethod + def export_pmo_header_table(pmodata, separator: str = ",") -> pd.DataFrame: + """ + Export the pmo header meta information of a PMO to a dataframe + + :param pmodata: the pmo export the information from + :param separator: the separator to use for list values + :return: a pandas dataframe of the genomes metadata + """ + rows = [] + + if "pmo_header" not in pmodata.keys(): + raise ValueError("no pmo_header found in input PMO") + export_row = {} + for key, value in pmodata["pmo_header"].items(): + if "generation_method" == key: + export_row["generation_method.program_version"] = value[ + "program_version" + ] + export_row["generation_method.program_name"] = value["program_name"] + elif PMOExporter._is_primitive(value): + export_row[key] = value + elif PMOExporter._is_primitive_list(value): + export_row[key] = separator.join(str(v) for v in value) + rows.append(export_row) + df = pd.DataFrame(rows) + priority_cols = ["pmo_version"] + leading = [c for c in priority_cols if c in df.columns] + rest = sorted(c for c in df.columns if c not in priority_cols) + + return df[leading + rest] + + @staticmethod + def export_targeted_genomes_meta_table( + pmodata, separator: str = "," + ) -> pd.DataFrame: + """ + Export the targeted genomes meta information of a PMO to a dataframe + + :param pmodata: the pmo export the information from + :param separator: the separator to use for list values + :return: a pandas dataframe of the genomes metadata + """ + rows = [] + genome_id = 0 + if "targeted_genomes" not in pmodata.keys(): + raise ValueError("no targeted_genomes found in input PMO") + for genome_info in pmodata["targeted_genomes"]: + export_row = {} + export_row["genome_id"] = genome_id + genome_id += 1 + for key, value in genome_info.items(): + if PMOExporter._is_primitive(value): + export_row[key] = value + elif PMOExporter._is_primitive_list(value): + export_row[key] = separator.join(str(v) for v in value) + rows.append(export_row) + + df = pd.DataFrame(rows) + priority_cols = ["name", "genome_version", "taxon_id", "genome_id", "url"] + leading = [c for c in priority_cols if c in df.columns] + rest = sorted(c for c in df.columns if c not in priority_cols) + + return df[leading + rest] @staticmethod - def write_bed_locs(bed_locs: list[bed_loc_tuple], fnp, add_header: bool = False): + def write_bed_locs(bed_locs: list[BedLoc], fnp, add_header: bool = False): """ - Write out a list of bed_loc_tuple to a file, will auto overwrite it - :param bed_locs: a list of bed_loc_tuple + Write out a list of BedLoc to a file, will auto overwrite it + + :param bed_locs: a list of BedLoc :param fnp: output file path, will be overwritten if it exists :param add_header: add header of #chrom,start end,name,score,strand,ref_seq,extra_info, starts with comment so tools will treat it as a comment line """ @@ -267,12 +474,12 @@ def extract_targets_insert_bed_loc( ): """ Extract out of a PMO the insert location for targets, will add ref seq if loaded into PMO + :param pmodata: the PMO to extract from :param select_target_ids: a list of target ids to select, if None will select all targets :param sort_output: whether to sort output by genomic location - :return: a list of target inserts, with named tuples with fields: chrom, start, end, name, score, strand, extra_info, ref_seq + :return: a list of target inserts, with named tuples with fields: chrom, start, end, name, score, strand, ref_seq, extra_info """ - # bed_loc = NamedTuple("bed_loc", [("chrom", str), ("start", int), ("end", int), ("name", str), ("score", float), ("strand", str), ("extra_info", str), ("ref_seq", str)]) bed_loc_out = [] if select_target_ids is None: select_target_ids = list(range(len(pmodata["target_info"]))) @@ -306,7 +513,7 @@ def extract_targets_insert_bed_loc( else tar["insert_location"]["ref_seq"] ) bed_loc_out.append( - bed_loc_tuple( + BedLoc( tar["insert_location"]["chrom"], tar["insert_location"]["start"], tar["insert_location"]["end"], @@ -327,10 +534,11 @@ def extract_panels_insert_bed_loc( ): """ Extract out of a PMO the insert location for panels, will add ref seq if loaded into PMO + :param pmodata: the PMO to extract from :param select_panel_ids: a list of panels ids to select, if None will select all panels :param sort_output: whether to sort output by genomic location - :return: a list of target inserts, with named tuples with fields: chrom, start, end, name, score, strand, extra_info, ref_seq + :return: a list of target inserts, with named tuples with fields: chrom, start, end, name, score, strand, ref_seq, extra_info """ bed_loc_out = {} if select_panel_ids is None: @@ -382,7 +590,7 @@ def extract_panels_insert_bed_loc( else tar["insert_location"]["ref_seq"] ) bed_loc_out_per_panel.append( - bed_loc_tuple( + BedLoc( tar["insert_location"]["chrom"], tar["insert_location"]["start"], tar["insert_location"]["end"], @@ -412,7 +620,7 @@ def extract_alleles_per_sample_table( default_base_col_names: list[str] = [ "library_sample_name", "target_name", - "mhap_id", + "seq", ], jsonschema_fnp=os.path.join( os.path.dirname( @@ -431,7 +639,7 @@ def extract_alleles_per_sample_table( :param additional_library_sample_info_fields: any additional fields to write from the library_samples object :param additional_microhap_fields: any additional fields to write from the microhap object :param additional_representative_info_fields: any additional fields to write from the representative_microhaplotype_sequences object - :param default_base_col_names: The default column name for the sample, locus and allele + :param default_base_col_names: The default column name for the library_sample_name, target_name and seq :param jsonschema_fnp: path to the jsonschema schema file to validate the PMO against :param validate_pmo: whether to validate the PMO with a jsonschema :return: pandas dataframe @@ -509,12 +717,14 @@ def extract_alleles_per_sample_table( # samples without this meta field will have NA if additional_representative_info_fields is not None: # Find meta fields that have at least some data + # not add seq as it's being added by default, so don't output twice additional_microhap_fields_with_data = { additional_microhap_field for additional_microhap_field in additional_representative_info_fields for target_data in pmodata["representative_microhaplotypes"]["targets"] for microhap_data in target_data["microhaplotypes"] if additional_microhap_field in microhap_data + and additional_microhap_field != "seq" } # Determine meta fields with no samples having data additional_microhap_fields_with_no_samples = ( @@ -540,11 +750,18 @@ def extract_alleles_per_sample_table( library_sample_info = pmodata["library_sample_info"] detected_microhaps = pmodata["detected_microhaplotypes"] rep_haps = pmodata["representative_microhaplotypes"]["targets"] - bioinformatics_run_names = PMOProcessor.get_bioinformatics_run_names(pmodata) + bioinformatics_run_names = None + if "bioinformatics_run_info" in pmodata: + bioinformatics_run_names = PMOProcessor.get_bioinformatics_run_names( + pmodata + ) + detected_microhaplotypes_count = 0 for bio_run_for_detected_microhaps in detected_microhaps: - bioinformatics_run_id = bio_run_for_detected_microhaps[ - "bioinformatics_run_id" - ] + bioinformatics_run_id = None + if "bioinformatics_run_id" in bio_run_for_detected_microhaps: + bioinformatics_run_id = bio_run_for_detected_microhaps[ + "bioinformatics_run_id" + ] for sample_data in bio_run_for_detected_microhaps["library_samples"]: library_sample_id = sample_data["library_sample_id"] specimen_id = library_sample_info[library_sample_id]["specimen_id"] @@ -560,16 +777,25 @@ def extract_alleles_per_sample_table( rep_hap_meta = rep_haps[target_data["mhaps_target_id"]][ "microhaplotypes" ][allele_id] + row = { - "bioinformatics_run_name": bioinformatics_run_names[ - bioinformatics_run_id - ], default_base_col_names[0]: library_meta[ "library_sample_name" ], default_base_col_names[1]: target_name, - default_base_col_names[2]: allele_id, + default_base_col_names[2]: rep_hap_meta["seq"], } + if ( + bioinformatics_run_names is not None + and bioinformatics_run_id is not None + ): + row["bioinformatics_run_name"] = bioinformatics_run_names[ + bioinformatics_run_id + ] + else: + row[ + "bioinformatics_run_name" + ] = f"detected_microhaplotypes_count_idx_{detected_microhaplotypes_count}" if additional_library_sample_info_fields is not None: for field in additional_library_sample_info_fields: row[field] = library_meta.get(field, "NA") @@ -583,6 +809,7 @@ def extract_alleles_per_sample_table( for field in additional_representative_info_fields: row[field] = rep_hap_meta.get(field, "NA") rows.append(row) + detected_microhaplotypes_count += 1 # Build and return DataFrame return pd.DataFrame(rows) @@ -594,6 +821,7 @@ def list_library_sample_names_per_specimen_name( ) -> pd.DataFrame: """ List all the library_sample_names per specimen_name + :param pmodata: the PMO :param select_specimen_ids: a list of specimen_ids to select, if None, all specimen_ids are used :param select_specimen_names: a list of specimen_names to select, if None, all specimen_names are used @@ -640,3 +868,155 @@ def list_library_sample_names_per_specimen_name( columns=["specimen_name", "library_sample_name", "library_sample_count"], ) return df + + @staticmethod + def _write_sheet(writer: pd.ExcelWriter, config: "PMOExporter.SheetConfig") -> None: + """Write a single DataFrame to an Excel sheet and autofit its columns.""" + config.df.to_excel(writer, sheet_name=config.sheet_name, index=False) + PMOExporter._autofit_columns( + writer, + config.sheet_name, + config.df, + specific_cols=config.specific_cols, + max_row_check=config.max_row_check, + ) + + @staticmethod + def _autofit_columns( + writer: pd.ExcelWriter, + sheet_name: str, + df: pd.DataFrame, + specific_cols: list[str] | None = None, + max_row_check: int | None = None, + ) -> None: + """ + Auto-adjusts column widths in an Excel worksheet based on content length. + + Args: + writer: The active ExcelWriter instance (post df.to_excel call). + sheet_name: The name of the worksheet to adjust. + df: The DataFrame that was written to the sheet. + specific_cols: Optional list of column names to adjust. If None, all columns are adjusted. + max_row_check: Optional max number of rows to sample when calculating width. + Always includes the header regardless of this value. + If None, all rows are checked. + """ + worksheet = writer.sheets[sheet_name] + columns = specific_cols if specific_cols is not None else list(df.columns) + + for column in columns: + col_idx = df.columns.get_loc(column) + 1 + sample = ( + df[column] if max_row_check is None else df[column].iloc[:max_row_check] + ) + max_length = max( + sample.astype(str).map(len).max() if len(sample) > 0 else 0, + len(str(column)), + ) + col_letter = get_column_letter(col_idx) + worksheet.column_dimensions[col_letter].width = max_length + 1 + + @dataclass + class SheetConfig: + """Configuration for writing a DataFrame to an Excel sheet.""" + + sheet_name: str + df: pd.DataFrame + max_row_check: int | None = None + specific_cols: list[str] | None = None + + @staticmethod + def _build_pmo_sheet_configs(pmo) -> "list[PMOExporter.SheetConfig]": + """ + Build the ordered list of SheetConfigs to export from a PMO object. + Optional sheets are included only if their key is present in pmo. + """ + sheet_conf = PMOExporter.SheetConfig + + sheets = [ + sheet_conf("PMO Header", PMOExporter.export_pmo_header_table(pmo)), + sheet_conf( + "Required Panel Targets", PMOExporter.export_target_info_meta_table(pmo) + ), + sheet_conf( + "Required Panel Info", PMOExporter.export_panel_info_meta_table(pmo) + ), + ] + + if "targeted_genomes" in pmo: + sheets.append( + sheet_conf( + "Optional GenomeInfo", + PMOExporter.export_targeted_genomes_meta_table(pmo), + ) + ) + + sheets.append( + sheet_conf( + "Required Microhaplotype", + # @todo add in the optional fields of the detected_microhaplotypes and representative_microhaplotypes + PMOExporter.extract_alleles_per_sample_table( + pmo, additional_microhap_fields=["reads"] + ), + max_row_check=10, + ) + ) + sheets.append( + sheet_conf( + "Optional Specimen Level", + PMOExporter.export_specimen_meta_table(pmo), + max_row_check=10, + ) + ) + + sheets.append( + sheet_conf( + "Optional LibrarySampleInfo", + PMOExporter.export_library_sample_meta_table(pmo), + max_row_check=10, + ) + ) + + if "project_info" in pmo: + sheets.append( + sheet_conf( + "Optional ProjectInfo", + PMOExporter.export_project_info_meta_table(pmo), + ) + ) + if "sequencing_info" in pmo: + sheets.append( + sheet_conf( + "Optional SequencingInfo", + PMOExporter.export_sequencing_info_meta_table(pmo), + ) + ) + if "bioinformatics_methods_info" in pmo: + sheets.append( + sheet_conf( + "Optional Bioinformatics Methods", + PMOExporter.export_bioinformatics_methods_info_meta_table(pmo), + ) + ) + if "bioinformatics_run_info" in pmo: + sheets.append( + sheet_conf( + "Optional Bioinformatics Run", + PMOExporter.export_bioinformatics_run_info_meta_table(pmo), + ) + ) + + return sheets + + @staticmethod + def export_to_excel(pmo, output_path: str) -> None: + """ + Export a PMO object to a multi-sheet Excel file. + + Args: + pmo: The PMO object to export. + output_path: The path to write the Excel file to. + """ + with pd.ExcelWriter(output_path, engine="openpyxl") as writer: + for config in PMOExporter._build_pmo_sheet_configs(pmo): + PMOExporter._write_sheet(writer, config) diff --git a/src/pmotools/pmo_engine/pmo_processor.py b/src/pmotools/pmo_engine/pmo_processor.py index 7579ac8..cef95fb 100644 --- a/src/pmotools/pmo_engine/pmo_processor.py +++ b/src/pmotools/pmo_engine/pmo_processor.py @@ -15,6 +15,7 @@ class PMOProcessor: def get_index_key_of_bioinformatics_run_names(pmodata): """ Get key of bioinformatics_run_name to index in pmodata["bioinformatics_run_info"] + :param pmodata: the PMO to get indexes from :return: a dictionary of indexes keyed by bioinformatics_run_name """ @@ -27,6 +28,7 @@ def get_index_key_of_bioinformatics_run_names(pmodata): def get_index_key_of_specimen_names(pmodata): """ Get key of specimen_name to index in pmodata["specimen_info"] + :param pmodata: the PMO to get indexes from :return: a dictionary of indexes keyed by specimen_name """ @@ -39,6 +41,7 @@ def get_index_key_of_specimen_names(pmodata): def get_index_key_of_library_sample_names(pmodata): """ Get key of library_sample_name to index in pmodata["library_sample_info"] + :param pmodata: the PMO to get indexes from :return: a dictionary of indexes keyed by library_sample_name """ @@ -51,6 +54,7 @@ def get_index_key_of_library_sample_names(pmodata): def get_index_key_of_target_names(pmodata): """ Get key of target_name to index in pmodata["target_info"] + :param pmodata: the PMO to get indexes from :return: a dictionary of indexes keyed by target_name """ @@ -63,6 +67,7 @@ def get_index_key_of_target_names(pmodata): def get_index_key_of_panel_names(pmodata): """ Get key of panel_name to index in pmodata["panel_info"] + :param pmodata: the PMO to get indexes from :return: a dictionary of indexes keyed by panel_name """ @@ -75,6 +80,7 @@ def get_index_key_of_panel_names(pmodata): def get_sorted_bioinformatics_run_names(pmodata) -> list[str]: """ Get a name sorted list of bioinformatics_run_names in pmodata["bioinformatics_run_info"] + :param pmodata: the PMO to get bioinformatics_run_names from :return: a list of all bioinformatics_run_names """ @@ -86,6 +92,7 @@ def get_sorted_bioinformatics_run_names(pmodata) -> list[str]: def get_sorted_specimen_names(pmodata) -> list[str]: """ Get a name sorted list of specimen_names in pmodata["specimen_info"] + :param pmodata: the PMO to get specimen_names from :return: a list of all specimen_names """ @@ -95,6 +102,7 @@ def get_sorted_specimen_names(pmodata) -> list[str]: def get_sorted_library_sample_names(pmodata) -> list[str]: """ Get a name sorted list of library_sample_names in pmodata["library_sample_info"] + :param pmodata: the PMO to get library_sample_names from :return: a list of all library_sample_names """ @@ -106,6 +114,7 @@ def get_sorted_library_sample_names(pmodata) -> list[str]: def get_sorted_target_names(pmodata) -> list[str]: """ Get a name sorted list of target_names in pmodata["target_info"] + :param pmodata: the PMO to get target_names from :return: a list of all target_names """ @@ -115,6 +124,7 @@ def get_sorted_target_names(pmodata) -> list[str]: def get_sorted_panel_names(pmodata) -> list[str]: """ Get a name sorted list of panel_names in pmodata["panel_info"] + :param pmodata: the PMO to get panel_names from :return: a list of all panel_names """ @@ -124,9 +134,14 @@ def get_sorted_panel_names(pmodata) -> list[str]: def get_bioinformatics_run_names(pmodata) -> list[str]: """ Get a list of bioinformatics_run_names in pmodata["bioinformatics_run_info"] in order they appear + :param pmodata: the PMO to get bioinformatics_run_names from :return: a list of all bioinformatics_run_names """ + if "bioinformatics_run_info" not in pmodata: + raise Exception( + "input PMO data does not contain bioinformatics_run_info, cannot get bioinformatics_run_names" + ) ret = [] for bioinformatics_run in pmodata["bioinformatics_run_info"]: ret.append(bioinformatics_run["bioinformatics_run_name"]) @@ -136,6 +151,7 @@ def get_bioinformatics_run_names(pmodata) -> list[str]: def get_specimen_names(pmodata) -> list[str]: """ Get a list of specimen_names in pmodata["specimen_info"] in the order they appear + :param pmodata: the PMO to get specimen_names from :return: a list of all specimen_names """ @@ -148,6 +164,7 @@ def get_specimen_names(pmodata) -> list[str]: def get_library_sample_names(pmodata) -> list[str]: """ Get a list of library_sample_names in pmodata["library_sample_info"] in the order they appear + :param pmodata: the PMO to get library_sample_names from :return: a list of all library_sample_names """ @@ -160,6 +177,7 @@ def get_library_sample_names(pmodata) -> list[str]: def get_target_names(pmodata) -> list[str]: """ Get a list of target_names in pmodata["target_info"] in the order they appear + :param pmodata: the PMO to get target_names from :return: a list of all target_names """ @@ -172,6 +190,7 @@ def get_target_names(pmodata) -> list[str]: def get_panel_names(pmodata) -> list[str]: """ Get a list of panel_names in pmodata["panel_info"] in the order they appear + :param pmodata: the PMO to get panel_names from :return: a list of all panel_names """ @@ -184,6 +203,7 @@ def get_panel_names(pmodata) -> list[str]: def get_index_key_of_target_in_representative_microhaplotypes(pmodata): """ Get key of target_name to index for the representative microhaplotypes for the target_name in pmodata["representative_microhaplotypes"] + :param pmodata: the PMO to get indexes from :return: a dictionary of indexes keyed by target_name """ @@ -204,6 +224,7 @@ def get_index_of_bioinformatics_run_names( ): """ Get index of bioinformatics_run_name in pmodata["bioinformatics_run_info"] + :param pmodata: the PMO to get indexes from :param bioinformatics_run_names: a list of bioinformatics_run_names :return: the index of bioinformatics_run_names in pmodata["bioinformatics_run_name"] returned in the same order as bioinformatics_run_names @@ -217,6 +238,7 @@ def get_index_of_bioinformatics_run_names( def get_index_of_specimen_names(pmodata, specimen_names: list[str]): """ Get index of specimen_name in pmodata["specimen_info"] + :param pmodata: the PMO to get indexes from :param specimen_names: a list of specimen_names :return: the index of specimen_names in pmodata["specimen_info"] returned in the same order as specimen_names @@ -228,6 +250,7 @@ def get_index_of_specimen_names(pmodata, specimen_names: list[str]): def get_index_of_library_sample_names(pmodata, library_sample_names: list[str]): """ Get index of library_sample_name in pmodata["library_sample_info"] + :param pmodata: the PMO to get indexes from :param library_sample_names: a list of library_sample_names :return: the index of library_sample_names in pmodata["library_sample_info"] returned in the same order as library_sample_names @@ -239,6 +262,7 @@ def get_index_of_library_sample_names(pmodata, library_sample_names: list[str]): def get_index_of_target_names(pmodata, target_names: list[str]): """ Get index of target_name in pmodata["target_info"] + :param pmodata: the PMO to get indexes from :param target_names: a list of target_names :return: the index of target_names in pmodata["target_info"] returned in the same order as target_names @@ -250,6 +274,7 @@ def get_index_of_target_names(pmodata, target_names: list[str]): def get_index_of_panel_names(pmodata, panel_names: list[str]): """ Get index of panel_name in pmodata["panel_info"] + :param pmodata: the PMO to get indexes from :param panel_names: a list of panel_names :return: the index of panel_names in pmodata["panel_info"] returned in the same order as panel_names @@ -263,6 +288,7 @@ def get_index_of_target_in_representative_microhaplotypes( ): """ Get index of target_name in pmodata["representative_microhaplotypes"]["targets"] + :param pmodata: the PMO to get indexes from :param target_names: a list of target_names :return: the index of target_names in pmodata["representative_microhaplotypes"]["targets"] returned in the same order as target_names @@ -278,6 +304,7 @@ def get_index_of_target_in_representative_microhaplotypes( def get_library_ids_for_specimen_ids(pmodata, specimen_ids: set[int]): """ get a dictionary that lists the library_ids for a specimen_id + :param pmodata: the PMO to get indexes from :param specimen_ids: a set of specimen_ids :return: a dictionary that lists the library_ids for a specimen_id @@ -305,7 +332,7 @@ def count_targets_per_library_sample( pmodata, min_reads: float = 0.0 ) -> pd.DataFrame: """ - Count the number of targets per library sample, with optional collapsing across bioinformatics runs. + Count the number of targets per library sample. :param pmodata: the loaded PMO :param min_reads: a minimum number of reads for a target in order for it to be counted @@ -314,8 +341,14 @@ def count_targets_per_library_sample( records = [] library_sample_info = pmodata["library_sample_info"] + detected_microhaplotypes_count = 0 for result in pmodata["detected_microhaplotypes"]: - run_id = result["bioinformatics_run_id"] + run_id = ( + f"detected_microhaplotypes_count_idx_{detected_microhaplotypes_count}" + ) + if "bioinformatics_run_id" in result: + run_id = result["bioinformatics_run_id"] + detected_microhaplotypes_count += 1 for sample in result["library_samples"]: sample_id = sample["library_sample_id"] sample_name = library_sample_info[sample_id]["library_sample_name"] @@ -344,16 +377,22 @@ def count_library_samples_per_target( :param pmodata: the loaded PMO :param min_reads: the minimum number of reads for a target in order for it to be counted :param collapse_across_runs: if True, sums across bioinformatics_run_id per target - :return: a pandas dataframe - - if collapse_across_runs=False: columns = [bioinformatics_run_id, target_name, sample_count] - - if collapse_across_runs=True: columns = [target_name, sample_count] + :return: a pandas dataframe: + + - if ``collapse_across_runs=False``: columns are ``bioinformatics_run_id``, ``target_name``, ``sample_count`` + - if ``collapse_across_runs=True``: columns are ``target_name``, ``sample_count`` """ records = [] microhap_targets = pmodata["representative_microhaplotypes"]["targets"] target_info = pmodata["target_info"] - + detected_microhaplotypes_count = 0 for result in pmodata["detected_microhaplotypes"]: - run_id = result["bioinformatics_run_id"] + run_id = ( + f"detected_microhaplotypes_count_idx_{detected_microhaplotypes_count}" + ) + if "bioinformatics_run_id" in result: + run_id = result["bioinformatics_run_id"] + detected_microhaplotypes_count += 1 target_sample_counts = defaultdict(int) for sample in result["library_samples"]: @@ -408,6 +447,7 @@ def count_targets_per_panel(pmodata) -> pd.DataFrame: def count_specimen_per_meta_fields(pmodata) -> pd.DataFrame: """ Get a pandas dataframe of counts of the meta fields within the specimen_info section + :param pmodata: the pmo to count from :return: a pandas dataframe of counts with the following columns: field, present_in_specimens_count, total_specimen_count """ @@ -478,7 +518,7 @@ def extract_allele_counts_freq_from_pmo( :param library_sample_names: optional list of library_sample_names to include :param target_names: optional list of target_names to include :param collapse_across_runs: whether to collapse count/freqs across bioinformatics_run_id runs - :return: DataFrame with columns: bioinformatics_run_id, target, mhap_id, count, freq, target_total + :return: DataFrame with columns: bioinformatics_run_id (if not collapsing), target_name, mhap_id, count, freq, target_total """ allele_counts = defaultdict(lambda: defaultdict(lambda: defaultdict(int))) @@ -558,6 +598,7 @@ def extract_allele_counts_freq_from_pmo( def filter_pmo_by_library_sample_ids(pmodata, library_sample_ids: set[int]): """ Extract out of a load PMO the data associated with select library_sample_ids + :param pmodata:the loaded PMO :param library_sample_ids: the library_sample_ids to extract the info for :return: a new PMO with only the data associated with the supplied library_sample_ids @@ -582,23 +623,29 @@ def filter_pmo_by_library_sample_ids(pmodata, library_sample_ids: set[int]): pmo_out = { "pmo_header": copy.deepcopy(pmodata["pmo_header"]), "panel_info": copy.deepcopy(pmodata["panel_info"]), - "sequencing_info": copy.deepcopy(pmodata["sequencing_info"]), "target_info": copy.deepcopy(pmodata["target_info"]), - "targeted_genomes": copy.deepcopy(pmodata["targeted_genomes"]), "representative_microhaplotypes": copy.deepcopy( pmodata["representative_microhaplotypes"] ), - "bioinformatics_methods_info": copy.deepcopy( - pmodata["bioinformatics_methods_info"] - ), - "bioinformatics_run_info": copy.deepcopy( - pmodata["bioinformatics_run_info"] - ), "specimen_info": [], "library_sample_info": [], - "project_info": copy.deepcopy(pmodata["project_info"]), "detected_microhaplotypes": [], } + if "sequencing_info" in pmodata: + pmo_out["sequencing_info"] = copy.deepcopy(pmodata["sequencing_info"]) + if "project_info" in pmodata: + pmo_out["project_info"] = copy.deepcopy(pmodata["project_info"]) + if "bioinformatics_methods_info" in pmodata: + pmo_out["bioinformatics_methods_info"] = copy.deepcopy( + pmodata["bioinformatics_methods_info"] + ) + if "bioinformatics_run_info" in pmodata: + pmo_out["bioinformatics_run_info"] = copy.deepcopy( + pmodata["bioinformatics_run_info"] + ) + if "targeted_genomes" in pmodata: + pmo_out["targeted_genomes"] = copy.deepcopy(pmodata["targeted_genomes"]) + if "read_counts_by_stage" in pmodata: pmo_out["read_counts_by_stage"] = [] # need to update read_counts_by_stage, library_sample_info, specimen_info, detected_microhaplotypes @@ -636,11 +683,12 @@ def filter_pmo_by_library_sample_ids(pmodata, library_sample_ids: set[int]): # detected_microhaplotypes for detected_microhaplotypes in pmodata["detected_microhaplotypes"]: new_detected_microhaplotypes = { - "bioinformatics_run_id": detected_microhaplotypes[ - "bioinformatics_run_id" - ], "library_samples": [], } + if "bioinformatics_run_id" in detected_microhaplotypes: + new_detected_microhaplotypes[ + "bioinformatics_run_id" + ] = detected_microhaplotypes["bioinformatics_run_id"] for sample in detected_microhaplotypes["library_samples"]: if sample["library_sample_id"] in library_sample_ids: new_detected_microhaplotypes["library_samples"].append( @@ -657,9 +705,12 @@ def filter_pmo_by_library_sample_ids(pmodata, library_sample_ids: set[int]): if "read_counts_by_stage" in pmodata: for read_count in pmodata["read_counts_by_stage"]: new_read_count = { - "bioinformatics_run_id": read_count["bioinformatics_run_id"], "read_counts_by_library_sample_by_stage": [], } + if "bioinformatics_run_id" in read_count: + new_read_count["bioinformatics_run_id"] = read_count[ + "bioinformatics_run_id" + ] for sample in read_count["read_counts_by_library_sample_by_stage"]: if sample["library_sample_id"] in library_sample_ids: new_read_count["read_counts_by_library_sample_by_stage"].append( @@ -680,6 +731,7 @@ def filter_pmo_by_library_sample_ids(pmodata, library_sample_ids: set[int]): def filter_pmo_by_library_sample_names(pmodata, library_sample_names: set[str]): """ Filters pmodata by library sample names + :param pmodata: the pmodata object :param library_sample_names: set of library sample names, will be converted into indexes to extract out :return: filtered pmodata object containing only the indexes @@ -696,6 +748,7 @@ def filter_pmo_by_library_sample_names(pmodata, library_sample_names: set[str]): def filter_pmo_by_specimen_ids(pmodata, specimen_ids: set[int]): """ Extract out of a load PMO the data associated with select specimen_ids + :param pmodata:the loaded PMO :param specimen_ids: the specimen_ids to extract the info for :return: a new PMO with only the data associated with the supplied specimen_ids @@ -725,7 +778,8 @@ def filter_pmo_by_specimen_ids(pmodata, specimen_ids: set[int]): @staticmethod def filter_pmo_by_specimen_names(pmodata, specimen_names: set[str]): """ - Extract out of a load PMO the data associated with select specimen_ids + Extract out of a loaded PMO the data associated with select specimen_names + :param pmodata:the loaded PMO :param specimen_names: the specimen_names to extract the info for :return: a new PMO with only the data associated with the supplied specimen_names @@ -740,6 +794,7 @@ def filter_pmo_by_specimen_names(pmodata, specimen_names: set[str]): def filter_pmo_by_target_ids(pmodata, target_ids: set[int]): """ Extract out data from the PMO for only select target IDs + :param pmodata: the pmo to extract data from :param target_ids: the target_ids to extract :return: a new pmo with the data for only the targets supplied @@ -767,26 +822,31 @@ def filter_pmo_by_target_ids(pmodata, target_ids: set[int]): pmo_out = { "pmo_header": copy.deepcopy(pmodata["pmo_header"]), - "sequencing_info": copy.deepcopy(pmodata["sequencing_info"]), "specimen_info": copy.deepcopy(pmodata["specimen_info"]), - "project_info": copy.deepcopy(pmodata["project_info"]), "library_sample_info": copy.deepcopy(pmodata["library_sample_info"]), - "bioinformatics_methods_info": copy.deepcopy( - pmodata["bioinformatics_methods_info"] - ), - "bioinformatics_run_info": copy.deepcopy( - pmodata["bioinformatics_run_info"] - ), - "targeted_genomes": copy.deepcopy(pmodata["targeted_genomes"]), "target_info": [], } + if "sequencing_info" in pmodata: + pmo_out["sequencing_info"] = copy.deepcopy(pmodata["sequencing_info"]) + if "project_info" in pmodata: + pmo_out["project_info"] = copy.deepcopy(pmodata["project_info"]) + if "bioinformatics_methods_info" in pmodata: + pmo_out["bioinformatics_methods_info"] = copy.deepcopy( + pmodata["bioinformatics_methods_info"] + ) + if "bioinformatics_run_info" in pmodata: + pmo_out["bioinformatics_run_info"] = copy.deepcopy( + pmodata["bioinformatics_run_info"] + ) + if "targeted_genomes" in pmodata: + pmo_out["targeted_genomes"] = copy.deepcopy(pmodata["targeted_genomes"]) + # function will update target_info, panel_info, representative_microhaplotypes, detected_microhaplotypes, read_counts_by_stage based # on target_ids selecting for first update representative_microhaplotypes, detected_microhaplotypes, read_counts_by_stage # then update target_info, panel_info # then update the target_ids # target_info - pmo_out["target_info"] = [] target_info_index_key = {} for target_info_id, target_info in enumerate(pmodata["target_info"]): if target_info_id in target_ids: @@ -810,6 +870,8 @@ def filter_pmo_by_target_ids(pmodata, target_ids: set[int]): ) if len(new_reaction["panel_targets"]) > 0: new_panel_info["reactions"].append(new_reaction) + pmo_out["panel_info"].append(new_panel_info) + # representative_microhaplotypes pmo_out["representative_microhaplotypes"] = {"targets": []} # key=old_mhaps_target_id, value = new_mhaps_target_id @@ -832,11 +894,12 @@ def filter_pmo_by_target_ids(pmodata, target_ids: set[int]): pmo_out["detected_microhaplotypes"] = [] for detected_microhaplotypes in pmodata["detected_microhaplotypes"]: new_detected_microhaplotypes = { - "bioinformatics_run_id": detected_microhaplotypes[ - "bioinformatics_run_id" - ], "library_samples": [], } + if "bioinformatics_run_id" in detected_microhaplotypes: + new_detected_microhaplotypes[ + "bioinformatics_run_id" + ] = detected_microhaplotypes["bioinformatics_run_id"] for sample in detected_microhaplotypes["library_samples"]: new_sample = { "library_sample_id": sample["library_sample_id"], @@ -857,11 +920,12 @@ def filter_pmo_by_target_ids(pmodata, target_ids: set[int]): pmo_out["read_counts_by_stage"] = [] for read_counts_by_bioid in pmodata["read_counts_by_stage"]: new_read_counts_by_bioid = { - "bioinformatics_run_id": read_counts_by_bioid[ - "bioinformatics_run_id" - ], "read_counts_by_library_sample_by_stage": [], } + if "bioinformatics_run_id" in read_counts_by_bioid: + new_read_counts_by_bioid[ + "bioinformatics_run_id" + ] = read_counts_by_bioid["bioinformatics_run_id"] for sample in read_counts_by_bioid[ "read_counts_by_library_sample_by_stage" ]: @@ -889,7 +953,8 @@ def filter_pmo_by_target_ids(pmodata, target_ids: set[int]): @staticmethod def filter_pmo_by_target_names(pmodata, target_names: set[str]): """ - Extract out data from the PMO for only select target IDs + Extract out data from the PMO for only select target names + :param pmodata: the pmo to extract data from :param target_names: the target_names to extract :return: a new pmo with the data for only the targets supplied @@ -904,9 +969,10 @@ def filter_pmo_by_target_names(pmodata, target_names: set[str]): def extract_from_pmo_samples_with_meta_groupings(pmodata, meta_fields_values: str): """ Extract out of a PMO the data associated with specimens that belong to specific meta data groupings + :param pmodata: the PMO to extract from :param meta_fields_values: Meta Fields to include, should either be a table with columns field, values (comma separated values) (and optionally group) or supplied command line as field1=value1,value2,value3:field2=value1,value2;field1=value5,value6, where each group is separated by a semicolon - :return: a pmodata with the input meta + :return: a tuple of (filtered PMO, group counts dataframe) """ selected_meta_groups = {} # parse meta values @@ -996,6 +1062,7 @@ def extract_from_pmo_samples_with_meta_groupings(pmodata, meta_fields_values: st def extract_from_pmo_with_read_filter(pmodata, read_filter: float): """ Extract out data from the PMO with inconclusive read filter + :param pmodata: the pmo to extract data from :param read_filter: the read filter to use, inconclusive filter :return: a new pmodata with the data only with detected microhaplotypes above this read filter diff --git a/src/pmotools/pmo_engine/pmo_reader.py b/src/pmotools/pmo_engine/pmo_reader.py index f31e9e0..91a6e46 100644 --- a/src/pmotools/pmo_engine/pmo_reader.py +++ b/src/pmotools/pmo_engine/pmo_reader.py @@ -18,6 +18,7 @@ class PMOReader: def read_in_pmo(fnp: str | os.PathLike[str]): """ Read in a PMO file, can either be compressed(.gz) or uncompressed + :param fnp: the file name path of the PMO file to read in :return: a PMO like object """ @@ -36,6 +37,7 @@ def read_in_pmo(fnp: str | os.PathLike[str]): def read_in_pmos(fnps: list[str] | list[os.PathLike[str]]): """ Read in a PMO file, can either be compressed(.gz) or uncompressed + :param fnps: the file name path of the PMO file to read in :return: a list of PMO like object """ @@ -48,6 +50,7 @@ def read_in_pmos(fnps: list[str] | list[os.PathLike[str]]): def combine_multiple_pmos(pmos: list[dict]): """ Combine multiple PMOs into one pmo + :param pmos: a list of PMO objects :return: a combined PMO """ @@ -71,28 +74,34 @@ def combine_multiple_pmos(pmos: list[dict]): }, } - # combine targeted_genomes fields - pmo_out["targeted_genomes"] = copy.deepcopy(pmos[0]["targeted_genomes"]) + # combine targeted_genomes fields if present # key: genome name + _ + genome_version, val: index targeted_genomes_out_index_key = {} - for genome_info_index, genome in enumerate(pmos[0]["targeted_genomes"]): - targeted_genomes_out_index_key[ - genome["name"] + "_" + genome["genome_version"] - ] = genome_info_index + if "targeted_genomes" in pmos[0]: + pmo_out["targeted_genomes"] = copy.deepcopy(pmos[0]["targeted_genomes"]) + for genome_info_index, genome in enumerate(pmos[0]["targeted_genomes"]): + targeted_genomes_out_index_key[ + genome["name"] + "_" + genome["genome_version"] + ] = genome_info_index # key1 pmo_index, key2 old_index, val new_index targeted_genomes_old_index_key = defaultdict(dict) for pmo_index, pmo in enumerate(pmos[1:], start=1): - for genome_index, genome in enumerate(pmo["targeted_genomes"]): - genome_id = genome["name"] + "_" + genome["genome_version"] - if genome_id in targeted_genomes_out_index_key: - targeted_genomes_old_index_key[pmo_index][ - genome_index - ] = targeted_genomes_out_index_key[genome_id] - else: - new_index = len(pmo_out["targeted_genomes"]) - pmo_out["targeted_genomes"].append(copy.deepcopy(genome)) - targeted_genomes_out_index_key[genome_id] = new_index - targeted_genomes_old_index_key[pmo_index][genome_index] = new_index + if "targeted_genomes" in pmo: + for genome_index, genome in enumerate(pmo["targeted_genomes"]): + genome_id = genome["name"] + "_" + genome["genome_version"] + if genome_id in targeted_genomes_out_index_key: + targeted_genomes_old_index_key[pmo_index][ + genome_index + ] = targeted_genomes_out_index_key[genome_id] + else: + if "targeted_genomes" not in pmo_out: + pmo_out["targeted_genomes"] = [] + new_index = len(pmo_out["targeted_genomes"]) + pmo_out["targeted_genomes"].append(copy.deepcopy(genome)) + targeted_genomes_out_index_key[genome_id] = new_index + targeted_genomes_old_index_key[pmo_index][ + genome_index + ] = new_index # combine target_info fields pmo_out["target_info"] = copy.deepcopy(pmos[0]["target_info"]) @@ -112,7 +121,10 @@ def combine_multiple_pmos(pmos: list[dict]): new_index = len(pmo_out["target_info"]) target_copy = copy.deepcopy(target) # update genome_id if adding new target - if len(pmo_out["targeted_genomes"]) > 1: + if ( + "targeted_genomes" in pmo_out + and len(pmo_out["targeted_genomes"]) > 1 + ): if "insert_location" in target_copy: # update genome_id target_copy["insert_location"][ @@ -173,13 +185,18 @@ def combine_multiple_pmos(pmos: list[dict]): # just concatenate sequencing infos. Only way this could have happened is if files were split into different # pmos and then rejoined but even if we concatenate sequencing_info of the same, they will still properly # have the right info per library - pmo_out["sequencing_info"] = copy.deepcopy(pmos[0]["sequencing_info"]) # key1 pmo_index, key2 old_index, val new_index sequencing_info_old_index_key = defaultdict(dict) + if "sequencing_info" in pmos[0]: + pmo_out["sequencing_info"] = copy.deepcopy(pmos[0]["sequencing_info"]) for pmo_index, pmo in enumerate(pmos[1:], start=1): + if "sequencing_info" not in pmo: + continue for sequencing_info_index, sequencing_info in enumerate( pmo["sequencing_info"] ): + if "sequencing_info" not in pmo_out: + pmo_out["sequencing_info"] = [] new_index = len(pmo_out["sequencing_info"]) pmo_out["sequencing_info"].append(copy.deepcopy(sequencing_info)) sequencing_info_old_index_key[pmo_index][ @@ -188,33 +205,39 @@ def combine_multiple_pmos(pmos: list[dict]): # combine project_info # could be possible to be combining PMOs across one project so check if project already exists - pmo_out["project_info"] = copy.deepcopy(pmos[0]["project_info"]) project_info_old_index_key = defaultdict(dict) + if "project_info" in pmos[0]: + pmo_out["project_info"] = copy.deepcopy(pmos[0]["project_info"]) for pmo_index, pmo in enumerate(pmos[1:], start=1): + if "project_info" not in pmo: + continue for project_info_index, project_info in enumerate(pmo["project_info"]): - # check to see if project already exists + # check to see if the project already exists found_project_info = False - for current_project_id, current_project_info in enumerate( - pmo_out["project_info"] - ): - if ( - current_project_info["project_name"] - == project_info["project_name"] + if "project_info" in pmo_out: + for current_project_id, current_project_info in enumerate( + pmo_out["project_info"] ): if ( - current_project_info["project_description"] - != project_info["project_description"] + current_project_info["project_name"] + == project_info["project_name"] ): - raise Exception( - "Project description mismatch for project_name: " - + project_info["project_name"] - ) - else: - project_info_old_index_key[pmo_index][ - project_info_index - ] = current_project_id - found_project_info = True + if ( + current_project_info["project_description"] + != project_info["project_description"] + ): + raise Exception( + "Project description mismatch for project_name: " + + project_info["project_name"] + ) + else: + project_info_old_index_key[pmo_index][ + project_info_index + ] = current_project_id + found_project_info = True if not found_project_info: + if "project_info" not in pmo_out: + pmo_out["project_info"] = [] new_index = len(pmo_out["project_info"]) pmo_out["project_info"].append(copy.deepcopy(project_info)) project_info_old_index_key[pmo_index][ @@ -262,11 +285,13 @@ def combine_multiple_pmos(pmos: list[dict]): ) specimen_names.append(specimen_info["specimen_name"]) new_index = len(pmo_out["specimen_info"]) - # update project_id + specimen_info_copy = copy.deepcopy(specimen_info) - specimen_info_copy["project_id"] = project_info_old_index_key[ - pmo_index - ][specimen_info_copy["project_id"]] + # update project_id + if "project_id" in specimen_info_copy: + specimen_info_copy["project_id"] = project_info_old_index_key[ + pmo_index + ][specimen_info_copy["project_id"]] pmo_out["specimen_info"].append(specimen_info_copy) specimen_info_old_index_key[pmo_index][ specimen_info_index @@ -303,11 +328,12 @@ def combine_multiple_pmos(pmos: list[dict]): library_sample_info_copy["panel_id"] = panel_info_old_index_key[ pmo_index ][library_sample_info_copy["panel_id"]] - library_sample_info_copy[ - "sequencing_info_id" - ] = sequencing_info_old_index_key[pmo_index][ - library_sample_info_copy["sequencing_info_id"] - ] + if "sequencing_info_id" in library_sample_info_copy: + library_sample_info_copy[ + "sequencing_info_id" + ] = sequencing_info_old_index_key[pmo_index][ + library_sample_info_copy["sequencing_info_id"] + ] # append to the out library_sample_info_copy after getting new index new_index = len(pmo_out["library_sample_info"]) pmo_out["library_sample_info"].append(library_sample_info_copy) @@ -331,16 +357,21 @@ def combine_multiple_pmos(pmos: list[dict]): # update bioinformatics_methods_info # the different bioinformatics_methods_info might be the same but there's no easy way to perfectly match up right now - pmo_out["bioinformatics_methods_info"] = copy.deepcopy( - pmos[0]["bioinformatics_methods_info"] - ) + if "bioinformatics_methods_info" in pmos[0]: + pmo_out["bioinformatics_methods_info"] = copy.deepcopy( + pmos[0]["bioinformatics_methods_info"] + ) # key1 pmo_index, key2 old_index, val new_index bioinformatics_methods_info_old_index_key = defaultdict(dict) for pmo_index, pmo in enumerate(pmos[1:], start=1): + if "bioinformatics_methods_info" not in pmo: + continue for ( bioinformatics_methods_info_index, bioinformatics_methods_info, ) in enumerate(pmo["bioinformatics_methods_info"]): + if "bioinformatics_methods_info" not in pmo_out: + pmo_out["bioinformatics_methods_info"] = [] new_index = len(pmo_out["bioinformatics_methods_info"]) pmo_out["bioinformatics_methods_info"].append( copy.deepcopy(bioinformatics_methods_info) @@ -350,12 +381,15 @@ def combine_multiple_pmos(pmos: list[dict]): ] = new_index # update bioinformatics_run_info - pmo_out["bioinformatics_run_info"] = copy.deepcopy( - pmos[0]["bioinformatics_run_info"] - ) + if "bioinformatics_run_info" in pmos[0]: + pmo_out["bioinformatics_run_info"] = copy.deepcopy( + pmos[0]["bioinformatics_run_info"] + ) # key1 pmo_index, key2 old_index, val new_index bioinformatics_run_info_old_index_key = defaultdict(dict) for pmo_index, pmo in enumerate(pmos[1:], start=1): + if "bioinformatics_run_info" not in pmo: + continue for bioinformatics_run_info_index, bioinformatics_run_info in enumerate( pmo["bioinformatics_run_info"] ): @@ -365,6 +399,8 @@ def combine_multiple_pmos(pmos: list[dict]): ] = bioinformatics_methods_info_old_index_key[pmo_index][ bioinformatics_run_info_index ] + if "bioinformatics_run_info" not in pmo_out: + pmo_out["bioinformatics_run_info"] = [] new_index = len(pmo_out["bioinformatics_run_info"]) pmo_out["bioinformatics_run_info"].append(bioinformatics_run_info_copy) bioinformatics_run_info_old_index_key[pmo_index][ @@ -392,6 +428,7 @@ def combine_multiple_pmos(pmos: list[dict]): representative_microhaplotypes_hmap_for_target_index_old_index_key = ( defaultdict(lambda: defaultdict(dict)) ) + # @todo need to check for mhap_location and update the genome_id if not the same genome for pmo_index, pmo in enumerate(pmos[1:], start=1): for ( representative_microhaplotypes_index, @@ -416,7 +453,6 @@ def combine_multiple_pmos(pmos: list[dict]): ): found = False # print(pmo_out["representative_microhaplotypes"]["targets"][representative_microhaplotypes_out_index_key[pmo["target_info"][representative_microhaplotypes["target_id"]]["target_name"]]]["microhaplotypes"]) - # print("\n\n\n") for ( already_have_microhap_index, already_have_microhap, @@ -430,7 +466,6 @@ def combine_multiple_pmos(pmos: list[dict]): ]["microhaplotypes"] ): # print(already_have_microhap) - # print("\n") if adding_microhap["seq"] == already_have_microhap["seq"]: representative_microhaplotypes_hmap_for_target_index_old_index_key[ pmo_index @@ -512,11 +547,12 @@ def combine_multiple_pmos(pmos: list[dict]): ] = library_sample_info_old_index_key[pmo_index][ library_sample["library_sample_id"] ] - detected_microhaplotypes_copy[ - "bioinformatics_run_id" - ] = bioinformatics_run_info_old_index_key[pmo_index][ - detected_microhaplotypes_copy["bioinformatics_run_id"] - ] + if "bioinformatics_run_id" in detected_microhaplotypes_copy: + detected_microhaplotypes_copy[ + "bioinformatics_run_id" + ] = bioinformatics_run_info_old_index_key[pmo_index][ + detected_microhaplotypes_copy["bioinformatics_run_id"] + ] # append after the indexes have been updated pmo_out["detected_microhaplotypes"].append( detected_microhaplotypes_copy @@ -562,10 +598,11 @@ def combine_multiple_pmos(pmos: list[dict]): ] = library_sample_info_old_index_key[pmo_index][ read_counts_by_library_sample_by_stage["library_sample_id"] ] - read_counts_by_stage_copy[ - "bioinformatics_run_id" - ] = bioinformatics_run_info_old_index_key[pmo_index][ - read_counts_by_stage_copy["bioinformatics_run_id"] - ] + if "bioinformatics_run_id" in read_counts_by_stage_copy: + read_counts_by_stage_copy[ + "bioinformatics_run_id" + ] = bioinformatics_run_info_old_index_key[pmo_index][ + read_counts_by_stage_copy["bioinformatics_run_id"] + ] pmo_out["read_counts_by_stage"].append(read_counts_by_stage_copy) return pmo_out diff --git a/src/pmotools/pmo_engine/pmo_writer.py b/src/pmotools/pmo_engine/pmo_writer.py index ea21743..c859020 100644 --- a/src/pmotools/pmo_engine/pmo_writer.py +++ b/src/pmotools/pmo_engine/pmo_writer.py @@ -18,6 +18,7 @@ class PMOWriter: def write_out_pmo(pmo, fnp: str | os.PathLike[str], overwrite: bool = False): """ Write out a PMO, will write to zip file if the output fnp name ends with .gz + :param pmo: the PMO to write :param fnp: the output filename path :param overwrite: whether to overwrite output file if it exists diff --git a/src/pmotools/schemas/portable_microhaplotype_object_v1.1.0.schema.json b/src/pmotools/schemas/portable_microhaplotype_object_v1.1.0.schema.json new file mode 100644 index 0000000..5470df9 --- /dev/null +++ b/src/pmotools/schemas/portable_microhaplotype_object_v1.1.0.schema.json @@ -0,0 +1,1831 @@ +{ + "$defs": { + "BioMethod": { + "additionalProperties": true, + "description": "bioinformatics methodology description with info on program, version, and arguments different from the default", + "properties": { + "additional_argument": { + "description": "any additional arguments that differ from the default arguments", + "items": { + "pattern": "^[A-z-._0-9{}\\(\\),\\/\\ ]+$", + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "program": { + "description": "name of the program used for this portion of the pipeline", + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + }, + "program_description": { + "description": "a short description of what this method does", + "pattern": "^[A-z-._0-9\\(\\),\\/\\ ]+$", + "type": [ + "string", + "null" + ] + }, + "program_url": { + "description": "a url pointing to code base of a program, e.g. a github link", + "pattern": "^[A-z-._0-9\\(\\),\\/\\ ]+$", + "type": [ + "string", + "null" + ] + }, + "program_version": { + "description": "the version of program, should be in the format of v[MAJOR].[MINOR].[PATCH]", + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + } + }, + "required": [ + "program_version", + "program" + ], + "title": "BioMethod", + "type": "object" + }, + "BioinformaticsMethodInfo": { + "additionalProperties": true, + "description": "the targeted amplicon bioinformatics methods used to generate the microhaplotype data in this PMO", + "properties": { + "methods": { + "description": "methodology used to generate the microhaplotype data stored in this PMO, e.g. demultiplexing method, denosing method, or a pipeline method that ties all th steps together", + "items": { + "$ref": "#/$defs/BioMethod" + }, + "type": "array" + } + }, + "required": [ + "methods" + ], + "title": "BioinformaticsMethodInfo", + "type": "object" + }, + "BioinformaticsRunInfo": { + "additionalProperties": true, + "description": "Information about the pipeline run that generated microhaplotype_detected and reads_by_stage", + "properties": { + "bioinformatics_methods_id": { + "description": "the index into the bioinformatics_methods_info list", + "minimum": 0, + "pattern": "^[0-9]+$", + "type": "integer" + }, + "bioinformatics_run_name": { + "description": "a name to for this run, needs to be unique to each run ", + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + }, + "run_date": { + "description": "the date when the run was done, should be YYYY-MM-DD", + "pattern": "\\d{4}-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12][0-9]|3[01]))?", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "bioinformatics_methods_id", + "bioinformatics_run_name" + ], + "title": "BioinformaticsRunInfo", + "type": "object" + }, + "DetectedMicrohaplotypes": { + "additionalProperties": true, + "description": "the microhaplotypes detected in a targeted amplicon analysis", + "properties": { + "bioinformatics_run_id": { + "description": "the index into bioinformatics_run_info list", + "minimum": 0, + "pattern": "^[0-9]+$", + "type": [ + "integer", + "null" + ] + }, + "library_samples": { + "description": "a list of the microhaplotypes detected for all samples with a list for each target ", + "items": { + "$ref": "#/$defs/DetectedMicrohaplotypesForSample" + }, + "type": "array" + } + }, + "required": [ + "library_samples" + ], + "title": "DetectedMicrohaplotypes", + "type": "object" + }, + "DetectedMicrohaplotypesForSample": { + "additionalProperties": true, + "description": "Microhaplotypes detected for a sample for all targets", + "properties": { + "library_sample_id": { + "description": "the index into the library_sample_info list", + "minimum": 0, + "pattern": "^[0-9]+$", + "type": "integer" + }, + "target_results": { + "description": "a list of the microhaplotypes detected for a list of targets", + "items": { + "$ref": "#/$defs/DetectedMicrohaplotypesForTarget" + }, + "type": "array" + } + }, + "required": [ + "library_sample_id", + "target_results" + ], + "title": "DetectedMicrohaplotypesForSample", + "type": "object" + }, + "DetectedMicrohaplotypesForTarget": { + "additionalProperties": true, + "description": "Microhaplotypes detected for a specific target", + "properties": { + "mhaps": { + "description": "a list of the microhaplotypes detected for this target", + "items": { + "$ref": "#/$defs/MicrohaplotypeForTarget" + }, + "type": "array" + }, + "mhaps_target_id": { + "description": "the index for a target in the representative_microhaplotypes list", + "minimum": 0, + "pattern": "^[0-9]+$", + "type": "integer" + } + }, + "required": [ + "mhaps_target_id", + "mhaps" + ], + "title": "DetectedMicrohaplotypesForTarget", + "type": "object" + }, + "GenomeInfo": { + "additionalProperties": true, + "description": "information on a genome", + "properties": { + "chromosomes": { + "description": "a list of the chromosomes/contigs found within this genome", + "items": { + "pattern": "^[A-z-._0-9]+$", + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "genome_version": { + "description": "the genome version", + "pattern": "^[A-z-._0-9]+$", + "type": "string" + }, + "gff_url": { + "description": "a link to the where this genome's annotation file could be downloaded", + "pattern": "^(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*$", + "type": [ + "string", + "null" + ] + }, + "name": { + "description": "name of the genome", + "pattern": "^[A-z-._0-9]+$", + "type": "string" + }, + "taxon_id": { + "description": "the NCBI taxonomy number, can be a list of values if it's a genome file that has been created by combining gnomes from different species", + "items": { + "minimum": 0, + "pattern": "^[0-9]$", + "type": "integer" + }, + "type": "array" + }, + "url": { + "description": "a link to the where this genome file could be downloaded", + "pattern": "^(?:NA|(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*)$", + "type": "string" + } + }, + "required": [ + "name", + "genome_version", + "taxon_id", + "url" + ], + "title": "GenomeInfo", + "type": "object" + }, + "GenomicLocation": { + "additionalProperties": true, + "description": "information on the genomic location of specific sequence", + "properties": { + "alt_seq": { + "description": "a possible alternative sequence of this genomic location", + "pattern": "^[A-z-]+$", + "type": [ + "string", + "null" + ] + }, + "chrom": { + "description": "the chromosome name", + "pattern": "^[A-z-._0-9]+$", + "type": "string" + }, + "end": { + "description": "the end of the location, 0-based positioning", + "minimum": 0, + "pattern": "^[0-9]+$", + "type": "integer" + }, + "genome_id": { + "description": "the index to the genome in the targeted_genomes list that this location refers to", + "minimum": 0, + "pattern": "^[0-9]+$", + "type": "integer" + }, + "ref_seq": { + "description": "the reference sequence of this genomic location", + "pattern": "^[A-z-]+$", + "type": [ + "string", + "null" + ] + }, + "start": { + "description": "the start of the location, 0-based positioning", + "minimum": 0, + "pattern": "^[0-9]+$", + "type": "integer" + }, + "strand": { + "description": "which strand the location is, either + for plus strand or - for negative strand", + "pattern": "[+-]", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "genome_id", + "chrom", + "start", + "end" + ], + "title": "GenomicLocation", + "type": "object" + }, + "LibrarySampleInfo": { + "additionalProperties": true, + "description": "Information about a specific amplification and sequencing of a specimen", + "properties": { + "alternate_identifiers": { + "description": "a list of alternative names", + "items": { + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "experiment_accession": { + "description": "ERA/SRA experiment accession number for the sample if it was submitted", + "pattern": "^[A-z-._0-9]+$", + "type": [ + "string", + "null" + ] + }, + "fastqs_loc": { + "description": "the location (url or filename path) of the fastqs for a library run", + "pattern": "^[A-z-.;,_0-9\\(\\),\\/\\ ]+$", + "type": [ + "string", + "null" + ] + }, + "library_prep_plate_info": { + "anyOf": [ + { + "$ref": "#/$defs/PlateInfo" + }, + { + "type": "null" + } + ], + "description": "plate location of where library was prepared for sequencing " + }, + "library_sample_name": { + "description": "a unique identifier for this sequencing/amplification run", + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + }, + "panel_id": { + "description": "the index into the panel_info list", + "minimum": 0, + "pattern": "^[0-9]+$", + "type": "integer" + }, + "qpcr_parasite_density_info": { + "description": "qpcr parasite density measurement for this extracted sample", + "items": { + "$ref": "#/$defs/ParasiteDensity" + }, + "type": [ + "array", + "null" + ] + }, + "run_accession": { + "description": "ERA/SRA run accession number for the sample if it was submitted", + "pattern": "^[A-z-._0-9]+$", + "type": [ + "string", + "null" + ] + }, + "sequencing_info_id": { + "description": "the index into the sequencing_info list", + "minimum": 0, + "pattern": "^[0-9]+$", + "type": [ + "integer", + "null" + ] + }, + "specimen_id": { + "description": "the index into the specimen_info list", + "minimum": 0, + "pattern": "^[0-9]+$", + "type": "integer" + } + }, + "required": [ + "specimen_id", + "panel_id", + "library_sample_name" + ], + "title": "LibrarySampleInfo", + "type": "object" + }, + "MarkerOfInterest": { + "additionalProperties": true, + "description": "A specific genomic location of interest, e.g. drug resistance, or other phenotypical marker", + "properties": { + "associations": { + "description": "a list of associations with this marker, e.g. SP resistance, etc", + "items": { + "pattern": "^[A-z-._0-9]+$", + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "marker_location": { + "$ref": "#/$defs/GenomicLocation", + "description": "the genomic location" + } + }, + "required": [ + "marker_location" + ], + "title": "MarkerOfInterest", + "type": "object" + }, + "MaskingInfo": { + "additionalProperties": true, + "description": "information about a subsegment of the sequence that should be masked", + "properties": { + "masking_generation_description": { + "description": "a description of how the masking information was generated ", + "pattern": "^[A-z-._0-9\\(\\),\\/\\ ]+$", + "type": [ + "string", + "null" + ] + }, + "replacement_size": { + "description": "the size of replacement mask", + "minimum": 0, + "type": "integer" + }, + "seq_segment_size": { + "description": "the size of the masking", + "minimum": 0, + "type": "integer" + }, + "seq_start": { + "description": "the start of the masking", + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "seq_start", + "seq_segment_size", + "replacement_size" + ], + "title": "MaskingInfo", + "type": "object" + }, + "MicrohaplotypeForTarget": { + "additionalProperties": true, + "description": "Microhaplotype detected for a specific target", + "properties": { + "mhap_id": { + "description": "the index for a microhaplotype for a target in the representative_microhaplotypes list, e.g. representative_microhaplotypes[mhaps_target_id][mhap_id]", + "minimum": 0, + "pattern": "^[0-9]+$", + "type": "integer" + }, + "reads": { + "description": "the read count for this microhaplotype", + "minimum": 0, + "type": "integer" + }, + "umis": { + "description": "the unique molecular identifier (umi) count for this microhaplotype", + "minimum": 0, + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "mhap_id", + "reads" + ], + "title": "MicrohaplotypeForTarget", + "type": "object" + }, + "PanelInfo": { + "additionalProperties": true, + "description": "information on a panel of targeted amplicon primer pairs", + "properties": { + "panel_name": { + "description": "a name for the panel", + "pattern": "^[A-z-._0-9]+$", + "type": "string" + }, + "reactions": { + "description": "a list of 1 or more reactions that this panel contains, each reactions list the targets that were amplified in that reaction, e.g. pool1, pool2", + "items": { + "$ref": "#/$defs/ReactionInfo" + }, + "type": "array" + } + }, + "required": [ + "reactions", + "panel_name" + ], + "title": "PanelInfo", + "type": "object" + }, + "ParasiteDensity": { + "additionalProperties": true, + "description": "method and value of determined parasite density", + "properties": { + "date_measured": { + "description": "the date the qpcr was performed, can be YYYY, YYYY-MM, or YYYY-MM-DD", + "pattern": "(?:\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12][0-9]|3[01]))?)?|NA)", + "type": [ + "string", + "null" + ] + }, + "density_method_comments": { + "description": "additional comments about how the density was performed", + "pattern": "^[A-z-._0-9\\(\\),\\/\\ ]+$", + "type": [ + "string", + "null" + ] + }, + "parasite_density": { + "description": "the density in microliters", + "minimum": 0, + "pattern": "^[-+]?\\\\d*\\\\.?\\\\d+(?:[eE][-+]?\\\\d+)?$", + "type": "number" + }, + "parasite_density_method": { + "description": "the method of how this density was obtained", + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + } + }, + "required": [ + "parasite_density_method", + "parasite_density" + ], + "title": "ParasiteDensity", + "type": "object" + }, + "PlateInfo": { + "additionalProperties": true, + "description": "Information about a plate location, e.g. a standard 96 well plate with row having a letter and column having a number", + "properties": { + "plate_col": { + "description": "the column position", + "minimum": 0, + "pattern": "^[0-9]+$", + "type": "integer" + }, + "plate_name": { + "description": "a name for the plate", + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + }, + "plate_row": { + "description": "the row position", + "pattern": "^[A-z]$", + "type": "string" + } + }, + "required": [ + "plate_name", + "plate_row", + "plate_col" + ], + "title": "PlateInfo", + "type": "object" + }, + "PmoGenerationMethod": { + "additionalProperties": true, + "description": "Information about how a PMO was generated", + "properties": { + "program_name": { + "description": "the name of the program", + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + }, + "program_version": { + "description": "the version of program, should be in the format of v[MAJOR].[MINOR].[PATCH]", + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + } + }, + "required": [ + "program_version", + "program_name" + ], + "title": "PmoGenerationMethod", + "type": "object" + }, + "PmoHeader": { + "additionalProperties": true, + "description": "Information on the PMO file itself", + "properties": { + "creation_date": { + "description": "the date of when the PMO file was created or modified, should be YYYY-MM-DD", + "pattern": "\\d{4}-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12][0-9]|3[01]))?", + "type": [ + "string", + "null" + ] + }, + "generation_method": { + "anyOf": [ + { + "$ref": "#/$defs/PmoGenerationMethod" + }, + { + "type": "null" + } + ], + "description": "the generation method to create this PMO " + }, + "pmo_version": { + "description": "the version of the PMO file, should be in the format of v[MAJOR].[MINOR].[PATCH]", + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + } + }, + "required": [ + "pmo_version" + ], + "title": "PmoHeader", + "type": "object" + }, + "PortableMicrohaplotypeObject": { + "additionalProperties": true, + "description": "Information on final microhaplotype results from a targeted amplicon analysis with associated meta data", + "properties": { + "bioinformatics_methods_info": { + "description": "the bioinformatics pipeline/methods used to generated the microhaplotype analysis for this project", + "items": { + "$ref": "#/$defs/BioinformaticsMethodInfo" + }, + "type": [ + "array", + "null" + ] + }, + "bioinformatics_run_info": { + "description": "the runtime info for the bioinformatics pipeline used to generated the microhaplotypes analysis for this project", + "items": { + "$ref": "#/$defs/BioinformaticsRunInfo" + }, + "type": [ + "array", + "null" + ] + }, + "detected_microhaplotypes": { + "description": "the microhaplotypes detected in this projects", + "items": { + "$ref": "#/$defs/DetectedMicrohaplotypes" + }, + "type": "array" + }, + "library_sample_info": { + "description": "a list of libraries of all the seq/amp of the specimens within this PMO file", + "items": { + "$ref": "#/$defs/LibrarySampleInfo" + }, + "type": "array" + }, + "panel_info": { + "description": "a list of info on the panels", + "items": { + "$ref": "#/$defs/PanelInfo" + }, + "type": "array" + }, + "pmo_header": { + "$ref": "#/$defs/PmoHeader", + "description": "the PMO information for this file including version etc" + }, + "project_info": { + "description": "the information about the projects stored in this PMO", + "items": { + "$ref": "#/$defs/ProjectInfo" + }, + "type": [ + "array", + "null" + ] + }, + "read_counts_by_stage": { + "description": "the read counts for library_samples for different stages of the pipeline", + "items": { + "$ref": "#/$defs/ReadCountsByStage" + }, + "type": [ + "array", + "null" + ] + }, + "representative_microhaplotypes": { + "$ref": "#/$defs/RepresentativeMicrohaplotypes", + "description": "a list of the information on the representative microhaplotypes" + }, + "sequencing_info": { + "description": "a list of sequencing infos for this PMO file", + "items": { + "$ref": "#/$defs/SequencingInfo" + }, + "type": [ + "array", + "null" + ] + }, + "specimen_info": { + "description": "a list of all the specimens within this PMO file", + "items": { + "$ref": "#/$defs/SpecimenInfo" + }, + "type": "array" + }, + "target_info": { + "description": "a list of info on the targets", + "items": { + "$ref": "#/$defs/TargetInfo" + }, + "type": "array" + }, + "targeted_genomes": { + "description": "a list of genomes that any genomic location information refers to", + "items": { + "$ref": "#/$defs/GenomeInfo" + }, + "type": [ + "array", + "null" + ] + } + }, + "required": [ + "library_sample_info", + "specimen_info", + "panel_info", + "target_info", + "representative_microhaplotypes", + "detected_microhaplotypes", + "pmo_header" + ], + "title": "PortableMicrohaplotypeObject", + "type": "object" + }, + "PrimerInfo": { + "additionalProperties": true, + "description": "information on a primer sequence", + "properties": { + "location": { + "anyOf": [ + { + "$ref": "#/$defs/GenomicLocation" + }, + { + "type": "null" + } + ], + "description": "what the intended genomic location of the primer is" + }, + "seq": { + "description": "the sequence", + "pattern": "^[A-z]+$", + "type": "string" + } + }, + "required": [ + "seq" + ], + "title": "PrimerInfo", + "type": "object" + }, + "ProjectInfo": { + "additionalProperties": true, + "description": "Information on a project underwhich a collection of specimens belong to", + "properties": { + "BioProject_accession": { + "description": "an SRA bioproject accession e.g. PRJNA33823", + "pattern": "^[A-z-._0-9 ]+$", + "type": [ + "string", + "null" + ] + }, + "project_collector_chief_scientist": { + "description": "can be collection of names separated by a semicolon if multiple people involved or can just be the name of the primary person managing the specimen", + "pattern": "^[A-z-._0-9;|\\(\\),\\/\\ ]+$", + "type": [ + "string", + "null" + ] + }, + "project_contributors": { + "description": "a list of collaborators who contributed to this project", + "items": { + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "project_description": { + "description": "a short description of the project", + "type": "string" + }, + "project_name": { + "description": "a name for the project, should be unique if multiple projects listed", + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + }, + "project_type": { + "description": "the type of project conducted, e.g. TES vs surveillance vs transmission", + "pattern": "^[A-z-._0-9 ]+$", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "project_name", + "project_description" + ], + "title": "ProjectInfo", + "type": "object" + }, + "ProteinVariant": { + "additionalProperties": true, + "description": "information on a variant in protein sequence", + "properties": { + "alternative_gene_name": { + "description": "an alternative gene name", + "pattern": "^[A-z-._0-9]+$", + "type": [ + "string", + "null" + ] + }, + "codon_genomic_location": { + "anyOf": [ + { + "$ref": "#/$defs/GenomicLocation" + }, + { + "type": "null" + } + ], + "description": "the position within the genomic sequence of the codon" + }, + "gene_name": { + "description": "an identifier of the gene, if any, is being covered with this targeted", + "pattern": "^[A-z-._0-9:]+$", + "type": [ + "string", + "null" + ] + }, + "protein_location": { + "$ref": "#/$defs/GenomicLocation", + "description": "the position within the protein, the chromosome in this case would be the transcript name" + } + }, + "required": [ + "protein_location" + ], + "title": "ProteinVariant", + "type": "object" + }, + "Pseudocigar": { + "additionalProperties": true, + "description": "information on pseudocigar for a sequence", + "properties": { + "pseudocigar_generation_description": { + "description": "a description of how the pseudocigar information was generated ", + "pattern": "^[A-z-._0-9\\(\\),\\/\\ ]+$", + "type": [ + "string", + "null" + ] + }, + "pseudocigar_seq": { + "description": "the pseudocigar itself", + "pattern": "^[a-zA-Z0-9+=.]+$", + "type": "string" + }, + "ref_loc": { + "$ref": "#/$defs/GenomicLocation", + "description": "the genomic location the pseudocigar is in reference to" + } + }, + "required": [ + "pseudocigar_seq", + "ref_loc" + ], + "title": "Pseudocigar", + "type": "object" + }, + "ReactionInfo": { + "additionalProperties": true, + "description": "information on a panel of targeted amplicon primer pairs", + "properties": { + "panel_targets": { + "description": "a list of the target indexes in the target_info list", + "items": { + "minimum": 0, + "type": "integer" + }, + "type": "array" + }, + "reaction_name": { + "description": "a name for this reaction", + "pattern": "^[A-z-._0-9]+$", + "type": "string" + } + }, + "required": [ + "panel_targets", + "reaction_name" + ], + "title": "ReactionInfo", + "type": "object" + }, + "ReadCountsByStage": { + "additionalProperties": true, + "description": "Information on the reads counts at several stages of a pipeline", + "properties": { + "bioinformatics_run_id": { + "description": "the index into bioinformatics_run_info list", + "minimum": 0, + "pattern": "^[0-9]+$", + "type": [ + "integer", + "null" + ] + }, + "read_counts_by_library_sample_by_stage": { + "description": "a list by library_sample for the counts at each stage", + "items": { + "$ref": "#/$defs/ReadCountsByStageForLibrarySample" + }, + "type": "array" + } + }, + "required": [ + "read_counts_by_library_sample_by_stage" + ], + "title": "ReadCountsByStage", + "type": "object" + }, + "ReadCountsByStageForLibrarySample": { + "additionalProperties": true, + "description": "Information on the reads counts at several stages of a pipeline for a library_sample", + "properties": { + "library_sample_id": { + "description": "the index into the library_sample_info list", + "minimum": 0, + "pattern": "^[0-9]+$", + "type": "integer" + }, + "read_counts_for_targets": { + "description": "a list of counts by stage for a target", + "items": { + "$ref": "#/$defs/ReadCountsByStageForTarget" + }, + "type": [ + "array", + "null" + ] + }, + "total_raw_count": { + "description": "the raw counts off the sequencing machine that a sample began with", + "minimum": 0, + "pattern": "^[0-9]+$", + "type": "integer" + } + }, + "required": [ + "library_sample_id", + "total_raw_count" + ], + "title": "ReadCountsByStageForLibrarySample", + "type": "object" + }, + "ReadCountsByStageForTarget": { + "additionalProperties": true, + "description": "Information on the reads counts at several stages of a pipeline for a target", + "properties": { + "stages": { + "description": "the read counts by each stage", + "items": { + "$ref": "#/$defs/StageReadCounts" + }, + "type": "array" + }, + "target_id": { + "description": "the index into the target_info list", + "minimum": 0, + "pattern": "^[0-9]+$", + "type": "integer" + } + }, + "required": [ + "target_id", + "stages" + ], + "title": "ReadCountsByStageForTarget", + "type": "object" + }, + "RepresentativeMicrohaplotype": { + "additionalProperties": true, + "description": "the representative sequence for a microhaplotype", + "properties": { + "alt_annotations": { + "description": "a list of additional annotations associated with this microhaplotype, e.g. wildtype", + "items": { + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "associated_protein_variants": { + "description": "a list of protein variants for this haplotype, e.g. amino acid changes/INDELS", + "items": { + "$ref": "#/$defs/ProteinVariant" + }, + "type": [ + "array", + "null" + ] + }, + "associated_seq_variants": { + "description": "a list of sequence variants for this haplotype, e.g. SNPS, indels", + "items": { + "$ref": "#/$defs/GenomicLocation" + }, + "type": [ + "array", + "null" + ] + }, + "masking": { + "description": "masking info for the sequence", + "items": { + "$ref": "#/$defs/MaskingInfo" + }, + "type": [ + "array", + "null" + ] + }, + "microhaplotype_name": { + "description": "an optional name for this microhaplotype", + "pattern": "^[A-z-._0-9]+$", + "type": [ + "string", + "null" + ] + }, + "pseudocigar": { + "anyOf": [ + { + "$ref": "#/$defs/Pseudocigar" + }, + { + "type": "null" + } + ], + "description": "the pseudocigar of the haplotype" + }, + "quality": { + "description": "the ASCII fastq per base quality score for this sequence, this is optional, must be same length as the sequence", + "pattern": "^[A-z-._0-9]+$", + "type": [ + "string", + "null" + ] + }, + "seq": { + "description": "the sequence", + "pattern": "^[A-z]+$", + "type": "string" + } + }, + "required": [ + "seq" + ], + "title": "RepresentativeMicrohaplotype", + "type": "object" + }, + "RepresentativeMicrohaplotypes": { + "additionalProperties": true, + "description": "a collection of representative sequences for microhaplotypes for all targets", + "properties": { + "targets": { + "description": "a list of the microhaplotypes for each targets ", + "items": { + "$ref": "#/$defs/RepresentativeMicrohaplotypesForTarget" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "title": "RepresentativeMicrohaplotypes", + "type": "object" + }, + "RepresentativeMicrohaplotypesForTarget": { + "additionalProperties": true, + "description": "a list of the representative sequence for the microhaplotypes for a target", + "properties": { + "mhap_location": { + "anyOf": [ + { + "$ref": "#/$defs/GenomicLocation" + }, + { + "type": "null" + } + ], + "description": "a genomic location that was analyzed for this target info, this allows listing location that may be different from the full target location (e.g 1 trimmed off the full length) " + }, + "microhaplotypes": { + "description": "a list of all the microhaplotypes for a target", + "items": { + "$ref": "#/$defs/RepresentativeMicrohaplotype" + }, + "type": "array" + }, + "target_id": { + "description": "the index into the target_info list", + "minimum": 0, + "pattern": "^[0-9]+$", + "type": "integer" + } + }, + "required": [ + "target_id", + "microhaplotypes" + ], + "title": "RepresentativeMicrohaplotypesForTarget", + "type": "object" + }, + "SequencingInfo": { + "additionalProperties": true, + "description": "Information on sequencing info", + "properties": { + "library_kit": { + "description": "Name, version, and applicable cell or cycle numbers for the kit used to prepare libraries and load cells or chips for sequencing. If possible, include a part number, e.g. MiSeq Reagent Kit v3 (150-cycle), MS-102-3001", + "pattern": "^[A-z-._0-9\\(\\),\\/\\ ]+$", + "type": [ + "string", + "null" + ] + }, + "library_layout": { + "description": "Specify the configuration of reads, e.g. paired-end, single", + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + }, + "library_screen": { + "description": "Describe enrichment, screening, or normalization methods applied during amplification or library preparation, e.g. size selection 390bp, diluted to 1 ng DNA/sample", + "pattern": "^[A-z-._0-9\\(\\),\\/\\ ]+$", + "type": [ + "string", + "null" + ] + }, + "library_selection": { + "description": "how amplification was done (common are PCR=Source material was selected by designed primers, RANDOM =Random selection by shearing or other method)", + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + }, + "library_source": { + "description": "Source of amplification material e.g. was it DNA (GENOMIC) or RNA (TRANSCRIPTOMIC) (common names GENOMIC, TRANSCRIPTOMIC)", + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + }, + "library_strategy": { + "description": "what the nuceloacid sequencing/amplification strategy was (common names are AMPLICON, WGS)", + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + }, + "nucl_acid_amp": { + "description": "Link to a reference or kit that describes the enzymatic amplification of nucleic acids", + "pattern": "^(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*$", + "type": [ + "string", + "null" + ] + }, + "nucl_acid_amp_date": { + "description": "the date of the nucleoacid amplification", + "pattern": "\\d{4}-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12][0-9]|3[01]))?", + "type": [ + "string", + "null" + ] + }, + "nucl_acid_ext": { + "description": "Link to a reference or kit that describes the recovery of nucleic acids from the sample", + "pattern": "^(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*$", + "type": [ + "string", + "null" + ] + }, + "nucl_acid_ext_date": { + "description": "the date of the nucleoacid extraction", + "pattern": "\\d{4}-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12][0-9]|3[01]))?", + "type": [ + "string", + "null" + ] + }, + "pcr_cond": { + "description": "the method/conditions for PCR, List PCR cycles used to amplify the target", + "pattern": "^[A-z-._0-9\\(\\),\\/\\ ]+$", + "type": [ + "string", + "null" + ] + }, + "seq_center": { + "description": "Name of facility where sequencing was performed (lab, core facility, or company)", + "pattern": "^[A-z-._0-9\\(\\),\\/\\ ]+$", + "type": [ + "string", + "null" + ] + }, + "seq_date": { + "description": "the date of sequencing, should be YYYY-MM or YYYY-MM-DD", + "pattern": "\\d{4}-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12][0-9]|3[01]))?", + "type": [ + "string", + "null" + ] + }, + "seq_instrument_model": { + "description": "the sequencing instrument model used to sequence the run, e.g. NextSeq 2000, MinION, Revio", + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + }, + "seq_platform": { + "description": "the sequencing technology used to sequence the run, e.g. ILLUMINA, NANOPORE, PACBIO", + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + }, + "sequencing_info_name": { + "description": "a name for a specific sequencing run, e.g. batch1", + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + } + }, + "required": [ + "sequencing_info_name", + "seq_platform", + "seq_instrument_model", + "library_layout", + "library_strategy", + "library_source", + "library_selection" + ], + "title": "SequencingInfo", + "type": "object" + }, + "SpecimenInfo": { + "additionalProperties": true, + "description": "Information on specimen info", + "properties": { + "alternate_identifiers": { + "description": "a list of alternative names", + "items": { + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "blood_meal": { + "description": "whether host specimen has had a recent blood meal ", + "type": [ + "boolean", + "null" + ] + }, + "collection_country": { + "description": "the name of country collected in, would be the same as admin level 0", + "pattern": "^[\\w ,._:'\u2013-]+$", + "type": [ + "string", + "null" + ] + }, + "collection_date": { + "description": "the date of the specimen collection, can be YYYY, YYYY-MM, or YYYY-MM-DD", + "pattern": "(?:\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12][0-9]|3[01]))?)?|NA)", + "type": [ + "string", + "null" + ] + }, + "drug_usage": { + "description": "Any drug used by subject and the frequency of usage; can include multiple drugs used", + "items": { + "pattern": "^[A-z-._0-9;|\\(\\),\\/\\ ]+$", + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "env_broad_scale": { + "description": "the broad environment from which the specimen was collected, e.g. highlands, lowlands, mountainous region", + "pattern": "^[A-z-._0-9;|\\(\\),\\/\\ ]+$", + "type": [ + "string", + "null" + ] + }, + "env_local_scale": { + "description": "the local environment from which the specimen was collected, e.g. jungle, urban, rural", + "pattern": "^[A-z-._0-9;|\\(\\),\\/\\ ]+$", + "type": [ + "string", + "null" + ] + }, + "env_medium": { + "description": "the environment medium from which the specimen was collected from", + "pattern": "^[A-z-._0-9;|\\(\\),\\/\\ ]+$", + "type": [ + "string", + "null" + ] + }, + "geo_admin1": { + "description": "geographical admin level 1, the secondary large demarcation of a nation (nation = admin level 0)", + "type": [ + "string", + "null" + ] + }, + "geo_admin2": { + "description": "geographical admin level 2, the third large demarcation of a nation (nation = admin level 0)", + "type": [ + "string", + "null" + ] + }, + "geo_admin3": { + "description": "geographical admin level 3, the third large demarcation of a nation (nation = admin level 0)", + "type": [ + "string", + "null" + ] + }, + "gravid": { + "description": "whether host specimen is currently pregnant", + "type": [ + "boolean", + "null" + ] + }, + "gravidity": { + "description": "the gravidity of the specimen host (number of previous pregnancies)", + "minimum": 0, + "pattern": "^[0-9]+$", + "type": [ + "integer", + "null" + ] + }, + "has_travel_out_six_month": { + "description": "has travelled out from local region in the last six months", + "type": [ + "boolean", + "null" + ] + }, + "host_age": { + "description": "if specimen is from a person, the age in years of the person, can be float value so for 3 month old put 0.25", + "minimum": 0, + "pattern": "^\\d*\\.?\\d+$", + "type": [ + "number", + "null" + ] + }, + "host_sex": { + "description": "if specimen is collected from a host with a sex, the sex listed for that host", + "pattern": "^[A-z-._0-9 ]+$", + "type": [ + "string", + "null" + ] + }, + "host_subject_name": { + "description": "an identifier for the individual/person/patient a specimen was collected from", + "minimum": 0, + "type": [ + "string", + "null" + ] + }, + "host_taxon_id": { + "description": "the NCBI taxonomy number of the host that the specimen was collected from", + "minimum": 0, + "pattern": "^[0-9]+$", + "type": [ + "integer", + "null" + ] + }, + "lat_lon": { + "description": "the latitude and longitude of a specific site", + "pattern": "^[-+]?\\d{1,2}(?:\\.\\d+)?,[-+]?\\d{1,3}(?:\\.\\d+)?$", + "type": [ + "string", + "null" + ] + }, + "parasite_density_info": { + "description": "one or more parasite densities in microliters for this specimen", + "items": { + "$ref": "#/$defs/ParasiteDensity" + }, + "type": [ + "array", + "null" + ] + }, + "project_id": { + "description": "the index into the project_info list", + "minimum": 0, + "pattern": "^[0-9]+$", + "type": [ + "integer", + "null" + ] + }, + "specimen_accession": { + "description": "if specimen is deposited in a database, what accession is it associated with", + "pattern": "^[A-z-._0-9 ]+$", + "type": [ + "string", + "null" + ] + }, + "specimen_collect_device": { + "description": "the way the specimen was collected, e.g. whole blood, dried blood spot", + "pattern": "^[A-z-._0-9\\(\\),\\/\\ ]+$", + "type": [ + "string", + "null" + ] + }, + "specimen_comments": { + "description": "any additional comments about the specimen", + "items": { + "pattern": "^[A-z-._0-9\\(\\),\\/\\ ]+$", + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "specimen_name": { + "description": "an identifier for the specimen, should be unique within this sample set", + "pattern": "^[A-z-._0-9\\(\\),\\/\\ ]+$", + "type": "string" + }, + "specimen_store_loc": { + "description": "the specimen store site, address or facility name", + "pattern": "^[A-z-._0-9\\(\\),\\/\\ ]+$", + "type": [ + "string", + "null" + ] + }, + "specimen_taxon_id": { + "description": "the NCBI taxonomy number of the organism(s) in the specimen, can list multiple if a mixed sample", + "items": { + "minimum": 0, + "pattern": "^[0-9]+$", + "type": "integer" + }, + "type": [ + "array", + "null" + ] + }, + "specimen_type": { + "description": "what type of specimen this is, e.g. negative_control, positive_control, field_sample", + "pattern": "^[A-z-._0-9\\(\\),\\/\\ ]+$", + "type": [ + "string", + "null" + ] + }, + "storage_plate_info": { + "anyOf": [ + { + "$ref": "#/$defs/PlateInfo" + }, + { + "type": "null" + } + ], + "description": "plate location of where specimen is stored if stored in a plate " + }, + "travel_out_six_month": { + "description": "Specification of the countries travelled in the last six months; can include multiple travels", + "items": { + "$ref": "#/$defs/TravelInfo" + }, + "type": [ + "array", + "null" + ] + }, + "treatment_status": { + "description": "If person has been treated with drugs, what was the treatment outcome", + "items": { + "pattern": "^[A-z-._0-9;|\\(\\),\\/\\ ]+$", + "type": "string" + }, + "type": [ + "array", + "null" + ] + } + }, + "required": [ + "specimen_name" + ], + "title": "SpecimenInfo", + "type": "object" + }, + "StageReadCounts": { + "additionalProperties": true, + "description": "Information on the reads counts at several stages", + "properties": { + "reads": { + "description": "the read counts for this stage", + "minimum": 0, + "type": "integer" + }, + "stage": { + "description": "the stage of the pipeline, e.g. demultiplexed, denoised, etc", + "pattern": "^[A-z-._0-9 ]+$", + "type": "string" + } + }, + "required": [ + "reads", + "stage" + ], + "title": "StageReadCounts", + "type": "object" + }, + "TargetInfo": { + "additionalProperties": true, + "description": "Information about a specific targeted microhaplotype", + "properties": { + "forward_primer": { + "$ref": "#/$defs/PrimerInfo", + "description": "the forward primer for this target" + }, + "gene_name": { + "description": "an identifier of the gene, if any, is being covered with this targeted", + "pattern": "^[A-z-._0-9:]+$", + "type": [ + "string", + "null" + ] + }, + "insert_location": { + "anyOf": [ + { + "$ref": "#/$defs/GenomicLocation" + }, + { + "type": "null" + } + ], + "description": "the intended genomic location of the insert of the amplicon (the location between the end of the forward primer and the beginning of the reverse primer)" + }, + "markers_of_interest": { + "description": "a list of markers of interest that are covered by this target", + "items": { + "$ref": "#/$defs/MarkerOfInterest" + }, + "type": [ + "array", + "null" + ] + }, + "reverse_primer": { + "$ref": "#/$defs/PrimerInfo", + "description": "the reverse primer for this target" + }, + "target_attributes": { + "description": "a list of classification types for this target", + "items": { + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "target_name": { + "description": "a name for this target", + "pattern": "^[A-z-._0-9]+$", + "type": "string" + } + }, + "required": [ + "target_name", + "forward_primer", + "reverse_primer" + ], + "title": "TargetInfo", + "type": "object" + }, + "TravelInfo": { + "additionalProperties": true, + "description": "Information on travel info", + "properties": { + "bed_net_usage": { + "description": "approximate usage of bed net while traveling, 1 = 100% nights with bed net, 0 = 0% no bed net usage", + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "geo_admin1": { + "description": "geographical admin level 1, the secondary large demarcation of a nation (nation = admin level 0)", + "type": [ + "string", + "null" + ] + }, + "geo_admin2": { + "description": "geographical admin level 2, the third large demarcation of a nation (nation = admin level 0)", + "type": [ + "string", + "null" + ] + }, + "geo_admin3": { + "description": "geographical admin level 3, the third large demarcation of a nation (nation = admin level 0)", + "type": [ + "string", + "null" + ] + }, + "lat_lon": { + "description": "the latitude and longitude of a specific site", + "pattern": "^[-+]?\\d{1,2}(?:\\.\\d+)?,[-+]?\\d{1,3}(?:\\.\\d+)?$", + "type": [ + "string", + "null" + ] + }, + "travel_country": { + "description": "the name of country, would be the same as admin level 0", + "pattern": "^[\\w ,._:'\u2013-]+$", + "type": "string" + }, + "travel_end_date": { + "description": "the date of the end of travel, can be approximate, should be YYYY-MM or YYYY-MM-DD (preferred)", + "pattern": "\\d{4}-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12][0-9]|3[01]))?", + "type": "string" + }, + "travel_start_date": { + "description": "the date of the start of travel, can be approximate, should be YYYY-MM or YYYY-MM-DD (preferred)", + "pattern": "\\d{4}-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12][0-9]|3[01]))?", + "type": "string" + } + }, + "required": [ + "travel_country", + "travel_start_date", + "travel_end_date" + ], + "title": "TravelInfo", + "type": "object" + } + }, + "$id": "https://plasmogenepi.github.io/portable-microhaplotype-object", + "$schema": "https://json-schema.org/draft/2019-09/schema", + "additionalProperties": true, + "description": "Information on final microhaplotype results from a targeted amplicon analysis with associated meta data", + "metamodel_version": "1.7.0", + "properties": { + "bioinformatics_methods_info": { + "description": "the bioinformatics pipeline/methods used to generated the microhaplotype analysis for this project", + "items": { + "$ref": "#/$defs/BioinformaticsMethodInfo" + }, + "type": [ + "array", + "null" + ] + }, + "bioinformatics_run_info": { + "description": "the runtime info for the bioinformatics pipeline used to generated the microhaplotypes analysis for this project", + "items": { + "$ref": "#/$defs/BioinformaticsRunInfo" + }, + "type": [ + "array", + "null" + ] + }, + "detected_microhaplotypes": { + "description": "the microhaplotypes detected in this projects", + "items": { + "$ref": "#/$defs/DetectedMicrohaplotypes" + }, + "type": "array" + }, + "library_sample_info": { + "description": "a list of libraries of all the seq/amp of the specimens within this PMO file", + "items": { + "$ref": "#/$defs/LibrarySampleInfo" + }, + "type": "array" + }, + "panel_info": { + "description": "a list of info on the panels", + "items": { + "$ref": "#/$defs/PanelInfo" + }, + "type": "array" + }, + "pmo_header": { + "$ref": "#/$defs/PmoHeader", + "description": "the PMO information for this file including version etc" + }, + "project_info": { + "description": "the information about the projects stored in this PMO", + "items": { + "$ref": "#/$defs/ProjectInfo" + }, + "type": [ + "array", + "null" + ] + }, + "read_counts_by_stage": { + "description": "the read counts for library_samples for different stages of the pipeline", + "items": { + "$ref": "#/$defs/ReadCountsByStage" + }, + "type": [ + "array", + "null" + ] + }, + "representative_microhaplotypes": { + "$ref": "#/$defs/RepresentativeMicrohaplotypes", + "description": "a list of the information on the representative microhaplotypes" + }, + "sequencing_info": { + "description": "a list of sequencing infos for this PMO file", + "items": { + "$ref": "#/$defs/SequencingInfo" + }, + "type": [ + "array", + "null" + ] + }, + "specimen_info": { + "description": "a list of all the specimens within this PMO file", + "items": { + "$ref": "#/$defs/SpecimenInfo" + }, + "type": "array" + }, + "target_info": { + "description": "a list of info on the targets", + "items": { + "$ref": "#/$defs/TargetInfo" + }, + "type": "array" + }, + "targeted_genomes": { + "description": "a list of genomes that any genomic location information refers to", + "items": { + "$ref": "#/$defs/GenomeInfo" + }, + "type": [ + "array", + "null" + ] + } + }, + "required": [ + "library_sample_info", + "specimen_info", + "panel_info", + "target_info", + "representative_microhaplotypes", + "detected_microhaplotypes", + "pmo_header" + ], + "title": "portable-microhaplotype-object", + "type": "object", + "version": null +} diff --git a/src/pmotools/scripts/convertors_to_pmo/excel_meta_to_json_meta.py b/src/pmotools/scripts/convertors_to_pmo/excel_meta_to_json_meta.py index 6205a26..0c6e1df 100755 --- a/src/pmotools/scripts/convertors_to_pmo/excel_meta_to_json_meta.py +++ b/src/pmotools/scripts/convertors_to_pmo/excel_meta_to_json_meta.py @@ -6,8 +6,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_excel_meta_to_json_meta(): - parser = argparse.ArgumentParser() +def get_parser_excel_meta_to_json_meta() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python excel_meta_to_json_meta", + description="Convert Excel file meta to JSON Meta", + ) parser.add_argument("--file", type=str, required=True, help="Input excel file path") parser.add_argument( "--sheet", @@ -28,6 +31,11 @@ def parse_args_excel_meta_to_json_meta(): parser.add_argument( "--overwrite", action="store_true", help="If output file exists, overwrite it" ) + return parser + + +def parse_args_excel_meta_to_json_meta(): + parser = get_parser_excel_meta_to_json_meta() return parser.parse_args() diff --git a/src/pmotools/scripts/convertors_to_pmo/microhaplotype_table_to_json_file.py b/src/pmotools/scripts/convertors_to_pmo/microhaplotype_table_to_json_file.py index d3dc0fd..0d73f34 100755 --- a/src/pmotools/scripts/convertors_to_pmo/microhaplotype_table_to_json_file.py +++ b/src/pmotools/scripts/convertors_to_pmo/microhaplotype_table_to_json_file.py @@ -7,29 +7,32 @@ from pmotools.utils.small_utils import Utils -def parse_args_microhaplotype_table_to_json_file(): - parser = argparse.ArgumentParser() +def get_parser_microhaplotype_table_to_json_file() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python microhaplotype_table_to_json_file", + description="Convert microhaplotype table to a JSON file", + ) parser.add_argument("--file", type=str, required=True, help="Input excel file path") parser.add_argument( - "--bioinfo_id", + "--bioinfo_name", type=str, - required=True, + required=False, help="Identifier of bioinformatics processing run", ) parser.add_argument( - "--sampleID_col", + "--library_sample_name_col", type=str, - default="sampleID", - help="Column name containing sampleIDs", + default="library_sample_name", + help="Column name containing library_sample_name", ) parser.add_argument( - "--locus_col", + "--target_name_col", type=str, - default="locus", - help="Column name containing locus information", + default="target_name", + help="Column name containing target_name information", ) parser.add_argument( - "--mhap_col", + "--seq_col", type=str, default="asv", help="Column name containing microhaplotypes", @@ -54,13 +57,19 @@ def parse_args_microhaplotype_table_to_json_file(): parser.add_argument( "--overwrite", action="store_true", help="If output file exists, overwrite it" ) + return parser + + +def parse_args_microhaplotype_table_to_json_file(): + parser = get_parser_microhaplotype_table_to_json_file() return parser.parse_args() def microhaplotype_table_to_json_file(): args = parse_args_microhaplotype_table_to_json_file() - args.output = Utils.appendStrAsNeeded(args.output, ".json") + ext = ".json.gz" if args.output.endswith(".json.gz") else ".json" + args.output = Utils.appendStrAsNeeded(args.output, ext) addCols = None if args.additional_cols is not None: @@ -85,16 +94,16 @@ def microhaplotype_table_to_json_file(): contents = pd.read_csv(args.file, sep=args.delim) output_data = mhap_table_to_pmo( contents, - args.bioinfo_id, - args.sampleID_col, - args.locus_col, - args.mhap_col, + args.bioinfo_name, + args.library_sample_name_col, + args.target_name_col, + args.seq_col, args.reads_col, addCols, ) # Write output as json json_str = json.dumps(output_data, indent=4) - with open(args.output, "w") as json_file: + with Utils.smart_open_write(args.output) as json_file: json_file.write(json_str) diff --git a/src/pmotools/scripts/convertors_to_pmo/terra_amp_output_to_json.py b/src/pmotools/scripts/convertors_to_pmo/terra_amp_output_to_json.py index 97ccb45..c32f4a8 100755 --- a/src/pmotools/scripts/convertors_to_pmo/terra_amp_output_to_json.py +++ b/src/pmotools/scripts/convertors_to_pmo/terra_amp_output_to_json.py @@ -7,8 +7,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_terra_amp_output_to_json(): - parser = argparse.ArgumentParser() +def get_parser_terra_amp_output_to_json() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python terra_amp_output_to_json", + description="Convert Terra output to JSON sequence table", + ) parser.add_argument("--file", type=str, required=True, help="Input excel file path") parser.add_argument( "--gt_sheet", @@ -40,6 +43,11 @@ def parse_args_terra_amp_output_to_json(): parser.add_argument( "--overwrite", action="store_true", help="If output file exists, overwrite it" ) + return parser + + +def parse_args_terra_amp_output_to_json(): + parser = get_parser_terra_amp_output_to_json() return parser.parse_args() diff --git a/src/pmotools/scripts/convertors_to_pmo/text_meta_to_json_meta.py b/src/pmotools/scripts/convertors_to_pmo/text_meta_to_json_meta.py index f601b68..dbc850f 100755 --- a/src/pmotools/scripts/convertors_to_pmo/text_meta_to_json_meta.py +++ b/src/pmotools/scripts/convertors_to_pmo/text_meta_to_json_meta.py @@ -6,8 +6,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_text_meta_to_json_meta(): - parser = argparse.ArgumentParser() +def get_parser_text_meta_to_json_meta() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python text_meta_to_json_meta", + description="Convert text file meta to JSON Meta", + ) parser.add_argument("--file", type=str, required=True, help="Input text file path") parser.add_argument( "--delim", @@ -28,6 +31,11 @@ def parse_args_text_meta_to_json_meta(): parser.add_argument( "--overwrite", action="store_true", help="If output file exists, overwrite it" ) + return parser + + +def parse_args_text_meta_to_json_meta(): + parser = get_parser_text_meta_to_json_meta() return parser.parse_args() diff --git a/src/pmotools/scripts/extract_info_from_pmo/count_library_samples_per_target.py b/src/pmotools/scripts/extract_info_from_pmo/count_library_samples_per_target.py index bd37d8b..369df1a 100755 --- a/src/pmotools/scripts/extract_info_from_pmo/count_library_samples_per_target.py +++ b/src/pmotools/scripts/extract_info_from_pmo/count_library_samples_per_target.py @@ -8,8 +8,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_count_library_samples_per_target(): - parser = argparse.ArgumentParser() +def get_parser_count_library_samples_per_target() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python count_library_samples_per_target", + description="Count number of samples per target", + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--output", type=str, default="STDOUT", required=False, help="output file" @@ -31,7 +34,11 @@ def parse_args_count_library_samples_per_target(): required=False, help="the minimum read count (inclusive) to be counted as covered by sample", ) + return parser + +def parse_args_count_library_samples_per_target(): + parser = get_parser_count_library_samples_per_target() return parser.parse_args() diff --git a/src/pmotools/scripts/extract_info_from_pmo/count_specimen_meta.py b/src/pmotools/scripts/extract_info_from_pmo/count_specimen_meta.py index 570c08e..263effa 100755 --- a/src/pmotools/scripts/extract_info_from_pmo/count_specimen_meta.py +++ b/src/pmotools/scripts/extract_info_from_pmo/count_specimen_meta.py @@ -8,8 +8,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_count_specimen_meta(): - parser = argparse.ArgumentParser() +def get_parser_count_specimen_meta() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python count_specimen_meta", + description="Count values of selected specimen meta fields", + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--output", type=str, default="STDOUT", required=False, help="output file" @@ -30,7 +33,11 @@ def parse_args_count_specimen_meta(): required=True, help="the fields to count the subfields of, can supply multiple separated by commas, e.g. --meta_fields collection_country,collection_date", ) + return parser + +def parse_args_count_specimen_meta(): + parser = get_parser_count_specimen_meta() return parser.parse_args() diff --git a/src/pmotools/scripts/extract_info_from_pmo/count_targets_per_library_sample.py b/src/pmotools/scripts/extract_info_from_pmo/count_targets_per_library_sample.py index d02c41c..318972a 100755 --- a/src/pmotools/scripts/extract_info_from_pmo/count_targets_per_library_sample.py +++ b/src/pmotools/scripts/extract_info_from_pmo/count_targets_per_library_sample.py @@ -8,8 +8,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_count_targets_per_library_sample(): - parser = argparse.ArgumentParser() +def get_parser_count_targets_per_library_sample() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python count_targets_per_library_sample", + description="Count number of targets per sample", + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--output", type=str, default="STDOUT", required=False, help="output file" @@ -31,7 +34,11 @@ def parse_args_count_targets_per_library_sample(): required=False, help="the minimum read count (inclusive) to be counted as covered by sample", ) + return parser + +def parse_args_count_targets_per_library_sample(): + parser = get_parser_count_targets_per_library_sample() return parser.parse_args() diff --git a/src/pmotools/scripts/extract_info_from_pmo/list_bioinformatics_run_names.py b/src/pmotools/scripts/extract_info_from_pmo/list_bioinformatics_run_names.py index c8df1be..f013ad6 100755 --- a/src/pmotools/scripts/extract_info_from_pmo/list_bioinformatics_run_names.py +++ b/src/pmotools/scripts/extract_info_from_pmo/list_bioinformatics_run_names.py @@ -8,8 +8,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_list_bioinformatics_run_names(): - parser = argparse.ArgumentParser() +def get_parser_list_bioinformatics_run_names() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python list_bioinformatics_run_names", + description="List all bioinformatics_run_names in a PMO", + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--output", type=str, default="STDOUT", required=False, help="output file" @@ -17,7 +20,11 @@ def parse_args_list_bioinformatics_run_names(): parser.add_argument( "--overwrite", action="store_true", help="If output file exists, overwrite it" ) + return parser + +def parse_args_list_bioinformatics_run_names(): + parser = get_parser_list_bioinformatics_run_names() return parser.parse_args() diff --git a/src/pmotools/scripts/extract_info_from_pmo/list_library_sample_names_per_specimen_name.py b/src/pmotools/scripts/extract_info_from_pmo/list_library_sample_names_per_specimen_name.py index de5a1cd..5b01a6b 100755 --- a/src/pmotools/scripts/extract_info_from_pmo/list_library_sample_names_per_specimen_name.py +++ b/src/pmotools/scripts/extract_info_from_pmo/list_library_sample_names_per_specimen_name.py @@ -8,8 +8,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_list_library_sample_names_per_specimen_name(): - parser = argparse.ArgumentParser() +def get_parser_list_library_sample_names_per_specimen_name() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python list_library_sample_names_per_specimen_name", + description="List library_sample_names per specimen_name", + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--output", type=str, default="STDOUT", required=False, help="output file" @@ -24,7 +27,11 @@ def parse_args_list_library_sample_names_per_specimen_name(): parser.add_argument( "--overwrite", action="store_true", help="If output file exists, overwrite it" ) + return parser + +def parse_args_list_library_sample_names_per_specimen_name(): + parser = get_parser_list_library_sample_names_per_specimen_name() return parser.parse_args() diff --git a/src/pmotools/scripts/extract_info_from_pmo/list_specimen_meta_fields.py b/src/pmotools/scripts/extract_info_from_pmo/list_specimen_meta_fields.py index d4518bb..f7e316a 100755 --- a/src/pmotools/scripts/extract_info_from_pmo/list_specimen_meta_fields.py +++ b/src/pmotools/scripts/extract_info_from_pmo/list_specimen_meta_fields.py @@ -8,8 +8,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_list_specimen_meta_fields(): - parser = argparse.ArgumentParser() +def get_parser_list_specimen_meta_fields() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python list_specimen_meta_fields", + description="List specimen meta fields in the specimen_info section", + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--output", type=str, default="STDOUT", required=False, help="output file" @@ -24,7 +27,11 @@ def parse_args_list_specimen_meta_fields(): parser.add_argument( "--overwrite", action="store_true", help="If output file exists, overwrite it" ) + return parser + +def parse_args_list_specimen_meta_fields(): + parser = get_parser_list_specimen_meta_fields() return parser.parse_args() diff --git a/src/pmotools/scripts/extractors_from_pmo/extract_pmo_with_read_filter.py b/src/pmotools/scripts/extractors_from_pmo/extract_pmo_with_read_filter.py index f625a3b..70b6e62 100755 --- a/src/pmotools/scripts/extractors_from_pmo/extract_pmo_with_read_filter.py +++ b/src/pmotools/scripts/extractors_from_pmo/extract_pmo_with_read_filter.py @@ -8,8 +8,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_extract_pmo_with_read_filter(): - parser = argparse.ArgumentParser() +def get_parser_extract_pmo_with_read_filter() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python extract_pmo_with_read_filter", + description="Extract with a read filter", + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--output", type=str, required=True, help="Output json file path" @@ -19,11 +22,15 @@ def parse_args_extract_pmo_with_read_filter(): ) parser.add_argument( "--read_count_minimum", - default=0.0, type=float, required=True, help="the minimum read count (inclusive) for detected haplotypes to be kept", ) + return parser + + +def parse_args_extract_pmo_with_read_filter(): + parser = get_parser_extract_pmo_with_read_filter() return parser.parse_args() diff --git a/src/pmotools/scripts/extractors_from_pmo/extract_pmo_with_select_library_sample_names.py b/src/pmotools/scripts/extractors_from_pmo/extract_pmo_with_select_library_sample_names.py index bce755d..dad73f2 100755 --- a/src/pmotools/scripts/extractors_from_pmo/extract_pmo_with_select_library_sample_names.py +++ b/src/pmotools/scripts/extractors_from_pmo/extract_pmo_with_select_library_sample_names.py @@ -8,8 +8,13 @@ from pmotools.utils.small_utils import Utils -def parse_args_extract_pmo_with_select_library_sample_names(): - parser = argparse.ArgumentParser() +def get_parser_extract_pmo_with_select_library_sample_names() -> ( + argparse.ArgumentParser +): + parser = argparse.ArgumentParser( + prog="pmotools-python extract_pmo_with_select_library_sample_names", + description="Extract library sample names from library_sample_info table", + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--output", type=str, required=True, help="Output json file path" @@ -28,6 +33,11 @@ def parse_args_extract_pmo_with_select_library_sample_names(): required=True, help="Can either comma separated library_sample_names, or a plain text file where each line is a library_sample_name", ) + return parser + + +def parse_args_extract_pmo_with_select_library_sample_names(): + parser = get_parser_extract_pmo_with_select_library_sample_names() return parser.parse_args() diff --git a/src/pmotools/scripts/extractors_from_pmo/extract_pmo_with_select_specimen_names.py b/src/pmotools/scripts/extractors_from_pmo/extract_pmo_with_select_specimen_names.py index 41c20da..bc0d7e3 100755 --- a/src/pmotools/scripts/extractors_from_pmo/extract_pmo_with_select_specimen_names.py +++ b/src/pmotools/scripts/extractors_from_pmo/extract_pmo_with_select_specimen_names.py @@ -8,8 +8,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_extract_pmo_with_select_specimen_names(): - parser = argparse.ArgumentParser() +def get_parser_extract_pmo_with_select_specimen_names() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python extract_pmo_with_select_specimen_names", + description="Extract specific samples from the specimens table", + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--output", type=str, required=True, help="Output json file path" @@ -28,6 +31,11 @@ def parse_args_extract_pmo_with_select_specimen_names(): required=True, help="Can either comma separated specimen_names, or a plain text file where each line is a specimen_name", ) + return parser + + +def parse_args_extract_pmo_with_select_specimen_names(): + parser = get_parser_extract_pmo_with_select_specimen_names() return parser.parse_args() diff --git a/src/pmotools/scripts/extractors_from_pmo/extract_pmo_with_select_targets.py b/src/pmotools/scripts/extractors_from_pmo/extract_pmo_with_select_targets.py index abf0010..8736635 100755 --- a/src/pmotools/scripts/extractors_from_pmo/extract_pmo_with_select_targets.py +++ b/src/pmotools/scripts/extractors_from_pmo/extract_pmo_with_select_targets.py @@ -8,8 +8,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_extract_pmo_with_select_targets(): - parser = argparse.ArgumentParser() +def get_parser_extract_pmo_with_select_targets() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python extract_pmo_with_select_targets", + description="Extract specific targets", + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--output", type=str, required=True, help="Output json file path" @@ -26,8 +29,13 @@ def parse_args_extract_pmo_with_select_targets(): "--targets", type=str, required=True, - help="Can either comma separated target_namess, or a plain text file where each line is a target_namess", + help="Can either comma separated target_names, or a plain text file where each line is a target_name", ) + return parser + + +def parse_args_extract_pmo_with_select_targets(): + parser = get_parser_extract_pmo_with_select_targets() return parser.parse_args() diff --git a/src/pmotools/scripts/extractors_from_pmo/extract_pmo_with_selected_meta.py b/src/pmotools/scripts/extractors_from_pmo/extract_pmo_with_selected_meta.py index 54bdac7..058b809 100755 --- a/src/pmotools/scripts/extractors_from_pmo/extract_pmo_with_selected_meta.py +++ b/src/pmotools/scripts/extractors_from_pmo/extract_pmo_with_selected_meta.py @@ -9,8 +9,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_extract_pmo_with_selected_meta(): - parser = argparse.ArgumentParser() +def get_parser_extract_pmo_with_selected_meta() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python extract_pmo_with_selected_meta", + description="Extract samples + haplotypes using selected meta", + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--output", type=str, required=True, help="Output json file path" @@ -29,6 +32,11 @@ def parse_args_extract_pmo_with_selected_meta(): required=True, help="Meta Fields to include, should either be a table with columns field, values (and optionally group) or supplied command line as field1=value1,value2,value3:field2=value1,value2", ) + return parser + + +def parse_args_extract_pmo_with_selected_meta(): + parser = get_parser_extract_pmo_with_selected_meta() return parser.parse_args() diff --git a/src/pmotools/scripts/pmo_to_tables/export_bioinformatics_methods_info_meta_table.py b/src/pmotools/scripts/pmo_to_tables/export_bioinformatics_methods_info_meta_table.py new file mode 100644 index 0000000..4b71d8b --- /dev/null +++ b/src/pmotools/scripts/pmo_to_tables/export_bioinformatics_methods_info_meta_table.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 +import argparse +import sys + + +from pmotools.pmo_engine.pmo_exporter import PMOExporter +from pmotools.pmo_engine.pmo_reader import PMOReader +from pmotools.utils.small_utils import Utils + + +def get_parser_export_bioinformatics_methods_info_meta_table() -> ( + argparse.ArgumentParser +): + parser = argparse.ArgumentParser( + prog="pmotools-python export_bioinformatics_methods_info_meta_table", + description="export the bioinformatics_methods_info meta table from a PMO file", + ) + parser.add_argument("--file", type=str, required=True, help="PMO file") + parser.add_argument( + "--output", type=str, default="STDOUT", required=False, help="output file" + ) + parser.add_argument( + "--delim", + default="tab", + type=str, + required=False, + help="the delimiter of the output text file, examples input tab,comma but can also be the actual delimiter", + ) + parser.add_argument( + "--overwrite", action="store_true", help="If output file exists, overwrite it" + ) + return parser + + +def parse_args_export_bioinformatics_methods_info_meta_table(): + parser = get_parser_export_bioinformatics_methods_info_meta_table() + return parser.parse_args() + + +def export_bioinformatics_methods_info_meta_table(): + args = parse_args_export_bioinformatics_methods_info_meta_table() + + # check files + output_delim, output_extension = Utils.process_delimiter_and_output_extension( + args.delim, gzip=args.output.endswith(".gz") + ) + args.output = ( + args.output + if "STDOUT" == args.output + else Utils.appendStrAsNeeded(args.output, output_extension) + ) + Utils.inputOutputFileCheck(args.file, args.output, args.overwrite) + + # read in PMO + pmo = PMOReader.read_in_pmo(args.file) + + # count fields + info_df = PMOExporter.export_bioinformatics_methods_info_meta_table(pmo) + + # output + info_df.to_csv( + sys.stdout if "STDOUT" == args.output else args.output, + sep=output_delim, + index=False, + ) + + +if __name__ == "__main__": + export_bioinformatics_methods_info_meta_table() diff --git a/src/pmotools/scripts/pmo_to_tables/export_bioinformatics_run_info_meta_table.py b/src/pmotools/scripts/pmo_to_tables/export_bioinformatics_run_info_meta_table.py new file mode 100644 index 0000000..3036e60 --- /dev/null +++ b/src/pmotools/scripts/pmo_to_tables/export_bioinformatics_run_info_meta_table.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +import argparse +import sys + + +from pmotools.pmo_engine.pmo_exporter import PMOExporter +from pmotools.pmo_engine.pmo_reader import PMOReader +from pmotools.utils.small_utils import Utils + + +def get_parser_export_bioinformatics_run_info_meta_table() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python export_bioinformatics_run_info_meta_table", + description="export the bioinformatics_run_info meta table from a PMO file", + ) + parser.add_argument("--file", type=str, required=True, help="PMO file") + parser.add_argument( + "--output", type=str, default="STDOUT", required=False, help="output file" + ) + parser.add_argument( + "--delim", + default="tab", + type=str, + required=False, + help="the delimiter of the output text file, examples input tab,comma but can also be the actual delimiter", + ) + parser.add_argument( + "--overwrite", action="store_true", help="If output file exists, overwrite it" + ) + return parser + + +def parse_args_export_bioinformatics_run_info_meta_table(): + parser = get_parser_export_bioinformatics_run_info_meta_table() + return parser.parse_args() + + +def export_bioinformatics_run_info_meta_table(): + args = parse_args_export_bioinformatics_run_info_meta_table() + + # check files + output_delim, output_extension = Utils.process_delimiter_and_output_extension( + args.delim, gzip=args.output.endswith(".gz") + ) + args.output = ( + args.output + if "STDOUT" == args.output + else Utils.appendStrAsNeeded(args.output, output_extension) + ) + Utils.inputOutputFileCheck(args.file, args.output, args.overwrite) + + # read in PMO + pmo = PMOReader.read_in_pmo(args.file) + + # count fields + info_df = PMOExporter.export_bioinformatics_run_info_meta_table(pmo) + + # output + info_df.to_csv( + sys.stdout if "STDOUT" == args.output else args.output, + sep=output_delim, + index=False, + ) + + +if __name__ == "__main__": + export_bioinformatics_run_info_meta_table() diff --git a/src/pmotools/scripts/pmo_to_tables/export_library_sample_meta_table.py b/src/pmotools/scripts/pmo_to_tables/export_library_sample_meta_table.py index b624799..73d45f1 100644 --- a/src/pmotools/scripts/pmo_to_tables/export_library_sample_meta_table.py +++ b/src/pmotools/scripts/pmo_to_tables/export_library_sample_meta_table.py @@ -8,8 +8,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_export_library_sample_meta_table(): - parser = argparse.ArgumentParser() +def get_parser_export_library_sample_meta_table() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python export_library_sample_meta_table", + description="export the library_sample meta table from a PMO file", + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--output", type=str, default="STDOUT", required=False, help="output file" @@ -24,7 +27,11 @@ def parse_args_export_library_sample_meta_table(): parser.add_argument( "--overwrite", action="store_true", help="If output file exists, overwrite it" ) + return parser + +def parse_args_export_library_sample_meta_table(): + parser = get_parser_export_library_sample_meta_table() return parser.parse_args() diff --git a/src/pmotools/scripts/pmo_to_tables/export_panel_info_meta_table.py b/src/pmotools/scripts/pmo_to_tables/export_panel_info_meta_table.py index a54fc18..f78a6aa 100644 --- a/src/pmotools/scripts/pmo_to_tables/export_panel_info_meta_table.py +++ b/src/pmotools/scripts/pmo_to_tables/export_panel_info_meta_table.py @@ -8,8 +8,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_export_panel_info_meta_table(): - parser = argparse.ArgumentParser() +def get_parser_export_panel_info_meta_table() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python export_panel_info_meta_table", + description="export the panel info meta table from a PMO file", + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--output", type=str, default="STDOUT", required=False, help="output file" @@ -24,7 +27,11 @@ def parse_args_export_panel_info_meta_table(): parser.add_argument( "--overwrite", action="store_true", help="If output file exists, overwrite it" ) + return parser + +def parse_args_export_panel_info_meta_table(): + parser = get_parser_export_panel_info_meta_table() return parser.parse_args() diff --git a/src/pmotools/scripts/pmo_to_tables/export_pmo_into_xlsx.py b/src/pmotools/scripts/pmo_to_tables/export_pmo_into_xlsx.py new file mode 100644 index 0000000..de1e8ba --- /dev/null +++ b/src/pmotools/scripts/pmo_to_tables/export_pmo_into_xlsx.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 +import argparse + +from pmotools.pmo_engine.pmo_exporter import PMOExporter +from pmotools.pmo_engine.pmo_reader import PMOReader +from pmotools.utils.small_utils import Utils + + +def get_parser_export_pmo_into_xlsx() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python export_pmo_into_xlsx", + description="export all parts of a PMO into a .xlsx file", + ) + parser.add_argument("--pmo", type=str, required=True, help="PMO file") + parser.add_argument("--output", type=str, required=True, help="output file") + parser.add_argument( + "--overwrite", action="store_true", help="If output file exists, overwrite it" + ) + return parser + + +def parse_args_export_pmo_into_xlsx(): + parser = get_parser_export_pmo_into_xlsx() + return parser.parse_args() + + +def export_pmo_into_xlsx(): + args = parse_args_export_pmo_into_xlsx() + + # check files + + args.output = Utils.appendStrAsNeeded(args.output, ".xlsx") + Utils.inputOutputFileCheck(args.pmo, args.output, args.overwrite) + + # read in PMO + pmo = PMOReader.read_in_pmo(args.pmo) + + # export + PMOExporter.export_to_excel(pmo, args.output) + + +if __name__ == "__main__": + export_pmo_into_xlsx() diff --git a/src/pmotools/scripts/pmo_to_tables/export_project_info_meta_table.py b/src/pmotools/scripts/pmo_to_tables/export_project_info_meta_table.py index 9fbc64d..1765407 100644 --- a/src/pmotools/scripts/pmo_to_tables/export_project_info_meta_table.py +++ b/src/pmotools/scripts/pmo_to_tables/export_project_info_meta_table.py @@ -8,8 +8,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_export_project_info_meta_table(): - parser = argparse.ArgumentParser() +def get_parser_export_project_info_meta_table() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python export_project_info_meta_table", + description="export the project_info meta table from a PMO file", + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--output", type=str, default="STDOUT", required=False, help="output file" @@ -24,7 +27,11 @@ def parse_args_export_project_info_meta_table(): parser.add_argument( "--overwrite", action="store_true", help="If output file exists, overwrite it" ) + return parser + +def parse_args_export_project_info_meta_table(): + parser = get_parser_export_project_info_meta_table() return parser.parse_args() diff --git a/src/pmotools/scripts/pmo_to_tables/export_sequencing_info_meta_table.py b/src/pmotools/scripts/pmo_to_tables/export_sequencing_info_meta_table.py index 2c7334f..60f4dbe 100644 --- a/src/pmotools/scripts/pmo_to_tables/export_sequencing_info_meta_table.py +++ b/src/pmotools/scripts/pmo_to_tables/export_sequencing_info_meta_table.py @@ -8,8 +8,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_export_sequencing_info_meta_table(): - parser = argparse.ArgumentParser() +def get_parser_export_sequencing_info_meta_table() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python export_sequencing_info_meta_table", + description="export the sequencing_info meta table from a PMO file", + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--output", type=str, default="STDOUT", required=False, help="output file" @@ -24,7 +27,11 @@ def parse_args_export_sequencing_info_meta_table(): parser.add_argument( "--overwrite", action="store_true", help="If output file exists, overwrite it" ) + return parser + +def parse_args_export_sequencing_info_meta_table(): + parser = get_parser_export_sequencing_info_meta_table() return parser.parse_args() diff --git a/src/pmotools/scripts/pmo_to_tables/export_specimen_meta_table.py b/src/pmotools/scripts/pmo_to_tables/export_specimen_meta_table.py index 5a45012..790c931 100644 --- a/src/pmotools/scripts/pmo_to_tables/export_specimen_meta_table.py +++ b/src/pmotools/scripts/pmo_to_tables/export_specimen_meta_table.py @@ -8,8 +8,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_export_specimen_meta_table(): - parser = argparse.ArgumentParser() +def get_parser_export_specimen_meta_table() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python export_specimen_meta_table", + description="export the specimen meta table from a PMO file", + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--output", type=str, default="STDOUT", required=False, help="output file" @@ -24,7 +27,11 @@ def parse_args_export_specimen_meta_table(): parser.add_argument( "--overwrite", action="store_true", help="If output file exists, overwrite it" ) + return parser + +def parse_args_export_specimen_meta_table(): + parser = get_parser_export_specimen_meta_table() return parser.parse_args() diff --git a/src/pmotools/scripts/pmo_to_tables/export_specimen_travel_meta_table.py b/src/pmotools/scripts/pmo_to_tables/export_specimen_travel_meta_table.py index 3594cc8..c7d34fb 100644 --- a/src/pmotools/scripts/pmo_to_tables/export_specimen_travel_meta_table.py +++ b/src/pmotools/scripts/pmo_to_tables/export_specimen_travel_meta_table.py @@ -8,8 +8,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_export_specimen_travel_meta_table(): - parser = argparse.ArgumentParser() +def get_parser_export_specimen_travel_meta_table() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python export_specimen_travel_meta_table", + description="export the specimen travel_info meta table from a PMO file", + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--output", type=str, default="STDOUT", required=False, help="output file" @@ -24,7 +27,11 @@ def parse_args_export_specimen_travel_meta_table(): parser.add_argument( "--overwrite", action="store_true", help="If output file exists, overwrite it" ) + return parser + +def parse_args_export_specimen_travel_meta_table(): + parser = get_parser_export_specimen_travel_meta_table() return parser.parse_args() @@ -48,6 +55,11 @@ def export_specimen_travel_meta_table(): # count fields info_df = PMOExporter.export_specimen_travel_meta_table(pmo) + # check if dataframe is empty + if info_df.empty: + sys.stderr.write("No travel history loaded for any specimens to export\n") + sys.exit(1) + # output info_df.to_csv( sys.stdout if "STDOUT" == args.output else args.output, diff --git a/src/pmotools/scripts/pmo_to_tables/export_target_info_meta_table.py b/src/pmotools/scripts/pmo_to_tables/export_target_info_meta_table.py index 05d6d4f..95d1712 100644 --- a/src/pmotools/scripts/pmo_to_tables/export_target_info_meta_table.py +++ b/src/pmotools/scripts/pmo_to_tables/export_target_info_meta_table.py @@ -8,8 +8,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_export_target_info_meta_table(): - parser = argparse.ArgumentParser() +def get_parser_export_target_info_meta_table() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python export_target_info_meta_table", + description="export the target info meta table from a PMO file", + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--output", type=str, default="STDOUT", required=False, help="output file" @@ -24,7 +27,11 @@ def parse_args_export_target_info_meta_table(): parser.add_argument( "--overwrite", action="store_true", help="If output file exists, overwrite it" ) + return parser + +def parse_args_export_target_info_meta_table(): + parser = get_parser_export_target_info_meta_table() return parser.parse_args() @@ -45,7 +52,7 @@ def export_target_info_meta_table(): # read in PMO pmo = PMOReader.read_in_pmo(args.file) - # count fields + # target info dataframe info_df = PMOExporter.export_target_info_meta_table(pmo) # output diff --git a/src/pmotools/scripts/pmo_to_tables/export_targeted_genomes_meta_table.py b/src/pmotools/scripts/pmo_to_tables/export_targeted_genomes_meta_table.py new file mode 100644 index 0000000..ae64d9c --- /dev/null +++ b/src/pmotools/scripts/pmo_to_tables/export_targeted_genomes_meta_table.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +import argparse +import sys + + +from pmotools.pmo_engine.pmo_exporter import PMOExporter +from pmotools.pmo_engine.pmo_reader import PMOReader +from pmotools.utils.small_utils import Utils + + +def get_parser_export_targeted_genomes_meta_table() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python export_targeted_genomes_meta_table", + description="export the targeted genomes info meta table from a PMO file", + ) + parser.add_argument("--file", type=str, required=True, help="PMO file") + parser.add_argument( + "--output", type=str, default="STDOUT", required=False, help="output file" + ) + parser.add_argument( + "--delim", + default="tab", + type=str, + required=False, + help="the delimiter of the output text file, examples input tab,comma but can also be the actual delimiter", + ) + parser.add_argument( + "--overwrite", action="store_true", help="If output file exists, overwrite it" + ) + return parser + + +def parse_args_export_targeted_genomes_meta_table(): + parser = get_parser_export_targeted_genomes_meta_table() + return parser.parse_args() + + +def export_targeted_genomes_meta_table(): + args = parse_args_export_targeted_genomes_meta_table() + + # check files + output_delim, output_extension = Utils.process_delimiter_and_output_extension( + args.delim, gzip=args.output.endswith(".gz") + ) + args.output = ( + args.output + if "STDOUT" == args.output + else Utils.appendStrAsNeeded(args.output, output_extension) + ) + Utils.inputOutputFileCheck(args.file, args.output, args.overwrite) + + # read in PMO + pmo = PMOReader.read_in_pmo(args.file) + + # count fields + info_df = PMOExporter.export_targeted_genomes_meta_table(pmo) + + # output + info_df.to_csv( + sys.stdout if "STDOUT" == args.output else args.output, + sep=output_delim, + index=False, + ) + + +if __name__ == "__main__": + export_targeted_genomes_meta_table() diff --git a/src/pmotools/scripts/pmo_to_tables/extract_allele_table.py b/src/pmotools/scripts/pmo_to_tables/extract_allele_table.py index 549028c..bfd458b 100755 --- a/src/pmotools/scripts/pmo_to_tables/extract_allele_table.py +++ b/src/pmotools/scripts/pmo_to_tables/extract_allele_table.py @@ -3,6 +3,7 @@ import argparse import json import os +import sys from pmotools.pmo_engine.pmo_reader import PMOReader from pmotools.utils.small_utils import Utils @@ -13,8 +14,20 @@ from pmotools import __version__ as __pmotools_version__ -def parse_args_extract_for_allele_table(): - parser = argparse.ArgumentParser() +def get_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python extract_allele_table", + description="Extract allele tables for tools like dcifer or moire", + epilog=""" + Examples: + %(prog)s --file input.pmo --output output.tsv + %(prog)s --file input.pmo.gz --output output.tsv --delim comma + %(prog)s --file input.pmo --output output.tsv --allele_freqs_output freqs.tsv --overwrite + %(prog)s --file input.pmo --output output.tsv --microhap_fields reads,mhap_id + %(prog)s --file input.pmo --output output.tsv --specimen_info_meta_fields collection_date,collection_country + """, + formatter_class=argparse.RawDescriptionHelpFormatter, + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--jsonschema", @@ -29,7 +42,6 @@ def parse_args_extract_for_allele_table(): required=False, help="the jsonschema to check the PMO against", ) - parser.add_argument( "--delim", default="tab", @@ -43,12 +55,14 @@ def parse_args_extract_for_allele_table(): parser.add_argument( "--overwrite", action="store_true", help="If output file exists, overwrite it" ) + parser.add_argument( + "--skip_validation", action="store_true", help="skip validation of PMO" + ) parser.add_argument( "--allele_freqs_output", type=str, help="if also writing out allele frequencies, write to this file", ) - parser.add_argument( "--specimen_info_meta_fields", type=str, @@ -80,7 +94,11 @@ def parse_args_extract_for_allele_table(): default="library_sample_name,target_name,mhap_id", help="default base column names, must be length 3", ) + return parser + +def parse_args_extract_for_allele_table(): + parser = get_parser() return parser.parse_args() @@ -111,11 +129,13 @@ def extract_for_allele_table(): Utils.inputOutputFileCheck(args.file, allele_freq_output, args.overwrite) pmodata = PMOReader.read_in_pmo(args.file) - with open(args.jsonschema, "r") as f: - schema_dict = json.load(f) - checker = PMOChecker(schema_dict) - # make sure PMO is valid - checker.validate_pmo_json(pmodata) + if not args.skip_validation: + with open(args.jsonschema, "r") as f: + schema_dict = json.load(f) + checker = PMOChecker(schema_dict) + # make sure PMO is valid + checker.validate_pmo_json(pmodata) + sys.stderr.write("PMO is valid\n") if args.specimen_info_meta_fields is not None: args.specimen_info_meta_fields = Utils.parse_delimited_input_or_file( diff --git a/src/pmotools/scripts/pmo_to_tables/extract_insert_of_panels.py b/src/pmotools/scripts/pmo_to_tables/extract_insert_of_panels.py index b0da163..94a3a07 100755 --- a/src/pmotools/scripts/pmo_to_tables/extract_insert_of_panels.py +++ b/src/pmotools/scripts/pmo_to_tables/extract_insert_of_panels.py @@ -6,8 +6,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_extract_insert_of_panels(): - parser = argparse.ArgumentParser() +def get_parser_extract_insert_of_panels() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python extract_insert_of_panels", + description="Extract inserts of panels from a PMO", + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--output", type=str, default="STDOUT", required=False, help="output file" @@ -20,7 +23,11 @@ def parse_args_extract_insert_of_panels(): action="store_true", help="add ref seqs to the output as ref_seq", ) + return parser + +def parse_args_extract_insert_of_panels(): + parser = get_parser_extract_insert_of_panels() return parser.parse_args() diff --git a/src/pmotools/scripts/pmo_to_tables/extract_refseq_of_inserts_of_panels.py b/src/pmotools/scripts/pmo_to_tables/extract_refseq_of_inserts_of_panels.py index f335334..cb23473 100755 --- a/src/pmotools/scripts/pmo_to_tables/extract_refseq_of_inserts_of_panels.py +++ b/src/pmotools/scripts/pmo_to_tables/extract_refseq_of_inserts_of_panels.py @@ -6,8 +6,14 @@ from pmotools.utils.small_utils import Utils -def parse_args_extract_refseq_of_inserts_of_panels(): - parser = argparse.ArgumentParser() +def get_parser_extract_refseq_of_inserts_of_panels() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python extract_refseq_of_inserts_of_panels", + description=( + "extract ref_seq of inserts of panels, but if no ref_seq is saved " + "in the PMO will just be blank" + ), + ) parser.add_argument("--file", type=str, required=True, help="PMO file") parser.add_argument( "--output", type=str, default="STDOUT", required=False, help="output file" @@ -15,7 +21,11 @@ def parse_args_extract_refseq_of_inserts_of_panels(): parser.add_argument( "--overwrite", action="store_true", help="If output file exists, overwrite it" ) - parser.description = "extract ref_seq of inserts of panels, but if no ref_seq is save in the PMO will just be blank" + return parser + + +def parse_args_extract_refseq_of_inserts_of_panels(): + parser = get_parser_extract_refseq_of_inserts_of_panels() return parser.parse_args() diff --git a/src/pmotools/scripts/pmo_utils/combine_pmos.py b/src/pmotools/scripts/pmo_utils/combine_pmos.py index edbe37d..afe2a93 100755 --- a/src/pmotools/scripts/pmo_utils/combine_pmos.py +++ b/src/pmotools/scripts/pmo_utils/combine_pmos.py @@ -7,8 +7,11 @@ from pmotools.pmo_engine.pmo_reader import PMOReader -def parse_args_combine_pmos(): - parser = argparse.ArgumentParser() +def get_parser_combine_pmos() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python combine_pmos", + description="Combine multiple PMOs of the same panel", + ) parser.add_argument( "--pmo_files", type=str, @@ -21,7 +24,11 @@ def parse_args_combine_pmos(): parser.add_argument( "--overwrite", action="store_true", help="If output file exists, overwrite it" ) + return parser + +def parse_args_combine_pmos(): + parser = get_parser_combine_pmos() return parser.parse_args() diff --git a/src/pmotools/scripts/pmo_utils/validate_pmo.py b/src/pmotools/scripts/pmo_utils/validate_pmo.py index dbe7723..744d1aa 100755 --- a/src/pmotools/scripts/pmo_utils/validate_pmo.py +++ b/src/pmotools/scripts/pmo_utils/validate_pmo.py @@ -10,24 +10,43 @@ from pmotools import __version__ as __pmotools_version__ -def parse_args_validate_pmo(): - parser = argparse.ArgumentParser() +def get_parser_validate_pmo() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pmotools-python validate_pmo", + description="Validate a PMO file against a JSON Schema", + ) parser.add_argument("--pmo", type=str, required=True, help="a pmo file to validate") + parser.add_argument( + "--jsonschema_version", + default=__pmotools_version__, + type=str, + required=False, + help="version of the jsonschema to validate against (default: %(default)s)", + ) parser.add_argument( "--jsonschema_file", - default=os.path.join( - os.path.dirname( - os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - ), - "schemas/", - f"portable_microhaplotype_object_v{__pmotools_version__}.schema.json", - ), + default=None, type=str, required=False, - help="jsonschema to validate against", + help="explicit jsonschema file path to validate against (overrides --jsonschema_version)", ) + return parser + + +def parse_args_validate_pmo(): + parser = get_parser_validate_pmo() + args = parser.parse_args() - return parser.parse_args() + # post-parse resolution stays here, NOT in get_parser + if args.jsonschema_file is None: + args.jsonschema_file = os.path.join( + os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + ), + "schemas/", + f"portable_microhaplotype_object_v{args.jsonschema_version}.schema.json", + ) + return args def validate_pmo(): diff --git a/src/pmotools/utils/color_text.py b/src/pmotools/utils/color_text.py index 3ae12e6..cbeab81 100644 --- a/src/pmotools/utils/color_text.py +++ b/src/pmotools/utils/color_text.py @@ -75,7 +75,6 @@ def boldRed(t: str) -> str: :param t: the text :return: the text but with terminal escape characters to bold and make the text red """ - return ColorText.red + ColorText.bold + t + ColorText.reset @staticmethod @@ -101,7 +100,7 @@ def boldBlue(t: str) -> str: @staticmethod def boldWhite(t: str) -> str: """ - Create a bolded blue text + Create a bolded white text :param t: the text :return: the text but with terminal escape characters to bold and make the text white @@ -124,28 +123,28 @@ def addColor(color_code: int) -> str: Takes a number between 16 and 231 to change text color, gives a bigger range of colors than the regular offered ones :param color_code: a code between 16 and 231 - :return: change the text to the color code given - @todo: Put a check to make sure it's a number between 16 and 231 - """ + :return: the escape sequence that changes the text to the given color code + .. todo:: Add a check to make sure it's a number between 16 and 231. + """ return "\033[38;5;" + str(color_code) + "m" @staticmethod def addBGColor(color_code: int) -> str: """ - Takes a number between 16 and 231 to change background color of text, gives a bigger range of colors than the regular offered ones + Takes a number between 16 and 231 to change the background color of text, gives a bigger range of colors than the regular offered ones :param color_code: a code between 16 and 231 - :return: generates the - @todo: Put a check to make sure it's a number between 16 and 231 - """ + :return: the escape sequence that changes the background to the given color code + .. todo:: Add a check to make sure it's a number between 16 and 231. + """ return "\033[48;5;" + str(color_code) + "m" @staticmethod def outputColors(): """ - prints out to stdout the colors with their backgrounds those colors so you can see + Prints out to stdout the colors with their backgrounds so you can see them :return: nothing """ diff --git a/src/pmotools/utils/schema_loader.py b/src/pmotools/utils/schema_loader.py deleted file mode 100644 index bad556e..0000000 --- a/src/pmotools/utils/schema_loader.py +++ /dev/null @@ -1,29 +0,0 @@ -import json -import importlib.resources as resources - - -def load_schema(name: str) -> dict: - """ - Load a JSON schema from the pmotools.schemas package. - - Parameters - ---------- - name : str - The filename of the schema (e.g. "pmo_schema.json"). - - Returns - ------- - dict - Parsed JSON schema as a Python dictionary. - - Raises - ------ - FileNotFoundError - If the schema file does not exist. - json.JSONDecodeError - If the schema file is not valid JSON. - """ - with resources.files("pmotools.schemas").joinpath(name).open( - "r", encoding="utf-8" - ) as f: - return json.load(f) diff --git a/tests/data/combined_pmo_minimum_fields_example.json b/tests/data/combined_pmo_minimum_fields_example.json new file mode 100644 index 0000000..5c7958e --- /dev/null +++ b/tests/data/combined_pmo_minimum_fields_example.json @@ -0,0 +1 @@ +{"pmo_header": {"pmo_version": "0.1", "creation_date": "2026-05-07", "generation_method": {"program_name": "pmotools-python.PMOReader.combine_multiple_pmos", "program_version": "0.1"}}, "target_info": [{"forward_primer": {"seq": "CCTGAGTTTTAAGTGAATGAATATATTTTTGTT"}, "reverse_primer": {"seq": "AAAATGTCCAATATGTCAAGGTATATTAAAGT"}, "target_name": "Pf3D7_01_v3-0145420-0145630"}, {"forward_primer": {"seq": "TACTACCGATCATCAAGCCGAA"}, "reverse_primer": {"seq": "TGTGTGCTTTGTCGTTGATTCAT"}, "target_name": "Pf3D7_01_v3-0162888-0163092"}, {"forward_primer": {"seq": "CTTTTCATATTTGTCTATTAGCTTTTTCAAACC"}, "reverse_primer": {"seq": "TAGTTTAAATCTATACTTGTCTCACCTGAACA"}, "target_name": "Pf3D7_01_v3-0181544-0181729"}, {"forward_primer": {"seq": "ACAATGTAGAACAATATATAAAACTGGAAAAGA"}, "reverse_primer": {"seq": "GTGTTTCATTATTTTAGACACATTCAGGAATTT"}, "target_name": "Pf3D7_01_v3-0455826-0456021"}, {"forward_primer": {"seq": "CTTAGTTTAGATTTGCCTACAATATTTGCAC"}, "reverse_primer": {"seq": "AATCATTTTATCCCACTTATTTATCTCGTCT"}, "target_name": "Pf3D7_01_v3-0528889-0529073"}, {"forward_primer": {"seq": "TGGTTTAATGTGTTAGTAGAAGAAAAAGCA"}, "reverse_primer": {"seq": "CTTTGACAATCATCCAACATGTAAGTATATAAA"}, "target_name": "Pf3D7_01_v3-0535994-0536206"}, {"forward_primer": {"seq": "AAGCATCATTTTCCTTATCATTATAATGAGG"}, "reverse_primer": {"seq": "ACTTTTAAATATGGCACATAATCCAATAGATG"}, "target_name": "Pf3D7_02_v3-0290610-0290789"}, {"forward_primer": {"seq": "TGCTAGAGGCATATAAAGAACTTTTTAAAGTC"}, "reverse_primer": {"seq": "AGTAGAAATCGTCGAAGAACATATACATAAAAT"}, "target_name": "Pf3D7_02_v3-0291801-0291984"}, {"forward_primer": {"seq": "ATTTTCAAAGGTTCAAAAATATATGAACATGAA"}, "reverse_primer": {"seq": "GTATGTATTATACCCTCCATTTGATTATTCTCT"}, "target_name": "Pf3D7_02_v3-0470469-0470676"}, {"forward_primer": {"seq": "AGTACACATATCGTTATGATCCTTAATTAAAC"}, "reverse_primer": {"seq": "CATCACGATATTGATGTGTACTATGGTC"}, "target_name": "Pf3D7_02_v3-0503071-0503260"}, {"forward_primer": {"seq": "GTGATTTTCTCTTTTGTGATAATCTTGAAAAAT"}, "reverse_primer": {"seq": "AATTATCTTACACCAACAATGAAGGTGAA"}, "target_name": "Pf3D7_02_v3-0628973-0629143"}, {"forward_primer": {"seq": "ACATAACGAAGAATATCTATTCGTATAGGTTTC"}, "reverse_primer": {"seq": "AGGTATATATGGTAGCAATTCTATAAATTGGTT"}, "target_name": "Pf3D7_02_v3-0630673-0630874"}, {"forward_primer": {"seq": "TCCTTTAATTTTTCTTTCATCAAATTTAACCAT"}, "reverse_primer": {"seq": "TGGAAGATGAATATTATGATGTAAATGATGAAA"}, "target_name": "Pf3D7_03_v3-0085539-0085723"}, {"forward_primer": {"seq": "GATCTATTCCAGGAGCATCAAGG"}, "reverse_primer": {"seq": "GCATATGTTCCCAACCTTCATTAACTTC"}, "target_name": "Pf3D7_03_v3-0515440-0515629"}, {"forward_primer": {"seq": "GTAACAAAAATTTCACCTAACGGTATATTTTTA"}, "reverse_primer": {"seq": "CTTTATGTATTTTTCAAAAATCGGCACGT"}, "target_name": "Pf3D7_03_v3-0653993-0654177"}, {"forward_primer": {"seq": "ATGAGGTATCAAAACACAATAATACGATTC"}, "reverse_primer": {"seq": "CGTTTTCAATTAATTGTATTGAGAATTGTACAA"}, "target_name": "Pf3D7_03_v3-0855455-0855664"}, {"forward_primer": {"seq": "GTCTTGTTTGTTTGTTATGATATGTTCTTTATT"}, "reverse_primer": {"seq": "ACATATCCATAGCAGAGTCTTCTTATTTCTTAT"}, "target_name": "Pf3D7_03_v3-0891585-0891794"}, {"forward_primer": {"seq": "CTTTAGGTACACCTGCAAGTACC"}, "reverse_primer": {"seq": "GTGTTATGTTAAGCAATAAAAATTTTCATAGCA"}, "target_name": "Pf3D7_04_v3-0109961-0110151"}, {"forward_primer": {"seq": "TTTTAGTTTCGGTATTTTGTGTTCCTCTT"}, "reverse_primer": {"seq": "AAGAAATTTATCAGAGTTACAAAAGGGAAATC"}, "target_name": "Pf3D7_04_v3-0115483-0115652"}, {"forward_primer": {"seq": "ATTTAATCTTTTACCAGCAGTAGAAACTACAT"}, "reverse_primer": {"seq": "AGAAGAGCACAAAAGAGATGAATATCAAG"}, "target_name": "Pf3D7_04_v3-0133612-0133801"}, {"forward_primer": {"seq": "ATTTGAACTTTGACTTTTCCAAATATTGTTTTA"}, "reverse_primer": {"seq": "AGAACATAATTATGATAAAAAGTATAGGGACGT"}, "target_name": "Pf3D7_04_v3-0133960-0134121"}, {"forward_primer": {"seq": "TGATAATATATATGCTAAGGAAAAGGAAATTCG"}, "reverse_primer": {"seq": "ATTATTATTATTTTCATCTTGTGTGTCTCCAT"}, "target_name": "Pf3D7_04_v3-0140349-0140516"}, {"forward_primer": {"seq": "ACCATGCTGATGATACACGTG"}, "reverse_primer": {"seq": "TCTAATTCTTTATAAAGATCAAGCATTTGTCTG"}, "target_name": "Pf3D7_04_v3-0141761-0141957"}, {"forward_primer": {"seq": "TTTGTATATCGTTTGATTTGTTTGTAAGATGTC"}, "reverse_primer": {"seq": "AAAAATTCAACGAAAATAAAAGGTTGTTCTT"}, "target_name": "Pf3D7_04_v3-0284153-0284333"}, {"forward_primer": {"seq": "AGAATGTATATTTTGATGCCGAGTTGATAAT"}, "reverse_primer": {"seq": "CAATGAAATATGTGTTAGACCTACAAATTCTTC"}, "target_name": "Pf3D7_04_v3-0316623-0316825"}, {"forward_primer": {"seq": "TGAAAGAGAAATATAATATACAACAGGAGGAAA"}, "reverse_primer": {"seq": "GTGTCTGTATTTAATAAATGATTATCTGGGTTA"}, "target_name": "Pf3D7_04_v3-0544486-0544685"}, {"forward_primer": {"seq": "AAGATTGATTAAATTTCACATTATACCTTCCA"}, "reverse_primer": {"seq": "TTTCCCTTGATACAATTTAATAAAAAGGGAATA"}, "target_name": "Pf3D7_04_v3-0648096-0648299"}, {"forward_primer": {"seq": "CGACGTTTTCGATATTTATGCCAT"}, "reverse_primer": {"seq": "TCATTTACATTATCCACAGTTTCTTTGTTTAAA"}, "target_name": "Pf3D7_04_v3-0748128-0748326"}, {"forward_primer": {"seq": "AAAAATTACAAAATGTTGTAGTTATGGGAAGAA"}, "reverse_primer": {"seq": "TCTAAAAATTCTTGATAAACAACGGAACCT"}, "target_name": "Pf3D7_04_v3-0748406-0748581"}, {"forward_primer": {"seq": "TTCCGTTGTTTATCAAGAATTTTTAGAAAAGAA"}, "reverse_primer": {"seq": "TTTTTCTTCTCCTTTTATACAATTTTGTTCATT"}, "target_name": "Pf3D7_04_v3-0748617-0748789"}, {"forward_primer": {"seq": "AATTCATGGTAAATATTATCTCCATTTTGATCA"}, "reverse_primer": {"seq": "TGAAAATAAGGTAGGTGAAGAAAGAGAACT"}, "target_name": "Pf3D7_04_v3-0900558-0900729"}, {"forward_primer": {"seq": "ATCATCATGAATATGTTTTCCTGATACATAAAT"}, "reverse_primer": {"seq": "AATTCTTATGGAACAAAATTCGAATCAGGATA"}, "target_name": "Pf3D7_04_v3-1005970-1006155"}, {"forward_primer": {"seq": "AGTTAATGAAATAGCTCAACTTAATTTAACCAT"}, "reverse_primer": {"seq": "TGACATAAATTACTACGTCATAGGTATTTGGT"}, "target_name": "Pf3D7_04_v3-1037676-1037859"}, {"forward_primer": {"seq": "ACAGCATTAGATACGGTTTTCCATC"}, "reverse_primer": {"seq": "CACTAAACGTAGCATGCTCAGATATTA"}, "target_name": "Pf3D7_04_v3-1113421-1113612"}, {"forward_primer": {"seq": "TTTATCCTTATCATTATTTCCATCATTTTCTGG"}, "reverse_primer": {"seq": "AAAAATAAAAGGAACAATGTAATGGTTGAAAA"}, "target_name": "Pf3D7_05_v3-0213059-0213219"}, {"forward_primer": {"seq": "AAAGCATCATTTTGCTCATAATTATATGTATGA"}, "reverse_primer": {"seq": "GAACAGTTCATATATATAATTCAACAACAGCCA"}, "target_name": "Pf3D7_05_v3-0350840-0351019"}, {"forward_primer": {"seq": "CGAGAATTATGCCTCCTATAATCATAGTGA"}, "reverse_primer": {"seq": "TGACCACATGTCTATATTACTATGATGATTATT"}, "target_name": "Pf3D7_05_v3-0369705-0369916"}, {"forward_primer": {"seq": "ATTTGATACAGGATGTGAAATTTTTGCATTATC"}, "reverse_primer": {"seq": "ATTGAACTCTTTGATATCTCAGAAAAATTCTTT"}, "target_name": "Pf3D7_05_v3-0395919-0396103"}, {"forward_primer": {"seq": "ATTCAAATGTATATTGTTCTCCTCATAAGAAC"}, "reverse_primer": {"seq": "CAAGTTCAAAATATCCGAAGAGAAACAGA"}, "target_name": "Pf3D7_05_v3-0550834-0551043"}, {"forward_primer": {"seq": "AACGTGCTACATATTTATAAATTCACTAAAGA"}, "reverse_primer": {"seq": "CGTGTATGTAGGAAATAAATTGTGTTCACAA"}, "target_name": "Pf3D7_05_v3-0641162-0641373"}, {"forward_primer": {"seq": "TAACATGACCATCCCTTGTGATACT"}, "reverse_primer": {"seq": "CCAACGTTTCTTCGATCAAATGATT"}, "target_name": "Pf3D7_05_v3-0668787-0668979"}, {"forward_primer": {"seq": "CGTTAAGTAGTACCTTTGGTTATTTTATGTTAG"}, "reverse_primer": {"seq": "AAAACTACCATTTAATCCTGATAGAATAGCA"}, "target_name": "Pf3D7_05_v3-0796550-0796728"}, {"forward_primer": {"seq": "GCTGTATTATCAGGAGGAACATTACCT"}, "reverse_primer": {"seq": "TCAGATCTTAATTTAGATCCAGGATTATTATCA"}, "target_name": "Pf3D7_05_v3-0958105-0958317"}, {"forward_primer": {"seq": "AGTGAGTTCAGGAATTGGTACGA"}, "reverse_primer": {"seq": "CCCATTAAAGCCTCTTCTATAATGGACA"}, "target_name": "Pf3D7_05_v3-0958394-0958580"}, {"forward_primer": {"seq": "TGAAAGCTTTAGAAGCAACAAATAGTTTATATG"}, "reverse_primer": {"seq": "CAATTAATTTTAGTATGGTTGATTTCCCACAAC"}, "target_name": "Pf3D7_05_v3-0958952-0959135"}, {"forward_primer": {"seq": "CAGATGATGAAATGTTTAAAGATCCAAGTTTT"}, "reverse_primer": {"seq": "AATTAAGAAGGATCCAAACCAATAGGC"}, "target_name": "Pf3D7_05_v3-0960841-0961021"}, {"forward_primer": {"seq": "AAAAATGTAAATGAATTTTCAAACCAATCTGGA"}, "reverse_primer": {"seq": "ATAGCAGCAAACTTACTAACACGTTTAA"}, "target_name": "Pf3D7_05_v3-0961543-0961730"}, {"forward_primer": {"seq": "TCTTTAAATAAAACTAACACATCTAATGCACCA"}, "reverse_primer": {"seq": "AATATAGGTTTAAATATAGATGCAGAGATTGGT"}, "target_name": "Pf3D7_05_v3-1188488-1188673"}, {"forward_primer": {"seq": "TTTTCTATTGAATCCATGAAATAGGAATATGAA"}, "reverse_primer": {"seq": "ATCAGCAACGATAGTACAAATTGAATGA"}, "target_name": "Pf3D7_05_v3-1322131-1322313"}, {"forward_primer": {"seq": "GCTATCTTTTATAAATGTACCACTATTAAACCA"}, "reverse_primer": {"seq": "CAAGGAAGGTAGAATATCAAATACAAGGG"}, "target_name": "Pf3D7_06_v3-0145317-0145502"}, {"forward_primer": {"seq": "ACTTCTCCTTTAATTGAAAATGTTTTCACAC"}, "reverse_primer": {"seq": "TGCTCAAAGTATGATAAAAGGTATATTTAATCC"}, "target_name": "Pf3D7_06_v3-0176138-0176305"}, {"forward_primer": {"seq": "CGCATCGAAACTTAATTTGAGTACG"}, "reverse_primer": {"seq": "AATTTCGTTATAAAAACTCTTTTGCTCTGAAA"}, "target_name": "Pf3D7_06_v3-0416486-0416688"}, {"forward_primer": {"seq": "TGATCAAGCTGAATCTATCCTATTGGATC"}, "reverse_primer": {"seq": "TGGTATATTGTTTATTGGGATCCCCTT"}, "target_name": "Pf3D7_06_v3-0532194-0532380"}, {"forward_primer": {"seq": "ACACTGACATTTTACTGCACCTTC"}, "reverse_primer": {"seq": "GAAAGGAAGATATTATGCCACTGCA"}, "target_name": "Pf3D7_06_v3-0851515-0851740"}, {"forward_primer": {"seq": "ATCTACATATTCTATAGGACAGTAAGATCTCA"}, "reverse_primer": {"seq": "ACTCAAAAGAATTAATAAACACTGACATGGTA"}, "target_name": "Pf3D7_06_v3-1115931-1116136"}, {"forward_primer": {"seq": "GTTTTCTTTTTCATGTGTAACAGGATTATAAGT"}, "reverse_primer": {"seq": "AAAAATTCACCTAACTTGTCATCAGC"}, "target_name": "Pf3D7_06_v3-1128590-1128771"}, {"forward_primer": {"seq": "ATCAGTTTTTAGATTTCCATTAGTTCCATTTAC"}, "reverse_primer": {"seq": "GCATTCAGAATTCCTCCAATAATAGAGT"}, "target_name": "Pf3D7_06_v3-1135637-1135827"}, {"forward_primer": {"seq": "ACTTACATTGTCGTTGCCTTTATTTTTATTA"}, "reverse_primer": {"seq": "TAATGATTTGGAATATACTACTTGTGCCAATC"}, "target_name": "Pf3D7_06_v3-1136121-1136332"}, {"forward_primer": {"seq": "TCCTCTCAATACTCTCAAAACACGA"}, "reverse_primer": {"seq": "AGATAGGTGAACATAATAATATGCAAATACATT"}, "target_name": "Pf3D7_06_v3-1140924-1141141"}, {"forward_primer": {"seq": "AAAAGTATAAATAGAATGATCGAATGTGTTCA"}, "reverse_primer": {"seq": "AATGATATCGTTTTTACCACTGAAATACCAA"}, "target_name": "Pf3D7_06_v3-1192659-1192836"}, {"forward_primer": {"seq": "ATTAATAATGGTCCTTCTATTACCATTAAAGGT"}, "reverse_primer": {"seq": "TTGAAGTATATTTTAGGAAGTGTCCATTCAAC"}, "target_name": "Pf3D7_06_v3-1197277-1197483"}, {"forward_primer": {"seq": "AACTTGTAATATTACGCTTCTAAATGTTGAT"}, "reverse_primer": {"seq": "TTCTTAATCTTTTCCTTATTCTCCTTATCCATA"}, "target_name": "Pf3D7_06_v3-1214845-1215036"}, {"forward_primer": {"seq": "ACAAAACCAAATGACAATCCAAAATCTATAAT"}, "reverse_primer": {"seq": "TGGTGGTGTTAGATCTAGTACGG"}, "target_name": "Pf3D7_06_v3-1215267-1215479"}, {"forward_primer": {"seq": "CACCACCAGGTGTAAATCGAC"}, "reverse_primer": {"seq": "AAAAACGAGTCATCAAAAAGTAGTAAGAA"}, "target_name": "Pf3D7_06_v3-1215515-1215727"}, {"forward_primer": {"seq": "ATTTGATTCTGAAGGAAGCATAAAATATAAAGA"}, "reverse_primer": {"seq": "ACACCCTTTTCATATTCATTCAAAATACTTCTT"}, "target_name": "Pf3D7_06_v3-1235427-1235625"}, {"forward_primer": {"seq": "ACAAGTGAGGAGTTATTTTTAGAGAAATTAAA"}, "reverse_primer": {"seq": "TCGTATAAGTAGAAATATTTTTCTTTCGGTGG"}, "target_name": "Pf3D7_06_v3-1282687-1282898"}, {"forward_primer": {"seq": "CATGAGTACTGTGTTCTTTCTTATGTTCT"}, "reverse_primer": {"seq": "GCCCATGGATTATTTGAAGAAATTGAAA"}, "target_name": "Pf3D7_07_v3-0105200-0105414"}, {"forward_primer": {"seq": "GACCTTAACAGATGGCTCACG"}, "reverse_primer": {"seq": "AAAGAACATAATCATACAAATAAAGTTGTGAGT"}, "target_name": "Pf3D7_07_v3-0403499-0403683"}, {"forward_primer": {"seq": "CAGATGGCTCACGTTTAGGTG"}, "reverse_primer": {"seq": "TTCCCTTTTTATTTCCAAATAAGGAATAAACAA"}, "target_name": "Pf3D7_07_v3-0403507-0403717"}, {"forward_primer": {"seq": "AGGACATATGAGTTGCCCTTTAGA"}, "reverse_primer": {"seq": "TACAATTGTCAGGACACGAAAATCATT"}, "target_name": "Pf3D7_07_v3-0432855-0433064"}, {"forward_primer": {"seq": "ACTTATGATTTGTCCAAATATGAAAAACAAC"}, "reverse_primer": {"seq": "AATTTATGTATAAGTTTGCTGGTTTTGTTTATT"}, "target_name": "Pf3D7_07_v3-0475343-0475512"}, {"forward_primer": {"seq": "AGAAAGATTGTCCATTTACATAATTTGCAGA"}, "reverse_primer": {"seq": "TTCTATTTTAGAAGGAAATGAAGGAGATATGAA"}, "target_name": "Pf3D7_07_v3-0627381-0627592"}, {"forward_primer": {"seq": "ATTTTATCCATTAATTTTATGATGAAGGTGTGG"}, "reverse_primer": {"seq": "ATCCCTCTCTATCTCATCTTCATTCTTATTAT"}, "target_name": "Pf3D7_07_v3-0717292-0717461"}, {"forward_primer": {"seq": "GTAAATCAAGCCATTGATTTAACTCTCC"}, "reverse_primer": {"seq": "AAAGAGAGGCGTTTTCTAACGAAAA"}, "target_name": "Pf3D7_07_v3-0729507-0729725"}, {"forward_primer": {"seq": "AATACATATAGAAAAGATGATAGAAGAAGCTCC"}, "reverse_primer": {"seq": "TTTTCATATTCTGTCGAGGATAACAATTCAATA"}, "target_name": "Pf3D7_07_v3-0896645-0896816"}, {"forward_primer": {"seq": "ACTAAAAATAACTCTTGATCTTTATCTTCGTT"}, "reverse_primer": {"seq": "TGTTGAATAATATGAATGAAAATAATCATTCGC"}, "target_name": "Pf3D7_07_v3-1028361-1028570"}, {"forward_primer": {"seq": "ATGTTAGGAACACGCTTATCATTTATCTTTT"}, "reverse_primer": {"seq": "ACAGATATGAGCTCCTTCTCTTTAATAACC"}, "target_name": "Pf3D7_07_v3-1044011-1044195"}, {"forward_primer": {"seq": "AAAGATAAAAATGGATATTATACAATGGCTTCA"}, "reverse_primer": {"seq": "CCCATATGCGCACAGTTTATAACA"}, "target_name": "Pf3D7_07_v3-1066693-1066879"}, {"forward_primer": {"seq": "GAAATCTAGAGATGAATAATCTGGACATGTAG"}, "reverse_primer": {"seq": "TGTATACTCTCACATATTCCCTTCAGTG"}, "target_name": "Pf3D7_07_v3-1149398-1149585"}, {"forward_primer": {"seq": "CATTAACATATAAAGTATCAGAACTTGTCGCT"}, "reverse_primer": {"seq": "TGTTGAAGAGTCAAGTTTTGTTCAGAA"}, "target_name": "Pf3D7_08_v3-0102308-0102500"}, {"forward_primer": {"seq": "AATATTTCCCACAATATGAATACATGAATATGA"}, "reverse_primer": {"seq": "ACATATAATAATCTTGAACCCTCTTTCTCAAGT"}, "target_name": "Pf3D7_08_v3-0336453-0336618"}, {"forward_primer": {"seq": "TTGTATTAATGAAGATGCCGATTGCT"}, "reverse_primer": {"seq": "AAAAAGATGACAATTTTGCTCTTGTGA"}, "target_name": "Pf3D7_08_v3-0399718-0399934"}, {"forward_primer": {"seq": "GATGATAGTTATTTTCTTGACATCATGTCAAAT"}, "reverse_primer": {"seq": "TTTCACAATTTTCTTTCATTTCTCTTTTTAGAT"}, "target_name": "Pf3D7_08_v3-0412833-0413029"}, {"forward_primer": {"seq": "AGATAATTGTGTACACACAAATATAAATGTACC"}, "reverse_primer": {"seq": "ATTTTCTTTACTTGAGTGATTAGTATTTCGAGA"}, "target_name": "Pf3D7_08_v3-0476264-0476442"}, {"forward_primer": {"seq": "CAGATGGAGGTATTTTTGTTGAACCTA"}, "reverse_primer": {"seq": "TTGGTTTCGCATCACATTTAACAATTTTATT"}, "target_name": "Pf3D7_08_v3-0549609-0549776"}, {"forward_primer": {"seq": "ATGCATAAAAGAGGAAATCCACATACAAT"}, "reverse_primer": {"seq": "GGGCAATAAATCTTTTTCTTGAATATCCAATAA"}, "target_name": "Pf3D7_08_v3-0549988-0550182"}, {"forward_primer": {"seq": "TTCTTGTATTAAATGGAATACCTCGTTATAGGA"}, "reverse_primer": {"seq": "ATCCAATTGTGTGATTTGTCCACA"}, "target_name": "Pf3D7_08_v3-0550089-0550294"}, {"forward_primer": {"seq": "TCATAAGGGAACCTAAATTATTAGTATAATCGT"}, "reverse_primer": {"seq": "CCTTCATAGTATAACTGTTACTGGTCCT"}, "target_name": "Pf3D7_08_v3-0585363-0585562"}, {"forward_primer": {"seq": "CTTTTAAACGATGATAACCTATATCTGCATCAT"}, "reverse_primer": {"seq": "GAAGTTATTAATTTTAAAATTGAACGTGAAACC"}, "target_name": "Pf3D7_08_v3-0585735-0585916"}, {"forward_primer": {"seq": "ATTCTAATAATATTTCCACCAAAACAATGTCC"}, "reverse_primer": {"seq": "AAACTAATGATTATAAAATATGGAGTGCTCAAG"}, "target_name": "Pf3D7_08_v3-0586024-0586233"}, {"forward_primer": {"seq": "GGCTAGTAACAGTACAGCTAGTTGT"}, "reverse_primer": {"seq": "TGCATCATCATTGTCTAAAGCTTCG"}, "target_name": "Pf3D7_08_v3-1056702-1056878"}, {"forward_primer": {"seq": "AGATAATTTGAAAAACGATGAAAAAGATGAAG"}, "reverse_primer": {"seq": "AGCAAAATTATCACATATGTTACATTCATACAC"}, "target_name": "Pf3D7_08_v3-1099750-1099944"}, {"forward_primer": {"seq": "TTGTTATATCCGTTGATATAAAAGAAGGATCAT"}, "reverse_primer": {"seq": "GGGACCTTACAACCTTTTTGTAAGC"}, "target_name": "Pf3D7_08_v3-1176345-1176524"}, {"forward_primer": {"seq": "AGAAAAACAAATAGGTTTATGGAATAAATGGA"}, "reverse_primer": {"seq": "AATCATCAATATGTTTCACATATCTTGCAA"}, "target_name": "Pf3D7_08_v3-1313119-1313308"}, {"forward_primer": {"seq": "AAGTGGAACATATGAAATTCAAGAGGA"}, "reverse_primer": {"seq": "TGTTTATTTTTCCATTCCTTCATATTTTCTTTT"}, "target_name": "Pf3D7_08_v3-1314743-1314953"}, {"forward_primer": {"seq": "AATTTTCTTATATAACCTAAGTTGATGACTTGG"}, "reverse_primer": {"seq": "AGAACAGATGAAGTAACTACTCGATTAAATGA"}, "target_name": "Pf3D7_08_v3-1344650-1344813"}, {"forward_primer": {"seq": "TTGTGTCCGAATACTTTTTCTTTAACCA"}, "reverse_primer": {"seq": "CTTAGGTATTTTTGCATCTATTAATTTGCTTTT"}, "target_name": "Pf3D7_09_v3-0082033-0082203"}, {"forward_primer": {"seq": "ACCCAAAATGATAAATCTTCTTCATTTCTAAAA"}, "reverse_primer": {"seq": "ACCAAAAATGCTATTATTATTTTTCTGGGAA"}, "target_name": "Pf3D7_09_v3-0163845-0164021"}, {"forward_primer": {"seq": "TTTTTGGTAATACAGCTAATAATACGGCAA"}, "reverse_primer": {"seq": "GGCTTTCGTTTGACTTTACTTCTG"}, "target_name": "Pf3D7_09_v3-0164074-0164287"}, {"forward_primer": {"seq": "GTAAACAATGAATAAATATTCTTGCCAATTCGA"}, "reverse_primer": {"seq": "ATGTGTGATAGAGAAAGGTTCAATTGTTTA"}, "target_name": "Pf3D7_09_v3-0202886-0203076"}, {"forward_primer": {"seq": "CCTTCAGCTTCTTCTAATTCTTCCATT"}, "reverse_primer": {"seq": "AGATGCTATTGCGGAAAAAGACAT"}, "target_name": "Pf3D7_09_v3-0270941-0271136"}, {"forward_primer": {"seq": "ACACAAAATGGTACTTTTAAAGATTGTTTATG"}, "reverse_primer": {"seq": "TGGACAATAAAAACCTATGGGACATTC"}, "target_name": "Pf3D7_09_v3-0516766-0516980"}, {"forward_primer": {"seq": "TTTAGTAATGTTACATATAATATTCCACACGGT"}, "reverse_primer": {"seq": "AAACAAACTGAAGATTTCATTACACAATATG"}, "target_name": "Pf3D7_09_v3-0595860-0596063"}, {"forward_primer": {"seq": "CAAGTTCAACCGAACAAATATAATCACG"}, "reverse_primer": {"seq": "GGGCGAAATTCTATGAATGTATTATTAATAGAA"}, "target_name": "Pf3D7_09_v3-0685587-0685792"}, {"forward_primer": {"seq": "GCTACCGATTGAATAGTTGAATCTTTGT"}, "reverse_primer": {"seq": "TGTTCCAAAGGATTGAAATATATTTGTACTTTT"}, "target_name": "Pf3D7_09_v3-1015130-1015317"}, {"forward_primer": {"seq": "CTTTTAAATGAAGTGTCTGCTAGTACAGAT"}, "reverse_primer": {"seq": "TTCACCATTTTCTATTATTATTTCATCCTCTCC"}, "target_name": "Pf3D7_09_v3-1406371-1406581"}, {"forward_primer": {"seq": "AACAAAATTGCCTATCATTAATGGAAAATATC"}, "reverse_primer": {"seq": "TCATTCGTATGACCCATATAATCTTCATTTTTC"}, "target_name": "Pf3D7_10_v3-0992362-0992570"}, {"forward_primer": {"seq": "ACGAATGATGCTTATAGTCAACATGG"}, "reverse_primer": {"seq": "CACAAGTATCAGTATTCAATTCATTACATGAAT"}, "target_name": "Pf3D7_10_v3-0992621-0992836"}, {"forward_primer": {"seq": "TTAATAACTCCATAAGTGCTACAGTTATATAGG"}, "reverse_primer": {"seq": "AAACTTAAAAATGAGGACAAGGAAAATAATACA"}, "target_name": "Pf3D7_10_v3-1386689-1386876"}, {"forward_primer": {"seq": "TGATGGTGACAAAAGAGGTAAAGTAATTT"}, "reverse_primer": {"seq": "TTTTTGTTCTTCTTTTACACTGTGTATTTTGG"}, "target_name": "Pf3D7_10_v3-1392399-1392588"}, {"forward_primer": {"seq": "TTAAAGCATTATGAAGAATGGGTTAATAGAAGG"}, "reverse_primer": {"seq": "AAAGAAGTGGTTGTTAGAGAATCTTGATTTT"}, "target_name": "Pf3D7_10_v3-1414369-1414565"}, {"forward_primer": {"seq": "CAACGTCTATTAATAGTGTTAGGGATTCTAGT"}, "reverse_primer": {"seq": "ATTTTTCTTCAGTAATAATATTTGTACCAGGAA"}, "target_name": "Pf3D7_10_v3-1414630-1414799"}, {"forward_primer": {"seq": "TTCTTATATCAACCTTTTCAAGAGGAACTTTAG"}, "reverse_primer": {"seq": "AATAGCTTTACGTTATGATCCAGAAAATAATGA"}, "target_name": "Pf3D7_11_v3-0115945-0116151"}, {"forward_primer": {"seq": "CTGTAATACTATTTTCATAAGAACTGCTTCCA"}, "reverse_primer": {"seq": "AAAACTAGTGAAGGGAATATCAAAGAATATAGA"}, "target_name": "Pf3D7_11_v3-0119463-0119672"}, {"forward_primer": {"seq": "ACTAATGATCCATATAAAAACGCTCAAAATAT"}, "reverse_primer": {"seq": "CATCCTGTGTATCATAATTTTGTTCATTCG"}, "target_name": "Pf3D7_11_v3-0408316-0408504"}, {"forward_primer": {"seq": "AATAACTTAAATAAAAATATGGACGGCTCC"}, "reverse_primer": {"seq": "GACATTCTTTCAATGCTTCCGAAA"}, "target_name": "Pf3D7_11_v3-0408572-0408747"}, {"forward_primer": {"seq": "ACTAAAATAGAAAATTTCGAGCAACTTTTC"}, "reverse_primer": {"seq": "GCTGATTGAGCAAAAGTAAAAATTTCTTC"}, "target_name": "Pf3D7_11_v3-0497306-0497519"}, {"forward_primer": {"seq": "TTTTTATATTTAAAACTGACATGACCAAAAACT"}, "reverse_primer": {"seq": "ACTGGATGAAAAGAATCCTCCCAA"}, "target_name": "Pf3D7_11_v3-1006725-1006893"}, {"forward_primer": {"seq": "AGGAAGTGAATATATTAGAAATGTCTGAATTTT"}, "reverse_primer": {"seq": "ATTTATATTTTAAAGGTGCATGCTATTTTTGT"}, "target_name": "Pf3D7_11_v3-1018813-1019021"}, {"forward_primer": {"seq": "AAATAAGAATGTCTTAACACAACAAAGGA"}, "reverse_primer": {"seq": "ATGTGAAGAAGAAAATATGATTACACATGAAT"}, "target_name": "Pf3D7_11_v3-1019078-1019287"}, {"forward_primer": {"seq": "GTCTTCTTAAGAAAAGGAAACAAACCATTT"}, "reverse_primer": {"seq": "CGGCATTTAGCTCGATATTGGT"}, "target_name": "Pf3D7_11_v3-1127103-1127294"}, {"forward_primer": {"seq": "GGAAGAGGACAGAATTATTGGGAAC"}, "reverse_primer": {"seq": "AATTACTTCTTTCTACTATTTCAATGCTTGAA"}, "target_name": "Pf3D7_11_v3-1293943-1294136"}, {"forward_primer": {"seq": "GAAACAGCATGTTTTGTTTTAGACCAG"}, "reverse_primer": {"seq": "TGTTTAGGTTGATCCGAAGCAC"}, "target_name": "Pf3D7_11_v3-1294690-1294888"}, {"forward_primer": {"seq": "AACATGTTTAATTAACAATTCATCATACATTGC"}, "reverse_primer": {"seq": "GGTCACATGGGCATTTTAAACTGT"}, "target_name": "Pf3D7_11_v3-1295135-1295311"}, {"forward_primer": {"seq": "GTATGTAAATGTGTAGAAAGAAGGGCA"}, "reverse_primer": {"seq": "TCATCCATTTTATCATATTTTTCAGCATTTCCT"}, "target_name": "Pf3D7_11_v3-1295397-1295564"}, {"forward_primer": {"seq": "GTACCATCAACACTATATGCAAACATTTTC"}, "reverse_primer": {"seq": "GAAAATTATTAGAAGAACATCCAAATGAAGAAG"}, "target_name": "Pf3D7_11_v3-1374946-1375115"}, {"forward_primer": {"seq": "ATTTGATACACCATTGTCTTGGATATTATTTTG"}, "reverse_primer": {"seq": "AGAAGAATTTATGGAAAGGATCTACTTAAGAA"}, "target_name": "Pf3D7_11_v3-1375839-1376024"}, {"forward_primer": {"seq": "CAAAATTATTCATCATGCTATTTGTGCCA"}, "reverse_primer": {"seq": "AACTGTAGAAGAGCATTCTTTAAGTAGTA"}, "target_name": "Pf3D7_11_v3-1376086-1376276"}, {"forward_primer": {"seq": "ATCTTTTTCGTTGTATGTGCATAATCA"}, "reverse_primer": {"seq": "AAACATAATTCTAATGATATTGACCTTGTGCA"}, "target_name": "Pf3D7_11_v3-1816178-1816346"}, {"forward_primer": {"seq": "ACTTTCGGTGTTTTTCTGGTATATCATT"}, "reverse_primer": {"seq": "AAAAGAAAGAAAACAAAAAGCACTAAATCTTAT"}, "target_name": "Pf3D7_11_v3-1934989-1935203"}, {"forward_primer": {"seq": "GCTATCCACTTCTTACAACGTGATAAATTATTT"}, "reverse_primer": {"seq": "AACACATTTATCTTATTTACCCGTATCTCATAT"}, "target_name": "Pf3D7_12_v3-0063113-0063281"}, {"forward_primer": {"seq": "TCTAAATTCTGTCCCTTCACCTAAAGTT"}, "reverse_primer": {"seq": "ATTCTGATGATATATGTGATGACATTTTTGAT"}, "target_name": "Pf3D7_12_v3-0233445-0233639"}, {"forward_primer": {"seq": "AATGGATTAATGTTTTCTACTTTTCCTTTAGC"}, "reverse_primer": {"seq": "TGTCTTGTTATCATTGGCTTTTTCATTGTATA"}, "target_name": "Pf3D7_12_v3-0529526-0529735"}, {"forward_primer": {"seq": "CATATGTTGCTGGGTCGACTTT"}, "reverse_primer": {"seq": "GCTTTTCTTGAATCACAATCAATGAATAAGA"}, "target_name": "Pf3D7_12_v3-0659902-0660096"}, {"forward_primer": {"seq": "TCAGGAATTTACCATTAATATCAATTATTGGTC"}, "reverse_primer": {"seq": "TTGATCCTTTATTTCTTTTGAAAACTTTTCTTG"}, "target_name": "Pf3D7_12_v3-0684043-0684207"}, {"forward_primer": {"seq": "AAAATCCTTCTTTTCCAACTGTCATATATATAC"}, "reverse_primer": {"seq": "TCTTTGACATTTTTCAAAAACGACATACTG"}, "target_name": "Pf3D7_12_v3-0857082-0857293"}, {"forward_primer": {"seq": "AATCGGTGGCAAGGTTTACAATATT"}, "reverse_primer": {"seq": "TCTCAGAAATAATAGTGGAACCATAATATTGTA"}, "target_name": "Pf3D7_12_v3-1959668-1959858"}, {"forward_primer": {"seq": "ATGATTTGTTCATATTATAGGTACCATGGC"}, "reverse_primer": {"seq": "TCTTATGACCATTTAATATACATAAAGGATCCT"}, "target_name": "Pf3D7_12_v3-2092558-2092765"}, {"forward_primer": {"seq": "CTTGATTTGTCATTTAACCCGTGTTATAG"}, "reverse_primer": {"seq": "ATCCCATATATTAACAGAAGAATCAAAAGAGG"}, "target_name": "Pf3D7_12_v3-2092682-2092852"}, {"forward_primer": {"seq": "GGTATTACTCAACCAAGAAAAATAGCTGTA"}, "reverse_primer": {"seq": "ATCCATATTTATACTTCTTTCATGTGCTTC"}, "target_name": "Pf3D7_13_v3-0146724-0146904"}, {"forward_primer": {"seq": "ACAGATATGGATTTTTCCATATCTATTGAAC"}, "reverse_primer": {"seq": "GAATGTTTTAACAATATAGGTGTGTCATATCTG"}, "target_name": "Pf3D7_13_v3-0156486-0156652"}, {"forward_primer": {"seq": "TCAACAAAATAGATTAATGAGCAATTCTAACTT"}, "reverse_primer": {"seq": "GAGTAACATAATTGTTCTACCTCCTAAAGC"}, "target_name": "Pf3D7_13_v3-0156745-0156956"}, {"forward_primer": {"seq": "TTTAAATTTTCATCCTTCATTACATCCTTTCTA"}, "reverse_primer": {"seq": "AGTCTATAAATCAATCCAACTCAAAACAGC"}, "target_name": "Pf3D7_13_v3-0388170-0388378"}, {"forward_primer": {"seq": "ATGTTTAATATGAATGTACCTGGTGATAATATG"}, "reverse_primer": {"seq": "ATTTTCTCTGTCTTTCAAAATAGCTAATTCATC"}, "target_name": "Pf3D7_13_v3-0479601-0479778"}, {"forward_primer": {"seq": "ACATTCACACAAATAGAAAAATCTTCATTTTTC"}, "reverse_primer": {"seq": "ATCAATAATCAAAATCATGATAACAACCAATTT"}, "target_name": "Pf3D7_13_v3-0815894-0816058"}, {"forward_primer": {"seq": "GCTTTCAGATTTGAAACTAATGATTTGATTGTT"}, "reverse_primer": {"seq": "TGACTTGCACTTTTTCCATCGAAT"}, "target_name": "Pf3D7_13_v3-0852679-0852897"}, {"forward_primer": {"seq": "ACTACATGGGCTTCCAAATAAACATG"}, "reverse_primer": {"seq": "ACAACCAAACCTAGTAATAGTAGAAGTAAAG"}, "target_name": "Pf3D7_13_v3-0911782-0911974"}, {"forward_primer": {"seq": "AAATTCAATAACATGAATGATGACTACTCCAA"}, "reverse_primer": {"seq": "TCTAGAACAATACTTGCCCTTTCTCT"}, "target_name": "Pf3D7_13_v3-0935644-0935858"}, {"forward_primer": {"seq": "TTTAATGATGTTAATACAAAATCTGCATCTTTT"}, "reverse_primer": {"seq": "GAAAAAGATACAAATATAACATACCCTTGGTAT"}, "target_name": "Pf3D7_13_v3-1004772-1004969"}, {"forward_primer": {"seq": "CAGCAAAGATGGAGAAACATTCTCT"}, "reverse_primer": {"seq": "GGTTTTGTTTCAATTTTTCTTGGTGGTA"}, "target_name": "Pf3D7_13_v3-1146788-1146982"}, {"forward_primer": {"seq": "GTGTGGGTTCCTCACAAATGTTATT"}, "reverse_primer": {"seq": "GTGGTGCAAAGATATTAACGTATTTATTAGAGA"}, "target_name": "Pf3D7_13_v3-1233117-1233299"}, {"forward_primer": {"seq": "AGTGCTAATATAATTACAAAAACATTTTCGTTC"}, "reverse_primer": {"seq": "TGTTTTTGAAAATAATATTCTTCCTCCCTGAT"}, "target_name": "Pf3D7_13_v3-1265526-1265694"}, {"forward_primer": {"seq": "ACTTTTATGTATATCGTTTCGATTTAGGTCTTC"}, "reverse_primer": {"seq": "ATCGTATGAGAGGTATGTTAGGTAAAGAAAA"}, "target_name": "Pf3D7_13_v3-1350887-1351062"}, {"forward_primer": {"seq": "CCATTGTTAGGATATTCTTTTGTTTCTTCTTTC"}, "reverse_primer": {"seq": "AATGATGACAAATTGAGTGAAAATCCTG"}, "target_name": "Pf3D7_13_v3-1406745-1406947"}, {"forward_primer": {"seq": "TCTTTAGAATTTAAAACGAAGTCTTCATATTCT"}, "reverse_primer": {"seq": "GGTAAAGGCACAAAGTGAAACAGAT"}, "target_name": "Pf3D7_13_v3-1419395-1419601"}, {"forward_primer": {"seq": "CCTTCTTCTGGATTTGGTGAAGG"}, "reverse_primer": {"seq": "TGTGGTGTTTGGGACGAATG"}, "target_name": "Pf3D7_13_v3-1465638-1465870"}, {"forward_primer": {"seq": "TTTTCTACTTCAACACAAACAGCCT"}, "reverse_primer": {"seq": "CAATTAGTTGTTATATTAACAGATGGAATTCCA"}, "target_name": "Pf3D7_13_v3-1465925-1466124"}, {"forward_primer": {"seq": "TGGTGAAAAGAAATGACATGAATTTAGAACT"}, "reverse_primer": {"seq": "GGGAACAATTTCCATATGCCTTATTAGAA"}, "target_name": "Pf3D7_13_v3-1724925-1725137"}, {"forward_primer": {"seq": "CCTGAACTTCTAGCTTCTAATAAGGCAT"}, "reverse_primer": {"seq": "GGATATGATGGCTCTTCTATTATACCGAA"}, "target_name": "Pf3D7_13_v3-1725151-1725336"}, {"forward_primer": {"seq": "CTCTCACCATTAGTTCCACCAATG"}, "reverse_primer": {"seq": "GGTGTATGATCGTTTAAGAGATGTATGGTA"}, "target_name": "Pf3D7_13_v3-1725231-1725441"}, {"forward_primer": {"seq": "ATTCTACCATTTGACGTAACACCAC"}, "reverse_primer": {"seq": "GTGGATTTGATGGTGTAGAATATTTAAATTCG"}, "target_name": "Pf3D7_13_v3-1725403-1725620"}, {"forward_primer": {"seq": "CATACACCTCAGTTTCAAATAAAGCCTTAT"}, "reverse_primer": {"seq": "GCCTTGTTGAAAGAAGCAGAATTTT"}, "target_name": "Pf3D7_13_v3-1725493-1725694"}, {"forward_primer": {"seq": "ACAAGGCTTCACTTTCACTTAAATCTTT"}, "reverse_primer": {"seq": "CTGAAACTATGATTGATATTAATGTTGGTGGA"}, "target_name": "Pf3D7_13_v3-1725740-1725923"}, {"forward_primer": {"seq": "GTTGTGTTAAGGTATGTCTAGATGTTTCA"}, "reverse_primer": {"seq": "AAAAAGAAAAAGAAGAACATAGGAAACGA"}, "target_name": "Pf3D7_13_v3-1725915-1726094"}, {"forward_primer": {"seq": "TCGATTTCTTGTAAAAATCTTAATCTTTCTTCA"}, "reverse_primer": {"seq": "AAGACACAAATGAATTTTATTCGAGAAAAAGAT"}, "target_name": "Pf3D7_13_v3-1726089-1726271"}, {"forward_primer": {"seq": "TCATGTAATTTCTGTTCTTCAATATTTTTACGG"}, "reverse_primer": {"seq": "ATGATACTTATGAAAAGAAAATTATTGAAACGG"}, "target_name": "Pf3D7_13_v3-1726206-1726375"}, {"forward_primer": {"seq": "TTTTTACTATCAAAGTTCGAATCTAATACACTC"}, "reverse_primer": {"seq": "GGAAGGAGAAAAAGTAAAAACAAAAGCA"}, "target_name": "Pf3D7_13_v3-1726755-1726967"}, {"forward_primer": {"seq": "ATGTGCACTATCATCAACTAAAGAAATATCT"}, "reverse_primer": {"seq": "ATGTTTTCAAGAAGGAAAAGAAAAAGCC"}, "target_name": "Pf3D7_13_v3-1876421-1876636"}, {"forward_primer": {"seq": "TCTACTGAGGCTTCATGTAAGATATCAATT"}, "reverse_primer": {"seq": "TTGTAGTTCCACAATCATCTGGAATTTT"}, "target_name": "Pf3D7_13_v3-2114271-2114454"}, {"forward_primer": {"seq": "GGATTTCGTATTTTCTGACATGGCAT"}, "reverse_primer": {"seq": "AATACTTGAAGAAAGGTTAAATACCGTATTAAA"}, "target_name": "Pf3D7_13_v3-2114854-2115057"}, {"forward_primer": {"seq": "AGCTATCATTACATGCTGACACAATAT"}, "reverse_primer": {"seq": "GATTAGTTGTGGAGATGATAAAACTATCAAATT"}, "target_name": "Pf3D7_13_v3-2545091-2545258"}, {"forward_primer": {"seq": "CATACAACATCAACAAAAACTTCCACA"}, "reverse_primer": {"seq": "ATTTTCTCTTCATTAGCTAAAGGTATACATG"}, "target_name": "Pf3D7_14_v3-0106893-0107084"}, {"forward_primer": {"seq": "TTCCATTTTTACATTTACATATAACTCCAACTC"}, "reverse_primer": {"seq": "AGAAATGTACGAATTTTAAATGAAGAAAAATGT"}, "target_name": "Pf3D7_14_v3-0120133-0120332"}, {"forward_primer": {"seq": "TTTCTTAATTTCTTTACTACCATATTCCATTCA"}, "reverse_primer": {"seq": "ATGAAGATGAGCAATTTTGCTTATTTATATGT"}, "target_name": "Pf3D7_14_v3-0137430-0137636"}, {"forward_primer": {"seq": "CCATTACTACCAAAAACATGGAAACCTA"}, "reverse_primer": {"seq": "AGTAATTATATTTCCCATTACTTATGGGAAGTT"}, "target_name": "Pf3D7_14_v3-0279590-0279800"}, {"forward_primer": {"seq": "AAGGTTTTGAGCTCTGTATTGAAAAATAAAT"}, "reverse_primer": {"seq": "GGAACCCATAAATTAGCTGAACCG"}, "target_name": "Pf3D7_14_v3-0283380-0283552"}, {"forward_primer": {"seq": "TGATTTTTATGAAGGACCTTTAACTTATGAAAA"}, "reverse_primer": {"seq": "GTAAATCATCGTTATCACAGGTGGTTA"}, "target_name": "Pf3D7_14_v3-0284005-0284184"}, {"forward_primer": {"seq": "TTTTTCTTATTGATTACCGGAGCATTATTTTAT"}, "reverse_primer": {"seq": "CATCATTTAATGTTACACTATCACCAGCATTA"}, "target_name": "Pf3D7_14_v3-0288461-0288664"}, {"forward_primer": {"seq": "TGTTGACAGTGGTACTAGTTCTATAACG"}, "reverse_primer": {"seq": "GTTCAAATCAACAGGTATTATAGATACCATACA"}, "target_name": "Pf3D7_14_v3-0289328-0289517"}, {"forward_primer": {"seq": "ACAGAAAGGATTTCAAATACTATATGTACTTCT"}, "reverse_primer": {"seq": "GTTTTAGTAAGTCCTGAATTAAGAAAATTGACA"}, "target_name": "Pf3D7_14_v3-0293607-0293796"}, {"forward_primer": {"seq": "ACTGTACCAACTGACTTTTTAAATAAAATGTT"}, "reverse_primer": {"seq": "TATTTTCTCATGAATGGGTCACCTAGA"}, "target_name": "Pf3D7_14_v3-0294534-0294741"}, {"forward_primer": {"seq": "GTACCAACTGACTTTTTAAATAAAATGTTGCA"}, "reverse_primer": {"seq": "GGGTCACCTAGAATAAAGGTTGG"}, "target_name": "Pf3D7_14_v3-0294537-0294730"}, {"forward_primer": {"seq": "AAATATTATTTGTGACAGTTTTCATAGTTTTGG"}, "reverse_primer": {"seq": "TCCACATTATCAAACTCACTACCTAAATAACT"}, "target_name": "Pf3D7_14_v3-0297615-0297824"}, {"forward_primer": {"seq": "CCATACAGCTTCATCTAATGTATGGG"}, "reverse_primer": {"seq": "ACAATTTCCGTCATTTCAATAAATTTATAGGGT"}, "target_name": "Pf3D7_14_v3-0297960-0298129"}, {"forward_primer": {"seq": "TTTGATGGACCATTGAACTATGAAAAATTAAAT"}, "reverse_primer": {"seq": "GTATATACTTTATTTGGTGAACGATATTCGAGT"}, "target_name": "Pf3D7_14_v3-0298400-0298603"}, {"forward_primer": {"seq": "ATTCTTGTAGAATATCAAAAGAAATTCGTAACA"}, "reverse_primer": {"seq": "TTGCACAATAATGGAAAAAGAAAATGCA"}, "target_name": "Pf3D7_14_v3-0377797-0377992"}, {"forward_primer": {"seq": "CATAAATCCGTTTTAATGTTTTCCTTTTATACC"}, "reverse_primer": {"seq": "CATCTAATACAAACATGAGTAACTTGGTTAATT"}, "target_name": "Pf3D7_14_v3-0407338-0407509"}, {"forward_primer": {"seq": "CCTTTTCTCGATTTTTCAGTAAATTAAATCCTT"}, "reverse_primer": {"seq": "CTTCCTTGTAATGATTCTATAGTATCAAACAAA"}, "target_name": "Pf3D7_14_v3-0421354-0421514"}, {"forward_primer": {"seq": "TCCCGAAAACATATCACTAGATCCAT"}, "reverse_primer": {"seq": "AAAAATTAAACATGATGCCACATTTTAGTAGT"}, "target_name": "Pf3D7_14_v3-0771432-0771601"}, {"forward_primer": {"seq": "AGGATGAAAAATATAATAATTTGTGTACTTGGA"}, "reverse_primer": {"seq": "AAGAATAATACGAAAAATTAACCATAACCATCA"}, "target_name": "Pf3D7_14_v3-0921208-0921399"}, {"forward_primer": {"seq": "AAAATCTTCATCAACTCTTTGGTTCGA"}, "reverse_primer": {"seq": "ATCATTGTACACAACATTTTAGATCTTATGTTA"}, "target_name": "Pf3D7_14_v3-1038326-1038505"}, {"forward_primer": {"seq": "AGAATGGGATGGAAAATATGTATTCGAT"}, "reverse_primer": {"seq": "TTTTTGATCTTCTACAGATATGGACAAATTAGT"}, "target_name": "Pf3D7_14_v3-1166134-1166338"}, {"forward_primer": {"seq": "TCTTTATATTAGTACCATGAACATCTACCCTAT"}, "reverse_primer": {"seq": "GCACTACGAAACAGATGTTTTGAAATT"}, "target_name": "Pf3D7_14_v3-1392869-1393059"}, {"forward_primer": {"seq": "ATTTACATCGTCTTTATCAATTGATGAATTTG"}, "reverse_primer": {"seq": "CCAGTTCATTAGATTCAAGAACCGA"}, "target_name": "Pf3D7_14_v3-1954881-1955099"}, {"forward_primer": {"seq": "ATGATATACATTATCCATCTCATTTGCTTTTGT"}, "reverse_primer": {"seq": "GGTATTCTAGTAAAAATTCGGGTGGTATC"}, "target_name": "Pf3D7_14_v3-1956088-1956301"}, {"forward_primer": {"seq": "AGATTCTTGTAATTCTATAAAAGCTGATTGT"}, "reverse_primer": {"seq": "GCAAAAGGATAGATATGAAAGGAAATAGCT"}, "target_name": "Pf3D7_14_v3-1956395-1956609"}, {"forward_primer": {"seq": "ATCATACTATAAACCATAAACAAAACTTTGAGT"}, "reverse_primer": {"seq": "AAATCATCAGTTGATTTATTTTTGTTGAATGTT"}, "target_name": "Pf3D7_14_v3-1957250-1957447"}, {"forward_primer": {"seq": "TTTTCATGAAAGGAGTATCCAATAAATGATTTA"}, "reverse_primer": {"seq": "GCACTTACCACGAAAAGGGATAA"}, "target_name": "Pf3D7_14_v3-1992153-1992347"}, {"forward_primer": {"seq": "TTGCTACATATGTTTATGTGTAAAGGTTAATAT"}, "reverse_primer": {"seq": "CAGAAACTTGATGAACAATCAAAGAATATAGC"}, "target_name": "Pf3D7_14_v3-2004394-2004574"}, {"forward_primer": {"seq": "CTTGGATTTCTTAGATTCATTATTCCATTCATC"}, "reverse_primer": {"seq": "ACATTGAATAACGCTCAGCATAGTAC"}, "target_name": "Pf3D7_14_v3-2020636-2020823"}, {"forward_primer": {"seq": "GCATATGCAACCATACCACCAAT"}, "reverse_primer": {"seq": "ATTGTTTGTGGAACACATACAGTATTGA"}, "target_name": "Pf3D7_14_v3-2260555-2260737"}, {"forward_primer": {"seq": "AAAACATCATATGAAGCATATCAAGAACAATC"}, "reverse_primer": {"seq": "TGACATAATAATATCGTTTTTGGATTGTATCCA"}, "target_name": "Pf3D7_14_v3-2355645-2355820"}, {"forward_primer": {"seq": "GTTTCATTTTAGATTTACCTTTTTGCGATCTC"}, "reverse_primer": {"seq": "GAAATTTACAACTGGAAGGTGAAAAACATAC"}, "target_name": "Pf3D7_14_v3-2481064-2481245"}, {"forward_primer": {"seq": "AAAGAATTATTATTGTTCGTTTCGTTTGAAATT"}, "reverse_primer": {"seq": "TAGCGATATGCAAAGAATAACATCAAATGT"}, "target_name": "Pf3D7_14_v3-2695869-2696052"}, {"forward_primer": {"seq": "GCAAAAATGAATATAGGTGGCGATATAAAAGTA"}, "reverse_primer": {"seq": "AATTCTTATTGTAGATGAAACGGTTTTGA"}, "target_name": "Pf3D7_14_v3-2733377-2733564"}, {"forward_primer": {"seq": "AATAATTATACATCTTTATTTGGACACCGTGT"}, "reverse_primer": {"seq": "AGTTTCAATATCCATCATATCATCAACAATAAT"}, "target_name": "Pf3D7_14_v3-2858925-2859127"}, {"forward_primer": {"seq": "CAAGTGAACAACGACCTGCTTATAAT"}, "reverse_primer": {"seq": "CCATTTTTCCATATCCTGGTTGTTCATTA"}, "target_name": "Pf3D7_14_v3-3124441-3124626"}, {"forward_primer": {"seq": "CAGGTTGTTGGGAATTTAACATTACAAAA"}, "reverse_primer": {"seq": "AAGACTTCTTCTTTTCAAATCTAATAAAATTGC"}, "target_name": "Pf3D7_14_v3-3125829-3126040"}, {"forward_primer": {"seq": "AATCTAATTCATTTATGGAATCATACACTTGGT"}, "reverse_primer": {"seq": "AATTTCTTATATCATCAATTGATGGTTGCC"}, "target_name": "Pf3D7_14_v3-3214281-3214486"}], "panel_info": [{"panel_name": "MAD4HATTER", "reactions": [{"panel_targets": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208], "reaction_name": "full"}]}], "specimen_info": [{"specimen_name": "Ghana_pop_01_1"}, {"specimen_name": "Ghana_pop_01_3"}, {"specimen_name": "Ghana_pop_01_4"}, {"specimen_name": "Ghana_pop_01_2"}, {"specimen_name": "Ghana_pop_10_4"}, {"specimen_name": "Ghana_pop_10_3"}, {"specimen_name": "Ghana_pop_10_1"}, {"specimen_name": "Ghana_pop_10_2"}], "library_sample_info": [{"library_sample_name": "Ghana_pop_01_1_S1", "panel_id": 0, "specimen_id": 0}, {"library_sample_name": "Ghana_pop_01_3_S223", "panel_id": 0, "specimen_id": 1}, {"library_sample_name": "Ghana_pop_01_4_S334", "panel_id": 0, "specimen_id": 2}, {"library_sample_name": "Ghana_pop_01_2_S112", "panel_id": 0, "specimen_id": 3}, {"library_sample_name": "Ghana_pop_10_3_S223", "panel_id": 0, "specimen_id": 5}, {"library_sample_name": "Ghana_pop_10_2_S112", "panel_id": 0, "specimen_id": 7}, {"library_sample_name": "Ghana_pop_10_1_S1", "panel_id": 0, "specimen_id": 6}, {"library_sample_name": "Ghana_pop_10_4_S334", "panel_id": 0, "specimen_id": 4}], "representative_microhaplotypes": {"targets": [{"microhaplotypes": [{"seq": "GATATGTTTAAATATATGATTCTCGAAAAAACTTTTTTTATTTTTTTTGTCAATAGATAAATGATCAATATTTTCTATATTTAATCTATCAAGTATTTTTATATATCTATTATTTCTTTCTTCGATGGATAAATTATAAGAATCAATATCCTTTCTTTCATCAACAAACTTTTTTATTGTTAACTCCATTTTTTTATTTAAGATACCA"}, {"seq": "GATATGTTTAAATATATGATTCTCGAAAAAACTTTTTTTATTTTTTTTGTCAATAGATAAATGATCAATATTTTCTATATTTAATCTATCAAGTATTTTTATATATCTATTATTTCTTTCTTCGATGGATAAATTATATGAATCAATATCCTTTCTTTCATCAACAAACTTTTTTATTGTTAACTCCATTTTTTTATTTAAGATACCA"}, {"seq": "GATATGTTTAAATATATGATTCTCGAAAAAACTTTTTTTATTTTTTTTGTCAATAGATAAATGATCAATATTTTCTATATTTAATCTATCAAGAATTTTTATATATCTATTATTTCTTTCTTCGATGGATAAATTATATGAATCAATATCCTTTCTTTCATCAACAAACTTTTTTATTGTTAACTCCATTTTTTTATTTAAGATACCA"}, {"seq": "GATATGTTTAAATATATGATTCTCGAAAAAACTTTTTTTATTTTTTTTGTCAATAGATAAATGATCAATATTTTCTATATTTAATCTATCAAGAATTTTTATATATCTATTATTTCTTTCTTCGATGGATAAATTATAAGAATCAATATCCTTTCTTTCATCAACAAACTTTTTTATTGTTAACTCCATTTTTTTATTTAAGATACCA"}, {"seq": "GATATGTTTAAATATATGATTCTCGAAAAAACTTTTTTTATTTTTTTTGTCAATAGATAAATGATCAATATTTTCTATATTTAATCTATCAAGAATTTTTATATATCTATTATTTCTTTCTTCGAAGGATAAATTATATGAATCAATATCCTTTCTTTCATCAACAAACTTTTTTATTGTTAACTCCATTTTTTTATTTAAGATACCA"}], "target_id": 0}, {"microhaplotypes": [{"seq": "ATATACCAATAATACTTTTTTTTTTAAATAATGTAAAAAATGATTTATATAATTGTTATAAACAAATGATCACATATCATAATAATAATAATAATATGCTAAATCATAACTCTAATATTTTATCAAAAGAAAATGAAAAAAAACAACCTTTTTCAACATATAATATATCAAATCTTTGTTCTCCTGACCAAATGGTGATAAATAAAAA"}, {"seq": "ATATACCAATAATACTTTTTTTTTTAAATAATGTAAAAAATGATTTATATAATTGTTATAAACAAATGATCACATATCATAATAATAATATCCTAAATCATAACTCTAATATTTTATCAAAAGAAAATGAAAAAAAACAACCTTTTTCAACATATAATATATCAAATCTTTGTTCTCCTGACCAAATGGTGATAAATAAAAA"}, {"seq": "ATATACCAATAATACTTTTTTTTTTAAATAATGTAAAAAATGATTTATATAATTGTTATAAACAAATGATCACATATCATAATAATAATATCCTAAATCATAACTCTAATATTTTATCAAAAGAAAATGAAAAAAAACAACCTTTTTCAACATATAATATATCAAATCTTTGTTCTCCTGATCAAATGGTAATAAATAAAAA"}, {"seq": "ATATACCAATAATACTTTTTTTTTTAAATAATGTAAAAAATGATTTATATAATTGTTATAAACAAATGATCACATATCATAATAATAATAATAATATGCTAAATCATAACTCTAATATTTTATCAAAAGAAAATGAAAAAAAACAACCTTTTTCAACATATAATATATCAAATCTTTGTTCTCCTGATCAAATGGTAATAAATAAAAA"}, {"seq": "ATATACCAATAATACTTTTTTTTTTAAATAATGTAAAAAATGATTTATATAATTGTTATAAACAAATGATCACATATCATAATAATAATATGCTAAATCATAACTCTAATATTTTATCAAAAGAAAATGAAAAAAAACAACCTTTTTCAACATATAATATATCAAATCTTTGTTCTCCTGACCAAATGGTGATAAATAAAAA"}, {"seq": "ATATACCAATAATACTTTTTTTTTTAAATAATGTAAAAAATGATTTATATAATTGTTATAAACAAATGATCACATATCATAATAATAATAATAATATCCTAAATCATAACTCTAATATTTTATCAAAAGAAAATGAAAAAAAACAACCTTTTTCAACATATAATATATCAAATCTTTGTTCTCCTGACCAAATGGTGATAAATAAAAA"}, {"seq": "ATATACCAATAATACTTTTTTTTTTAAATAATGTAAAAAATGATTTATATAATTGTTATAAACAAATGATCACATATCATAATAATAATATGCTAAATCATAACTCTAATATTTTATCAAAAGAAAATGAAAAAAAACAACCTTTTTCAACATATAATATATCAAATCTTTGTTCTCCTGATCAAATGGTAATAAATAAAAA"}, {"seq": "ATATACCAATAATACTTTTTTTTTTAAATAATGTAAAAAATGATTTATATAATTGTTATAAACAAATGATCACATATCATAATAATAATAATAATATGCTAAATCATAACTCTAATATTTTATCAAAAGAAAATGAAAAAAAACAACCTTTTTCAACATATAATATATCAAATCTTTGTTCTCCTGATCAAATGGTGATAAATAAAAA"}, {"seq": "ATATACCAATAATACTTTTTTTTTTAAATAATGTAAAAAATGATTTATATAATTGTTATAAACAAATGATCACATATCATAATAATAATAATAATATCCTAAATCATAACTCTAATATTTTATCAAAAGAAAATGAAAAAAAACAACCTTTTTCAACATATAATATATCAAATCTTTGTTCTCCTGATCAAATGGTAATAAATAAAAA"}, {"seq": "ATATACCAATAATACTTTTTTTTTTAAATAATGTAAAAAATGATTTATATAATTGTTATAAACAAATGATCACATATCATAATAATAATAATAATATGCTAAATGATAACTCTAATATTTTATCAAAAGAAAATGAAAAAAAACAACCTTTTTCAACATATAATATATCAAATCTTTGTTCTCCTGACCAAATGGTGATAAATAAAAA"}, {"seq": "ATATACCAATAATACTTTTTTTTTTAAATAATGTAAAAAATGATTTATATAATTGTTATAAACAAATGATCACATATCATAATAATAATAATAATATGCTAAATCATAACTCTAATATTTTATCAAAAGAAAATGAAAAAAAACAACCTTTTTCAACATATAATATATCAAATCTTTGTTCTCCTGACCAAATGGTAATAAATAAAAA"}, {"seq": "ATATACCAATAATACTTTTTTTTTTAAATAATGTAAAAAATGATTTATATAATTGTTATAAACAAATGATCACATATCATAATAATAATAATAATATGCTAAATCATAGCTCTAATATTTTATCAAAAGAAAATGAAAAAAAACAACCTTTTTCAACATATAATATATCAAATCTTTGTTCTCCTGACCAAATGGTGATAAATAAAAA"}, {"seq": "ATATACCAATAATACTTTTTTTTTTAAATAATGTAAAAAATGATTTATATAATTGTTATAAACAAATGATCACATATCATAATAATAATATCTTAAATCATAACTCTAATATTTTATCAAAAGAAAATGAAAAAAAACAACCTTTTTCAACATATAATATATCAAATCTTTGTTCTCCTGATCAAATGGTGATAAATAAAAA"}, {"seq": "ATATACCAATAATACTTTTTTTTTTAAATAATGTAAAAAATGATTTATATAATTGTTATAAACAAATGATCACATATCATAATAATAATAATAATAATATGCTAAATCATAACTCTAATATTTTATCAAAAGAAAATGAAAAAAAACAACCTTTTTCAACATATAATATATCAAATCTTTGTTCTCCTGACCAAATGGTGATAAATAAAAA"}], "target_id": 1}, {"microhaplotypes": [{"seq": "TTCATTATTGTTTTCATTCTTTTTTTAACGAAAACTATTCATCTCAAAAATATAAGATATTTTATATGACGAATGCCATTGTATTTTTTGTTACGTAAAACCTGACTTCTTCAGGGAAAACACATGCGCATTTTCACCAATTTTTGCCTAAGCTTATTATAAAAAGTATATTAAATGTATGAC"}, {"seq": "TTCATTATTGTTTTCATTCTTTTTTTAACTAAAACTATTCATCTCAAAAATATAAGATATTTTATATGACGAATGCCATTGTATTTTTTGTTACGTAAAACCTGACTTCTTCAAGGAAAACACATGCGCATTTTCACCAATTTTTGCCTAAGCTTATTATAAAAAGTATATTAAATGTATGAC"}, {"seq": "TTCATTATTGTTTTCATTCTTTTTTTAACGAAAACTATTCATCTCAAAAATATAAGATATTTTATATGACGAATGCCATTGTATTTTTTGTTACGTAAAACCTGACTTCTTCAAGGAAAACACATGCGCATTTTCACCAATTTTTGCCTAAGCTTATTATAAAAAGTATATTAAATGTATGAC"}, {"seq": "TTCATTATTGTTTTCATTCTTTTTTTAACTAAAACTATTCATCTCAAAAATATAAGATATTTTATATGACGAATGCCATTGTATTTTTTGTTACGTAAAACCTGACTTCTTCAGGGAAAACACATGCGCATTTTCACCAATTTTTGCCTAAGCTTATTATAAAAAGTATATTAAATGTATGAC"}, {"seq": "TTCATTATTGTTTTCATTCTTTTTTTAACGAAAACTATTCATCTCAAAAATATAAGATATTTTATATGACGAATGCCATTGTATTTTTTGTTACGTAAAACCTGACTTCTTCAGGGAAAACACATGCGTATTTTCACCAATTTTTGCCTAAGCTTATTATAAAAAGTATATTAAATGTATGAC"}, {"seq": "TTCATTATTGTTTTCATTCTTTTTTTAACTAAAACTATTCATCTCAAAAATATAAGATATTTTATATGACGAATGCCATTGTATTTTTTGTTACGTAAAACCTGACTTCTTCAAGGAAAACACATGCGCATTTTCACCAATTTTTGCCTAAGCTTATTATAAAAAGTATATTAAATATATGAC"}, {"seq": "TTCATTATTGTTTTCATTCTTTTTTTAACGAAAACTATTCATCTCAAAAATATAAGATATTTTATATGACGAATGCCATTGTATTTTTTGTTAAGTAAAACCTGACTTCTTCAAGGAAAACACATGCGCATTTTCACCAATTTTTGCCTAAGCTTATTATAAAAAGTATATTAAATGTATGAC"}, {"seq": "TTCATTATTGTTTTCATTCTTTTTTTAACTAAAACTATTCATCTCAAAAATATAAGATATTTTATATGACGAATGCCATTGTATTTTTTGTTACGTAAAACCTGACTTCTTCAGGGAAAACACATGCGTATTTTCACCAATTTTTGCCTAAGCTTATTATAAAAAGTATATTAAATGTATGAC"}], "target_id": 2}, {"microhaplotypes": [{"seq": "AGAAAAAAAATTTATTAAGAGGTATTTCGATTTTAAAAATTTAAGAATTAATTTTTAATTATGTCTATAAAAACTTAATAGAAAATAAATATTATTTTGTTTTTCAAAAAAATGTTTAAGAATAATATTTCTTTATTCTTTTACAATTTAGAACATATAATGCTATTTCTTTTAATTTTAATTTAATTTCAAA"}, {"seq": "AGAAAAAAAATTTATTAAGAGGTATTTCGATTTTAAAAATTTAAGAATTCATTTTTAATTATGTCTATAAAAACTTAATAGAAAATAAATATTATTTTGTTTTTCAAAAAAATGTTTAAGAATAATATTTCTTTATTCTTTTACAATTTAGAACATATAATGCTATTTCTTTTAATTTTAATTTAATTTCAAA"}, {"seq": "AGAAAAAAAATTTATTAAGAGGTATTTAGATTTTAAAAATTTAAGAATTAATTTTTAATTATGTCTATAAAAACTTAATAGAAAATAAATATTATTTTGTTTTTCAAAAAAATGTTTAAGAATAATATTTCTTTATTCTTTTACAATTTAGAACATATAATGCTATTTCTTTTAATTTTAATTTAATTTCAAA"}], "target_id": 3}, {"microhaplotypes": [{"seq": "TTTGATTCTTTTTAATGAAAAAGAAGCTAAAGATATGTCAGACCATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTAATTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAATAAAGCATCATGACATACATCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATGAAAAAGAAGCTAAAGATATGTCAGACCATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTAATTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAATAAAGCATCCTGACATACATCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATGAAAAAGAAGCTAAAGATATGTCAGACGATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTAATTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAATAAAGCATCATGACATACATCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATGAAAAAGAAGCTAAAGATATGTCAGACGATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTAATTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAATAAAGCATCCTGACATACATCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATGAAAAAGAAGCTAAAGATATGTCAGACCATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTAATTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAATAAAGCATCATGACATACACCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATGAAAAAGAAGCTAAAGATATGTCAGACTATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTAATTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAATAAAGCATCATGACATACATCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATGAAAAAGAAGCTAAAGATATGTCAGACCATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTATTTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAATAAAGCATCATGACATACACCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATGAAAAAGAAGCTAAAGATATGTCAGACGATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTATTTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAATAAAGCATCATGACATACATCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATGAAAAAGAAGCTAAAGATATGTCAGACCATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTATTTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAATAAAGCATCATGACATACATCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATGAAAAAGAAGCTAAAGATATGTCAGACGATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTATTTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAATAAAGCATCATGACATACACCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATGAAAAAGAAGCTAAAGATATGTCAGACTATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTAATTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAATAAAGCATCCTGACATACATCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATGAAAAAGAAGCTAAAGATATGTCAGACGATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTAATTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAATAAAGCATCATGACATACACCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATAAAAAAGAAGCTAAAGATATGTCAGACGATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTATTTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAATAAAGCATCATGACATACATCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATGAAAAAGAAGCTAAAGATATGTCAGACTATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTAATTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAATAAAGCATCATGACATACACCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATGAAAAAGAAGCTAAAGATATGTCAGACCATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTATTTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAATAAAGCATCCTGACATACATCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATAAAAAAGAAGCTAAAGATATGTCAGACGATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTAATTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAATAAAGCATCATGACATACATCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATGAAAAAGAAGCTAAAGATATGTCAGACGATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTAATTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAGTAAAGCATCATGACATACACCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATGAAAAAGAAGCTAAAGATATGTCAGACTATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTATTTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAATAAAGCATCCTGACATACATCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATGAGAAAGAAGCTAAAGATATGTCAGACCATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTAATTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAATAAAGCATCCTGACATACATCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATAAAAAAGAAGCTAAAGATATGTCAGACCATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTAATTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAATAAAGCATCCTGACATACATCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATGAAAAAGAAGCTAAAGATATGTCAGACCATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTAATTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAATAAAGCATCCTGACATACACCAAAAGG"}, {"seq": "TTTGATTCTTTTTAATGAAAAAGAAGCTAAAGATATGTCAGACCATATAATTTCCCAACAAAAACGTTATTGCTCTACCAATATTCATAGTAATTATAATAATAAAATATGTATATGTAAAAATAAGCGACATCATAACAAAAGAGGGAAAGGAGTAAAGCATCATGACATACACCAAAAGG"}], "target_id": 4}, {"microhaplotypes": [{"seq": "GCTCATTTGATATTTTCCAGTTGTTTGATTTTAAAAATGATGTATATTTTTTAGATGATAATTTGTTCGACAAGGATATGGTATATTGTACAAGTACCAACAATTATGGCGTTATGGAAAATGATAATGATGATGATAAAATAATAAAAATACAAAATTTAAATGAGAAATTAAAAAATGGAAAAGCTGAATTTAAAGATATATTATTAT"}, {"seq": "GCTCATTCGATATTTTCCAGTTGTTTGATTTTAAAAATGATGTATATTTTTTAGATGATAATTTGTTCGACAAGGATATGGTATATTGTACAAGTACCAACAATTATGGCATTATGGAAAATGATAATGATGATGATAAAATAATAAAAATACAGAATTTAAATGAGAAATTAAAAAATGGAAAAGCTGAATTTAAAGATATATTATTAT"}, {"seq": "GCTCATTTGATATTTTCCAGTTGTTTGATTTTAAAAATGATGTATATTTTTTAGATGATAATTTGTTCGACAAGGATATGGTATATTGTACAAGTACCAACAATTATGGCGTTATGGGAAATGATAATGATGATGATAAAATAATAAAAATACAAAATTTAAATGAGAAATTAAAAAATGGAAAAGCTGAATTTAAAGATATATTATTAT"}, {"seq": "GCTCATTCGATATTTTCCAGTTGTTTGATTTTAAAAATGATGTATATTTTTTAGATGATAATTTGTTCGACAAGGATATGGTATATTGTACAAGTACCAACAATTATGGCGTTATGGGAAATGATAATGATGATGATAAAATAATAAAAATACAAAATTTAAATGAGAAATTAAAAAATGGAAAAGCTGAATTTAAAGATATATTATTAT"}, {"seq": "GCTCATTCGATATTTTCCAGTTGTTTGATTTTAAAAATGATGTATATTTTTTAGATGATAATTTGTTCGACAAGGATATGGTATATTGTACAAGTGCCAACAATTATGGCGTTATGGAAAATGATAATGATGATGATAAAATAATAAAAATACAAAATTTAAATGAGAAATTAAAAAATGGAAAAGCTGAATTTAAAGATATATTATTAT"}, {"seq": "GCTCATTTGATATTTTCCAGTTGTTTGATTTTAAAAATGATGTATATTTTTTAGATGATAATTTGTTCGACAAGGATATGGTATATTGTACAAGTACCAACAATTATGGCATTATGGAAAATGATAATGATGATGATAAAATAATAAAAATACAGAATTTAAATGAGAAATTAAAAAATGGAAAAGCTGAATTTAAAGATATATTATTAT"}, {"seq": "GCTCATTTGATATTTTCCAGTTGTTTGATTTTAAAAATGATGTATATTTTTTAGATGATAATTTGTTCGACAAGGATATGGTATATTGTACAAGTGCCAACAATTATGGCGTTATGGAAAATGATAATGATGATGATAAAATAATAAAAATACAAAATTTAAATGAGAAATTAAAAAATGGAAAAGCTGAATTTAAAGATATATTATTAT"}, {"seq": "GCTCATTCGATATTTTCCAGTTGTTTGATTTTAAAAATGATGTATATTTTTTAGATGATAATTTGTTCGACAAGGATATGGTATATTGTACAAGTACCAACAATTATGGCGTTATGGAAAATGATAATGATGATGATAAAATAATAAAAATACAAAATTTAAATGAGAAATTAAAAAATGGAAAAGCTGAATTTAAAGATATATTATTAT"}, {"seq": "GCTCATTCGATATTTTCCAGTTGTTTGATTTTAAAAATGATGTATATTTTTTAGATGATAATTTGTTCGACAAGGATATGGTATATTGTACAAGTACCAACAATTATGGCATTATGGAAAATGATAATGATGATGATAAAATAATAAAAATACAAAATTTAAATGAGAAATTAAAAAATGGAAAAGCTGAATTTAAAGATATATTATTAT"}, {"seq": "GCTCATTTGATATTTTCCAGTTGTTTGATTTTAAAAATGATGTATATTTTTTAGATGATAATTTGTTCGACAAGGATATGGTATATTGTACAAGTACCAAAAATTATGGCGTTATGGAAAATGATAATGATGATGATAAAATAATAAAAATACAAAATTTAAATGAGAAATTAAAAAATGGAAAAGCTGAATTTAAAGATATATTATTAT"}, {"seq": "GCTCATTTGATATTTTCCAGTTGTTTGATTTTAAAAATGATGTATATTTTTTAGATGATAATTTGTTCGACAAGGATATGGTATATTGTACAAGTACCAACAATTATGGCGTTATGGAAAATGATAATGATGATGATAAAATAATAAAAATACAGAATTTAAATGAGAAATTAAAAAATGGAAAAGCTGAATTTAAAGATATATTATTAT"}, {"seq": "GCTCATTCGATATTTTCCAGTTGTTTGATTTTAAAAATGATGTATATTTTTTAGATGATAATTTGTTCGACAAGGATATGGTATATTGTACAAGTACCAACAATTATGGCGTTATGGGAAATGATAATGATGATGATAAAATAATAAAAATACAGAATTTAAATGAGAAATTAAAAAATGGAAAAGCTGAATTTAAAGATATATTATTAT"}, {"seq": "GCTCATTTGATATTTTCCAGTTGTTTGATTTTAAAAATGATGTATATTTTTTAGATGATAATTTGTTCGACAAGGATATGGTATATTGTACAAGTACCAACAATTATGGCATTATGGAAAATGATAATGATGATGATAAAATAATAAAAATACAAAATTTAAATGAGAAATTAAAAAATGGAAAAGCTGAATTTAAAGATATATTATTAT"}, {"seq": "GCTCATTCGATATTTTCCAGTTGTTTGATTTTAAAAATGATGTATATTTTTTAGATGATAATTTGTTCGACAAGGATATGGTATATTGTACAAGTGCCAACAATTATGGCGTTAAGGAAAATGATAATGATGATGATAAAATAATAAAAATACAAAATTTAAATGAGAAATTAAAAAATGGAAAAGCTGAATTTAAAGATATATTATTAT"}, {"seq": "GCTCATTCGATATTTTCCAGTTGTTTGATTTTAAAAATGATGTATATTTTTTAGATGATAATTTGTTCGACAAGGATATGGTATATTGTACAAGTGCCAACAATTATGGCGTTATGGAAAATGATAATGATGATGATAAAATAATAAAAATACAGAATTTAAATGAGAAATTAAAAAATGGAAAAGCTGAATTTAAAGATATATTATTAT"}, {"seq": "GTTCATTTGATATTTTCCAGTTGTTTGATTTTAAAAATGATGTATATTTTTTAGATGATAATTTGTTCGACAAGGATATGGTATATTGTACAAGTACCAACAATTATGGCATTATGGAAAATGATAATGATGATGATAAAATAATAAAAATACAAAATTTAAATGAGAAATTAAAAAATGGAAAAGCTGAATTTAAAGATATATTATTAT"}, {"seq": "GCTCATTTGATATTTTCCAGTTGTTTGATTTTAAAAATGATGTATATTTTTTAGATGATAATTTGTTCGACAAGGATATGGTATATTGTACAAGTACCAACAATTATGGTGTTATGGGAAATGATAATGATGATGATAAAATAATAAAAATACAAAATTTAAATGAGAAATTAAAAAATGGAAAAGCTGAATTTAAAGATATATTATTAT"}, {"seq": "GCTCATTTGATATTTTCCAGTTGTTTGATTTTAAAAATGATGTATATTTTTTAGATGATAATTTGTTCGACAAGGATATGGTATATTGTACAAGTGCCAACAATTATGGCGTTATGGAAAATGATAATGATGATGATAAAATAATAAAAATACAGAATTTAAATGAGAAATTAAAAAATGGAAAAGCTGAATTTAAAGATATATTATTAT"}, {"seq": "GCTCATTTGATATTTTCCAGTTGTTTGATTTTAAAAATGATGTATATTTTTTAGATGATAATTTGTTCGACAAGGATATGGTATATTGTACAAGTACCAACAATTATGGCGTTATGGGAAATGATAATGATGATGATAAAATAATAAAAATACAGAATTTAAATGAGAAATTAAAAAATGGAAAAGCTGAATTTAAAGATATATTATTAT"}], "target_id": 5}, {"microhaplotypes": [{"seq": "TTATTATAAGGATTATAATTATTATCATTCTTATTATATGGATTAATATAATTTCGATCATTATCATTACTGTTTTTATCATATTGTGGATAATTATTTCTATTTCTATTTTGATTAAAATCCGATTGTCTATATCTAACTCTAATATCTGTAGATGCTAAATCATTAGGTAATGGG"}, {"seq": "TTATTATAAGGATTATAATTATTATCATTCTTATTATATGGATTAATATAATTTCGATCATTATCATTACTGTTTTTATCATATTGTGGATAATTATTTCTATTTCTATTTTGATTAAAATCCGATTGTCTATATCTAACTCTAGTATCTGTAGATGCTAAATCATTAGGTAATGGG"}, {"seq": "TTATTATAAGGATTATAATTATTATCATTCTTATTATATGGATTAATATAATTTCCATCATAATCATTACTGTTTTTATCATATTGTGGATAATTATTTCTATTTCTATTTTGATTAAAATCCGATTGTCTATATCTAACTCTAATATCTGTAGATGCTAAATCATTAGGTAATGGG"}, {"seq": "TTATTATAAGGATTATAATTATTATCATTCTTATTATATGGATTAATATAATTTTGATCATAATCATTACTGTTTTTATCATATTGTGGATAATTATTTCTATTTCTATTTTGATTAAAATCCGATTGTCTATATCTAACTCTAATATCTGTAGATGCTAAATCATTAGGTAATGGG"}, {"seq": "TTATTATAAGGATTATAATTATTATCATTCTCATTATATGGATTAATATAATTTCGATCATAATCATTACTGTTTTTATCATATTGTGGATAATTATTTCTATTTCTATTTTGATTAAAATCCGATTGTCTATATCTAACTCTAGTATCTGTAGATGCTAAATCATTAGGTAATGGG"}, {"seq": "TTATTATAAGGATTATAATTATTATCATTCTTATTATATGGATTAATATAATTTCGATCATAATCATTACTGTTTTTATCATATTGTGGATAATTATTTCTATTTCTATTTTGATTAAAATCCGATTGTCTATATCTAACTCTAATATCTGTAGATGCTAAATCATTAGGTAATGGG"}, {"seq": "TTATTATAAGGATTATAATTATTATCATTCTCATTATATGGATTAATATAATTTCGATCATAATCATTACTGTTTTTATCATATTGTGGATAATTATTTCTATTTCTATTTTGATTAAAATCCGATTGTCTATATCTAACTCTAATATCTGTAGATGCTAAATCATTAGGTAATGGG"}, {"seq": "TTATTATAAGGATTATAATTATTATCATTCTTATTATATGGATTAATATAATTTTGATCATAATCATTACTGTTTTTATCATATTGTGGATAATTATTTCTATTTCTATTTTGATTAAAATCCGATTGTCTATATCTAACTCTAGTATCTGTAGATGCTAAATCATTAGGTAATGGG"}, {"seq": "TTATTATAAGGATTATAATTATTATCATTCTTATTATATGGATTAATATAATTTTGATCATTATCATTACTGTTTTTATCATATTGTGGATAATTATTTCTATTTCTATTTTGATTAAAATCCGATTGTCTATATCTAACTCTAATATCTGTAGATGCTAAATCATTAGGTAATGGG"}, {"seq": "TTATTATAAGGATTATAATTATTATCATTCTTATTATATGGATTAATATAATTTCCATCATAATCATTACTGTTTTTATCATATTGTGGATAATTATTTCTATTTCTATTTTGATTAAAATCCGATTGTCTATATCTAACTCTAGTATCTGTAGATGCTAAATCATTAGGTAATGGG"}, {"seq": "TTATTATAAGGATTATAATTATTATCATTCTTATTATATGGATTAATATAATTTCGATCATTATCATTACTGTTTTCATCATATTGTGGATAATTATTTCTATTTCTATTTTGATTAAAATCCGATTGTCTATATCTAACTCTAATATCTGTAGATGCTAAATCATTAGGTAATGGG"}], "target_id": 6}, {"microhaplotypes": [{"seq": "TAATATCATAAGGTTTGAATATTTTCCTCTCAGGTATTATACCAACAGAAGGTTTATCATCATCTTTAAAACCTGCTCTATCTTTAACCCATTGATTAGGATTTTTTAAACATAAAGCTGGATTCTTTAATAAATCTTTCATATGTTCCATATTATTTTCTTCATTTATATATGATTCTAC"}, {"seq": "TAATATCATAAGGTTTGAATATTTTCCTCTCAGGTATTATACCAACAGAAGGTTTATCATCATCTTTAAAACCTGCTCTATCTTTAACCCAATGATTAGGATTTTTTAAACATAAAGCTGGATTCTTTAATAAATCTTTCATATGTTCCATATTATTTTCTTCATTTATATATGATTCTAC"}, {"seq": "TAATATCATAAGGTTTGAATATTTTCCTCTTAGGTATTATACCAACAGAAGGTTTATCATCATCTTTAAAACCTGCTCTATCTTTAACCCATTGATTAGGATTTTTTAAACATAAAGCTGGATTCTTTAATAAATCTTTCATATGTTCCATATTATTTTCTTCATTTATATATGATTCTAC"}, {"seq": "TAATATCATAAGGTTTGAATATTTTCCTGTCAGGTATTATACCAACAGAAGGTTTATCATCATCTTTAAAACCTGCTCTATCTTTAACCCATTGATTAGGATTTTTTAAACATAAAGCTGGATTCTTTAATAAATCTTTCATATGTTCCATATTATTTTCTTCATTTATATATGATGCTAC"}, {"seq": "TAATATCATAAGGTTTGAATATTTTCATCTCAGGTATTATACCAACAGAAGGTTTATCATCATCTTTAAAACCTGCTCTATCTTTAACCCAATGATTAGGATTTTTTAAACATAAAGCTGGATTCTTTAATAAATCTTTCATATGTTCCATATTATTTTCTTCATTTATATATGATTCTAC"}, {"seq": "TAATATCATAAGGTTTGAATATTTTCCTCTCAGGTATTATACCAACAGAAGGTTTATCATCATCTTTAAAACCTGCTCTATCTTTAACCCATTGATTAGGATTTTTTAAACATAAAGCTGGATTCTTTAATAAATCTTTCATATGTTCCATATTATTTTCTTCATTTATATATGATGCTAC"}], "target_id": 7}, {"microhaplotypes": [{"seq": "AATATTGACATGAAACATTATAATACACATAAGAAAAAAAAAATTTATTTATTCTTACAAAAAGAATATAAAAACAAAATTTTGGGATTTATAAATTTTTATAAACGTATAACACACAAAATAAAAAAGAAACAAGAAAATGTTCATGATAAAATCACTTTTTTAAAATGTCTAAAGGAACTCTTTTTTGTCACACATACAAATA"}, {"seq": "AATATTGACATGAAACATTATAATACACATAAGAAAAAAAAAATTTATTTATTCTTACAAAAAGAATATAAAAACAAAATTTTGGGATTTATAAATTTTTATAAACATATAACACACAAAATAAAAAAGAAACAAGAAAATGTTCATGATAAAATCACTTTTTTAAAATGTCTAAAGGAACTCTTTTTTGTCACACATACAAATG"}, {"seq": "AATATTGACATGAAACATTATAATACACATAAGAAAAAAAAAATTTATTTATTCTTACAAAAAGAATATAAAAACAAAATTTTGGGATTTATAAATTTTTATAAACGTATAACACACAAAATAAAAAAGAAACAAGAAAATGTTCATGATAAAATCACTTTTTTAAAATGTCTAAAGGAACTCTTTTTTGTCACACATACAAATG"}, {"seq": "AATATTGACATGAAACATTATAATACACATAAGAAAAAAAAAATTTATTTATTCTTACAAAAAGAATATAAAAACAAAATTTTGGGATTTATAAATTTTTATAAACATATAACACACAAAATAAAAAAGAAACAAGAAAATGTTCATGATAAAATCACTTTTTTAAAATGTCTAAAGGAACTCTTTTTTGTCACACATACAAATA"}, {"seq": "AATATTGACATGAAACATTATAATACACATAAGAAAAAAAAAATTTATTTATTCTTACAAAAAGAATATAAAAACAAAATTTTGGGATTCATAAATTTTTATAAACGTATAACACACAAAATAAAAAAGAAACAAGAAAATGTTCATGATAAAATCACTTTTTTAAAATGTCTAAAGGAACTCTTTTTTGTCACACATACAAATA"}, {"seq": "AATATTGACATGAAACATTATAATACACATAAGAAAAAAAAAATTTATTTATTCTTACAAAAAGAATATAAAAACAAAATTTTGGGATTTATAAATTTTTATAAACATATAACACACAAAATAAAAAAGAAACAAGAAAATGTTCATGATAAAATCACTTTTTTAAAATGTCTAAAGGAACTCTTTTTTATCACACATACAAATA"}, {"seq": "AATATTGACATGAAACATTATAATACACATAAGAAAAAAAAAATTTATTTATTCTTACAAAAAGAATATAAAAACAAAATTTTGGGATTTATAAATTTTTATAAACATATAACACACAAAATAAAAAAGAAACAAGAAAATGTTCATGATAAAATCACTTTTTTAAAATGTATAAAGGAACTCTTTTTTGTCACACATACAAATG"}, {"seq": "AATATTGACATGAAACATTATAATACACATAAGAAAAAAAAAATTTATTTATTCTTACAAAAAGAATATAAAAACAAAATTTTGGGATTTATAAATTTTTATAAACATATAACACACAAAATAAAAAAGAAACAAGAAAATGTTCATGATAAAATCACTTTTTTAAAATGTTTAAAGGAACTCTTTTTTGTCACACATACAAATG"}, {"seq": "AATATTGACATGAAACATTATAATACACATAAGAAAAAAAAAATTTATTTATTCTTACAAAAAGAATATAAAAACAAAATTTTTGGATTTATAAATTTTTATAAACGTATAACACACAAAATAAAAAAGAAACAAGAAAATGTTCATGATAAAATCACTTTTTTAAAATGTCTAAAGGAACTCTTTTTTGTCACACATACAAATA"}], "target_id": 8}, {"microhaplotypes": [{"seq": "ATTATGATTAATAATAATATTTCTCATAATTTCGTTAAATACATCTAAACTATTTATAGAACCATCTATATCATCTTCATTCCTATTTTGGTGAACTGATTCGGTGTTTATAACATCTAAGGTGTCTTTTTCTTCTCCTCTGTAACTTTTTATAATTTTTTGATAAATGTTGTTATAAGAATTATCA"}, {"seq": "ATTATGATTAATAATAATATTTCTCATAATTTCGTTAAATACATCTAAACTATTTATAGAACCATCTATATCATCTTCATTCCTATTTTGGTGAACCGATTCGGTGTTTATAACATCTAAGGTGTCTTTTTCTTCTCCTCTGTAACTTTTTATAATTTTTTGATAAATGTTGTTATAAGAATTATCA"}, {"seq": "ATTATGATTAATAATAATATTTCTCATAATTTCGTTAAATACATCTAAACTATTTATAGAACCATCTGTATCATCTTCATTCCTATTTTGGTGAACCGATTCGGTGTTTATAACATCTAAGGTGTCTTTTTCTTCTCCTCTGTAACTTTTTATAATTTTTTGATAAATGTTGTTATAAGAATTATCA"}, {"seq": "ATTATGATTAATAATAATATTTCTCATAATTTCGTTAAATACATCTAAACTATTTATAGAACCATCTATATCATCTTCATTCCTATTTTTGTGAACTGATTCGGTGTTTATAACATCTAAGGTGTCTTTTTCTTCTCCTCTGTAACTTTTTATAATTTTTTGATAAATGTTGTTATAAGAATTATCA"}, {"seq": "ATTATGATTAATAATAATATTTCTCATAATTTCGTTAAATACATCTAAACTATTTATAGAACCATTTATATCATCTTCATTCCTATTTTGGTGAACTGATTCGGTGTTTATAACATCTAAGGTGTCTTTTTCTTCTCCTCTGTAACTTTTTATAATTTTTTGATAAATGTTGTTATAAGAATTATCA"}], "target_id": 9}, {"microhaplotypes": [{"seq": "ACTTTTTTTAGATTTTTCTTGATCGTTTTCATCATTTTTTATTTCCTGTTCATCTGAGGTTTTCTTTTGTAAACGCTTAGTGCGTTCCTTTTGACCTTTTAATTTTTTTTTAAATATATTTTTAACTTGATCAATGAAGAAAGCATAATCTTGTATGACAGAAAATCT"}, {"seq": "ACTTTTTTTAGATTTTTCTTGATCGTTTTCATCATTTTTTATTTCCTGTTCATCTGAGGTTTTCTTTTGTAAACGCTTAGTGCGTTCCTTTCGACCTTTTAATTTTTTTTTAAATATATTTTTAACTTGATCAATGAAGAAAGCATAATCTTGTATGACAGAAAATCT"}, {"seq": "ACTTTTTTTAGATTTTTCTTGATCGTTTTCATCATTTTTTATTTCCTGTTCATCTGAGGTTTTCTTTTGTAAACGCTTAGTGCGTTGCTTTTGACCTTTTAATTTTTTTTTAAATATATTTTTAACTTGATCAATGAAGAAAGCATAATCTTGTATGACAGAAAATCT"}, {"seq": "ACTTTTTTTAGATTTTTCTTGATCGTTTTCATCATTTTTTATTTCCTGTTCATCTGAGGTTTTCTTTTGTAAACGCTTAGTGCGTCCCTTTTGACCTTTTAATTTTTTTTTAAATATATTTTTAACTTGATCAATGAAGAAAGCATAATCTTGTATGACAGAAAATCT"}, {"seq": "ACTTTTTTTAGATTTTTCTTGATCGTTTTCATCATTTTTTATTTCCTGTTCATCTGAGGTTTTCTTTTGTAAACGCTTAGTGCGTTCCTTTTGACCTTTTAATTTTTTTTTAAATATGTTTTTAACTTGATCAATGAAGAAAGCATAATCTTGTATGACAGAAAATCT"}, {"seq": "ACTTTTTTTAGATTTTTCTTGATCTTTTTCATCATTTTTTATTTCCTGTTCATCTGAGGTTTTCTTTTGTAAACGCTTAGTGCGTTCCTTTTGACCTTTTAATTTTTTTTTAAATATATTTTTAACTTGATCAATGAAGAAAGCATAATCTTGTATGACAGAAAATCT"}], "target_id": 10}, {"microhaplotypes": [{"seq": "CTAAGTTATCTAAAATTATTAATTTTTTCAAATATGGTAATTCATGTCTATAAAGTAATAAGTCATCAACTAAATCTAAATCTAAACATAACCATTCTAATTTCGTTTCATTTAATATGTTTACAATTACATCTATACTAAAGTTAGAATGTAAAATCAAGGTTGTTACACCACTCATCATAGCTGCCATATCAACAAT"}, {"seq": "CTAAGTTATCTAAAATTATTAATTTTTTCAAATATAGTAATTCATGTCTATGAAGTAATAAGCCATCAACTAAATCTAAATCTAAACATAACCATTCTAATTTCGTTTCATTTAATATGTTTACAATTACATCTATACTAAAGTTAGAATGTAAAATCAAGGTTGTTACACCACTCATCATAGCTGCCATATCAACAAT"}, {"seq": "CTAAGTTATCTAAAATTATTAATTTTTTCAAATATGGTAATTCATGTCTATGAAGTAATAAGTCATCAACTAAATCTAAATCTAAACATAACCATTCTAATTTCGTTTCATTTAATATGTTTACAATTACATCTATACTAAAGTTAGAATGTAAAATCAAGGTTGTTACACCACTCATCATAGCTGCCATATCAACAAT"}, {"seq": "CTAAGTTATCTAAAATTATTAATTTTTTCAAATATGGTAATTCATGTCTATGAAGTAATAAGCCATCAACTAAATCTAAATCTAAACATAACCATTCTAATTTCGTTTCATTTAATATGTTTACAATTACATCTATACTAAATTTAGAATGTAAAATCAAGGTTGTTACACCACTCATCATAGCTGCCATATCAACAAT"}, {"seq": "CTAAGTTATCTAAAATTATTAATTTTTTCAAATATGGTAATTCATGTCTATGAAGTAATAAGCCATCAACTAAATCTAAATCTAAACATAACCATTCTAATTTCGTTTCATTTAATATGTTTACAATTACATCTATACTAAAGTTAGAATGTAAAATCAAGGTTGTTACACCACTCATCATAGCTGCCATATCAACAAT"}, {"seq": "CTAAGTTATCTAAAATTATTAATTTTTTCAAATATGGTAATTCATGTCTATGAAGTAATAAGTCATCAACTAAATCTAAATCTAAACATAACCATTCTAATTTCGTTTCATTTAATATGTTTACAATTACATCTATACTAAATTTAGAATGTAAAATCAAGGTTGTTACACCACTCATCATAGCTGCCATATCAACAAT"}, {"seq": "CTAAGTTATCTAAAATTATTAATTTTTTCAAATATGGTAATTTATGTCTATGAAGTAATAAGCCATCAACTAAATCTAAATCTAAACATAACCATTCTAATTTCGTTTCATTTAATATGTTTACAATTACATCTATACTAAAGTTAGAATGTAAAATCAAGGTTGTTACACCACTCATCATAGCTGCCATATCAACAAT"}, {"seq": "CTAAGTTATCTAAAATTATTAATTTTTTCAAATATAGTAATTCATGTCTATAAAGTAATAAGTCATCAACTAAATCTAAATCTAAACATAACCATTCTAATTTCGTTTCATTTAATATGTTTACAATTACATCTATACTAAAGTTAGAATGTAAAATCAAGGTTGTTACACCACTCATCATAGCTGCCATATCAACAAT"}], "target_id": 11}, {"microhaplotypes": [{"seq": "TATCATTTAAATTCTCTTTTTCCACAGCTCCAGCATTTTTATTTATATCATCTACAACTACATCTTCCTTCACATAATTATTTATATAAAAATTATTATCATCTAAAGCATCTGAAAATTCTTCATTTAATACTTCTTCATCTTCTACATTAAATGTTTTCGTTCTTTCATCATCTAATAAA"}, {"seq": "TATCATTTAAATTCTCTTTTTCCACAGCTCCAGCATTTTTATTTATATCATCTACAACTACATCTTCCTTCACATAATTATTTATATAAAAATTATTATCATCTAAAGCATCTGAAAATTCTTCATTTAATACTTCTTCATCTACATTAAATGTTTTCGTTCTTTCATCATCTAATAAA"}, {"seq": "TATCATTTAAATTCTCTTTTTCCACAGCTCCAGCATTTTTATTTATATCATCTACAACTACATCTTCCTTCACATAAATATTTATATAAAAATTATTATCATCTAAAGCATCTGAAAATTCTTCATTTAATACTTCTTCATCTTCTACATTAAATGTTTTCGTTCTTTCATCATCTAATAAA"}, {"seq": "TATCATTTAAATTCTCTTTTTCCACAGCTCCAGCATTTTTATTTATATCATCTACAACTACATCTTCCTTCACATAAATATTTATATAAAAAGTATTATCATCTAAAGCATCTGAAAATTCTTCATTTAATACTTCTTCATCTTCTACATTAAATGTTTTCGTTCTTTCATCATCTAATAAA"}, {"seq": "TATCATTTAAATTCTCTTTTTCCACAGCTCCAGCATTTTTATTTATATCATCTACAACTACATCTTCCTTCACATAATTATTTATATAAAAAATATTATCATCTAAAGCATCTGAAAATTCTTCATTTAATACTTCTTCATCTTCTACATTAAATGTTTTCGTTCTTTCATCATCTAATAAA"}, {"seq": "TATCATTTAAATTCTCTTTTTCCACAGCTCCAGCATTTTTATTTATATCATCTACAACTACATCTTCCTTCACATAATTATTTATATAAAAAGTATTATCATCTAAAGCATCTGAAAATTCTTCATTTAATACTTCTTCATCTTCTACATTAAATGTTTTCGTTCTTTCATCATCTAATAAA"}, {"seq": "TATCATTTAAATTCTCTTTTTCCACAGCTCCAGCATTTTTATTTATATCATCTACAACTACATCTTCCTTCACATAATTATTTATATAAAAATTATTATTATCTAAAGCATCTGAAAATTCTTCATTTAATACTTCTTCATCTTCTACATTAAATGTTTTCGTTCTTTCATCATCTAATAAA"}, {"seq": "TATCATTTAAATTCTCTTTTTCCACAGCTCCAGCATTTTTATTTATATCATCTACAACTACATCTTCCTTCACATAATTATTTATATAAAAATTATTATCATCTAAAGCATCTGAAAATTCTTCATTTAATACTTCTCCATCTTCTACATTAAATGTTTTCGTTCTTTCATCATCTAATAAA"}, {"seq": "TATCATTTAAATTCTCTTTTTCCACAGCTCCAGCATTTTTATTTATATCATCTACAACTACATCTTCCTTCACATAATTATTTATATAAAAAGTATTATCATCTAAAGCATCTGAAAATTCTTCATTTAATACTTCTTCATCTACATTAAATGTTTTCGTTCTTTCATCATCTAATAAA"}], "target_id": 12}, {"microhaplotypes": [{"seq": "TTTCTTTAATTTCTATATGTTTGAATTCCCTTATAGACATATTTGAATCATTATTACTTTTATATGAAGTGTTATTATCGAAATTATTATTAATACATTTTATTTTAATGATTTTGTTAAAATTTTTATTATTTACTATAATGGAAGTCAGATATGTACTTATCGTATGGAAAGCTAATCATCAACA"}, {"seq": "TTTCATTAATTTCTATATGTTTGAATTCCCTTATAGACATATTTGAATCATTATTACTTTTATATGAAGTGTTATTATCGAAATTATTATTAATACATTTTATTTTAATGATTTTGTTAAAATTTTTATTATTTACTATAATGGAAGTCAGATATGTACTTATCGTATGGAAAGCTAATCATCAACA"}, {"seq": "TTTCCTTAATTTCTATATGTTTGAATTCCCTTATAGACATATTTGAATCATTATTACTTTTATATGAAGTGTTATTATCGAAATTATTATTAATACATTTTATTTTAATGATTTTGTTAAAATTTTTATTATTTACTATAATGGAAGTCAGATATGTACTTATCGTATGGAAAGCTAATCATCAACA"}, {"seq": "TTTCTTTAATTTCTATATGTTTGAATTCCCTTATAGATATATTTGAATCATTATTACTTTTATATGAAGTGTTATTATCGAAATTATTATTAATACATTTTATTTTAATGATTTTGTTAAAATTTTTATTATTTACTATAATGGAAGTCAGATATGTACTTATCGTATGGAAAGCTAATCATCAACA"}, {"seq": "TTTCATTAATTTCTATATGTTTGAATTCCCTTATAGATATATTTGAATCATTATTACTTTTATATGAAGTGTTATTATCGAAATTATTATTAATACATTTTATTTTAATGATTTTGTTAAAATTTTTATTATTTACTATAATGGAAGTCAGATATGTACTTATCGTATGGAAAGCTAATCATCAACA"}], "target_id": 13}, {"microhaplotypes": [{"seq": "CTCGTACAATATTTTTATAATTTCCTTTCATCTTATTTTTTTCTTTATATTTTTTTTTTTCATATGTAAGATTTATATAATCACTTTCGCTTTTTCTAACCCTTTTGAACTTTTTAAATGTACTTCGTTCATTATTTCTAATTCTCGTAAACACAAGAATAAATATTTTGATATATCTTATA"}, {"seq": "CTCGTACAATATTTTTATAATTTCCTTTCATCTTATTTTTTTCTTTATATTTTTTTTTTTCATATGTAAGATTTATATAATCACTTTCGCTTTTTCTAACGCTTTTGAACTTTTTAAATGTACTTCGTTCATTATTTCTAATTCTCGTAAACACAAGAATAAATATTTTGATATATCTTATA"}, {"seq": "CTCGTACAATATTTTTATAATTTCCTTTCATCTTATTTTTTTCTTTATATTTTTTTTTTTCATATGTAAGATTTATATAATCACTTTCGCTTTTTCTAACGCTTTTGAACTTTTTAAATGTACTTCCTTCATTATTTCTAATTCTCGTAAACACAAGAATAAATATTTTGATATATCTTATA"}, {"seq": "CTCGTACAATATTTTTATAATTTCCTTTCATCTTATTTTTTTCTTTATATATTTTTTTTTCATATGTAAGATTTATATAATCACTTTCGCTTTTTCTAACGCTTTTGAACTTTTTAAATGTACTTCGTTCATTATTTCTAATTCTCGTAAACACAAGAATAAATATTTTGATATATCTTATA"}, {"seq": "CTCGTACAATATTTTTATAATTTCCTTTCATCTTATTTTTTTCTTTATATTTTTTTTTTTCATATGTAAGATTTATATAATCACTTTCTCTTTTTCTAACGCTTTTGAACTTTTTAAATGTACTTCGTTCATTATTTCTAATTCTCGTAAACACAAGAATAAATATTTTGATATATCTTATA"}, {"seq": "CTCGTACAATATTTTTATAATTTCCTTTCATCTTATTTTTTTCTTTATATTTTTTTTTTTCATATGTAAGATTTATATAATCACTTTCGCTTTTTCTAACCCTTTTGAACTTTTTAAATGCACTTCGTTCATTATTTCTAATTCTCGTAAACACAAGAATAAATATTTTGATATATCTTATA"}], "target_id": 14}, {"microhaplotypes": [{"seq": "GTTATTTCAGTATGAGTTTCAACAGTTAATACTACTTCAGGATATGGATTGATACTTAACGTATGTACTCTCAATAATCTAGTATCAAATATATATGAAAATGTATACTCAGGAAAACATATAGTAGATAATCCATTATTATTCTCTATACATATTTTACTTATAGCTATATAATCGTAATTATCTTCTATTACTATTGGTTCTGTG"}, {"seq": "GTTATTTCAGTATGAGTTTCAACAGTTAATAATACTTCAGGATATGGATTGATACTTAACGTATGTACTCTCAATAATCTAGTATCAAATATATATGAAAATGTATACTCAGGAAAACATATAGTAGATAATCCATTATTATTCTCTATACATATTTTACTTATAGCTATATAATCGTAATTATCTTCTATTACTATTGGTTCTGTG"}, {"seq": "GTTATTTCAGTATGAGTTTCAACAGTTAATACTACTTCAGGATATGGATTGATACTTAACATATGTACTCTCAATAATCTAGTATCAAATATATATGAAAATGTATACTCAGGAAAACATATAGTAGATAATCCATTATTATTCTCTATACATATTTTACTTATAGCTATATAATCGTAATTATCTTCTATTACTATTGGTTCTGTG"}, {"seq": "GTTATTTCAGTATGAGTTTCAACAGTTAATACTACTTCAGGATATGGATTGATACTTAACGTATGTACTCTCAATAATCGAGTATCAAATATATATGAAAATGTATACTCAGGAAAACATATAGTAGATAATCCATTATTATTCTCTATACATATTTTACTTATAGCTATATAATCGTAATTATCTTCTATTACTATTGGTTCTGTG"}], "target_id": 15}, {"microhaplotypes": [{"seq": "CAAGAGCTAAGAAAACATATAGAATCATCATAAGGATGTTGATAATATAAATGTGTTTTTATTTGTGTATTTATGTCAGAATATTGTTCCTTCGATTTATCTTTAAAATAATCAAGATTATTTATGTTGGTGGCTTTATTATTATTAAAATAATTTTGATTTGTTACATGATGACTATGGGTATATTTGTATTTTACGTTTTTATTA"}, {"seq": "CAAGAGCTAAGAAAACATATAGAATCATCATAAGGATGTTGATAATATAAATGTGTTTTTATTTGTGTATTTATGTCAGAATATTGTTCCTTCGATTTATCTTTAAAATAATCAAGATTATTTATGTTGGTGGCTTTATTATTATTAAAATAATTTTGATTTGTTACATGATGACTAGGGGTATATTTGTATTTTACGTTTTTATTA"}, {"seq": "CAAGAGCTAAGAAAACATATAGAATCATCATAAGGATGTTGATAATATAAATGTGTTTTTATTTGTGTATTTATGTCAGAATATTGTTCCTTTGATTTATCTTTAAAATAATCAATATTATTTATGTTGGTGGCTTTATTATTATTAAAATAATTTTGATTTGTTACATGATGACTAGGGGTATATTTGTATTTTACGTTTTTATTA"}, {"seq": "CAAGAGCTAAGAAAACATATAGAATCATCATAAGGATGTTGATAATATAAATGTGTTTTTATTTGTGTATTTATGTCAGAATATTGTTCCTTTGATTTATCTTTAAAATAATCAATATTATTTATGTTGGTGGCTTTATTATTATTAAAATAATTTTGATTTGTTACATGATGACTATGGGTATATTTGTATTTTACGTTTTTATTA"}, {"seq": "CAAGAGCTAAGAAAACATATAGAATTATCATAAGGATGTTGATAATATAAATGTGTTTTTATTTGTGTATTTATGTCAGAATATTGTTCCTTTGATTTATCTTTAAAATAATCAATATTATTTATGTTGGTGGCTTTATTATTATTAAAATAATTTTGATTTGTTACATGATGACTAGGGGTATATTTGTATTTTACGTTTTTATTA"}, {"seq": "CAAGAGCTAAGAAAACATATAGAATTATCATAAGGATGTTGATAATATAAATGTGTTTTTATTTGTGTATTTATGTCAGAATATTGTTCCTTTGATTTATCTTTAAAATAATCAAGATTATTTATGTTGGTGGCTTTATTATTATTAAAATAATTTTGATTTGTTACATGATGACTATGGGTATATTTGTATTTTACGTTTTTATTA"}, {"seq": "CAAGAGCTAAGAAAACATATAGAATTATCATAAGGATGTTGATAATATAAATGTGTTTTTATTTGTGTATTTATGTCAGAATATTGTTCCTTTGATTTATCTTTAAAATAATCAATATTATTTATGTTGGTGGCTTTATTATTATTAAAATAATTTTGATTTGTTACATGATGACTATGGGTATATTTGTATTTTACGTTTTTATTA"}, {"seq": "CAAGAGCTAAGAAAACATATAGAATTATCATAAGGATGTTGATAATATAAATGTGTTTTTATTTGTGTATTTATGTCAGAATATTGTTCCTTCGATTTATCTTTAAAATAATCAAGATTATTTATGTTGGTGGCTTTATTATTATTAAAATAATTTTGATTTGTTACATGATGACTATGGGTATATTTGTATTTTACGTTTTTATTA"}, {"seq": "CAAGAGCTAAGAAAACATATAGAATCATCATAAGGATGTTGATAATATAAATGTGTTTTTATTTGTGTATTTATGTCAGAATATTGTTCCTTTGATTTATCTTTAAAATAATCAAGATTATTTATGTTGGTGGCTTTATTATTATTAAAATAATTTTGATTTGTTACATGATGACTATGGGTATATTTGTATTTTACGTTTTTATTA"}, {"seq": "CAAGAGCTAAGAAAACATATAGAATCATCATAAGGATGTTGATAATATAAATGTGTTTTTATTTGTGTATTTATGTCAGAATATTGTTCCTTCGATTTATCTTTAAAATAATCAATATTATTTATGTTGGTGGCTTTATTATTATTAAAATAATTTTGATTTGTTACATGATGACTAGGGGTATATTTGTATTTTACGTTTTTATTA"}, {"seq": "CAAGAGCTAAGAAAACATATAGAATCATCATAAGGATGTTGATAATATAAATGTGTTTTTATTTGTGTATTTATGTCAGAATATTGTTCCTTTGATTTATCTTTAAAATAATCAAGATTATTTATGTTGGTGGCTTTATTATTATTAAAATAATTTTGATTTGTTACATGATGACTAGGGGTATATTTGTATTTTACGTTTTTATTA"}, {"seq": "CAAGAGCTAAGAAAACATATAGAATCATCATAAGGATGTTGATAATATAAATGTGTTTTTATTTGTGTATTTATGTCAGAATATTGTTCCTTCGATTTATCTTTAAAATAATCAAGATTATTTATGTAGGTGGCTTTATTATTATTAAAATAATTTTGATTTGTTACATGATGACTATGGGTATATTTGTATTTTACGTTTTTATTA"}, {"seq": "CAAGAGCTAAGAAAACATATAGAATTATCATAAGGATGTTGATAATATAAATGTGTTTTTATTTGTGTATTTATGTCAGAATATTGTTCCTTCGATTTATCTTTAAAATAATCAATATTATTTATGTTGGTGGCTTTATTATTATTAAAATAATTTTGATTTGTTACATGATGACTAGGGGTATATTTGTATTTTACGTTTTTATTA"}, {"seq": "CAAGAGCTAAGAATACATATAGAATCATCATAAGGATGTTGATAATATAAATGTGTTTTTATTTGTGTATTTATGTCAGAATATTGTTCCTTCGATTTATCTTTAAAATAATCAAGATTATTTATGTTGGTGGCTTTATTATTATTAAAATAATTTTGATTTGTTACATGATGACTATGGGTATATTTGTATTTTACGTTTTTATTA"}, {"seq": "CAAGAGCTAAGAAAACATATAGAATTATCATAAGGATGTTGATAATATAAATGTGTTTTTATTTGTGTATTTATGTCAGAATATTGTTCCTTCGATTTATCTTTAAAATAATCAAGATTATTTATGTTGGTGGCTTTATTATTATTAAAATAATTTTGATTTGTTACATGATGACTAGGGGTATATTTGTATTTTACGTTTTTATTA"}, {"seq": "CAAGAGCTTAGAAAACATATAGAATCATCATAAGGATGTTGATAATATAAATGTGTTTTTATTTGTGTATTTATGTCAGAATATTGTTCCTTCGATTTATCTTTAAAATAATCAAGATTATTTATGTTGGTGGCTTTATTATTATTAAAATAATTTTGATTTGTTACATGATGACTAGGGGTATATTTGTATTTTACGTTTTTATTA"}, {"seq": "CAAGAGCTAAGAAAACATATAGAATCATCATAAGGATGTTGATAATATAAATGTGTTTTTATTTGTGTATTTATGTCAGAATATTGTTCCTTCGATTTATCTTTAAAATAATCAAGATTATTTATGTTGGTGGCTTTATTATTATTAAAATAATTTTGATTTGTTACATGATGACAATGGGTATATTTGTATTTTACGTTTTTATTA"}, {"seq": "CAAGAGCTAAGAAAACATATAGAATCATCATAAGGATGTTGATAATATAAATGTGTTTTTATTTGTGTATTTATGTCAGAATATTGTTCCTTCGATTTATCTTTAAAATAATCAAGATTATTTATGTTGGTGGCTTTATTATTATTAAAATAATTTTGATTTGTTACATGATGACTACGGGTATATTTGTATTTTACGTTTTTATTA"}, {"seq": "CAAGAGCTAAGAAAACATATAGAATTATCATAAGGATGTTGATAATATAAATGTGTTTTTATTTGTGTATTTATGTCAGAATATTGTTCCTTTGATTTATCTTTAAAATAATCAAGATTATTTATGTTGGTGGCTTTATTATTATTAAAATAATTTTGATTTGTTACATGATGACTAGGGGTATATTTGTATTTTACGTTTTTATTA"}, {"seq": "CAAGAGCTAAGAAAACATATAGAACCATCATAAGGATGTTGATAATATAAATGTGTTTTTATTTGTGTATTTATGTCAGAATATTGTTCCTTCGATTTATCTTTAAAATAATCAAGATTATTTATGTTGGTGGCTTTATTATTATTAAAATAATTTTGATTTGTTACATGATGACTATGGGTATATTTGTATTTTACGTTTTTATTA"}], "target_id": 16}, {"microhaplotypes": [{"seq": "CAACATCTGAATTATATAAATCTTTAGAAAAACAACTAATATCCTTACTCGATATATTTATTTTTATACCAAGAATAACAGCCATATAAACCAAAACTCTCTCAAATACATGTGATACAGGTAAATAAGAAAAATGGGTTTTCGGTTTCATGTTTTTTATTACATTATGATCACATAATGGTGCTACT"}, {"seq": "CAACATCTGAATTATATAAATCTTTAGAAAAACAACTAATATCCTTACTACATATATTTATTTTTATACCAAGAATAACAGCCATATAAACCAAAACTCTCTCAAATGCATGTGATACAGGTAAATAAGAAAAATGGGTTTTCGGTTTCATGTTTTTTATTACATTATGATCACATAATGGTGCTACT"}, {"seq": "CAACATCTGAATTATATAAATCTTTAGAAAAACAACTAATATCCTTACTACATATATTTATTTTTATACCAAGAATAACAGCCATATAAACCAAAACTCTCTCAAATACATGTGATACAGGTAAATAAGAAAAATGGGTTTTCGGTTTCATGTTTTTTATTACATTATGATCACATAATGGTGCTACT"}, {"seq": "CAACATCTGAATTATATAAATCTTTAGAAAAACAACTAATATCCTTACTCCATATATTTATTTTTATACCAAGAATAACAGCCATATAAACCAAAACTCTCTCAAATACATGTGATACAGGTAAATAAGAAAAATGGGTTTTCGGTTTCATGTTTTTTATTACATTATGATCACATAATGGTGCTACT"}, {"seq": "CAACATCTGAATTATATAAATCTTTAGAAAAACAACTAATATCCTTACTCCATATATTTATTTTTATACCAAGAATAACAGCCATATAAACCAAAACTCTCTCAAATGCATGTGATACAGGTAAATAAGAAAAATGGGTTTTCGGTTTCATGTTTTTTATTACATTATGATCACATAATGGTGCTACT"}, {"seq": "CAACATCTGAATTATATAAATCTTTAGAAAAACAACTAATATCCTTACTCGATATATTTATTTTTATACCAAGAATAACAGCCATATAAACCAAAACTCTCTCAAATGCATGTGATACAGGTAAATAAGAAAAATGGGTTTTCGGTTTCATGTTTTTTATTACATTATGATCACATAATGGTGCTACT"}, {"seq": "CAACATCTGAATTATATAAATCTTTAGAAAAACAACTAATATCCTTACTCCATATATTTATTTTCATACCAAGAATAACAGCCATATAAACCAAAACTCTCTCAAATGCATGTGATACAGGTAAATAAGAAAAATGGGTTTTCGGTTTCATGTTTTTTATTACATTATGATCACATAATGGTGCTACT"}], "target_id": 17}, {"microhaplotypes": [{"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTCCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTTTGTTCATCTTTGAATTATCCGTTCTGTTTGTATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTCCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTTTGTTCATCTTTGAATTATTCGTTCTGTTTGTATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTTCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTTTGTTCATCTTTGAATTATCCGTTCTGTTTGTATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTCCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTCTGTTCATCTTTGAATTATCCGTTCTGTTTGTATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTCCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTTTGTTCATCTTTGAATTATGCGTTCTGTTTGTATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTCCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTTTGTTCATCCTTGAATTATCCGTTCTGTTTGTATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTCCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTTTTTTCATCTTTGAATTATCCGTTCTGTTTGTATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTTCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTTTGTTCATCTTTGAATTATTCGTTCTGTTTGTATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTCCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTCTGTTCATCTTTGAATTATTCGTTCTGTTTGTATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTTCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTCTGTTCATCTTTGAATTATCCGTTCTGTTTGTATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTTCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTTTGTTCATCTTTGAATTATCCGTTCTGTTTGAATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTCCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTTTGTTCATCTTTGAATTATTCGTTCTGTTTGTATGTCTCAAGCACGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTCCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTTTGTTCATATTTGAATTATGCGTTCTGTTTGTATGTCTCAAGCAAGGT"}, {"seq": "TATTAATATCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTCCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTTTGTTCATCCTTGAATTATCCGTTCTGTTTGTATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTCCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTCTGTTCATCTTTGAATTAACCGTTCTGTTTGTATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTCCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTTTGTTAATCTTTGAATTATCCGTTCTGTTTGTATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTCCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTTTGTTCATCTTTGAATTAACCGTTCTGTTTGTATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTTCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTTTGTTCATCTTTGAATTATGCGTTCTGTTTGTATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTTCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTTTGTTCATCTTTGAATTAACCGTTCTGTTTGTATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTCCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTTTGTTCATCTTTGAATTATCCATTCTGTTTGTATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTCCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTCTGTTCATCTTTGAATTATCCGTTCTGTTTGAATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTCCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTTTTTTCATCTTTGAATTATCCATTCTGTTTGTATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTCCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTTTGTTCATCTTTGAATTATCCCTTCTGTTTGTATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTCCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTTTGTTCATCTTTGAATTATCCGTTCTGTTTGAATGTCTCAAGCAAGGT"}, {"seq": "TATTAATGTCATTTTGTTTTTCTTTATTATTATTATTTTTATTTTTTCCCTGGTTATCTTCCTTATTACCTAGCTTTTTTTTGTTGTCATTATTTTCTGTCTGATTATTATTTTTGACTTTGTTCATCTTTGAATTATTCGTTCTATTTGTATGTCTCAAGCAAGGT"}], "target_id": 18}, {"microhaplotypes": [{"seq": "CTCTCGATTATCATTACCTACTTCAGTCTTTACAATTGTAGGAGGTGTTTTAACATGATTATCCCCTCCATGAGGAGTAACCCTTAAAGGTTCTTCTTGAATATTTGGTGTCGCTTCGCCTGTTTCTGTAGAAAGGATATTTATTCTATCAACATATTCATCACCTTCTTCAACTGTACTATTTAAA"}, {"seq": "CTCTCGATTATCATTACCTACTTCAGTCTTTACAATTATAGGAGGTGTTTTAACATGATTATCCCCTCCATGAGGAGTAACCCTTAAAGGTTCTTCTTGAATATTTGGTGTCGCTTCGCCTGTTTCTGTAGAAAGGATATTTATTCTATCAACATATTCATCACCTTCTTCAACTGTACTATTTAAA"}, {"seq": "CTCTCGATTACCATTACCTACTTCAGTCTTTACAATTATAGGAGGTGTTTTAACATGATTATCCCCTCCATGAGGAGTAACCCTTAAAGGTTCTTCTTGAATATTTGGTGTCGCTTCGCCTGTTTCTGTAGAAAGGATATTTATTCTATCAACATATTCATCACCTTCTTCAACTGTACTATTTAAA"}, {"seq": "CTCTCGATTACCATTACCTACTTCAGTCTTTACAATTATAGGAGGTGTTTTAACATGATTATCCCCTCCATGAGGAGTAACCCTTAAAGGTTCTTCTTGAATATTTGGTGTCGCTTCGCCTGTTTCTGTAGAAGGGATATTTATTCTATCAACATATTCATCACCTTCTTCAACTGTACTATTTAAA"}, {"seq": "CTCTCGATTATCATTACCTACTTCAGTCTTTACAATTGTAGGAGGTGTTTTAACATGATTATCCCCTCCATGAGGAGTAACCCTTAAAGGTTCTTCTTGAATATTTGGTGTCGCTTCGCCTGTTTCTGTAGAAGGGATATTTATTCTATCAACATATTCATCACCTTCTTCAACTGTACTATTTAAA"}, {"seq": "CTCTCGATTATCATTACCTACTTCAGTCTTTACAATTGTAGGAGGTGTTTTAACATGATTATCCCCTCCATGTGGAGTAACCCTTAAAGGTTCTTCTTGAATATTTGGTGTCGCTTCGCCTGTTTCTGTAGAAAGGATATTTATTCTATCAACATATTCATCACCTTCTTCAACTGTACTATTTAAA"}, {"seq": "CTCTCGATTATCATTACCTACTTCAGTCTTTACAATTGTAGGAGGTGTTTTAACATGATCATCCCCTCCATGAGGAGTAACCCTTAAAGGTTCTTCTTGAACATTTGGTGTCTCTTCGCCTGTTTCTATAGAAGGGATATTTTTTCTATCAGCATATTCATCACCTTCTTCAACTGTACTATTTAAA"}, {"seq": "CTCTCGATTATCATTACCTACTTCAGTCTTTACAATTGTAGGAGGTGTTTTAACATGATTATCCCCTCCATGAGGAGTAACCCTTAAAGGTTCTTGAATATTTGGTGTCGCTTCGCCTGTTTCTGTAGAAAGGATATTTATTCTATCAACATATTCATCACCTTCTTCAACTGTACTATTTAAA"}, {"seq": "CTCTCGATTATCATTACCTTCTTCAGTCTTTACAATTGTAGGAGGTGTTTTAACATGATCATCCCCTCCATGAGGAGTAACCCTTAAAGGTTCTTCTTGAACATTTGGTGTCTCTTCGCCTGTTTCTATAGAAGGGATATTTATTCTATCAGCATATTCATCACCTTCTTCAACTGTACTATTTAAA"}, {"seq": "CTCTCGATTATCATTACCTACTTCAGTCTTTACAATTGTAGGAGGTGTTTTAACATGATTATCCCCTTCATGAGGAGTAACCCTTAAAGGTTCTTCTTGAATATTTGGTGTCGCTTCGCCTGTTTCTGTAGAAAGGATATTTATTCTATCAACATATTCATCACCTTCTTCAACTGTACTATTTAAA"}, {"seq": "CTCTCGATTATCATTACCTACTTCAGTCTTTACAATTGTAGGAGGTGTTTTAACATGATCATCCCCTCCATGAGAAGTAACCCTTAAAGGTTCTTCTTGAATATTTGGTGTCTCTTCGCCTGTTTCTATAGAAGGGATATTTTTTCTATCAGCATATTCATCACCTTCTTCAACTGTACTATTTAAA"}, {"seq": "CTCTCGATTATCATTACCTACTTCAGTCTTTACAATTGTAGGAGGTGTTTTAACATGATCATCCCCTCCATGAGGAGTAACCCTTAAAGGTTCTTCTTGAACATTTGGTGTCTCTTCGCCTGTTTCTATAGAAGGGATATTTTTTCTATCAACATATTCATCACCTTCTTCAACTGTACTATTTAAA"}, {"seq": "CTCTCGATTATCATTACCTACTTCAGTCTTTACAATTGTAGGAGGTGTTTTAACATGATTATCCCCTCCATGAGGAGTAACCCTTAAAGATTCTTCTTGAATATTTGGTGTCGCTTCGCCTGTTTCTGTAGAAAGGATATTTATTCTATCAACATATTCATCACCTTCTTCAACTGTACTATTTAAA"}, {"seq": "CTCTCGATTATCATTACCTACTTCAGTCTTTACAATTGTAGGAGGTGTTTTAACATGATTATCCCCTCCATGAGGAGTAACCCTTAAAGGTTCTTCTTGAATATTTGGTGTCGCTTCGCCTGTTTCTATAGAAAGGATATTTATTCTATCAACATATTCATCACCTTCTTCAACTGTACTATTTAAA"}, {"seq": "CTCTCGATTATCATTACCTTCTTCAGTCTTTACAATTATAGGAGATGTTTTAACATGATCATCCCCTCCATGAGGAGTAACCCTTAAAGGTTCTTCTTGAACATTTGGTGTCTCTTCGCCTGTTTCTATAGAAGGGATATTTTTTCTATCAGCATATTCATCACCTTCTTCAACTGTACTATTTAAA"}, {"seq": "CTCTCGATTACCATTACCTACTTCAGTCTTTACAATTATAGGAGGTGTTTTAACATGATTATCCCCTCCATGAGGAGTAACCCTTAAAGGTTCTTCTTGAACATTTGGTGTCTCTTCGCCTGTTTCTATAGAAGGGATATTTTTTCTATCAGCATATTCATCACCTTCTTCAACTGTACTATTTAAA"}, {"seq": "CTCTCGATTACCATTACCTACTTCAGTCTTTACAATTATAGGAGGTGTTTTAACATGATTATCCCCTCCATGAGGAGTAACCCTTAAAGGTTCTTCTTGAATATTTGGTGTCGCTTCGCCTGTTTCTGTAGAAAGGATATTTATTCTATCAGCATATTCATCACCTTCTTCAACTGTACTATTTAAA"}, {"seq": "CTCTCGATTATCATTACCTTCTTCAGTCTTTACAATTGTAGGAGGTGTTTTAACATGATCATCCCCTCCATGAGGAGTAACCCTTAAAGGTTCTTCTTGAACATTTGGTGTCTCTTCGCCTGTTTCTATAGAAGGGATATTTATTCTATCAACATATTCATCACCTTCTTCAACTGTACTATTTAAA"}, {"seq": "CTCTCGATTACCATTACCTACTTCAGTCTTTACAATTGTAGGAGGTGTTTTAACATGATTATCCCCTCCATGTGGAGTAACCCTTAAAGGTTCTTCTTGAATATTTGGTGTCGCTTCGCCTGTTTCTGTAGAAAGGATATTTATTCTATCAACATATTCATCACCTTCTTCAACTGTACTATTTAAA"}, {"seq": "CTCTCGATTATCATTACCTACTTCAGTCTTTACAATTGTAGGAGGTGTTTTAACATGATCATCCCCTCCATGAGGAGTAACCCTTAAAGGTTCTTCTTGAATATTTGGTGTCTCTTCGCCTGTTTCTGTAGAAAGGATATTTATTCTATCAACATATTCATCACCTTCTTCAACTGTACTATTTAAA"}, {"seq": "CTCTCGATTATCATTACCTTCTTCAGTCTTTACAATTATAGGAGATGTTTTAACATGATCATCCCCTCCATGAGGAGTAACCCTTAAAGGTTCTTCTTGAATATTTGGTGTCTCTTCGCCTGTTTCTATAGAAGGCATATTTTTTCTATCAGCATATTCATCACCTTCTTCAACTGTACTATTTAAA"}], "target_id": 19}, {"microhaplotypes": [{"seq": "TTTTGAAATATCTAATTTATCCATTTGCCTTTTTATTTCATAGTCCCAACTACTTACCCAGGTATTAAAATTAATACAATCCTGTTCTGCATATTTTATGGCTTTTAAATCCCTCAATTTAGTAGCCCTATCTTCACAATAATCTTCTAATATTTTAAT"}, {"seq": "TTTTGAAATATCTAATTTATTCATTTGCCTTTTTATTTCATAGTCCCAACTACTTACCCAGGTATTAAAATTAATACAATCCTGTTCTGCATATTTTATGGCTTTTAAATCCCTCAATTTAGTAGCCCTATCTTCACAATAATCTTCTAATATTTTAAT"}, {"seq": "TTTTGAAATATCTAATTTATCCATTTGCCTTTTTATTTCATAGTCCCAACTACTTACCCAGGTATTAAAATTAATACAATCCTGTTCTGCATATTTTATGGCTTTTAAATCCCTCAATTTAGTATCCCTATCTTCACAATAATCTTCTAATATTTTAAT"}, {"seq": "TTTTGAAATATCTAATTTATCCATTTGCCTTTTTATTTCATAGTGCCAACTACTTACCCAGGTATTAAAATTAATACAATCCTGTTCTGCATATTTTATGGCTTTTAAATCCCTCAATTTAGTAGCCCTATCTTCACAATAATCTTCTAATATTTTAAT"}, {"seq": "TTTTGAAATATCTAATTTATTCATTTGCCTTTTTATTTCATAGTCCCAACTATTTACCCAGGTATTAAAATTAATACAATCCTGTTCTGCATATTTTATGGCTTTTAAATCCCTCAATTTAGTAGCCCTATCTTCACAATAATCTTCTAATATTTTAAT"}], "target_id": 20}, {"microhaplotypes": [{"seq": "TCGGGACAATATTATAAGGATTTTATCACATCAAGGAAAAATATTTATAATATAAGGGAAAATATATCCAAAAATGTAGATATGATAAAAAATGAAGAAAAGAAGAAAATACAGAATTGTGTAGATAAATATAATTCTATAAAACAATATGTAAAAATGTTTAAA"}, {"seq": "TCGGGACAATATTATAAGGATTTTATCACATCAAGGAAAAATATTTATAATATAAGGGAAAATATATCCAAAAATGTAGATATGATAAAAAATGAAGAAAAGAAGAAAATACAGAATTGTGTAGATAAATATAATTCTATAAAACAATATGTAAAAATGCTTAAA"}, {"seq": "TCGGGACAATATTATAAGGATTTTATCACATCAAGGAAAAATATTTATAATATAAGGGAAAATATATACAAAAATGTAGATATGATAAAAAATGAAGAAAAGAAGAAAATACAGAATTGTGTAGATAAATATAATTCTATAAAACAATATGTAAAAATGTTTAAA"}, {"seq": "TCGGGACAATATTATAAGGATTTTATCACATCAAGGAAAAATATTTATAATATAAGGGAAAATATATCCAAAAATGTATATATGATAAAAAATGAAGAAAAGAAGAAAATACAGAATTGTGTAGATAAATATAATTCTATAAAACAATATGTAAAAATGCTTAAA"}, {"seq": "TCGGGACAATATTATAAGAATTTTATCACATCAAGGAAAAATATTTATAATATAAGGGAAAATATATCCAAAAATGTAGATATGATAAAAAATGAAGAAAAGAAGAAAATACAGAATTGTGTAGATAAATATAATTCTATAAAACAATATGTAAAAATGTTTAAA"}], "target_id": 21}, {"microhaplotypes": [{"seq": "TGAATACCATATAGCCCTTTCAAATTATATAAAGACAGAACTAAGAAATATAAACCTGCAAGAAATAAAAAACAATATAATAAAAATATTTAAAGAATTCAAATCTGCACACAAAGAAATTAAAAAAGAATCAAAACAAATTAATAAAGAATTTACCAAAATGGATGTCGTCATAAATCAATTAAGAGATATAG"}, {"seq": "TGAATACCATATAGCCCTTTCAAATTATATAAAGACAGAACTAAGAAATATAAACCTGCAAGAAATAAAAAACAATATAATAAAAATATTTAAAGAATTCAAATCTGCACACAAAGAAATTAAAAAAGAATCAGAACAAATTAATAAAGAATTTACCAAAATGGATGTCGTCATAAATCAATTAAGAGATATAG"}, {"seq": "TGAATACCATATAGCCCTTTCAAATTATATAAAGACAGAACTAAGAAATATAAACCTGCAAGAAATAAAAAACAATATAATAAAAATATTTAAAGAATTCGAATCTGCACACAAAGAAATTAAAAAAGAATCAAAACAAATTAATAAAGAATTTACCAAAATGGATGTCGTCATAAATCAATTAAGAGATATAG"}, {"seq": "TGAATACCATATAGCCCTTTCAAATTATATAAAGACAGAACTAAGAAATATAAACCTGCAAGAAATAAAAAACAATATAATAAAAATATTTAAAGAATTCGAATCTGCACACAAAGAAATTAAAAAAGAATCAGAACAAATTAATAAAGAATTTACCAAAATGGATGTCGTCATAAATCAATTAAGAGATATAG"}, {"seq": "TGAATACCATATAGCCCTTTCAAATTATATAAAGACAGAACTAAGAAATATAAACCTCCAAGAAATAAAAAACAATATAATAAAAATATTTAAAGAATTCAAATCTGCACACAAAGAAATTAAAAAAGAATCAAAACAAATTAATAAAGAATTTACCAAAATGGATGTCGTCATAAATCAATTAAGAGATATAG"}, {"seq": "TGAATACCATATAGCCCTTTCAAATTATATAAAGACAGAACTAAGAAATATAAACCTGCAAGAAATAAAAAACAATATAATAAAAATATTTAAAGAATTCAATTCTGCACACAAAGAAATTAAAAAAGAATCAAAACAAATTAATAAAGAATTTACCAAAATGGATGTCGTCATAAATCAATTAAGAGATATAG"}, {"seq": "TGAATACCATATAGCCCTTTCAAATGATATAAAGACAGAACTAAGAAATATAAACCTGCAAGAAATAAAAAACAATATAATAAAAATATTTAAAGAATTCAAATCTGCACACAAAGAAATTAAAAAAGAATCAAAACAAATTAATAAAGAATTTACCAAAATGGATGTCGTCATAAATCAATTAAGAGATATAG"}, {"seq": "TGAATACCATATAGCCCTTTCAAATTATATAAAGACAGAACTAAGAAATATAAACCTCCAAGAAATAAAAAACAATATAATAAAAATATTTAAAGAATTCAAATCTGCACACAAAGAAATTAAAAAAGAATCAGAACAAATTAATAAAGAATTTACCAAAATGGATGTCGTCATAAATCAATTAAGAGATATAG"}, {"seq": "TGAATACCATATAGCCCTTTCAAATTATATAAAGACAGAACTAAGAAATATAAACCTGCAAGAAATAAAAAACAATATAATAAAAATATTTAAAGAATTCAAATCTGCACACGAAGAAATTAAAAAAGAATCAGAACAAATTAATAAAGAATTTACCAAAATGGATGTCGTCATAAATCAATTAAGAGATATAG"}, {"seq": "TGAATACCATATATCCCTTTCAAATTATATAAAGACAGAACTAAGAAATATAAACCTGCAAGAAATAAAAAACAATATAATAAAAATATTTAAAGAATTCAAATCTGCACACAAAGAAATTAAAAAAGAATCAAAACAAATTAATAAAGAATTTACCAAAATGGATGTCGTCATAAATCAATTAAGAGATATAG"}, {"seq": "TGAATACCATATAGCCCTTTCAAATTATATAAAGACAGAACTAAGAAATATAAACCTGCAAGAAATAAAAAACAATATAATAAAAATATTTAAAGAATTCAAATCTGCACACAAAGAAATTAAAAAAGAATCAAAACAAATTAATAAAGAATTTACCAAAATGGATGTCATCATAAATCAATTAAGAGATATAG"}, {"seq": "TGAATACCATATAGCCCTTTCAAATTATATAAAGACAGAACTAAGAAATATAAACCTGCAAGAAATAAAAAACAATATAATAAAAATATTTAAAGAATTCAAATCTGCACACAAAGAAATTAAAAAAGAATCAGAACATATTAATAAAGAATTTACCAAAATGGATGTCGTCATAAATCAATTAAGAGATATAG"}, {"seq": "TGAATACCATATAGCCCTTTCAAATTATATAAAGACAGAACTAAGAAATATAAACCTGCAAGAAATAAAAAACAATATAATAAAAATATTTAAAGAATTCCAATCTGCACACAAAGAAATTAAAAAAGAATCAGAACAAATTAATAAAGAATTTACCAAAATGGATGTCGTCATAAATCAATTAAGAGATATAG"}], "target_id": 22}, {"microhaplotypes": [{"seq": "ATATTGTATATTATCATAAGATTTATATGGAGGACCACATTGAAATCCGACAATTTCATTTGATGCATGTAGTACACATTCCGTATTTCTGTTTGAATTATTTAAAATAATTTTATTACTTAGAAATGATTCTTTTTCACTATAATCTTTATATAAGAAAGGGTCTTCATCAATTTGA"}, {"seq": "ATATTGTATATTATCATAAGATTTATATGGAGGACCACATTGAAATCCGACAATTTCATTTGATGCATGTAGTACACATTCCGTATTTCTGTTTGAATTATTTAAAATAATTTTATTACTTAGAAATGATTCTTTTTCACTATAATCTTTATATAACAAAGGGTCTTCATCAATTTGA"}, {"seq": "ATATTGTATATTATCATAAGATTTATATGGAGGACCACATTGAAATCCGACAATTTCATTTGATGCATGTAGTACACATTCCGTATTTCTGTTTGAATTATTTAAAATAATTTTATTACTTAGAAATGATTCTTTTTCACTATAATCTTTATATGACAAAGGGTCTTCATCAATTTGA"}, {"seq": "ATATTGTATATTATCATAAGATTTATATGGAGGACCACATTGAAATCCGACAATTTCATTTGATGCATGTAGTACACATTCCGTATTTCTGTTTGAATTATTTAAAATAATTTTATTACTTAGAAATGATTCTTTTTCACTATAATCTTTATATAACAAAGCGTCTTCATCAATTTGA"}, {"seq": "ATATTGTATATTATCATAAGATTTATATGGAGGACCACATTGAAATCCGACAATTTCATTTGATGCATGTAGTACACATTCCGTATTTCTGTTTGAATTATTTAAAATAATTTTATTACTTAGAAATGATTCTTTTTCACTATAATCTTTATATAACAAAGGTTCTTCATCAATTTGA"}, {"seq": "ATATTGTATATTATCATAAGATTTATATGGAGGACCACATTGAAATCCGACAATTTCATTTGATGCATGTAGTACACATTCCGTATTTCTGTTTGAATTATTTAAAATAATTTTATTACTTAGAAATGATTCTTTTTCACTATAATCTTTATATAACAAAGAGTCTTCATCAATTTGA"}, {"seq": "ATATTGTATATTATCATAAGATTTATATGGAGGACCACATTGAAATCCGACAATTTCATTTGATGCATGTAGTACACATTCCGTATTTCTGTTTGAATTATTTAAAATAATTTTATTACTTAGAAATGATTCTTTTTCACTATAATCTTTATATAACAAAGGGTTTTCATCAATTTGA"}, {"seq": "ATATTGTATATTATCATAAGATTTATATGGAGGACCACATTGAAATCCGACAATTTCATTTGATGCATGTAGTACACATTCCGTATTTCTGTTTGAATTATTTAAAATAATTTTATTACTTAGAAATGATTCTTTTTCACTATAATCTTTATATAACAAAGGGTATTCATCAATTTGA"}, {"seq": "ATATTGTATATTATCATAAGATTTATATGGAGGACCACATTGAAATCCGACAATTTCATTTGATGCATGTAGTACACATTCCGTATTTCTGTTTGAATTATTTAAAATAATTTTATTACTTAGAAATGATTCTTTTTCACTATAATCTTTATATAACAAAGGGTCTTCATCACTTTGA"}, {"seq": "ATATTGTATATTATCATAAGATTTATATGGAGGACCACATTGAAATCCGACAATTTCATTTGATGCATGTAGTACACATTCTGTATTTCTGTTTGAATTATTTAAAATAATTTTATTACTTAGAAATGATTCTTTTTCACTATAATCTTTATATAAGAAAGGGTCTTCATCAATTTGA"}, {"seq": "ATATTGTATATTATCATAAGATTTATATGGAGGACCACATTGAAATCCGACAATTTCATTTGATGCATGTAGTACACATTCCGTATTTCTGTTTGAATTATTTAAAATAATTTTATTACTTAGAAATGATTCTTTTTCACTATAATCTTTATATAACAAAGTGTCTTCATCAATTTGA"}, {"seq": "ATATTGTATATTATCATAAGATTTATATGGAGGACCACATTGAAATCCGACAATTTCATTTGATGCATGTAGTACACATTCCGTATTTCTGTTTGAATTATTTAAAATAATTTTATTACTTAAAAATGATTCTTTTTCACTATAATCTTTATATAAGAAAGGGTCTTCATCAATTTGA"}, {"seq": "ATATTGTATATTATCATAAGATTTATATGGAGGACCACATTGAAATCCGACAATTTCATTTGATGCATGTAATACACATTCCGTATTTCTGTTTGAATTATTTAAAATAATTTTATTACTTAGAAATGATTCTTTTTCACTATAATCTTTATATAAGAAAGGGTCTTCATCAATTTGA"}], "target_id": 23}, {"microhaplotypes": [{"seq": "TTATTCATTTTTTGTATATTATCCTTTTCTACATCATCAAAATTTGTTAATGATTCACACGTTATATTTGGTGATATTATATTTCTACCTGTACATACACCAATATTTGTTGTACCTATTATTTTATACCCTTCTTGACATTTAAATTCTATTTTTTCACCAAGTAAATAATATTTTTTATCAGGGATAAGGGAAACATA"}, {"seq": "TTATTCATTTTTTCTATATTATCCTTTTCTACATCATCAAAATTTGTTAATGATTCACACGTTATATTTGGTGATATTATATTTCTACCTGTACATACACCAATATTTGTTGTACCTATTATTTTATACCCTTCTTGACATTTAAATTCTATTTTTTCACCAAGTAAATAATATTTTTTATCAGGGATAAGGGAAACATA"}], "target_id": 24}, {"microhaplotypes": [{"seq": "ACAAAATATAATACTTTATATACAAATGCTTATAAAAAATTTTAACTCGAACGTACTTCAAAATAATATAAATGAACAAGAAGTAATACATAATAACATCAACATTAATAATATAAAAGAAGAACAAATTATACCAAATAATATCAAGAATATCCATAATAATGACAATATTAATCATTGTGATGGTAATAAAATAA"}, {"seq": "ACAAAATATAATACTTTATATACAAATGCTTATAAAAAATTTTAACTCGAACGTACTTCAAAATAATATAAATGAACAAGAAGTAATACATAATAACATCAACATTAATAATATAAAAGAAGAACAACTTATACCAAATAATATCAAGAATATCCATAATAATGACAATATTAATCATTGTGATGATAATAAAATAA"}, {"seq": "ACAAAATATAATACTTTATATACAAATGCTTATAAAAAATTTTAACTCGAACGTACTTCAAAATAATATAAATGAACAAGAAGTAATACATAATAACATCAACATTAATAATATAAAAGAAGAACAAATTATACCAAATAATATCAAGAATATCCATAATAATGACAATATTAATCATTGTGATGATAATAAAATAA"}, {"seq": "ACAAAATATAATACTTTATATACAAATGCTTATAAAAAATTTTAACGCGGACGTACTTCAAAATAATATAAATGAAGAAGAAGTAATACATAATAACATCAACATTAATAATATAAAAGAAGAACAAATTATACCAAATAATATCAAGAATATCCATAATAATGACAATATTAATCATTGTGATGATAATAAAATAA"}, {"seq": "ACAAAATATAATACTTTATATACAAATGCTTATAAAAAATTTTAACGCGGACGTACTTCAAAATAATATAAATGAACAAGAAGTAATACATAATAACATCAACATTAATAATATAAAAGAAGAACAACTTATACCAAATAATATCAAGAATATCCATAATAATGACAATATTAATCATTGTGATGATAATAAAATAA"}, {"seq": "ACAAAATATAATACTTTATATACAAATGCTTATAAAAAATTTTAACGCGGACGTACTTCAAAATAATATAAATGAACAAGAAGTAATACATAATAACATCAACATTAATAATATAAAAGAAGAACAAATTATACCAAATAATATCAAGAATATCCATAATAATGACAATATTAATCATTGTGATGATAATAAAATAA"}, {"seq": "ACAAAATATAATACTTTATATACAAATGCTTATAAAAAATTTTAACTCGAACGTACTTCAAAATAATATAAATGAAGAAGAAGTAATACATAATAACATCAACATTAATAATATAAAAGAAGAACAAATTATACCAAATAATATCAAGAATATCCATAATAATGACAATATTAATCATTGTGATGATAATAAAATAA"}, {"seq": "ACAAAATATAATACTTTATATACAAATGCTTATAAAAAATTTTAACGCGGACGTACTTCAAAATAATATAAATGAACAAGAAGTAATACATAATAACATCAACATTAATAATATAAAAGAAGAACAAATTATACCAAATAATATCAAGAATATCCATAATAATGACAATATTAATCATTGTGATGGTAATAAAATAA"}, {"seq": "ACAAAATATAATACTTTATATACAAATGCTTATAAAAAATTTTAACGCGGACGTACTTCAAAATAATATAAATGAAGAAGAAGTAATACATAATAACATCAACATTAATAATATAAAAGAAGAACAAATTATACCAAATAATATCAAGAATATCCATAATAATGACAATATTAATCATTGTGATGGTAATAAAATAA"}, {"seq": "ACAAAATATAATACTTTATATACAAATGCTTATAAAAAATTTTAACTCGAACGTACTTCAAAATAATATAAATGAACAAGAAGTAATACATAATAACATCAACATTAATAATATAAAAGAAGAACAAATTATACGAAATAATATCAAGAATATCCATAATAATGACAATATTAATCATTGTGATGGTAATAAAATAA"}, {"seq": "ACAAAATATAATACTTTATATACAAATGCTTATAAAAAATTTTAACTCGAACGTACTTCAAAATAATATAAATGAACAAGAAGTAATACATAATAACATCAACATTAATAATATAAAAGAAGAACAACTTATACCAAATAATATCAAGAATATCCATAATAATGACAATATTAATCATTGTGATGGTAATAAAATAA"}, {"seq": "ACAAAATATAATACTTTATATACAAATGCTTATAAAAAATTTTAACTCGAACGTACTTCAAAATAATATAAATGAACAAGAAGTAATACATAATAACATCAACATTAATAATATAAAAGAAGAACAAATTATACCAAATAATATCAAGAATATCCATAATAATGACAATATTAATCATTGTGATGATAATAATATAA"}, {"seq": "ACAAAATATAATACTTTATATACAAATGCTTATAAAAAATTTTAACTCGAACGTACTTCAAAATAATATAAATGAAGAAGAAGTAATACATAATAACATCAACATTAATAATATAAAAGAAGAACAAATTATACCAAATAATATCAAGAATATCCATAATAATGACAATATTAATCATTGTGATGGTAATAAAATAA"}, {"seq": "ACAAAATATAATACTTAATATACAAATGCTTATAAAAAATTTTAACTCGAACGTACTTCAAAATAATATAAATGAACAAGAAGTAATACATAATAACATCAACATTAATAATATAAAAGAAGAACAACTTATACCAAATAATATCAAGAATATCCATAATAATGACAATATTAATCATTGTGATGATAATAAAATAA"}, {"seq": "ACAAAATATAATACTTTATATACAAATGCTTATAAAAAATTTTAACTCGAACATACTTCAAAATAATATAAATGAACAAGAAGTAATACATAATAACATCAACATTAATAATATAAAAGAAGAACAAATTATACCAAATAATATCAAGAATATCCATAATAATGACAATATTAATCATTGTGATGGTAATAAAATAA"}, {"seq": "ACAAAATATAATACTTTATATACAAATGCTTATAAAAAATTTTAACTCGAACATACTTCAAAATAATATAAATGAACAAGAAGTAATACATAATAACATCAACATTAATAATATAAAAGAAGAACAAATTATACCAAATAATATCAAGAATATCCATAATAATGACAATATTAATCATTGTGATGATAATAAAATAA"}], "target_id": 25}, {"microhaplotypes": [{"seq": "TATGACTTCTGATTCAGTTTTGTTAAGATATATACCAAGAGATCTTAACAAATATAATAATTTTTCACCACTAACTCCATCTTTATTAGTATCGTATTCTTTAAATATTGATTCAATCTCAGCTCTCTTAAAGAAAACAAATATATATACATATATATATGTATTTATATGAATTTGTATCAATAAATAATAACATTCTTA"}, {"seq": "TATAACTTCTGATTCAGTTTTGTTAAGATATATACCAAGAGATCTTAACAAATATAATAATTTTTCACCACTAACTCCATCTTTATTAGTATCGTATTCTTTAAATATTGATTCAATCTCAGCTCTCTTAAAGAAAACAAATATATATACATATATATATGTATTTATATGAATTTGTATCAATAAATAATAACATTCTTA"}, {"seq": "TATGACTTCTGATTCAGTTTTGTTAAGATATATACCAAGAGATCTTAACAAATATAATAATTTTTCACCACTAACTCCATCTTTATTTGTATCGTATTCTTTAAATATTGATTCAATCTCAGCTCTCTTAAAGAAAACAAATATATATACATATATATATGTATTTATATGAATTTGTATCAATAAATAATAACATTCTTA"}, {"seq": "TATGACTTCTGATTCAGTTTTGTTAAGATATATACCAAGAGATCTTAACAAATATAATAATTTTTCACCACTAACTCCATCTTTATTAGTGTCGTATTCTTTAAATATTGATTCAATCTCAGCTCTCTTAAAGAAAACAAATATATATACATATATATATGTATTTATATGAATTTGTATCAATAAATAATAACATTCTTA"}, {"seq": "TATGACTTCTGATTCAGTTTTGTTAAGATATATACCAAGAGATCTTAACAAATATAATAATTTTTCACCACTAACTCCATCTTTATTAGTATCGTATTCTTTAAATATTGATTCAATCTCAGCTCTCTTAAAGAAAACAAATATATATACATATATATATGTATTTATATGAATTTGTATCAATAAATAATAACATTTTTA"}], "target_id": 26}, {"microhaplotypes": [{"seq": "TGTGCATGTTGTAAGGTTGAAAGCAAAAATGAGGGGAAAAAAAATGAGGTTTTTAATAACTACACATTTAGAGGTCTAGGAAATAAAGGAGTATTACCATGGAAATGTATTTCCCTAGATATGAAATATTTTCGTGCAGTTACAACATATGTGAATGAATCAAAATATGAAAAATTGAAATATAAGAGATGTAAAT"}, {"seq": "TGTGCATGTTGTAAGGTTGAAAGCAAAAATGAGGGGAAAAAAAATGAGGTTTTTAATAACTACACATTTAGAGGTCTAGGAAATAAAGGAGTATTACCATGGAAATGTAATTCCCTAGATATGAAATATTTTTGTGCAGTTACAACATATGTGAATGAATCAAAATATGAAAAATTGAAATATAAGAGATGTAAAT"}, {"seq": "TGTGCATGTTGTAAGGTTGAAAGCAAAAATGAGGGGAAAAAAAATGAGGTTTTTAATAACTACACATTTAGAGGTCTAGGAAATAAAGGAGTATTACCATGGAAATGTAATTCCCTAGATATGAAATATTTTCGTGCAGTTACAACATATGTGAATGAATCAAAATATGAAAAATTGAAATATAAGAGATGTAAAT"}, {"seq": "TGTGCATGTTGTAAGGTTGAAAGCAAAAATGAGGGGAAAAAAAATGAGGTTTTTAATAACTACACATTTAGAGGTCTAGGAAATAAAGGAGTATTACCATGGAAATGTATTTCCCTAGATATGAAATATTTTTGTGCAGTTACAACATATGTGAATGAATCAAAATATGAAAAATTGAAATATAAGAGATGTAAAT"}], "target_id": 27}, {"microhaplotypes": [{"seq": "AAACTGGGAAAGCATTCCAAAAAAATTTAAACCTTTAAGCAATAGGATAAATGTTATATTGTCTAGAACCTTAAAAAAAGAAGATTTTGATGAAGATGTTTATATCATTAACAAAGTTGAAGATCTAATAGTTTTACTTGGGAAATTAAATTACTATAAATGTTTTATTATAG"}, {"seq": "AAGCTGGGAAAGCATTCCAAAAAAATTTAAACCTTTAAGCAATAGGATAAATGTTATATTGTCTAGAACCTTAAAAAAAGAAGATTTTGATGAAGATGTTTATATCATTAACAAAGTTGAAGATCTAATAGTTTTACTTGGGAAATTAAATTACTATAAATGTTTTATTATAG"}, {"seq": "AAGCTGGGAAAGCATTCCAAAAAAATTTAAACCTTTAAGCAATAGGATAAATGTTATATTGTCTAGAACCTTAAAAAAAGAAGATTTTGATGAAGATGTTTATATCATTAACAAAGTTGAAGATCTAATAGTTTTACTTGGGAAATTAAAGTACTATAAATGTTTTATTATAG"}], "target_id": 28}, {"microhaplotypes": [{"seq": "TTAATAAAAAAAATATATTTTACTAGAATAAATAGTACATATGAATGTGATGTATTTTTTCCAGAAATAAATGAAAATGAGTATCAAATTATTTCTGTTAGCGATGTATATACTAGTAACAATACAACATTGGATTTTATCATTTATAAGAAAACGAATAATAAAATGTT"}], "target_id": 29}, {"microhaplotypes": [{"seq": "TTAACAACTTATCATCATTTATTAGATTCTTTTCATGGAACAGATTATTAACAGTATCCATAATTTTATGATCATCCGTGTTATATGTATCTATACAAGTATTTAGCTTGCTTATATAATTTACATATTTCAACGGATCATTTTGAAGTATGCAATCATCGAATGAATA"}, {"seq": "TTAACAACTTATCATCATTTATTAGATTCTTTTCATGGAACAGATTATTAACAGTATCCATAATTTTATGATCATCCGTGTTATATGTATCTATACAAGTATTTAACTTGCTTATATAATTTACATATTTCAACGGATCATTTTGAAGTATGCAATCATCGAATGAATA"}, {"seq": "TTAACAACTTATCATCATTTATTAGATTCTTTTCATTGAACAGATTATTAACAGTATCCATAATTTTATGATCATCCGTGTTATATGTATCTATACAAGTATTTAGCTTGCTTATATAATTTACATATTTCAACGGATCATTTTGAAGTATGCAATCATCGAATGAATA"}, {"seq": "TTAACAACTTATCATCATTTATTAGATTCTTTTCATTGAACAGATTATTAACAGTATCCATAATTTTATGATCATCCGTGTTATATGTATCTATACAAGTATTTAACTTGCTTATATAATTTACATATTTCAACGGATCATTTTGAAGTATGCAATCATCGAATGAATA"}, {"seq": "TTAACAACTTATCATCATTTATTAGATTCGTTTCATGGAACAGATTATTAACAGTATCCATAATTTTATGATCATCCGTGTTATATGTATCTATACAAGTATTTAGCTTGCTTATATAATTTACATATTTCAACGGATCATTTTGAAGTATGCAATCATCGAATGAATA"}, {"seq": "TTAACAACTTATCATCATTTATTAGATTCTTTTCATGGAACAGATTATTAACAGTATCCATAATTTTATGATCATCCGTGTTATATGTATCTATACAAGTATTTAACTTGCTTATATAATTTACATATTTCAACGGATCATTTTGAAGTATGCAATCATCGAATAAATA"}, {"seq": "TTAACAACTTATCATCATTTATTAGATTCTTTTCATGGAACAGATTATTAACAGTATCCATAATTTTATCATCATCCGTGTTATATGTATCTATACAAGTATTTAGCTTGCTTATATAATTTACATATTTCAACGGATCATTTTGAAGTATGCAATCATCGAATGAATA"}], "target_id": 30}, {"microhaplotypes": [{"seq": "GTCTTAACATTAATTCTAGTTACAAAGTTACATGGATTTATTGAAAAGATATTTTCGTCATTATATTTCTTTTTTTCCATATCTGTTTGATCATTTTGATATGTTTTCATATTATCCATATGTTCATTATTTTGATCAATATAATTTTTTTTTATAATAAATTTAGAATTATTTTTAAAGAAA"}, {"seq": "GTCTTAACATTAATCTTAGTTACAAAGTTACATGGATTTATTGAAAAGATATTTTCGTCACTATATTTCTTTTTTTCCATATCCGTTTGATCATTTTTATATGTTTTCATATTATCCATATGTTCATTATTTTGATCAATATAATTTTTTTTTATAATAAATTTAGAATTATTTTTAAAGAAA"}, {"seq": "GTCTTAACATTAATCTTAGTTACAAAGTTACATGGATTTATTGAAAAGATATTTTCGTCACTATATTTCTTTTTTTCCATATCTGTTTGATCATTTTGATATGTTTTCATATTATCCATATGTTCATTATTTTGATCAATATAATTTTTTTTTATAATAAATTTAGAATTATTTTTAAAGAAA"}, {"seq": "GTCTTAACATTAATCTTAGTTACAAAGTTACATGGATTTATTGAAAAGATATTTTCGTCACTATATTTCTTTTTTTCCATATCCGTTTGATCATTTTGATATGTTTTCATATTATCCATATGTTCATTATTTTGATCAATATAATTTTTTTTTATAATAAATTTAGAATTATTTTTAAAGAAA"}, {"seq": "GTCTTAACATTAATCTTAGTTACAAAGTTACATGGATTTATTGAAAAGATATTTTCGTCATTATATTTCTTTTTTTCCATATCTGTTTGATCATTTTGATATGTTTTCATATTATCCATATGTTCATTATTTTGATCAATATAATTTTTTTTTATAATAAATTTAGAATTATTTTTAAAGAAA"}, {"seq": "GTCTTAACATTAATTCTAGTTACAAAGTTACATGGATTTATTGAAAAGATATTTTCGTCATTATATTTCTTTTTTTCCATATCCGTTTGATCATTTTTATATGTTTTCATATTATCCATATGTTCATTATTTTGATCAATATAATTTTTTTTTATAATAAATTTAGAATTATTTTTAAAGAAA"}, {"seq": "GTCTTAACATTAATCTTAGTTACAAAGTTACATGGATTTATTGAAAAGATATTTTCGTTACTATATTTCTTTTTTTCCATATCCGTTTGATCATTTTTATATGTTTTCATATTATCCATATGTTCATTATTTTGATCAATATAATTTTTTTTTATAATAAATTTAGAATTATTTTTAAAGAAA"}, {"seq": "GTCTTAACATTAATTCTAGTTACAAAGTTACATGGATTTATTGAAAAGATATTTTCGTCACTATATTTCTTTTTTTCCATATCCGTTTGATCATTTTTATATGTTTTCATATTATCCATATGTTCATTATTTTGATCAATATAATTTTTTTTTATAATAAATTTAGAATTATTTTTAAAGAAA"}], "target_id": 31}, {"microhaplotypes": [{"seq": "GAAAGAGATTTAACAGATGATGCTGTGATTTTTGCACACTCACTTTATTTACCATTTGAAAAAGAAGAAATGTGGTGGATCGTTATCGGAATTAAAAAAATGAACTTACTTTTATCTATCAAAAAATTATCTTTATTGAAAAGTGTCAATAATATAAAAATTAATTTCGAATTGCCTGACA"}, {"seq": "GAAAGAGATTTAACAGATGATGCTGTGATTTTTGCACACTCACTTTATTTACCATTTGAAAAAGAAGAAATGTGGTGGATCGTTATCGGAATTAAAAAAATGAACTTACTTTTATCTATCAAAAAATTATCTTTATTGAAAAGTATCAATAATATAAAAATTAATTTCGAATTGCCTGACA"}, {"seq": "CAAAGAGATTTAACAGATGATGCTGTGATTTTTGCACACTCACTTTATTTACCATTTGAAAAAGAAGAAATGTGGTGGATCGTTATCGGAATTAAAAAAATGAACTTACTTTTATCTATCAAAAAATTATCTTTATTGAAAAGTGTCAATAATATAAAAATTAATTTCGAATTGCCTGACA"}], "target_id": 32}, {"microhaplotypes": [{"seq": "GATTCTGCATGCAGTAATGAATCTATTGAAATCATCTAAGAATAAACTTTTTTGTTTAAACCATTTATTGAACATTTCACTTAAATGTGATTCAATTTTTTTTTCTGAGCTTTCCATAATTTGATTACATCTATTCAATTTGTTTGTATAAGTTTTAGGTGTTATTATTCTTTTACGTTTTAAATCATC"}, {"seq": "GATTCTGCATGCAGTAATGAATCTATTGAAATCATCTAAGAATAAACTTTTTTGTTTAAACCATTTATTGAACATTTCACTTAAATGTGATTCAATTTTTTTTTCTGAGCTTTCCATAATTTGATTACAACTATTCAATTTGTTTGTATAAGTTTTAGGTCTTATTATTCTTTTACGTTTTAAATCATC"}, {"seq": "GATTCTGCATGCAGTAATGAATCTATTGAAATCATCTAAGAATAAACTTTTTTGTTTAAACCATTTATTGAACATTTCACTTAAATGTGATTCAATTTTTTTTTCTGAGCTTTCCATAATTTGATTACATCTATTCAATTTGTTTGTATAATTATTAGGTCTTATTATTCTTTTACGTTTTAAATCATC"}, {"seq": "GATTCTGCATGCAGTAATGAATCTATTGAAATCATCTAAGAATAAACTTTTTTGTTTAAACCATTTATTGAACATTTCACTTAAATGTGATTCAATTTCTTTTTCTGAGCTTTCCATAATTTGATTACATCTATTCAATTTGTTTGTATAATTATTAGGTCTTATTATTCTTTTACGTTTTAAATCATC"}, {"seq": "GATTCTGCATGCAGTAATGAATCTATTGAAATCATCTAAGAATAAACTTTTTTGTTTAAACCATTTATTGAACATTTCACTTAAATGTGATTCAATTTTTTTTTCTGAGCTTTCCATAATTTGATTACATCTATTTAATTTGTTTGTATAAGTTTTAGGTGTTATTATTCTTTTACGTTTTAAATCATC"}, {"seq": "GATTCTGCATGCAGTAATGAATCTATTGAAATCATCTAAGAATAAACTTTTTTGTTTAAACCATTTATTGAACATTTCACTTAAATGTGATTCAATTTTTTTTTCTGAGCTTTCCATAATTTGATTACATCTATTCAATTTGTTTGTATAAGTTTTAGGTCTTATTATTCTTTTACGTTTTAAATCATC"}, {"seq": "GATTCTGCATGCAGTAATGAATCTATTGAAATCATCTAAGAATAAACTTTTTTGTTTAAACCATTTATTGAACATTTCACTTAAATGTGATTCAATTTTTTTTTCTGAGCTTTCCATAATTTGATTACAACTATTCAATTTGTTTGTATAAGTTTTAGGTGTTATTATTCTTTTACGTTTTAAATCATC"}], "target_id": 33}, {"microhaplotypes": [{"seq": "ATGTACTTATCCCCTGATATGATTTTTCCAATATCATCAAAATCAGTAATCTCTAAATCATTTATATGATTTATATGTATAAATTCTTTTATCTTGTTCAAATAATTTCTGTAATAAAATATATTCTCTTTATCATCATCAATTATTTTCATATAATC"}, {"seq": "ATGTACTTATCCCCTGATATGATTTCCCCAATATCATCAAAATCAGTAATCTCTAAATCATTTATATGATTTATATGTATAAATTCTTTTATCTTGTTCAAATAATTTCTGTAATAAAATATATTCTCTTTATCATCATCAATTATTTTCATATAATC"}, {"seq": "ATGTACTTATCCCCTGATATGATTTTTCCAATATCATCAAAATTAGTAATCTCTAAATCATTTATATGATTTATATGTATAAATTCTTTTATCTTGTTCAAATAATTTCTGTAATAAAATATATTCTCTTTATCATCATCAATTATTTTCATATAATC"}, {"seq": "ATGTACTTATCCCCTGATATGATTCCTCCAATATCATCAAAATCAGTAATCTCTAAATCATTTATATGATTTATATGTATAAATTCTTTTATCTTGTTCAAATAATTTCTGTAATAAAATATATTCTCTTTATCATCATCAATTATTTTCATATAATC"}, {"seq": "ATGTACTTATCCCCTGATATGATTTCTCCATTATCATCAAAATCAGTAATCTCTAAATCATTTATATGATTTATATGTATAAATTCTTTTATCTTGTTCAAATAATTTCTGTAATAAAATATATTCTCTTTATCATCATCAATTATTTTCATATAATC"}, {"seq": "ATGTACTTATCCCCTGATATGATTGTTCCAATATCATCAAAATCAGTAATCTCTAAATCATTTATATGATTTATATGTATAAATTCTTTTATCTTGTTCAAATAATTTCTGTAATAAAATATATTCTCTTTATCATCATCAATTATTTTCATATAATC"}, {"seq": "ATGTACTTATCCCCTGATATGATTTCTCCAATATCATCAAAATCAGTAATCTCTAAATCATTTATATGATTTATATGTATAAATTCTTTTATCTTGTTCAAATAATTTCTGTAATAAAATATATTCTCTTTATCATCATCAATTATTTTCATATAATC"}, {"seq": "ATGTACTTATCCCCTGATATGATTGTTCCAATATCATCAAAATTAGTAATCTCTAAATCATTTATATGATTTATATGTATAAATTCTTTTATCTTGTTCAAATAATTTCTGTAATAAAATATATTCTCTTTATCATCATCAATTATTTTCATATAATC"}, {"seq": "ATGTACTTATCCCCTGATATGATTCCTCCAATATCATCAAAATTAGTAATCTCTAAATCATTTATATGATTTATATGTATAAATTCTTTTATCTTGTTCAAATAATTTCTGTAATAAAATATATTCTCTTTATCATCATCAATTATTTTCATATAATC"}, {"seq": "ATGTACTTATCCCCTGATATGATTTCTCCAATATCATCAAAATTAGTAATCTCTAAATCATTTATATGATTTATATGTATAAATTCTTTTATCTTGTTCAAATAATTTCTGTAATAAAATATATTCTCTTTATCATCATCAATTATTTTCATATAATC"}, {"seq": "ATGTACTTATCCCCTGATATGATTTCTCCAATATCATCAAAATCAGTAATCTCTAAATCATTTATATGATTTATATGTATAAATTCTTTTATCTTGTTCAAATAATTTCTGTAATAAAATATATTCTCTTTATCATCATAAATTATTTTCATATAATC"}, {"seq": "ATGTACTTATCCCCTGATATGATTACTCCAATATCATCAAAATTAGTAATCTCTAAATCATTTATATGATTTATATGTATAAATTCTTTTATCTTGTTCAAATAATTTCTGTAATAAAATATATTCTCTTTATCATCATCAATTATTTTCATATAATC"}, {"seq": "ATGTACTTATCCCCTGATATGATTTCTCCAATATTATCAAAATCAGTAATATCTAAATCATTTATATGATTTATATGTATAAATTCTTTTATCTTGTTCAAATAATTTCTGTAATAAAATATATTCTCTTTATCATCATCAATTATTTTCATATAATC"}], "target_id": 34}, {"microhaplotypes": [{"seq": "TAATATAATTTGAGTTGATAATATTATAATTATTTTTTATATGTTGCTCATTTATATTATTATGATAAATATGAGTTGTATTTTTATTAGAGTTGTAGGACATTTTCCCATACATGAGTTGTTTTACATTTTTAACATTTTTATAATTATGTATTAAACATAAGATTATTAGATAAA"}, {"seq": "TAATATAATTTGAGTTGATAATATTATAATTATTTTTTATATGTTGCTCATTTATATTATTATGATAAATATGAGTTGTATTTTTATTAGAGTTGTAGGACATTTTCCCATACATTAGTTGTTTTACATTTTTAACATTTTTATAATTATGTATTAAACATAAGATTATTAGATAAA"}, {"seq": "TAATATAATTTGAGTTGATAATATTATAATTATTTTTTATATGTTGCTCATTTATATTATTATGATAAATATGAGTTGTATTTTTATTAGAGTTGTAGGACATTTTCCCATACATGAGTTGTTTTACATTTTTAACATTTTTATAATTATGTATTAAACATAAAATTATTAGATAAA"}, {"seq": "TAATATAATTTGAGTTGATAATATTATAATTATTTTTTATATGTTGCTCATTTATATTATTATGATAAATATGAGTTGTATTTTTATTAGAATTGTAGGACATTTTCCCATACATGAGTTGTTTTACATTTTTAACATTTTTATAATTATGTATTAAACATAAGATTATTAGATAAA"}, {"seq": "TAATATAATTTGAGTTGATAATATTATAATTATTTTTTATATGTTGCTCATTTATATTATTATGATAAATATGAGTTGTATTTTTATTAGAATTGTAGGACATTTTCCCATACATGAGTTGTTTTACATTTTTAACATTTTTATAATTATGTATTAAACATAAAATTATTAGATAAA"}, {"seq": "TAATATAATTTGAGTTGATAATATTATAATTATTTTTTATATGTTGCTCATTTATATTATTATGATAAATATGAGTTGTATTTTTATTAGAATTGTAGGACATTTTCCCATACATTAGTTGTTTTACATTTTTAACATTTTTATAATTATGTATTAAACATAAGATTATTAGATAAA"}, {"seq": "TAATATAATTTGAGTTGATAATATTATAATTATTTTTTATATGTTGCTCATTTATATTATTATGATAAATATGAGTTGTATTTTTATTAGAGTTGTAGGACATTTTCCCATACATTAGTTGTTTTACATTTTTAACATTTTTATAATTATGTATTAAACATAAAATTATTAGATAAA"}, {"seq": "TAATATAATTTGAGTTGATAATATTATAATTATTTTTTATATGTTGCTCATTTATATTATTATGATAAATTTGAGTTGTATTTTTATTAGAGTTGTAGGACATTTTCCCATACATGAGTTGTTTTACATTTTTAACATTTTTATAATTATGTATTAAACATAAGATTATTAGATAAA"}, {"seq": "TAATATAATTTGAGTTGATAATATTATAATTATTTTTTATATGTTGCTCATTTATATTATTATGATAAATATGAGTTGTATTTTTATTAGTGTTGTAGGACATTTTCCCATACATTAGTTGTTTTACATTTTTAACATTTTTATAATTATGTATTAAACATAAGATTATTAGATAAA"}, {"seq": "TAATATAATTTGAGTTGATAATATTATAATTATTTTTTATATGTTGCTCATTTATATTATTATGATAAATATGAGTTGTATTTTTATTAGAATTGTAGGACATTTTCCCATACATTAGTTGTTTTACATTTTTAACATTTTTATAATTATGTATTAAACATAAAATTATTAGATAAA"}, {"seq": "TAATATAATTTGAGTTGATAATATTATAATTATTTTTTATATGTTGCTCATTTATATTATTATGATAAATATGAGTTGTATTTTTATTAGAATTGTAGGACATTTTCCCATACATTAGTTGTTTTACATTTTTAACGTTTTTATAATTATGTATTAAACATAAAATTATTAGATAAA"}, {"seq": "TAATATAATTTGAGTTGATAATATTATAATTATTTTTTATATGTTGTTCATTTATATTATTATGATAAATATGAGTTGTATTTTTATTAGAGTTGTAAGACATTTTCCCATACATGAGTTGTTTTACATTTTTAACATTTTTATAATTATGTATTAAACATAAAATTATTAGATAAA"}], "target_id": 35}, {"microhaplotypes": [{"seq": "TGTAATATTATATATCCTGTTATAAATAAATCATTGGATATGGATGTGAAAAAAGAAGATATAAAAAAAAATGTAGAAGAAAATAAATATATAGAACATACACAGAATTTGAAAAATTATTTAGAAAATGATGAAAATGAGAAAAAAAAAAGAAGAAAAAGATCAAATAATAATGACAATTATAATTCTCATGATAATAATATTTTTCA"}, {"seq": "TGTAATATTATATATCCTGTTATAAATAAATCACTGGATATGGATGTGAAAAAAGAAGATATAAAAAAAAATGTAGAAGAAAATAAATATATAGAACATACACAGAATTTGAAAAATTATTTAGAAAATGATGAAAATGAGAAAAAAAAAAGAAGAAAAAGATCAAATAATAATGACAATTATAATTCTCATGATAATAATATTTTTCA"}, {"seq": "TGTAATATTATATATCCTGTTATAAATAAATCACTGGATATGGATGTGAAAAAAGAAGATATAAAAAAAAATGTAGAAGAAAATAAATATATAGAACATACACAGAATTTGAAAAATCATTTAGAAAATGATGAAAATGAGAAAAAAAAAAGAAGAAAAAGATCAAATAATAATGACAATTATAATTCTCATGATAATAATATTTTTCA"}, {"seq": "TGTAATATTATATATCCTGTTATAAATAAATCATTGGATATGGATGTGAAAAAAGAAGATATAAAAAAAAATGTAGAAGAAAATAAATATATAGAACATACACAGAATTTGAAAAATCATTTAGAAAATGATGAAAATGAGAAAAAAAAAAGAAGAAAAAGATCAAATAATAATGACAATTATAATTCTCATGATAATAATATTTTTCA"}, {"seq": "TGTAATATTATATATCCTGTTATAAATAAATCATTGGATATGGATGTGGAAAAAGAAGATATAAAAAAAAATGTAGAAGAAAATAAATATATAGAACATACACAGAATTTGAAAAATTATTTAGAAAATGATGAAAATGAGAAAAAAAAAAGAAGAAAAAGATCAAATAATAATGACAATTATAATTCTCATGATAATAATATTTTTCA"}], "target_id": 36}, {"microhaplotypes": [{"seq": "TCTAAGGATTGTTGGTTTTTTAGGATGCTCATCTTTTTAAGATAATCCTCTTTACTGTCGTTATTATTTAAATCGTTTTGTATAATATTATATTGTGAATTCCTTGTGTTTTTCATAATACTATTAGTCCTATTGGTGTTCTTCTTATTATTATTATTATTATTGTTCTTCTTCTTAATAAA"}, {"seq": "TCTAAGGATTGTTGGTTTTTTAGGATGCTCATCTTTTTAAGATAATCCTCTTTACTGTCGTTATTATTTAAATCGTTTTGTATAATATTATATTGTGAATTCCTTGTGTTTTTCATAACACTATTAGTCCTATTGGTGTTCTTCTTCTTATTATTATTATTATTGTTCTTCTTCTTAATAAA"}, {"seq": "TCTAAGGATTGTTGGTTTTTTAGGATGCTCATCTTTTTAAGATAATCCTCTTTACTGTCGTTATTATTTAAATCGTTTTGTATAATATTATATTGTGAATTCCTTGTGTTTTTCATAACACTATTAGTCCTATTGGTGTTCTTCTTATTATTATTATTATTATTGTTCTTCTTCTTAATAAA"}, {"seq": "TCTAAGGATTGTTGGTTTTTTAGGATGCTCATCTTTTTAAGATAATCCTCTTTACTGTCGTTATTATTTAAATCGTTTTGTATAATATTATATTGTGAATTCCTTGTGTTTTTCATAACACTATTAGTCCTATTGGTGTTCTTCTTATTATTATTATTATTGTTCTTCTTCTTAATAAA"}, {"seq": "TCTAAGGATTGTTGGTTTTTTAGGATGCTCATCTTTTTAAGATAATCCTCTTTACTGTCGTTATTATTTAAATCGTTTTGTATAATATTATATTGTGAATTCCTTGTGTTTTTCATAACACTATTAGTCCTATTGGTGTTCTTCTTCTTATTATTATTATTGTTCTTCTTCTTAATAAA"}, {"seq": "TCTAAGGATTGTTGGTTTTTTAGGATGCTCATCTTTTTAAGATAATCCTCTTTACTGTCGTTATTATTTAAATCGTTTTGTATAATATTATATTGTGAATTCCTTGTGTTTTTCATAATACTATTAGTCCTATTGGTGTTCTTCTTCTTATTATTATTATTATTGTTCTTCTTCTTAATAAA"}, {"seq": "TCTAAGGATTGTTGGTTTTTTAGGATGCTCATCTTTTTAAGATAATCCTCTTTACTGTCGTTATTATTTAAATCGTTTTGTATAATATTATATTGTGAATTCCTTGTGTTTTTCATAATACTATTAGTCCTATTGGTGTTCTTCTTATTATTATTATTATTGTTCTTCTTCTTAATAAA"}, {"seq": "TCTAAGGATTGTTGGTTTTTTAGGATGTTCATCTTTTTAAGATAATCCTCTTTACTGTCGTTATTATTTAAATCGTTTTGTATAATATTATATTGTGAATTCCTTGTGTTTTTCATAACACTATTAGTCCTATTGGTGTTCTTCTTATTATTATTATTATTGTTCTTCTTCTTAATAAA"}, {"seq": "TCTAAGGATTGTTGGTTTTTTAGGATGCTCATCTTTTTAAGATAATCCTCTTTACTGTCGTTATTATTTAAATCGTTTTGTATAATATTATATTGTGAATTCCTTGTGTTTTTCATAACACTATTAGTCCTATTGGTGTTCTTCTTCTTCTTATTATTATTATTGTTCTTCTTCTTAATAAA"}, {"seq": "TCTAAGGATTGTTGGTTTTTTAGGATGCTCATCTTTTTAAGATAATCCTCTTTACTGTCGTTATTATTTAAATCGTTTTGTATAATATTATATTGTGAATTCCTTGTGTTTTTCATAACACTATTAGTCCTATTGGTGTTCTTCTTCTTATTATTATTATTATTATTGTTCTTCTTCTTAATAAA"}, {"seq": "TCTAAGGATTGTTGGTTTTTTAGGATGCTCATCTTTTTAAGATAATCCTCTTTACTGTCGTTATTATTTAAATCGTTTTGTATAATATTATATTGTGAATTCCTTGTGTTTTTCATAATACTATTAGTCCTATTGGTGTTCTTATTATTATTATTATTATTGTTCTTCTTCTTAATAAA"}, {"seq": "TCTAAGGATTGTTGGTTTTTTAGGATGCTCATCTTTTTAAGATAATCCTCTTTACTGTCGTTATTATTTAAATCGTTTTGTATAATATTATATTGTGAATTCCTTGTGTTTTTCATAACACTGTTAGTCCTATTGGTGTTCTTCTTCTTATTATTATTATTGTTCTTCTTCTTAATAAA"}, {"seq": "TCTAAGGATTGTTGGTTTTTTAGGATGCTCATCTTTTTAAGATAATCCTCTTTACTGTCGTTATTATTTAAATCGTTTTGTATACTATTATATTGTGAATTCCTTGTGTTTTTCATAACACTATTAGTCCTATTGGTGTTCTTCTTATTATTATTATTATTGTTCTTCTTCTTAATAAA"}, {"seq": "TCTAAGGATTGTTGGTTTTTTAGGATGCTCATCTTTTTAAGATAATCCTCTTTACTGTCGTTATTATTTAAATCGTTTTGTATAATATTATATTGTGAATTCCTTGTGTTTTTCATAACACTATTAGTCCTATTGGTGTTCTTCTTATTATTTTTATTATTGTTCTTCTTCTTAATAAA"}, {"seq": "TCTAAGGATTGTTGGTTTTTTAGGATGCTCATCTTTTTAAGATAATCCTCTTTACTGTCGTTATTATTTAAATCGTTTTGTATAATATTATATTGTGAATTCCTTGTGTTTTTCATAATACTATTAGTCCTATTGGTGTTCTTCTTCTTATTATTATTATTGTTCTTCTTCTTAATAAA"}, {"seq": "TCTAAGGATTGTTGGTTTTTTAGGATGCTCATCTTTTTAAGATAATCCTCTTTACTGTCGTTATTATTTAAATCGTTTTGTATAATATTATATTGTGAATTCCTTGTGTTTTTCATAATACTATTAGTCCTATTGGTGTTCTTCTTCTTATTATTATTATTATTGTTCTTCTTAATAAAAAA"}, {"seq": "TCTAAGGATTGTTGGTTTTTTAGGATGCTCATCTTTTTAAGATAATCCTCTTTACTGTTGTTATTATTTAAATCGTTTTGTATAATATTATATTGTGAATTCCTTGTGTTTTTCATAACACTATTAGTCCTATTGGTGTTCTTCTTATTATTATTATTATTATTGTTCTTCTTCTTAATAAA"}], "target_id": 37}, {"microhaplotypes": [{"seq": "ATATAATACACCTTTCTTATTTATATTAATCTTTTCATTTTTACAAGAAATCACCTCCCTACTTATTCGGTTGTCCTCATTTTCATATTTCATAACACCATCATTTATTTTTTCTATTTCTTTAATATTATTTTCTCCTTGGACGTAATTATGCTTTCCTATCATCTCCTTTGCTCTACTTCCTATATATACTAATTTCTCTCTGAA"}, {"seq": "ATATAATACACCTTTCTTATTTATATTAATCTTTTCATTTTTACAAGAAATCACCTCCCTACTTATTCGGTTGTCCTCATTTTCATATTTCATAACACCATCATTTATTTTTTCTATTTCTTTAATATTATTTTCTCCTTCGACGTAATTATGCTTTCCTATCATCTCCTTTGCTCTACTTCCTATATATACTAATTTCTCTCTGAA"}, {"seq": "ATATACACCTTTCTTATTTATATTAATCTTTTCATTTTTACAAGAAATCACCTCCCTACTTATTCGGTTGTCCTCATTTTCATATTTCATAACACCATCATTTATTTTTTCTATTTCTTTAATATTATTTTCTCCTTGGACGTAATTATGCTTTCCTATCATCTCCTTTGCTCTACTTCCTATATATACTAATTTCTCTCTGAA"}, {"seq": "ATATACACCTTTCTTATTTATATTAATCTTTTCATTTTTACAAGAAATCACCTCCCTACTTATTCGGTTGTCCTCATTTTCATATTTCATAACACCATCATTTATTTTTTCTATTTCTTTAATATTATTTTCTCCTTCGACGTAATTATGCTTTCCTATCATCTCCTTTGCTCTACTTCCTATATATACTAATTTCTCTCTGAA"}, {"seq": "ATATACACCTTTCTTATTTATATTAATCTTTTCATTTTTACAAGAAATCACCTCCCTACTTATTCGGTTGTTCTCATTTTCATATTTCATAACACCATCATTTATTTTTTCTATTTCTTTAATATTATTTTCTCCTTGGACGTAATTATGCTTTCCTATCATCTCCTTTGCTCTACTTCCTATATATACTAATTTCTCTCTGAA"}, {"seq": "ATATAATACACCTTTCTTATTTATATTAATCTTTTCATTTTTACAAGAAATCACCTCCCTATTTATTCGGTTGTCCTCATTTTCATATTTCATAACACCATCATTTATTTTTTCTATTTCTTTAATATTATTTTCTCCTTCGACGTAATTATGCTTTCCTATCATCTCCTTTGCTCTACTTCCTATATATACTAATTTCTCTCTGAA"}, {"seq": "ATATAATACACCTTTCTTATTTATATTAATCTTTTCATTTTTACAAGAAATCACCTCCCTACTTATTCGGTTGTCCTCATTTTCATATTTCATAACACCATCATTTATTTTTTCTATTTCTTTAATATTATTTTCTCCTTCGACGTAATTATGCTTTCCTATCATCTCCTTTGCTCTATTTCCTATATATACTAATTTCTCTCTGAA"}, {"seq": "ATATACACCTTTCTTATTTATATTAATCTTTTCATTTTTACAAGAAATCACCTCCCTACTTATTCGGTTGTTCTCATTTTCATATTTCATAACACCATCATTTATTTTTTCTATTTCTTTAATATTATTTTCTCCTTCGACGTAATTATGCTTTCCTATCATCTCCTTTGCTCTACTTCCTATATATACTAATTTCTCTCTGAA"}], "target_id": 38}, {"microhaplotypes": [{"seq": "GGAATTTTTTTTTTGGTGTTTTATTTTTTCGAAGGATACAGGATAATCTAAGACATTAAAATTATTGGGTTTGAAAAAGAGTTTCCTTTTTATGATGTGCAATAGAGGTATATTTATATAGGAAATATAAACATATAAAAGGAATATGATAAAAAGGAAATATTGACTTAATAAAATATTAATATTTCTTTTTTTCAAATATATTTCGT"}, {"seq": "GGAATTTTTTTTTTGGTGTTTTATTTTTTCGAAGGATACAGTATAATCTAAGACATTAAAATTATTGGATTTGAAAAAGAGTTTCCTTTTTATGATGTGCAATAGAGGTATATTTATATAGGAAATATAAACATATAAAAGGAATATGATAAAAAGGAAATATTGACTTAATAAAATATTAATATTTCTTTTTTTCAAATATATTTCGT"}, {"seq": "GGAATTTTTTTTTTGGTGTTTTATTTTTTCGAAGGATACAGGATAATCTAAGACATTAAAATTATTGGGTTTGAAAAAGAGTTTCCTTTTTATGATGTGCAATAGAGGTATATTTATATAGGAAATATAAACATATAAAAGGAATATGATAAAAAGGAAATATTGACTTAATAAAATATTAATATTTCTTTTTTTAAAATATATTTCGT"}, {"seq": "GGAATTTTTTTTTTGGTGTTTTATTTTTTCGAAGGATACAGGATAATCTAAGACATTAAAATTATTGGATTTGAAAAAGAGTTTCCTTTTTATGATGTGCAATAGAGGTATATTTATATAGGAAATATAAACATATAAAAGGAATATGATAAAAAGGAAATATTGACTTAATAAAATATTAATATTTCTTTTTTTCAAATATATTTCGT"}, {"seq": "GGAATTTTTTTTTTGGTGTTTTATTTTTTCGAAGGATACAGTATAATCTAAGACATTAAAATTATTGGGTTTGAAAAAGAGTTTCCTTTTTATGATGTGCAATAGAGGTATATTTATATAGGAAATATAAACATATAAAAGGAATATGATAAAAAGGAAATATTGACTTAATAAAATATTAATATTTCTTTTTTTCAAATATATTTCGT"}, {"seq": "GGAATTTTTTTTTTGGTGTTTTATTTTTTCGAAGGATACAGGATAATCTAAGACATTAAAATTATTGGATTTGAAAAAGAGTTTCCTTTTTATGATGTGCAATAGAGGTATATTTATATAGGAAATATAAACATATAAAAGGAATATGATAAAAAGGAAATATTGACTTAATAAAATATTAATATTTCTTTTTTTAAAATATATTTCGT"}], "target_id": 39}, {"microhaplotypes": [{"seq": "TAATATTATCTGGCTCTGTAACCATGTCCGAACATATGTTAACAGGAGAATCTGTTCCTATACATAAAGAGCGGTTACCTTTTGAAGGAAATGCTATTATAAATAAAAATAATAAATATGACAGTAACGATGAAAAGGATGATTACCTTCGTATTTATAATAATCATGCTAGTATTAATATGATCAACCG"}, {"seq": "TAATATTATCTGGCTCTGTAACCATGTCCGAACATATGTTAACAGGAGAATCTGTTCCTATACATAAAGAGCGGTTACCTTTTGAAGGAAATGCTATTATAAATAAAAATAATAAATATGACAGTAACGATGAAAAGGATGATTACCTTCGTATTTATAATAATCATGCTAGTATTAATATGATCAAGCG"}, {"seq": "TAATATTATCTGGCTCTGTAACCATGTCCGAACATATGTTAACAGGAGAATCTGTTCCTATACATAAAGAGCGGTTACCTTTTGAAGGAAATGCTATTATAAATAAAAATAATAAATATGAGAGTAACGATGAAAAGGATGATTACCTTCGTATTTATAATAATCATGCTAGTATTAATATGATCAAGCG"}, {"seq": "TAATATTATCTGGCTCTGTAACCATGTCCGAACATATGTTAACAGGAGAATCTGTTCCTATACATAAAGAGCAGTTACCTTTTGAAGGAAATGCTATTATAAATAAAAATAATAAATATGACAGTAACGATGAAAAGGATGATTACCTTCGTATTTATAATAATCATGCTAGTATTAATATGATCAACCG"}, {"seq": "TAATATTATCTGGCTCTGTAACCATGTCCGAACATATGTTAACAGGAGAATCTGTTCCTATACATAAAGAGCGGTTACCTTTTGAAGGAAATGCTATTATAAATAAAAATAATAAATATGAGAGTAACGATGAAAAGGATGATTACCTTCGTATTTATAATAATCATGCTAGTATTAATATGATCAACCG"}, {"seq": "TAATATTATCTGGCTCTGTAACCATGTCCGAACATATGTTAACAGGAGAATCTGTTCCTATACATAAAGAGCAGTTACCTTTTGAAGGAAATGCTATTATAAATAAAAATAATAAATATGAGAGTAACGATGAAAAGGATGATTACCTTCGTATTTATAATAATCATGCTAGTATTAATATGATCAAGCG"}, {"seq": "TAATATTATCTGGCTCTGTAACCATGTCCGAACATATGTTAACAGGAGAATCTGTTCCTATACATAAAGAGCAGTTACCTTTTGAAGGAAATGCTATTATAAATAAAAATAATAAATATGAGAGTAACGATGAAAAGGATGATTACCTTCGTATTTATAATAATCATGCTAGTATTAATATGATCAACCG"}, {"seq": "TAATATTATCTGGCTCTGTAACCATGTCCGAACATATGTTAACAGGAGAATCTGTTCCTATACATAAAGAGCGGTTACCTTTTGAAGGAAATGCTATTATAAATAAAAATAATAAATATGACAGTAACGATGAAAAGGATGATTACCTTCGTATTTATAATAATAATGCTAGTATTAATATGATCAAGCG"}, {"seq": "TAATATTATCTGGCTCTGTAACCATGTCCGAACATATGTTAACAGGAGAATCTGTTCCTATACATAAAGAGCAGTTACCTTTTGAAGGAAATGCTATTATAAATAAAAATAATAAATATGACAGTAACGATGAAAAGGATGATTACCTTCGTATTTATAATAATCATGCTAGTATTAATATGATCAAGCG"}, {"seq": "TAATATTATCTGGCTCTGTAACCATGTCCGAACATATGTTAACAGGAGAATCTGTTCCTATACATAAAGAGCGGTTACCTTTTGAAGGAAATGCTATTATAAATAAAAATAATAAATATGACAGTAACGATGAAAAGGATGATTACCTTCGTATTTATAATAATCATGCTAGTATTAATATGATCAATCG"}, {"seq": "TAATATTATCTGGCTCTGTAACCATGTCCGAACATATGTTAACAGGAGAATCTGTTCCTATAGATAAAGAGCAGTTACCTTTTGAAGGAAATGCTATTATAAATAAAAATAATAAATATGACAGTAACGATGAAAAGGATGATTACCTTCGTATTTATAATAATCATGCTAGTATTAATATGATCAACCG"}, {"seq": "TAATATTATCTGGATCTGTAACCATGTCCGAACATATGTTAACAGGAGAATCTGTTCCTATACATAAAGAGCGGTTACCTTTTGAAGGAAATGCTATTATAAATAAAAATAATAAATATGACAGTAACGATGAAAAGGATGATTACCTTCGTATTTATAATAATCATGCTAGTATTAATATGATCAAGCG"}, {"seq": "TAATATTATCTGGCTCTGTAACCATGTCCGAACATATGTTAACAGGAGAATCTGTTCCTATACATAAAGAGCAGTTACCTTTTGAAGGAAATGCTATTATAAATAAAAATAATAAATATGAGAGTAACGATGAAAAGGATGATTACCTTCGTATTTATAATAATCATGCTAGTATTAATATGATCACGCG"}], "target_id": 40}, {"microhaplotypes": [{"seq": "TGGTTCTTCAATTATTCATATAAGTTCTTTATTAGTAGGTGTATATTTATGTAGTAGTAGTGCAAATGCATTTAATCAAATTATTGAAAGAAATATAGATAAGTTAATGAAAAGAACCCAAAAAAGACCCTTAGCAAATAATAATCCAAATATGTCAGTTAAACATGCTGAAATAT"}, {"seq": "TGGTTCTTCAATTGTTCATATAAGTTCTTTATTAGTAGGTGTATATTTATGTAGTAGTAGTGCAAATGCATTTAATCAAATTATTGAAAGAAATATAGATAAGTTAATGAAAAGAACCCAAAAAAGACCCTTAGCAAATAATAATCCAAATATGTCAGTTAAACATGCTGAAATAT"}, {"seq": "TGGTTCTTCAATTATTCATATAAGTTCTTTATTAGTAGGTGTATATTTATGTAGTAGTAGTGCAAATGCATTTAATCAAATTATTGAAAGAAATATAGATAAGTTAATGAAAAGAACCCAAAAAAGACCCTTAGCAAATAATAATCCAAATATGTCAGTTAAGCATGCTGAAATAT"}, {"seq": "TGGTTCTTCAATTGTTCATATAAGTTCTTTATTAGTAGGTGTATATTTATGTAGTAGTAGTGCAAATGCATTTAATCAAATTATTGAAAGAAATATAGATAAGTTAATGAAAAGAACCCAAAAAAGACCCTTAGCAAATAATAATCCAAATATGTCAGTTAAGCATGCTGAAATAT"}, {"seq": "TGGTTCTTCAATTGTTCATATAAGTTCTTTATTAGTAGGTGTATATTTATGTAGTAGTAGTGCAAATGCATTTAATCAAATTATTGAAAGAAATATAGATAAGTTAATGAAGAGAACCCAAAAAAGACCCTTAGCAAATAATAATCCAAATATGTCAGTTAAGCATGCTGAAATAT"}, {"seq": "TGGTTCTTCAATTGTTCATATAAGTTCTTTATTAGTAGGTGTATATTTATGTAGTAGTAGTGCAAATGCATTTAATCAAATTATTGAAAGAAATATAGATAAGTTAATGAAAAGAACCCAAAAAAGACCCTTAGCAAATAATAATCCAAATGTGTCAGTTAAGCATGCTGAAATAT"}, {"seq": "TGGTTCTTCAATTGTTCATATAAGTTCTTTATTAGTAGGTGTATATTTATGTAGTAGTAGTGCAAATGCATTTAATCAAATTATTGAAAGAAGTATAGATAAGTTAATGAAAAGAACCCAAAAAAGACCCTTAGCAAATAATAATCCAAATATGTCAGTTAAACATGCTGAAATAT"}, {"seq": "TGGTTCTTCAATTATTCATATAAGTTCTTTATTAGTAGGTGTATATTTATGTAGTAGTAGTGCAAATGCATTTAATCAAATTATTGAAAGAAATATAGATAAGTTAATGAAGAGAACCCAAAAAAGACCCTTAGCAAATAATAATCCAAATATGTCAGTTAAGCATGCTGAAATAT"}], "target_id": 41}, {"microhaplotypes": [{"seq": "TTTTTATATCTGTGTTTGGTGTAATATTAAAGAACATGAATTTAGGTGATGATATTAATCCTATAATATTATCATTAGTATCTATAGGTTTAGTACAATTTATATTATCAATGATATCAAGTTATTGTATGGATGTAATTACATCAAAAATATTAAAAACTTTAAAGCTTGAATATTTAAGAAGTGTTTTTTATCAAGATGGACAATTTC"}, {"seq": "TTTTTATATCTGTGTTTGGTGTAATATTAAAGAACATGTATTTAGGTGATGATATTAATCCTATAATATTATCATTAGTATCTATAGGTTTAGTACAATTTATATTATCAATGATATCAAGTTATTGTATGGATGTAATTACATCAAAAATATTAAAAACTTTAAAGCTTGAATATTTAAGAAGTGTTTTTTATCAAGATGGACAATTTC"}, {"seq": "TTTTTATATCTGTGTTTGGTGTAATATTAAAGAACATGAATTTAGGTGATGATATTAATCCTATAATATTATCATTAGTATCTATAGGCTTAGTACAATTTATATTATCAATGATATCAAGTTATTGTATGGATGTAATTACATCAAAAATATTAAAAACTTTAAAGCTTGAATATTTAAGAAGTGTTTTTTATCAAGATGGACAATTTC"}, {"seq": "TTTTTATATCTGTGTTTGGTGTAATATTAAAGAACATGAATTTAGGTGATGATATTAATCCTATAATATTATCATTAGTATCTATAGGTTTAGTGCAATTTATATTATCAATGATATCAAGTTATTGTATGGATGTAATTACATCAAAAATATTAAAAACTTTAAAGCTTGAATATTTAAGAAGTGTTTTTTATCAAGATGGACAATTTC"}], "target_id": 42}, {"microhaplotypes": [{"seq": "ATTTATAACAATTTTTACATATGCCAGTTCCTTTTTAGGTTTATTTATTTGGTCATTAATAAAAAATGCACGTTTGACTTTATGTATTACTTGCGTTTTTCCGTTAATTTATGTTTGTGGTGTCATATGTAATAAGAAAGTAAAATTAAATAAAAAAACATCTTTGTTATATAATAACAATACC"}, {"seq": "ATTTATAACAATTTTTACATATGCCAGTTCCTTTTTAGGTTTATATATTTGGTCATTAATAAAAAATGCACGTTTGACTTTATGTATTACTTGCGTTTTTCCGTTAATTTATGTTTGTGGTGTCATATGTAATAAGAAAGTAAAATTAAATAAAAAAACATCTTTGTTATATAATAACAATACC"}, {"seq": "ATTTATAACAATTTTTACATATGCCAGTTCCTTTTTAGGTTTATATATTTGGTCATTAATAAAAAATGCACGTTTGACTTTATGTATTACTTGCGTTTTTCCGTTAATTTATGTCTGTGGTGTCATATGTAATAAGAAAGTAAAATTAAATAAAAAAACATCTTTGTTATATAATAACAATACC"}, {"seq": "ATTTATAACAATTTTTACATATGCCAGTTCCTTTTTAGGTTTATTTATTTGGTCATTAATAAAAAATGCACGTTTGACATTATGTATTACTTGCGTTTTTCCGTTAATTTATGTTTGTGGTGTCATATGTAATAAGAAAGTAAAATTAAATAAAAAAACATCTTTGTTATATAATAACAATACC"}], "target_id": 43}, {"microhaplotypes": [{"seq": "AATAATAAATCGAAAACCATTAGTTGAAAATAATGATGATGGAGAAACATTACCAAATATTAAAAAAATTGAATTTAAAAATGTAAGATTTCATTATGATACTAGAAAAGATGTTGAAATTTATAAAGATTTAAGTTTTACTCTAAAAGAAGGGAAAACATATGCATTTGTGGGAGAATCA"}, {"seq": "AATAATAAATCGAAAACCATTAGTTGAAAATAATGATGATGGAGAAACATTACCAAATATTAAAAAAATTGAATTTAAAAATGTTAGATTTCATTATGATACTAGAAAAGATGTTGAAATTTATAAAGATTTAAGTTTTACTCTAAAAGAAGGGAAAACATATGCATTTGTGGGAGAATCA"}], "target_id": 44}, {"microhaplotypes": [{"seq": "TAATACAGGAAGCATTTTATAATATGCATACTGTTATTAATTATGGTTTAGAAGATTATTTCTGTAATTTGATAGAAAAAGCTATTGATTATAAAAATAAAGGACAAAAAAGAAGAATTATTGTAAATGCAGCTTTATGGGGATTCAGTCAAAGCGCTCAATTATTTATTAATAGTTT"}, {"seq": "TAATACAGGAAGCATTTTATAATATGCATACGGTTATTAATTATGGTTTAGAAGATTATTTCTGTAATTTGATAGAAAAAGCTATTGATTATAAAAATAAAGGACAAAAAAGAAGAATTATTGTAAATGCAGCTTTATGGGGATTCAGTCAAAGCGCTCAATTATTTATTAATAGTTT"}, {"seq": "TAATACAGGAAGCATTTTATAATATGCATACTGTTATTAATTATGGTTTAGAAGATTACTTCTGTAATTTGATAGAAAAAGCTATTGATTATAAAAATAAAGGACAAAAAAGAAGAATTATTGTAAATGCAGCTTTATGGGGATTCAGTCAAAGCGCTCAATTATTTATTAATAGTTT"}, {"seq": "TAATACAGGAAGCATTTTATAATATGCATACTGTTATTAATTATGGTTTAGAAGATTATTTCTGCAATTTGATAGAAAAAGCTATTGATTATAAAAATAAAGGACAAAAAAGAAGAATTATTGTAAATGCAGCTTTATGGGGATTCAGTCAAAGCGCTCAATTATTTATTAATAGTTT"}], "target_id": 45}, {"microhaplotypes": [{"seq": "CTGCAGAAGATTATACTGTATTTAATAATAATGGAGAAATATTATTAGATGATATTAATATATGTGATTATAACTTAAGAGATCTTAGAAACTTATTTTCAATAGTTAGTCAAGAACCCATGTTATTTAATATGTCCATATATGAAAATATCAAATTTGGAAGAGAAGATGCAACATTGGAAGAT"}, {"seq": "CTGCAGAAGATTATACTGTATTTAATAATAATGGAGAAATATTATTAGATGATATTAATATATGTGATTATAACTTAAGATATCTTAGAAACTTATTTTCAATAGTTAGTCAAGAACCCATGTTATTTAATATGTCCATATATGAAAATATCAAATTTGGAAGAGAAGATGCAACATTGGAAGAT"}], "target_id": 46}, {"microhaplotypes": [{"seq": "CAAAATTTAAATCAATAGCGGTTACGTTCATAATTTTGCCTTCAAAACTAACCTCTGTATGATATATAAATTTATTTTCCTTTACACTAAATACATATATAAAAATGGTACTTAATAATTTATCTTTATCATATTTAAATAATATTAAATCTGTTTTTACATCTGAGTTATAATCACCGAAAT"}, {"seq": "CGAAATTTAAATCAATAGCGGTTACGTTCATAATTTTGCCTTCAAAACTAACTTCTGTATGATATATAAATTTATTTTCCTTTACACTAAATACATATATAAAAATGGTACTTAATAATTTATCTTTATCATATTTAAATAATATTAAATCTGTTTTTACATCTGAGTTATAATCACCGAAAT"}, {"seq": "CAAAATTTAAATCAATAGCGGTTACGTTCATAATTTTGCCTTCAAAACTAACTTCTGTATGATATATAAATTTATTTTCCTTTACACTAAATACATATATAAAAATGGTACTTAATAATTTATCTTTATCATATTTAAATAATATTAAATCTGTTTTTACATCTGAGTTGTAATCACCGAAAT"}, {"seq": "CGAAATTTAAATCAATAGCGGTTACGTTCATAATTTTGCCTTCAAAACTAACTTCTGTATGATATATAAATTTATTTTCCTTTACACTAAATACATATATAAAAATGGTACTTAATAATTTATCTTTATCATATTTAAATAATATTAAATCTGTTTTTACATCTGAGTTGTAATCACCGAAAT"}, {"seq": "CAAAATTTAAATCAATAGCGGTTACGTTCATAATTTTGCCTTCAAAACTAACTTCTGTATGATATATAAATTTATTTTCCTTTACACTAAATACATATATAAAAATGGTACTTAATAATTTATCTTTATCATATTTAAATAATATTAAATCTGTTTTTACATCTGAGTTATAATCACCGAAAT"}, {"seq": "CAAAATTTAAATCAATAGCGGTTACGTTCATAATTTTGCCTTCAAAACTAACCTCTGTATGATATATAAATTTATTTTCCTTTACACTAAATACATATATAAAAATGGTACTTAATAATTTATCTTTATCATATTTAAATAATATTAAATCTGTTTTTACATCTGAGTTGTAATCACCGAAAT"}, {"seq": "CGAAATTTAAATCAATAGCGGTTACGTTCATAATTTTGCCTTCAAAACTAACCTCTGTATGATATATAAATTTATTTTCCTTTACACTAAATACATATATAAAAATGGTACTTAATAATTTATCTTTATCATATTTAAATAATATTAAATCTGTTTTTACATCTGAGTTATAATCACCGAAAT"}, {"seq": "CGAAATTTAAATCAATAGCGGTTACGTTCATAATTTTGCCTTCAAAACTAACCTCTGTATGATATATAAATTTATTTTCCTTTACACTAAATACATATATAAAAATGGTACTTAATAATTTATCTTTATCATATTTAAATAATATTAAATCTGTTTTTACATCTGAGTTGTAATCACCGAAAT"}, {"seq": "CGAAATTTAAATCAATAGCGGTTACGTTCATAATTTTGCCTTCAAAACTAACTTCTGTATGATATATAAATTTATTTTCCTTTACACTAAATACATATATAAAAATGGTACTTAATAATTTATCTTTATCATATTTAAATAATATTAAATCTGTTTTTACATCTGAGTTATAATCACCAAAAT"}], "target_id": 47}, {"microhaplotypes": [{"seq": "TTCCAATAGAAACTATATTACGATTTTCTTCATGAGGTAAATTGACATTCATCTTATATGTATAATTAAGGATGAGTAATAAATTGTATAAAAATATTTTTATTTAATAATTTATATGTATTATTAATAATTCTGAATTTATCAATTGATATATTATTTTTGTTTTTCTTTATGCCATTC"}, {"seq": "TTCCAATAGAAACTAGATTACGATTTTCTTCATGAGGTAAATTGACATTCATCTTATATGTATAATTAAGGATGAGTAATAAATTGTATAGAAATATTTTTATTTAATAATTTATATGTATTATTAATAATTCTGAATTTATCAATTGATATATTATTTTTGTTTTTCTTTATGCCATTC"}, {"seq": "TTCCAATAGAAACTATATTACGATTTCCTTCATGAGGTAAATTGACATTCATCTTATATGTATAATTAAGGATGAGTAATAAATTGTATAAAAATATTTTTATTTAATAATTTATATGTATTATTAATAATTCTGAATTTATCAATTGATATATTATTTTTGTTTTTCTTTATGCCATTC"}, {"seq": "TTCCAATAGAAACTAGATTACGATTTTCTTCATGAGGTAAATTGACATTCATCTTATATGTATAATTAAGGATGAGTAATAAATTGTTTAGAAATATTTTTATTTAATAATTTATATGTATTATTAATAATTCTGAATTTATCAATTGATATATTATTTTTGTTTTTCTTTATGCCATTC"}, {"seq": "TTCCAATAGAAACTAGATTACGATTTTCTTCATGAGGTAAATTGACATTCATCTTATATGTATAATTAAGGATGAGTAATAAATTGTATAAAAATATTTTTATTTAATAATTTATATGTATTATTAATAATTCTGAATTTATCAATTGATATATTATTTTTGTTTTTCTTTATGCCATTC"}, {"seq": "TTCCAATAGAAACTATATTACGATTTTCTTCATGAGGTAAATTGACATTCATCTTATATGTATAATTAAGGATGAGTAATAAATTGTATAGAAATATTTTTATTTAATAATTTATATGTATTATTAATAATTCTGAATTTATCAATTGATATATTATTTTTTTTTTTCTTTATGCCATTC"}, {"seq": "TTCCAATAGAAACTATATTACGATTTTCTTCATGAGGTAAATTGACATTCATCTTATATGTATAATTAAGGATGAGTAATAAATTGTATAAAAATATTTTTATTTAATAATTTATATGTATTATTAATAATTCTGAATTTATCAATTGATATATTATTTTTTTTTTTCTTTATGCCATTC"}, {"seq": "TTCCAATAGAAACTATATTACGATTTCCTTCATGAGGTAAATTGACATTCATCTTATATGTATAATTAAGGATGAGTAATAAATTGTATAGAAATATTTTTATTTAATAATTTATATGTATTATTAATAATTCTGAATTTATCAATTGATATATTATTTTTGTTTTTCTTTATGCCATTC"}, {"seq": "TTCCAATAGAAACTAGATTACGATTTCCTTCATGAGGTAAATTGACATTCATCTTATATGTATAATTAAGGATGAGTAATAAATTGTATAAAAATATTTTTATTTAATAATTTATATGTATTATTAATAATTCTGAATTTATCAATTGATATATTATTTTTGTTTTTCTTTATGCCATTC"}, {"seq": "TTCAAATAGAAACTAGATTACGATTTTCTTCATGAGGTAAATTGACATTCATCTTATATGTATAATTAAGGATGAGTAATAAATTGTATAGAAATATTTTTATTTAATAATTTATATGTATTATTAATAATTCTGAATTTATCAATTGATATATTATTTTTGTTTTTCTTTATGCCATTC"}, {"seq": "TTCCAATAGAAACTATATTACGATTTTCTTCATGAGGTAAATTGACATTCATCTTATATGTATAATTAAGGATTAGTAATAAATTGTATAAAAATATTTTTATTTAATAATTTATATGTATTATTAATAATTCTGAATTTATCAATTGATATATTATTTTTGTTTTTCTTTATGCCATTC"}, {"seq": "TTCCAATAGAAACTATATTACGATTTTCTTCATGAGGTAAATTGACATTCATCTTATATGTATAATTAAGGATGAGTAATAAATTGTATAGAAATATTTTTATTTAATAATTTATATGTATTATTAATAATTCTGAATTTATCAATTGATATATTATTTTTGTTTTTCTTTATGCCATTC"}, {"seq": "TTCCAATAGAAACTAGATTACGATTTTCTTCATGAGGTAAATTGACATTCATCTTATATGTATAATTAAGGATGAGTAATAAATTGTATAGAAATATTTTTATTTAATAATTTATATGTATTATTAATAATTCTGAATTTATCAATTGATATATTATTTTTTTTTTTCTTTATGCCATTC"}], "target_id": 48}, {"microhaplotypes": [{"seq": "TCAACAAAAGCTGATGAATCATCATAATTTGAATAAAATTTATCATTCACAATATTATATTTTTGTTTCTTCTTTTTTCCCATAATATTATTATTTTGTTCACAATATATGTTCATGTGTCCCCTCTTTTTCTGTAAAATATTAAAATGTTTCTTACTATGCTTTTCTTCATTTTTAATAACA"}, {"seq": "TCAACAAAAGCTGATGAATCATCATAATTTGAATAAAATTTATCATTCACAATATTATATTTTTGTTTCTTCTTTTTTCCCATAATATTATTATTTTGTTCACAATATATGTTCATGTGTCCCCTCTTTTTCTGTAAAATATTAAAATGTTTCTTAGTATGCTTCTCTTCATTTTTAATAACA"}, {"seq": "TCAACAAAAGCTGATGAATCATCATAATTTGAATAAAATTTATCATTCACAATATCATGTTTTTGTTTCTTCTTTTTTCCCATAATATTATTATTTTGTTCACAATATATGTTCATGTGTCCCCTCTTTTTCTGTAAAATATTAAAATGTTTCTTAGTATGCTTCTCTTCATTTTTAATAACA"}, {"seq": "TCAACAAAAGCTGATGAATCATCATAATTTGAATAAAATTTATCATTCACAATATCATGTTTTTGTTTCTTCTTTTTTCCCATAATATTATTATTTTGTTCACAATATATGTTCATGTGTCCCCTCTTTTTCTGTAAAATATTAAAATGTTTCTTACTATGCTTTTCTTCATTTTTAATAACA"}, {"seq": "TCAACAAAAGCTGATGAATCATCATAATTTGAATAAAATTTATCATTCGCAATATTATATTTTTGTTTCTTCTTTTTTCCCATAATATTATTATTTTGTTCACAATATATGTTCATGTGTCCCCTCTTTTTCTGTAAAATATTAAAATGTTTCTTACTATGCTTTTCTTCATTTTTAATAACA"}, {"seq": "TCAACAAAAGCTGATGAATCATCATAATTTGAATAAAATTTATCATTCACAATATTATATTTTTGTTTCTTCTTTTTTCCTATAATATTATTATTTTGTTCACAATATATGTTCATGTGTCCCCTCTTTTTCTGTAAAATATTAAAATGTTTCTTACTATGCTTTTCTTCATTTTTAATAACA"}, {"seq": "TCAACAAAAGCTGATGAATCATCATAATTTGAATAAAATTTATCATTCACAATATTATATTTTTGTTTCTTCTTTTTTCCCATAATATTATTATTTTGTTCACAATATATGTTCATGTGTTCCCTCTTTTTCTGTAAAATATTAAAATGTTTCTTACTATGCTTTTCTTCATTTTTAATAACA"}, {"seq": "TCAACAAAAGCTGATGAATCATCATAATTTGAATAAAATTTATCATTCACAATATTATATTTTTGTTTCTTCTTTTTTCCCATAATATTATTATTTTGTTCACAATATATGTTCATGTGTCCCCTCTTTTTCTGTAAAATATTAAAATGTTTCTTACTATGCTTCTCTTCATTTTTAATAACA"}, {"seq": "TCACCAAAAGCTGATGAATCATCATAATTTGAATAAAATTTATCATTCACAATATTATATTTTTGTTTCTTCTTTTTTCCCATAATATTATTATTTTGTTCACAATATATGTTCATGTGTCCCCTCTTTTTCTGTAAAATATTAAAATGTTTCTTACTATGCTTTTCTTCATTTTTAATAACA"}], "target_id": 49}, {"microhaplotypes": [{"seq": "ATTATTATTATTATTATTATGATGATGATGATGATGATCTGTGTTAAGATCATCTTCTATACCATTAGTTAAACATTTTATATTTTTATTCATATAAACATTAATCTTCACAACAGATTTATCAGATCTAGAAAATCTTGTACCTGTTGCTTTATGTAACAATAT"}, {"seq": "ATTATTATTATTATTATTATGATGATGATGATGATGATGATCTGTGTTAAGATCATCTTCTATACCATTAGTTAAACATTTTATATTTTTATTCATATAAACATTAATCTTCACAACAGATTTATCAGATCTAGAAAATCTTGTACCTGTTGCTTTATGTAACAATAT"}, {"seq": "ATTATTATTATTATTATTATGCTGATGATGATGATGATCTGTGTTAAGATCATCTTCTATACCATTAGTTAAACATTTTATATTTTTATTCATATAAACATTAATCTTCACAACAGATTTATCAGATCTAGAAAATCTTGTACCTGTTGCTTTATGTAACAATAT"}, {"seq": "ATTATTATTATTATTATGATGATGATGATGATGATGATCTGTGTTAAGATCATCTTCTATACCATTAGTTAAACATTTTATATTTTTATTCATATAAACATTAATCTTCACAACAGATTTATCAGATCTAGAAAATCTTGTACCTGTTGCTTTATGTAACAATAT"}, {"seq": "ATTATTATTATTATTATGATGATGATGATGATGATGATGATCTGTGTTAAGATCATCTTCTATACCATTAGTTAAACATTTTATATTTTTATTCATATAAACATTAATCTTCACAACAGATTTATCAGATCTAGAAAATCTTGTACCTGTTGCTTTATGTAACAATAT"}, {"seq": "ATGTTTTCACACAATTATTATTATGATGATGATGATGATGATGATCTGTGTTAAGATCATCTTCTATACCATTAGTTAAACATTTTATATTTTTATTCATATAAACATTAATCTTCACAACAGATTTATCAGATCTAGAAAATCTTGTACCTGTTGCTTTATGTAACAATAT"}, {"seq": "ATTATTATTATTATTATTATTATGATGATGATGATGATCTGTGTTAAGATCATCTTCTATACCATTAGTTAAACATTTTATATTTTTATTCATATAAACATTAATCTTCACAACAGATTTATCAGATCTAGAAAATCTTGTACCTGTTGCTTTATGTAACAATAT"}, {"seq": "ATTATTATTATTATTATTATGATGATGATGATGATCTGTGTTAAGATCATCTTCTATACCATTAGTTAAACATTTTATATTTTTATTCATATAAACATTAATCTTCACAACAGATTTATCAGATCTAGAAAATCTTGTACCTGTTGCTTTATGTAACAATAT"}, {"seq": "ATTATTATTATTATTATGATGATGATGATCTGTGTTAAGATCATCTTCTATACCATTAGTTAAACATTTTATATTTTTATTCATATAAACATTAATCTTCACAACAGATTTATCAGATCTAGAAAATCTTGTACCTGTTGCTTTATGTAACAATAT"}, {"seq": "ATTATTATTATTATTATTATGATGATGATCTGTGTTAAGATCATCTTCTATACCATTAGTTAAACATTTTATATTTTTATTCATATAAACATTAATCTTCACAACAGATTTATCAGATCTAGAAAATCTTGTACCTGTTGCTTTATGTAACAATAT"}, {"seq": "ATTATTATTATTATTATGATGATGATGATGATGATGATGATGATGATGATCTGTGTTAAGATCATCTTCTATACCATTAGTTAAACATTTTATATTTTTATTCATATAAACATTAATCTTCACAACAGATTTATCAGATCTAGAAAATCTTGTACCTGTTGCTTTATGTAACAATAT"}, {"seq": "ATTATTATTATTATGATGATGATGATGATGATGATGATCTGTGTTAAGATCATCTTCTATACCATTAGTTAAACATTTTATATTTTTATTCATATAAACATTAATCTTCACAACAGATTTATCAGATCTAGAAAATCTTGTACCTGTTGCTTTATGTAACAATAT"}, {"seq": "ACAATTATTATTATTATTATGATGATGATGATGATGATCTGTGTTAAGATCATCTTCTATACCATTAGTTAAACATTTTATATTTTTATTCATATAAACATTAATCTTCACAACAGATTTATCAGATCTAGAAAATCTTGTACCTGTTGCTTTATGTAACAATAT"}, {"seq": "ATGTTTTCACACAATTATTATTATTATGATGATGATGATGATGATCTGTGTTAAGATCATCTTCTATACCATTAGTTAAACATTTTATATTTTTATTCATATAAACATTAATCTTCACAACAGATTTATCAGATCTAGAAAATCTTGTACCTGTTGCTTTATGTAACAATAT"}, {"seq": "ATTATTATTATTATTATGATGATGATGATGATCTGTGTTAAGATCATCTTCTATACCATTAGTTAAACATTTTATATTTTTATTCATATAAACATTAATCTTCACAACAGATTTATCAGATCTAGAAAATCTTGTACCTGTTGCTTTATGTAACAATAT"}, {"seq": "ATTATTATTATTATTATGATGATGATGATGATCTGTGTTAAGATCATCTTCTATACCATTGGTTAAACATTTTATATTTTTATTCATATAAACATTAATCTTCACAACAGATTTATCAGATCTAGAAAATCTTGTACCTGTTGCTTTATGTAACAATAT"}, {"seq": "ATTATTATTATTATTATTATGATGATGATGATGATGATGATGATCTGTGTTAAGATCATCTTCTATACCATTAGTTAAACATTTTATATTTTTATTCATATAAACATTAATCTTCACAACAGATTTATCAGATCTAGAAAATCTTGTACCTGTTGCTTTATGTAACAATAT"}, {"seq": "ATTATTATTATTATTATTATGATGATGATGATGATGATGATGATGATCTGTGTTAAGATCATCTTCTATACCATTAGTTAAACATTTTATATTTTTATTCATATAAACATTAATCTTCACAACAGATTTATCAGATCTAGAAAATCTTGTACCTGTTGCTTTATGTAACAATAT"}], "target_id": 50}, {"microhaplotypes": [{"seq": "AAGAAAAAATGGACATTGTGGAGAATATAAAAAATAGAGGAAAGGAAAAAACAGAATTAACATATAAAGAAGTATATAAAACACAACAGAATCAAAATGATGCAAGTTTAAATTCATTTTGGGGTGATGAAAAAAAAAATAATAATTATGATATAGATATAGTAAAAGAGAAATATAGTGAGTTAATGAAAAAAAAAGAA"}, {"seq": "AAGAGAAAATGGACATTGTGGAGAATATAAAAAATAGAGGAAAGGAAAAAACAGAATTAACATATAAAGAAGTATATAAAACACAACAGAATCAAAATGATGCAAGTTTAAATTCATTTTGGGGTGATGAAAAAAAAAATAATAATTATGATATAGATATAGTAAAAGAGAAATATAGTGAGTTAATGAAAAAAAAAGAA"}, {"seq": "AAGAAAAAATGGACATTGTGGAGAATATAAAAAATAGAGGAAAGGAAAAAACAGAATTAACATATAAAGAAGTATATAAAACACAACAGAATCAAAATGATGCAAGTTTAAATTCATTTTGGGGTGATGAAAAAAAAAATAATAATTATGATATAGATATAGTAAAAGAGAAATATAGTGAGCTAATGAAAAAAAAAGAA"}, {"seq": "AAGAGAAAATGGACATTGTGGAGAATATAAAAAATAGAGGAAAGGAAAAAACAGAATTAACATATAAAGAAGTATATAAAACACAACAGAATCAAAATGATGCAAGTTTAAATTCATTTTGGGGTGATGAAAAAAAAAATAATAATTATGATATAGATATAGTAAAAGAGAAATATAGTGAGCTAATGAAAAAAAAAGAA"}], "target_id": 51}, {"microhaplotypes": [{"seq": "AGAACAATTGCTAAACACCAAATTGGGTGAAACAAAAAACCACCTGAACAGAACCCCATTTATACCTGAATCGGTCATACGAGAAAGGAAATTACGCCAAGAAAAAGCGCAATCCACAAACAACATGTTCGATTCAACAAACGCAGATAGTATTACTTCCCCATGTGATCCAACGAATGCCACG"}, {"seq": "AGAACAATTGCTAAACACCAAATTGGGTGAAACAAAAAACCACCTGAACAGAACCCCATTTATACCTGAATCGGTCATACGAGAAAGGAAATTACGCCAAGAAAAAGCTCAATCCACAAACAACATGTTCGATTCAACAAACGCAGATAGTATTACTTCCCCATGTGATCCAACGAATGCCACG"}, {"seq": "AGAACAATTGTTAAACACCAAATTGGGTGAAACAAAAAACCACCTGAACAGAACCCCATTTATACCTGAATCGGTCATACGAGAAAGGAAATTACGCCAAGAAAAAGCTCAATCCACAAACAACATGTTCGATTCAACAAACGCAGATAGTATTACTTCCCCATGTGATCCAACGAATGCCACG"}, {"seq": "AGAACAATTGTTAAACACCAAATTGGGTGAAACAAAAAACCACCTGAACAGAACCCCATTTATACCTGAATCGGTCATACGAGAAAGGAAATTACGCCAAGAAAAAGCGCAATCCACAAACAACATGTTCGATTCAACAAACGCAGATAGTATTACTTCCCCATGTGATCCAACGAATGCCACG"}, {"seq": "AGAACAATTGCTAAACACCAAATTGGGTGAAACAAAAAACCACCTGAACAGAACTCCATTTATACCTGAATCGGTCATACGAGAAAGGAAATTACGCCAAGAAAAAGCTCAATCCACAAACAACATGTTCGATTCAACAAACGCAGATAGTATTACTTCCCCATGTGATCCAACGAATGCCACG"}, {"seq": "AGAACAATTGCTAAACACCAAATTGGGTGAAACAAAAAACCACCTGAACAGAACTCCATTTATACCTGAATCGGTCATACGAGAAAGGAAATTACGCCAAGAAAAAGCGCAATCCACAAACAACATGTTCGATTCAACAAACGCAGATAGTATTACTTCCCCATGTGATCCAACGAATGCCACG"}, {"seq": "AGAACAATTGCTAAACACCAAATTGGGTGAAACAAAAAACCACCTGAACAGAACCCCATTTATACCTGAATCGGTCATACGAGAAAGGAAATTACGCCAAGAAAAAGCTCAATCCACAAACAACATGTTCGATTCAACAAACGCAGATAGTATTACGTCCCCATGTGATCCAACGAATGCCACG"}, {"seq": "AGAACAATTGTTAAACACCAAATTGGGTGAAACAAAAAACCACCTGAACAGAACTCCATTTATACCTGAATCGGTCATACGAGAAAGGAAATTACGCCAAGAAAAAGCGCAATCCACAAACAACATGTTCGATTCAACAAACGCAGATAGTATTACTTCCCCATGTGATCCAACGAATGCCACG"}, {"seq": "AGAACAATTGCTAAACACCAAATTGGGTGAAACAAAAAACCACCTGAACAGAACCCCATTTATACCTGAATCGGTCATACGAGAAAGGAAATTACGCCAAGAAAAAGCGCAATCCACAAACAACATGTTCGATTCAACAAACGCAGATAGTATTACGTCCCCATGTGATCCAACGAATGCCACG"}, {"seq": "AGAACAATTGCTAAACACCAAATTGGGTGAAACAAAAAACCACCTGAACAGAACCCCATTTATACCTGAATCGGTCATACGAGAAAGGAAATTACGCCAAGAAAAAGCGCAATCCACAAACAACATGTTGGATTCAACAAACGCAGATAGTATTACTTCCCCATGTGATCCAACGAATGCCACG"}, {"seq": "AGAACAATTGCTAAACACCAAATTGGGTGAAACAAAAAACCACCTGAACAGAACTCCATTTATACCTGAATCGGTCATACGAGAAAGGAAATTACGCCAAGAAAAAGTGCAATCCACAAACAACATGTTCGATTCAACAAACGCAGATAGTATTACTTCCCCATGTGATCCAACGAATGCCACG"}, {"seq": "AGAACAATTGCTAAACACCAAATTGGGTGAAATAAAAAACCACCTGAACAGAACTCCATTTATACCTGAATCGGTCATACGAGAAAGGAAATTACGCCAAGAAAAAGCTCAATCCACAAACAACATGTTCGATTCAACAAACGCAGATAGTATTACTTCCCCATGTGATCCAACGAATGCCACG"}, {"seq": "AGAACAATTGCTAAACACCAAATTGGGTGAAACAAAAAACCACCTGAACAGAACCCCATTTATACCTGAATCGGTCATACGAGAAAGGAAATTACGCCAAGAAAAAGTGCAATCCACAAACAACATGTTCGATTCAACAAACGCAGATAGTATTACTTCCCCATGTGATCCAACGAATGCCACG"}, {"seq": "AGAACAATTGTTAAACACCAAATTGGGTGAAACAAAAAACCACCTGAACAGAACTCCATTTATACCTGAATCGGTCATACGAGAAAGGAAATTACGCCAAGAAAAAGCTCAATCCACAAACAACATGTTCGATTCAACAAACGCAGATAGTATTACTTCCCCATGTGATCCAACGAATGCCACG"}, {"seq": "AGAACAATTGCTAAACACCAAATTGGGTGAAACAAAAAACCACCTGAACAGAACTCCATTTATACCTGAATCGGTCATACGAGAAAGGAAATTACGCCAAGAAAAAGCGCAATCCACAAACAACATGTTCGATTCAACAAACGCAGATAGTATTACGTCCCCATGTGATGCAACGAATGCCACG"}, {"seq": "AGAACAATTGTTAAACACCAAATTGGGTGAAACAAAAAACCACCTGAACAGAACTCCATTTATACCTGAATCGGTCATACGAGAAAGGAAATTACGCCAAGAAAAAGCTCAATCCACAAACAACATGTTCGATTCAACAAACGCAGATAGTATTACGTCCCCATGTGATCCAACGAATGCCACG"}, {"seq": "AGAACAATTGCTAAACACCAAATTGGGTGAAACAAAAAACCACCTGAACAGAACCCCATTTATACCTGAATCGGTCATACGAGAAAGGAAATTACGCCAAGAAAAAGCTCAATCCACAAACAACATGTTCGATTCAACAAACGCAGATAGTATTACTTCCCCATGTGATCCAACGAATGTCACG"}, {"seq": "AGAACAATTGTTAAACACCAAATTGGGTGAAACAAAAAACCACCTGAACAGAACCCCATTTATACCTGAATCGGTCATACGAGAAAGGAAATTACGCCAAGAAAAAGCTCAATCCACAAACAACATGTTCGATTCAACAAACGCAGATAGTATTACGTCCCCATGTGATCCAACGAATGCCACG"}], "target_id": 52}, {"microhaplotypes": [{"seq": "ACAATAGTACATTCTGCATTTACATCACAACCTCCATTATTTTTTGAACAGTTCATATCTTTCATAGGTATACATTTAAAATAATTTACACTCATATCAACTATATAATTAGGTCGGCATCTACATTGTTCTTTATCTTTTTCGACAATATAACAACGTGAATTGGGTCCACATTTGGAATATTCACAAATATAATTTACTTTAAATATAACAAAATTTCTCA"}, {"seq": "ACAATAGTACATTCTGCATTTACATCACAACCTCCATTATTTTTTGAACAGTTCATATCTTTCATAGGTATACATTTAAAATAATTTACACTCATATCAACTATATAATTAGGTCGGCATCTACATTGTTCTTTATCTTTTTCGACAATATAACAACGTGAATTGGGTCCACATTTGGAATATTCACAAATATAATTTACTTTAAATATAACAAAATTTTTCA"}, {"seq": "ACAATAGTACATTCTGCATTTACATCACAACCTCCATTATTTTTTGAACAGTTCATATCTTTCATAGGTATACATTTAAAATAATTTACACTCATATCAACTATATAATTAGGTCGGCATCTACATTGTTCTTTATCTTTTTCGACAATATAACAACGTGAATTGGGTCCACATTTGGAATATTCACAAGTATAATTTACTTTAAATATAACAAAATTTTTCA"}, {"seq": "ACAATAGTACATTCTGCATTTACATCACAACCTCCATTATTTTTTGAACAGTTCATATCTTTCATAGGTATACATTTAAAATAATTTACACTCATATCAACTATATAATTAGGTCGGCATCTACATTGTTCTTTATCTTTTTCGACAATATAACAACGTGAATTGGGTCCACATTTGGAATATTCACAAGTATAATTTACTTTAAATATAACAAAATTTCTCA"}, {"seq": "ACAATAGTACATTCTGCATTTACATCACAACCTCCATTATTTTTTGAACAGTTCATATCTTTCATAGGTATACATTTAAAATAATTTACACTCATATCAACTATATAATTAGGTCGGCATCTACATTGTTCTTTATCTTTTTCGACAATATAACAACGTGAATTGGATCCACATTTGGAATATTCACAAATATAATTTACTTTAAATATAACAAAATTTCTCA"}, {"seq": "ACAATAGTACATTCTGCATTTACATCACAACCTCCATTATTTTTTGAACAGTTCATATCTTTCATAGGTATACATTTAAAATAATTTACACTCATATCAACTATATAATTAGGTCGGCATCTACATTGTTCTTTATCTTTTTCGACAATATAACAACGTGAATTGGGTCCACATTTGGAATATTCACAAATATAATTTACTTTAAATATAACAAAATTTCTTA"}], "target_id": 53}, {"microhaplotypes": [{"seq": "ATTTTTTAATAAAGCAGTACCATCTATATCTCTTCCTTTTTTTAAAACACATAAAGTTTCATCAAAATTGCTTGTGCTATTTTTATCAGGTTCAGGAAAATATTGTTTATTTGTAGAATATCCATTCTGATTACAAGTTATAATATTATTAATATTTATAAATTTTTTTTTTGTTTTTAAATCACCAAATTGATTATCGTTAT"}, {"seq": "ATTTTTTAATAAAGCAGTACCATCTATATCTCTTCCTTTTTTTAAAACACATAAAGTTTCATCAAAATTGCTTGTGCTATTTTTATCAGGTTCAGGAAAATATTGTTTATTTGTAGAATATCCATTCTGATTACAAGTTATAATATTATTAATATTTATAAATTTTTTTTTTGTTTTTAAATCAGCAAATTGATTATCGTTAT"}, {"seq": "ATTTTTTAATAAAGCAGTACCATCTATATCTCTTCCTTTTTTTAAAACACATAAAGTTTCATCAAAATTGCTTGTGCTATTTTTATCAGGTTCAGGAAAATATTGTTTATTTGGAGAATATCCATTCTGATTACAAGTTATAATATTATTAATATTTATAAATTTTTTGTTTGTTTTTAAATCACCAAATTGATTATCGTTAT"}, {"seq": "ATTTTTTAATAAAGCAGTACCATCTATATCTCTTCCTTTTTTTAAAACACATAAAGTTTCATCAAAATTGCTTGTGCTATTTTTATCAGGTTCAGGAAAATATTGTTTATTTGGAGAATATCCATTCTGATTACAAGTTATAATATTATTAATATTTATAAATTTTTTTTTTGTTTTTAAATCACCAAATTGATTATCGTTAT"}, {"seq": "ATTTTTTAATAAAGCAGTACCATCTATATCTCTTCCTTTTTTTAAAACACATAAAGTTTCATCAAAATTGCTTGTGCTATTTTTATCAGGTTCAGGAAAATATTGTTTATTTGGAGAATATCCATTCTGATTACAAGTTATAATATTATTAATATTTATAAATTTTTTTTTTGTTTTTAAATCAGCAAATTGATTATCGTTAT"}, {"seq": "ATTTTTTAATAAAGCAGTACCATCTATATCTCTGCCTTTTTTTAAAACACATAAAGTTTCATCAAAATTGCTTGTGCTATTTTTATCAGGTTCAGGAAAATATTGTTTATTTGTAGAATATCCATTCTGATTACAAGTTATAATATTATTAATATTTATAAATTTTTTTTTTGTTTTTAAATCAGCAAATTGATTATCGTTAT"}, {"seq": "ATTTTTTAATAAAGCAGTACCATCTATATCTCTTCCTTTTTTTAAAACACATAAAGTTTCATCAAAATTGCTTGTGCTATTTTTATCAGGTTCAGGAAAATATTGTTTATTTGTAGAATATCCATTCTGATTACAAGTTATAATATTATTAATATTTATAAATTTTTTGTTTGTTTTTAAATCACCAAATTGATTATCGTTAT"}], "target_id": 54}, {"microhaplotypes": [{"seq": "ATTGAATCGTTGGTGTTTATTTTATTATTCCTCTTTTGTTTTTCAATGAATACAAATGTTTCATCGACACTATCTTTATGATCTATTGGTATGGCATGATTTTCTAAATTGCTATTTCTTTCATTAGAATTGTATTTTTCACTATTATAGGTTGAGGTTTTACTACATTTTATATTTTT"}, {"seq": "ATTGAATCGTTGGTGTTTATTTTATTATTCCTCTTTTGTTTTTCAATGAATACAAATGTTTCATCGACACTATCTTTATGATCTATTGGTATGGCATGATTTTCTAAATTGCTATTTCTTTCATTAGAATTGTATTTTTCACTATTATAGGTTGAGATTTTACTACATTTTATATTTTT"}], "target_id": 55}, {"microhaplotypes": [{"seq": "TATAAAGAATTTATACCACCTAAATTGTTAACATTAGAAGTATTATTTGTTTCTGTATTTTCTTGTAACGTATTTGTATTATTAATATTGTTAGATGAAATATTATGACTATTTCTTCTATTTGTTATATTTAAATTGTAAATAGTTTCATTACTAACACTACTGATACCACTGAAATGATTATTTAG"}, {"seq": "TATAAAGAATTTATACCACCTAAATTGTTAACATTAGAAGTATTATTTGTTTCTGTATTTTCTTGTAACGTATTTGTATTATTAATATTGTTAGATGAAATATTATGACTATTTCTTCTATTTGTTATATTTAAATTGTAAATAGTTTCATTACTAACACTACTGATACCATTGAAATGATTATTTAG"}, {"seq": "TATAAAGAATTTATACCATCTAAATTGTTAACATTAGAAGTATTATTTGTTTCTGTATTTTCTTGTAACGTATTTGTATTATTAATATTGTTAGATGAAATATTATGACTATTTCTTCTATTTGTTATATTTAAATTGTAAATAGTTTCATTACTAACACTACTGATACCACTGAAATGATTATTTAG"}, {"seq": "TATAAAGAATTTATACCACCTAAATTGTTAACATTAGAAGTATAATTTGTTTCTGTATTTTCTTGTAACGTATTTGTATTATTAATATTGTTAGATGAAATATTATGACTATTTCTTCTATTTGTTATATTTAAATTGTAAATAGTTTCATTACTAACACTACTGATACCACTGAAATGATTATTTAG"}], "target_id": 56}, {"microhaplotypes": [{"seq": "CATTATTTTTGTATCCAACGTCGTTATTATTAAAACTTATTATTTGATTAATAACTGACGAACCACATATATTTACACAATGGAATACATAACTTAAGAAAGAGTAGTAATTGCATTTTACTTTTTGCATTTTCCCTCTGGTGGAGAAATAATTATTATGCTGCTTATTACTTTTTGTATTATGATAATTTTTGGTAATCATTTTTTTT"}, {"seq": "CATTATTTTTGTATCCAACGTCGTTATTATTAAAACTTATTATTTGATTAATAACTGACGAACCACATATATTTACACAATGGAATACATAACTTAAGAAAGAGTAGTAATTGCATTTTACTTTTTGCATTTTCCCTCTGGTGGAGAAATAATTATTATGCTGCTTATTACTCTTTGTATTATGATAATTTTTGGTAATCATTTTTTTT"}, {"seq": "CATTATTTTTGTATCCAACGTCGTTATTATTAAAACTTATTATTTGATTAATAACTGACGAACCACATATATTTACACAATGGAATACATAACTTATGAAAGAGTAGTAATTGCATTTTACTTTTTGCATTTTCCCTCTGGTGGAGAAATAATTATTATGCTGCTTATTACTTTTTGTATTATGATAATTTTTGGTAATCATTTTTTTT"}], "target_id": 57}, {"microhaplotypes": [{"seq": "CTTCCATGTGAGCTTCAAAATCGTCTGAAGGTCGACTAGACATGAAAAATTCAGATTGAGGTAAATCATCAAATGGATGATTTCTATATGATATTCTAGGTATTAATCCTAAGATATTATTTATGCTATTACATTGAGAATTTCCTTCATTGGTTGTGGTACTTATATCCACATTTTGGTGATCATCAGGATATAATGTATTTTCTTTAGAACTT"}, {"seq": "CTTCCATGTGAGCTTCAAAATCGTCTGAAGGTCGACTAGACATGAAAAATTCAGATTGAGGTAAATCATCAAATGGATGATTTCTATATGATATTCTAGGTATTAATCCTAAGATATTATTTATGCTATTACATTGAGAATTTCCTTCATTGGTTGTGGTACTTATATCCACATTTTGGTGATCATCAAGATATAATGTATTTTCTTTAGAACTT"}], "target_id": 58}, {"microhaplotypes": [{"seq": "GATTATATATTTCTATATTTTAATAAGAAGGCGTTACACAAACATGATGCCTCTAATGAAATGTGTTTTGTGAAAAACGAAGATTCTACACGCACAAAAGGACATATGAATGATGAACAAAATGATTTATATAAAATAAATAATAATACAACATATTTTTTTAACAAAAACCACT"}, {"seq": "GATTATATATTTCTATATTTTAATAAGAATGCGTTACACAAACATGATGCCTCTAATGAAATGTGTTTTGTGAAAAACGAAGATTCTACACGCACAAAAGGACATATGAATGATGAACAAAATGATTTATATAAAATAAATAATAATACAACATATTTTTTTAACAAAAACCACT"}, {"seq": "GATTATATATTTCTATATTTTAATAAGAAGGCGTTACACAAACATGATGCCTCTAATGAAATGTGTTTTGTGAAAAACGAAGATTCTACACGCACAAAAAGACATATGAATGATGAACAAAATGATTTATATAAAATAAATAATAATACAACATATTTTTTTAACAAAAACCACT"}, {"seq": "GATTATATATTTCTATATTTTAATAAAAAGGCGTTACACAAACATGATGCCTCTAATGAAATGTGTTTTGTGAAAAACGAAGATTCTACACGCACAAAAGGACATATGAATGATGAACAAAATGATTTATATAAAATAAATAATAATACAACATATTTTTTTAACAAAAACCACT"}], "target_id": 59}, {"microhaplotypes": [{"seq": "CATTAGGAAAAACAACAGATCCTTCTTCCATACCATAAATACATAAATCATTTCCACTAATCTTTTCTAAATATTGCACAAAAGAATCAATATCATTATAAGATGACATCTTCTTTCTTATAAAATCTAATTGAGCTTTGGTAAATCGAAAACAATTAATATATTTTATTACTTCATATACACCAGCTAATATAGCAAATTGAC"}, {"seq": "CATTAGGAAAAACAACAGAGCCTTCTTCCATACCATAAATACATAAATCATTTCCACTAATCTTTTCTAAATATTGCACAAAAGAATCAATATCATTATAAGATGACATCTTCTTTCTTATAAAATCTAATTGAGCTTTGGTAAATCGAAAACAATTAATATATTTTATTACTTCATATACACCAGCTAATATAGCAAATTGAC"}, {"seq": "CATTAGGAAAAACAACAGATCCTTCTTCCATACCATAAATACATAAATCATTTCCACTAATCTTTTCTAAATATTGCACAAAAGAATCAATATCATTATAAGATGACATCTTTTTTCTTATAAAATCTAATTGAGCTTTGGTAAATCGAAAACAATTAATATATTTTATTACTTCATATACACCAGCTAATATAGCAAATTGAC"}, {"seq": "CATTAGGAAAAACAACAGATCCTTCTTCCATACCATAAATACATAAATCATTTCCACTAATCTTTTCTAAATATTGCAAAAAAGAATCAATATCATTATAAGATGACATCTTCTTTCTTATAAAATCTAATTGAGCTTTGGTAAATCGAAAACAATTAATATATTTTATTACTTCATATACACCAGCTAATATAGCAAATTGAC"}, {"seq": "CATTAGGAAAAACAACAGATCCTTCTTCCATACCATAAATACATAAATCATTTCCACTAATCTTTTCTAAATATTGCACAAAAGAATCAATATCATTATAAGATGACATCTTTTTTCTTATAAAATCTAATTGAGCTTTGGTAAATCGAAAACAATTAATATATTTTATTACTTCATATACACCAGCAAATATAGCAAATTGAC"}, {"seq": "CATTAGGAAAAACAACAGATCCTTCTTCCATACCATAAATACATAAATCATTTCCACTAATCTTTTCTAAATATTGCACAAAAGAATCAATATCATTATAAGGTGACATCTTCTTTCTTATAAAATCTAATTGAGCTTTGGTAAATCGAAAACAATTAATATATTTTATTACTTCATATACACCAGCTAATATAGCAAATTGAC"}], "target_id": 60}, {"microhaplotypes": [{"seq": "TATTTAATCTTCTATGTGTAGGTTGATTGAATTGTCCAGTAATAAAACATGCATTTGGTTGTTGAGAGAAGGAAAATAACAATATATTGAAGCATTTGAAAAAGTGTTTATCCATTTTAAATAAATTTACTTCTTTATTAATTAATAAGTTATTATATGATTTGGTTTGTAGTCCTATAGTTAATACAG"}], "target_id": 61}, {"microhaplotypes": [{"seq": "GTTTTATAATATTTATTTCCTATCTTTTTTAATAAATTACCATAAACAAATGTATTATGTTCTAATGACGAGGTACATAATATATTTGTAGTTACATATGATTCGAAAGCATTCAATATTATTAATATAATACTAAGTATAATACCTAATTTAGAAAAAACATAAGGTATTGATAAAAAACCTACACCAATAGCTGTACATATAAAAAGT"}, {"seq": "GTTTTATAATATTTATTTCCTATCTTTTTTAATAAATTACCATAAACAAATGTATTATGTTCTAATGACGAGGTACATAATATATTTGTAGTTACATATGATTCGAAAGCATTCATTATTATTAATATAATACTAAGTATAATACCTAATTTAGAAAAAACATAAGGTATTGATAAAAAACCTACACCAATAGCTGTACATATAAAAAGT"}], "target_id": 62}, {"microhaplotypes": [{"seq": "AAATGTTCTACCCTTCCAATTTCTTTTTGGTTTGTTTGTTCCTTCTTCATCATTAGTATAATCCCCATCAGATATATCTACAATGGTATTATTATTATTATTATTGCTACTATTTTTTTTGCTATCTTTTTTTTTCTTTTTTTTATCATTGGAACCTTTAGTAATCAAATTGTTCGATTTTTTGTCATTTACATTTGTATATGTTTCTGT"}, {"seq": "AAATGTTCTACCCTTCCAATTTCTTTTTGGTTTGTTTGTTCCTTCTTCATCATTAGTATAATCCCCATCAGATATATCTACAATGGTATTATTATTATTATTATTATTGCTACTATTTTTTTTGCTATCTTTTTTTTTCTTTTTTTTATCATTGGAACCTTTAGTAATCAAATTGTTCGATTTTTTGTCATTTACATTTGTATATGTTTCTGT"}, {"seq": "AAATGTTCTACCCTTCCAATTTCTTTTTGGTTTGTTTGTTCCTTCTTCATCATTAGTATAATCCCCATCAGATATATTTACAATGGTATTATTATTATTATTATTGCTACTATTTTTTTTGCTATCTTTTTTTTTCTTTTTTTTATCATTGGAACCTTTAGTAATCAAATTGTTCGATTTTTTGTCATTTACATTTGTATATGTTTCTGT"}, {"seq": "AAATGTTCTACCCTTCCAATTTCTTTTTGGTTTGTTTGTTCCTTCTTCATCATTAGTATAATCCCCATCAGATATATCTACAATGGTATTATTATTATTATTATTGCTACTATATTTTTTGCTATCTTTTTTTTTCTTTTTTTTATCATTGGAACCTTTAGTAATCAAATTGTTCGATTTTTTGTCATTTACATTTGTATATGTTTCTGT"}, {"seq": "AAATGTTCTACCCTTCCAATTTCTTTTTGGTTTGTTTGTTCCTTCTTCATCATTAGTATAATCCCGATCAGATATATCTACAATGGTATTATTATTATTATTATTGCTACTATTTTTTTTGCTATCTTTTTTTTTCTTTTTTTTATCATTGGAACCTTTAGTAATCAAATTGTTCGATTTTTTGTCATTTACATTTGTATATGTTTCTGT"}, {"seq": "AAATGTTCTACCCTTCCAATTTCTTTTTGGTTTGTTTGTTCCTTCTTCATCATTAGTATAATCCCCATCAGATATATCTACAATGGTATTATTATTATTATTATTGCTACTATTTTTTTTGCTATCTTTTTTTTTCTTTTTTTTATCATTGGAACCTTTAGTAATCGAATTGTTCGATTTTTTGTCATTTACATTTGTATATGTTTCTGT"}], "target_id": 63}, {"microhaplotypes": [{"seq": "GAATATGATAAAATATATATACCAAACAATAAAAATAAAATTAATAATATAAATAATTTTTTAATAAAAAACAATTTGCTGTTGAAATCCAAATTTATGAGAATAACTCCTAATACCTATTTATGTCGTAATTGTGTCCTGTTATATCAAAATGATTTTTCGTATAATACATATGAAGAAGAAATTAATAAAATGG"}, {"seq": "GAATATGATAAAATATATATACCAAACAATAAAAATAAAATTAATAATATAAATAATTTTTTAATAAAAAACAATTTGTTGTTGAAATCCAAATTTATGAGAATAACTCCTAATACCTATTTATGTCGTAATTGTGTCCTGTTATATCAAAATGATTTTTCGTATAATACATATGAAGAAGAAATTAATAAAATGG"}, {"seq": "GAATATGATAAAATATATATACCAAACAATAAAAATAAAATTAATAATATAAATAATTTTTTAATAAAAAACAATTTGCTGTTGAAATCCAAATTTATGAGAATAACTCCTAATACCTATTTATGTCGTAATTGTGTCCTGTTATATCAAAATGATTTTTCGTATAATACATATGACGAAGAAATTAATAAAATGG"}, {"seq": "GAATATGATAAAATATATATACCAAACAATAAAAATAAAATTAATAATATAAAAAATTTTTTAATAAAAAACAATTTGCTGTTGAAATCCAAATTTATGAGAATAACTCCTAATACCTATTTATGTCGTAATTGTGTCCTGTTATATCAAAATGATTTTTCGTATAATACATATGAAGAAGAAATTAATAAAATGG"}, {"seq": "GAATATGATAAAATATATATACCAAACAATAAAAATAAAATTAATAATATAAATAATTTTTTAATAAAAAACAATTTGCTGTTGAAATCCGAATTTATGAGAATAACTCCTAATACCTATTTATGTCGTAATTGTGTCCTGTTATATCAAAATGATTTTTCGTATAATACATATGAAGAAGAAATTAATAAAATGG"}], "target_id": 64}, {"microhaplotypes": [{"seq": "AAAATATGGAAGAAATATGATAAAGAAAACAATAAATATATATTGTCTCATTTTATTCCTCAATTTATTGAAGACTTAAATTTGAAGGATGAATTCCGAAATTTATTTGATGGATTTGTAAATGATTTGGATATTCTATTATATTCAGAATTTAAAGCATTTTATTTACAAATGAAGCAAAAAGATATAAATGAACTGAAAAATTCTGA"}, {"seq": "AAGATATGGAAGAAATATGATAAAGAAAACAATAAATATATATTGTCTCATTTTATTCCCCAATTTATTGAAGACTTAAATTTGAAGGATGAATTCCGAAATTTATTTGATGGATTTGTAAATGATTTGGATATTCTATTATATTCAGAATTTAAAGCATTTTATTTACAAATGAAGCAAAAAGATATAAATGAACTGAAAAATTCTGA"}, {"seq": "AAAATATGGAAGAAATATGATAAAGAAAACAATAAATATATATTGTCTCATTTTATTCCCCAATTTATTGAAGACTTAAATTTGAAGGATGAATTCCGAAATTTATTTGATGGATTTGTAAATGATTTGGATATTCTATTATATTCAGAATTTAAAGCATTTTATTTACAAATGAAGCAAAAAGATATAAATGAACTGAAAAATTCTGA"}, {"seq": "AAGATATGGAAGAAATATGATAAAGAAAACAATAAATATATATTGTCTCATTTTATTCCTCAATTTATTGAAGACTTAAATTTGAAGGATGAATTCCGAAATTTATTTGATGGATTTGTAAATGATTTGGATATTCTATTATATTCAGAATTTAAAGCATTTTATTTACAAATGAAGCAAAAAGATATAAATGAACTGAAAAATTCTGA"}, {"seq": "AAGATATGGAAGAAATATGATAAAGAAAACAATAAATATATATTGTCTCATTTTATTCCCCAATTTATTGAAGACTTAAATTTGAAGGATGAATTCCGAAATTTATTTGATGGATTTGTAGATGATTTGGATATTCTATTATATTCAGAATTTAAAGCATTTTATTTACAAATGAAGCAAAAAGATATAAATGAACTGAAAAATTCTGA"}], "target_id": 65}, {"microhaplotypes": [{"seq": "GACTACTAACAGAGTGACTACCTACGCTATGTTGAGATGAATTCCTTCCATCTGAATTACTTCCAGATAGGTGATTTTCTGTACTTCCATCTGAATTGTTTTTATATAATTGACTTTCCTTTTGTCCATCTAAATTATGCACTGCACTATGAGTTCCTTCACCCAAATTATTACTGTTTGTTGTATCATCATTTAAATCAAATCCATTTCTT"}, {"seq": "GACTACTAACAGAGTGACTACCTACGCTATGTTGAGATGAATTGCTTCCATTTGAATTACTTCCAGATAGGTGATTTTCTGTACTTCCATCTGAATTGTTTTTATATAATTGACTTTCCTTTTGTCCATCTAAATTATGCACTGCACTATGAGTTCCTTCACCCAAATTATTACTGTTTGTTGTATCATCATTTAAATCAAATCCATTTCTT"}, {"seq": "GACTACTAACAGAGTGACTACCTACGCTATGTTGAGATGAATTCCTTCCATCTGGATTACTTCCAGATAGGTGATTTTCTGTACTTCCATCTGAATTGTTTTTATATAATTGACTTTCCTTTTGTCCATCTAAATTATGCACTGCACTATGAGTTCCTTCACCCAAATTATTACTGTTTGTTGTATCATCATTTAAATCAAATCCATTTCTT"}, {"seq": "GACTACTAACAGAGTGACTACCTACGCTATGTTGAGATGAATTCCTTCCATCTGAATTACTTCCAGATAGGTGATTTTCTGTACTTCCATCTGAATTGTTTTTATATAATTGACTTTCCTTTTGTCCATCTAAATTATGCACTGCACTATGAGCTCCTTCACCCAAATTATTACTGTTTGTTGTATCATCATTTAAATCAAATCCATTTCTT"}], "target_id": 66}, {"microhaplotypes": [{"seq": "TTAGGTGGAGGTTCTTGTCTTGGTAAATGTGCTCATGTGTTTAAACTTATTTTTAAAGAGATTAAGGATAATATTTTTATTTATATTTTAAGTATTATTTATTTAAGTGTATGTGTAATGAATAAAATTTTTGCTAAAAGAACTTTAAACAAAATTGGTAACTATAGTTTTGTAACATCCGA"}, {"seq": "TTAGGTGGAGGTTCTTGTCTTGGTAAATGTGCTCATGTGTTTAAACTTATTTTTAAAGAGATTAAGGATAATATTTTTATTTATATTTTAAGTATTATTTATTTAAGTGTATGTGTAATTGAAACAATTTTTGCTAAAAGAACTTTAAACAAAATTGGTAACTATAGTTTTGTAACATCCGA"}], "target_id": 67}, {"microhaplotypes": [{"seq": "AGGTTCTTGTCTTGGTAAATGTGCTCATGTGTTTAAACTTATTTTTAAAGAGATTAAGGATAATATTTTTATTTATATTTTAAGTATTATTTATTTAAGTGTATGTGTAATGAATAAAATTTTTGCTAAAAGAACTTTAAACAAAATTGGTAACTATAGTTTTGTAACATCCGAAACTCACAACTTTATTTGTATGATTATGTTCTTT"}, {"seq": "AGGTTCTTGTCTTGGTAAATGTGCTCATGTGTTTAAACTTATTTTTAAAGAGATTAAGGATAATATTTTTATTTATATTTTAAGTATTATTTATTTAAGTGTATGTGTAATTGAAACAATTTTTGCTAAAAGAACTTTAAACAAAATTGGTAACTATAGTTTTGTAACATCCGAAACTCACAACTTTATTTGTATGATTATGTTCTTT"}], "target_id": 68}, {"microhaplotypes": [{"seq": "TTGAAAAAGTCATCATCAGAATGGGGATGATTATTATTGTTATTATGAGTTTGGTTCGTATTAATATTATGCTCCTTTTCGTTATTTAATTTATGTTCATTTATATTTTTATAAATAAATAATTTTCCAAGAAGTATACCATTAATAAACTTACTAGTTAACATATTAGACTGCTCAATATTTGTACATTTTTTTAATGTATGTATT"}, {"seq": "TTGAAAAAGTCATCATCAGAATGGGGATGATTATTATTGTTATTATGAGTTTGGTTCGTATTAATATTATGATCCTTTTCGTTATTTAATTTATGTTCATTTATATTTTTATAAATAAATAATTTTCCAAGAAGTATACCATTAATAAACTTACTAGTTAACATATTAGACTGCTCAATATTTGTACATTTTTTTAAAGTATGTATT"}, {"seq": "TTGAAAAAGTCATCATCAGAATGGGGATGATTATTATTGTTATTATGAGTTTGGTTCGTATTAATATTATGATCCTTTTCGTTATTTAATTTATGTTCATTTATATTTTTATAAATAAATAATTTTCCAAGAAGTATACCATTAATAAACTTACTAGTTAACATATTAGACTGCTCAATATTTGTACATTTTTTTAATGTATGTATT"}, {"seq": "TTGAAAAAGTCATCATCAGAATGGGGATGATTATTATTGTTATTATGAGTTTGGTTCGTATTAATATTATGATCCTTTTCGTTATTTAATATATGTTCATTTATATTTTTATAAATAAATAATTTTCCAAGAAGTATACCATTAATAAACTTACTAGTTAACATATTAGACTGCTCAATATTTGTACATTTTTTTAAAGTATGTATT"}, {"seq": "TTGAAAAAGTCATCATCAGAATGGGGATGATTATTATTGTTATTATGAGTTTGGTTCGTATTAATATTATGCTCCTTTTCGTTATTTAATTTATGTTCATTTATATTTTTATAAATAAATAATTTTCCAAGAAGTATACCATTAATAAACTTACTAGTTAACATATTAGACTGCTCAATATTTGTACATTTTTTTAAAGTATGTATT"}, {"seq": "TTGAAAAAGTCATCATCAGAATGGGGATGATTATTATTGTTATTATGAATTTGGTTCGTATTAATATTATGATCCTTTTCGTTATTTAATTTATGTTCATTTATATTTTTATAAATAAATAATTTTCCAAGAAGTATACCATTAATAAACTTACTAGTTAACATATTAGACTGCTCAATATTTGTACATTTTTTTAATGTATGTATT"}, {"seq": "TTGAAAAAGTCATCATCAGAATGGGGATGATTATTATTGTTATTATTAGTTTGGTTCGTATTAATATTATGCTCCTTTTCGTTATTTAATTTATGTTCATTTATATTTTTATAAATAAATAATTTTCCAAGAAGTATACCATTAATAAACTTACTAGTTAACATATTAGACTGCTCAATATTTGTACATTTTTTTAATGTATGTATT"}, {"seq": "TTGAAAAAGTCATCATCAGAATGGGGATGATTATTATTGTTATTATGAGTTTGGTTCGTATTAATATTATGATCCTTTTCGTTATTTAATTTATGTTCATTTATATTTTTATAAATAAATAATTTTCCAAGAAGTATACCATTAATAAACTTATTAGTTAACATATTAGACTGCTCAATATTTGTACATTTTTTTAAAGTATGTATT"}, {"seq": "TTGAAAAAGTCATCATCAGAATGGGGATGATTATTATTGTTATTATGAGTTTGGTTCGTATTAATATTATGATCCTTTTCGTTATTTAATATATGTTCATTTATATTTTTATAAATAAATAATTTTCCAAGAAGTATACCATTAATAAACTTACTAGTTAACATATTAGACTGCTCAATATTTGTACATTTTTTTAATGTATGTATT"}, {"seq": "TTGAAAAAGTCATTATCAGAATGGGGATGATTATTATTGTTATTATGAGTTTGGTTCGTATTAATATTATGATCCTTTTCGTTATTTAATTTATGTTCATTTATATTTTTATAAATAAATAATTTTCCAAGAAGTATACCATTAATAAACTTACTAGTTAACATATTAGACTGCTCAATATTTGTACATTTTTTTAAAGTATGTATT"}, {"seq": "TTGAAAAAGTCATTATCAGAATGGGGATGATTATTATTGTTATTATGAGTTTGGTTCGTATTAATATTATGATCCTTTTCGTTATTTAATTTATGTTCATTTATATTTTTATAAATAAATAATTTTCCAAGAAGTATACCATTAATAAACTTACTAGTTAACATATTAGACTGCTCAATATTTGTACATTTTTTTAATGTATGTATT"}], "target_id": 69}, {"microhaplotypes": [{"seq": "AGCTTTATTATCTACAAAAAATCCACGTGGATATATGAAACAAATGAAATTGTATTTTATATTCCAAATTAAAGAAATTGCATTAAGAAAACATGGCTCTTTACTTACAGTCAAAAATTTATATGATAATAAACTTTTAAATATAAATTCATCATCTTCTACAAATA"}, {"seq": "AGCTTTATTATCTACAAAAAATCCACGTGGATATATGAAACAAATGAAATTGTATTTTATATTCCAAATTAAAGAAATTGCATTAAGAAAACATGGCTCTTTACTTACAGTCAAAAATTTATATAATAATAAACTTTTAAATATAAATTCATCATCTTCTACAAATA"}, {"seq": "AGCTTTATTATCTACAAAAAATCCACGTGGATATATGAAACAAATGAAATTGTATTTTATATTCCAAATTAAAGAAATTGCATTAAGAAAACATGGTTCTTTACTTACAGTCAAAAATTTATATAATAATAAACTTTTAAATATAAATTCGTCATCTTCTACAAATA"}, {"seq": "ATCTTTATTATCTACAAAAAATCCACGTGGATATATGAAACAAATGAAATTGTATTTTATATTCCAAATTAAAGAAATTGCATTAAGAAAACATGGCTCTTTACTTACAGTCAAAAATTTATATGATAATAAACTTTTAAATATAAATTCATCATCTTCTACAAATA"}], "target_id": 70}, {"microhaplotypes": [{"seq": "TCACTAAGATAATTATTATTACTATTTTCAGCATAATAAAATTTCTGATGTTTTATAAGAGGAGTTTGGTTAGAAGCAAAATTATCAGCAGTTGTCGAATAATTATTATGTTCTTGATAAAAGAGATTATTCATATAGTTATTATTATTTTTCATATCATCCATAGTATTATTGTTAATATAAAATTCCTCATATGAATTATATATATA"}, {"seq": "TCACTAAGATAATTATTATTACCATTTTCAGCATAATAAAACTTCTGATGTTTTATAAGAGGAGTTTGGTTAGAAGCAAAATTATCAGCAGTTGTTGAATAATTATTATGTTCTTGATAAAAGAGATTATTCATATAGTTATTATTATTTTTCATATCATCCATAGTATTATTGTTAATATAAAATTCCTCATATGAATTATATATATA"}, {"seq": "TCACTAAGATAATTATTATTACCATTTTCAGCATAATAAAACTTCTGATGTTTTATAAGAGGAGTTTGGTTAGAAGCAAAATTATCAGCAGTTGTCGAATAATTATTATGTTCTTGATAAAAGAGATTATTCATATAGTTATTATTATTTTTCATATCATCCATAGTATTATTGTTAATATAAAATTCCTCATATGAATTATATATATA"}, {"seq": "TCACTAAGATAATTATTATTACTATTTTCAGCATAATAAAATTTCTGATGTTTCATAAGAGGAGTTTGGTTAGAAGCAAAATTATCAGCAGTTGTCGAATAATTATTATGTTCTTGATAAAAGAGATTATTCATATAGTTATTATTATTTTTCATATCATCCATAGTATTATTGTTAATATAAAATTCCTCATATGAATTATATATATA"}, {"seq": "TCACTAAGATAATTATTATTACTATTTTCAGCATAATAAAATTTCTGATGTTTTATAAGAGGAGTTTGGTTAGAAGCAAAATTATCAGCAGTTGTTGAATAATTATTATGTTCTTGATAAAAGAGATTATTCATATAGTTATTATTATTTTTCATATCATCCATAGTATTATTGTTAATATAAAATTCCTCATATGAATTATATATATA"}, {"seq": "TCACTAAGATAATTATTATTACTATTTTCAGCATAATAAAACTTCTGATGTTTTATAAGAGGAGTTTGGTTAGAAGCAAAATTATCAGCAGTTGTTGAATAATTATTATGTTCTTGATAAAAGAGATTATTCATATAGTTATTATTATTTTTCATATCATCCATAGTATTATTGTTAATATAAAATTCCTCATATGAATTATATATATA"}, {"seq": "TCACTAAGATAATTATTATTACCATTTTCAGCATAATAAAATTTCTGATGTTTTATAAGAGGAGTTTGGTTAGAAGCAAAATTATCAGCAGTTGTCGAATAATTATTATGTTCTTGATAAAAGAGATTATTCATATAGTTATTATTATTTTTCATATCATCCATAGTATTATTGTTAATATAAAATTCCTCATATGAATTATATATATA"}, {"seq": "TCACTAAGATAATTATTATTACCATTTTCAGCATAATAAAATTTCTGATGTTTCATAAGAGGAGTTTGGTTAGAAGCAAAATTATCAGCAGTTGTTGAATAATTATTATGTTCTTGATAAAAGAGATTATTCATATAGTTATTATTATTTTTCATATCATCCATAGTATTATTGTTAATATAAAATTCCTCATATGAATTATATATATA"}, {"seq": "TTACTAAGATAATTATTATTACTATTTTCAGCATAATAAAATTTCTGATGTTTTATAAGAGGAGTTTGGTTAGAAGCAAAATTATCAGCAGTTGTCGAATAATTATTATGTTCTTGATAAAAGAGATTATTCATATAGTTATTATTATTTTTCATATCATCCATAGTATTATTGTTAATATAAAATTCCTCATATGAATTATATATATA"}, {"seq": "TCACTAAGATAATTATTATTACTATTTTCAGCATAATAAAATTTCTGATGTTTCATAAGAGGAGTTTGGTTAGAAGCAAAATTATCAGCAGTTGTTGAATAATTATTATGTTCTTGATAAAAGAGATTATTCATATAGTTATTATTATTTTTCATATCATCCATAGTATTATTGTTAATATAAAATTCCTCATATGAATTATATATATA"}, {"seq": "TCACTATGATAATTATTATTACTATTTTCAGCATAATAAAATTTCTGATGTTTTATAAGAGGAGTTTGGTTAGAAGCAAAATTATCAGCAGTTGTCGAATAATTATTATGTTCTTGATAAAAGAGATTATTCATATAGTTATTATTATTTTTCATATCATCCATAGTATTATTGTTAATATAAAATTCCTCATATGAATTATATATATA"}, {"seq": "TCACTAAGATAATTATTATTACTATTTTCAGCATAATAAAACTTCTGATGTTTTATAAGAGGAGTTTGGTTAGAAGCAAAATTATCAGCAGTTGTCGAATAATTATTATGTTCTTGATAAAAGAGATTATTCATATAGTTATTATTATTTTTCATATCATCCATAGTATTATTGTTAATATAAAATTCCTCATATGAATTATATATATA"}], "target_id": 71}, {"microhaplotypes": [{"seq": "GAGCTTGCTTTTTTGTTGCGTTACTTGCTGGGCTGATCAAAAAAAAAGTTGAATGTATTGAACTTAGTGCCAGCGAAATTTCCCCTCATGAAAACAAATCGACGAGTTCATCAATATTCCAAGAGGAATTAAAATTTGATAAGTCTCTGAAAAATTTTTTCAAACAA"}, {"seq": "GAGCTTGCTTTTTTGTTGCGTTACTTGCTGGGCTGATCAAAAAAAAAGTTGAATGTATTGAACTTAGTGCCAGCGAAATTTCCCCTCATGAAAACAAATCGACGAGTTCATCAATATTCCAAGAGGAATTAAAATTTGATGAGTCTCTGAAAAATTTTTTCAAACAA"}, {"seq": "GAGCTTGCTTTTTTGTTGCGTTACTTGCTGGGCTGATCAAAAAAAAAGTTGAATGTATTGAACTTAGTGCCAGCGAAATTTCCCCTCATGAAAACAAATCGACGAGTTCATCAATATTCCAAGAGGAATTAAAATTTGATGAGTCTCTGAAAAAATTTTTCAAACAA"}, {"seq": "GAGCTTGCTTTTTTGTTGCGTTACTTGCTGGGCTGATCAAAAAAAAAGTTGAATGTATTGAACTTAGTGCCAGCGAAATTTCCCCTCATGAAAACAAATCGACGAGTTCATCAATATTCCAAGAGGAATTAAAATTTGATGAGTCTCTGAGAAATTTTTTCAAACAA"}, {"seq": "GAGCTTGCTTTTTTGTTGCGTTACTTGCTGGGCTGATCAAAAAAAAAGTTGAATGTATTGAACTTAGTGCCAGCGAAATTTCCCCTCATGAAAACAAATCGACGAGTTCACCAATATTCCAAGAGGAATTAAAATTTGATGAGTCTCTGAAAAAATTTTTCAAACAA"}], "target_id": 72}, {"microhaplotypes": [{"seq": "TGAATGTTCAGAAATTTTATATCACTTAAATCGTTTGAGTGAGTTAGATCAAATATTGTTGAAAGATAAAATAAGTATATATGAGTATCAGCTAAAGGACACGTTTTTAACAACGTATGATATAGGTTGTTTATTAAAAATAGCTCAAGTGTTGAATGAACAAAATTATTATGATAACATTCCATTTTTGCATATATTTTTATATAACATACATAA"}, {"seq": "TGAATGTTCAGAAATTTTATATCACTTAAATCGTTTGAGTGCGTTAGATCAAATATTGTTGAAAGATAAAATAAGTATATATGAGTATCAGCTAAAGGACACGTTTTTAACAACGTATGATATAGGTTGTTTATTAAAAATAGCTCAAGTGTTGAATGAACAAAATTATTATGATAACATTCCATTTTTGCATATATTTTTATATAACATACATAA"}, {"seq": "TGAATGTTCAGAAATTTTATATCACTTAAATCGTTTGAGTGAGTTAGATCAAATATTGTTGAAAGATAAAATAAGTATATATGAGTATCAGCTAAAGGACACGTTTTTAACAACGTATGATATAGGTTGTTTATTAAAAATAGCTCAAGTGGTGAATGAACAAAATTATTATGATAACATTCCATTTTTGCATATATTTTTATATAACATACATAA"}, {"seq": "TGAATGTTCAGAAATTTTATATCACTTAAATCGTTTGAGTGAGTTAGATGAAATATTGTTGAAAGATAAAATAAGTATATATGAGTATCAGCTAAAGGACACGTTTTTAACAACGTATGATATAGGTTGTTTATTAAAAATAGCTCAAGTGTTGAATGAACAAAATTATTATGATAACATTCCATTTTTGCATATATTTTTATATAACATACATAA"}, {"seq": "TGAATGTTCAGAAATTTTATATCACTTAAATCGTTTGAGTGCGTTAGATCAAATATTGTTGAAAGATAAAATAAGTATATATGAGTATCAGCTAAAGGACACGTTTTTAACAACGTATGATATAGGTTGTTTATTAAAAATAGCTCAAGTGTTGAATGAACAAAATTATTATGATACCATTCCATTTTTGCATATATTTTTATATAACATACATAA"}, {"seq": "TGAATGTTCAGAAATTTTATATCACTTAAATCGTTTGAGTGAGTTAGATCAAATATTGTTGAAAGATAAAATAAGTATATATGAGTATCATCTAAAGGACACGTTTTTAACAACGTATGATATAGGTTGTTTATTAAAAATAGCTCAAGTGTTGAATGAACAAAATTATTATGATAACATTCCATTTTTGCATATATTTTTATATAACATACATAA"}, {"seq": "TGAATGTTCAGAAATTTTATATCACTTAAATCGTTTGAGTGAGTTAGATCAAATATTGTTGAAAGATAAAATAAGTATATATGAGTATCTGCTAAAGGACACGTTTTTAACAACGTATGATATAGGTTGTTTATTAAAAATAGCTCAAGTGTTGAATGAACAAAATTATTATGATAACATTCCATTTTTGCATATATTTTTATATAACATACATAA"}, {"seq": "TGAATGTTCAGAAATTTTATATCACTTAAATCGTTTGAGTGAGTTAGATCAAATATTGTTGAAAGATAAAATAAGTATATATGAGTATCAGCTAAAGGACACGTTTTTAACAACGTATGATATAGGTTGTTTATTAAAAATAGCTCAAGTGTTGAATGAACAAAATTATTATGAGAACATTCCATTTTTGCATATATTTTTATATAACATACATAA"}, {"seq": "TGAATGTTCAGAAATTTTATATCACTTAAATCGTTTGAGTGAGTTAGATCAAATATTGTTGAAAGATAAAATAAGTATATATGAGTATCAGCTAAAGGACACGTTTTTAACAACGTATGATATAGGTTGTTTATTAAAAATAGCTCAAGTGTTGAATGAACAAAATTATTATGATACCATTCCATTTTTGCATATATTTTTATATAACATACATAA"}], "target_id": 73}, {"microhaplotypes": [{"seq": "ACAATGAAAAAATGTATTAATGATGAATTATATAAAATAAAAATAAATGTAGGTTTATATAAAAAGGATAGAAAAAAATTATCCTTTTTTATATTGTTGCATAAATTTTATTTAGATAATTATAATATTGTTATTAATAAATTAAAAAATATGAATAATTTAATAGAAA"}, {"seq": "ACAATGAAAAAATGTATTAATGATGAATTATATAAAATAAAAATAAATGTAGGTTTATATAAAAAGGATAGAAAAAAATTATCCTTTTTTATATTGTTGCATAAAATTTATTTAGATAATTATAATATTGTTATTAATAAATTAAAAAATATGAATAATTTAATAGAAA"}], "target_id": 74}, {"microhaplotypes": [{"seq": "TAAAGAATATTTTTATTTCTAATATTATGGCTAAAAGGAAAATTATTTAATTTCATTTTTTGTGGGTTACTTGTATCATTACAACTCATCATCATGACCATATTATTATTATTATTATTGTTGTTGTTGTTGTTGTGGTGGTTCATTACCAATAAATTTGTGTTATTATGTTCATCCTTTTTTATATTAACAATTTCATTTCTATAA"}, {"seq": "TAAAGAATATTTTTATTTCTAATATTATGGCTAAAAGGAAAATTATTTAATTTCATTTTTTGTGGGTTACTTGTATCATTACAACTCATCATCATGACCATATTATTATTATTATTATTGTTGTTGTTGTTGTTGTTGTGGTGGTTCATTACCAATAAATTTGTGTTATTATGTTCATCCTTTTTTATATTAACAATTTCATTTCTATAA"}, {"seq": "TAAAGAATATTTTTATTTCTAATATTATGGCTAAAAGGAAAATTATTTAATTTCATTTTTTGTGGGTTACTTGTATCATTACAACTCATCATCATGACCATATTATTATTATTATTATTATTGTTGTTGTTGTTGTTGTGGTGGTTCATTACCAATAAATTTGTGTTATTATGTTCATCCTTTTTTATATTAACAATTTCATTTCTATAA"}, {"seq": "TAAAGAATATTTTTATTTCTAATATTATGGCTAAAAGGAAAATTATTTAATTTCATTTTTTGTGGGTTACTTGTATCATTACAACTCATCATCATGACCATATTATTATTATTATTATTATTGTTGTTGTTGTTGTGGTGGTTCATTACCAATAAATTTGTGTTATTATGTTCATCCTTTTTTATATTAACAATTTCATTTCTATAA"}, {"seq": "TAAAGAATATTTTTATTTCTAATATTATGGCTAAAAGGAAAATTATTTAATTTCATTTTTTGTGGGTTACTTGTATCATTACAACTCATCATCATGACCATATTATTATTATTATTATTGTTGTTGTTGTTGTTGTTGTTGTGGTGGTTCATTACCAATAAATTTGTGTTATTATGTTCATCCTTTTTTATATTAACAATTTCATTTCTATAA"}, {"seq": "TAAAGAATATTTTTATTTCTAATATTATGGCTAAAAGGAAAATTATTTAATTTCATTTTTTGTGGGTTACTTGTATCATTACAACTCATCATCATGACCATATTATTATTATTATTATTGTTGTTGTTGTTGTGGTGGTGGTTCATTACCAATAAATTTGTGTTATTATGTTCATCCTTTTTTATATTAACAATTTCATTTCTATAA"}, {"seq": "TAAAGAATATTTTTATTTCTAATATTATGGCTAAAAGGAAAATTATTTAATTTCATTTTTTGTGGGTTACTTGTATCATTACAACTCATCATCATGACCATATTATTATTATTATTATTGTTGTTGTTGTTGTTGTGGTGGTTCATTACCAATAAATTTGTGTTATTACGTTCATCCTTTTTTATATTAACAATTTCATTTCTATAA"}, {"seq": "TAAAGAATATTTTTATTTCTAATATTATGGCTAAAAGGAAAATTATTTAATTTCATTTTTTGTGGGTTACTTGTATCATTACAACTCATCATCATGACCATATTATTATTATTATTATTGTTGTTGTTGTTGTTGTGGTGGTTCATTACCAATAAATTTGTGTTATTATGTTCATCCTTTTTTATATTAACAATTTCATTTATATAA"}, {"seq": "TAAAGAATATTTTTATTTCTAATATTATGGCTAAAAGGAAAATTATTTAATTTCATTTTTTGTGGGTTACTTGTATCATTACAACTCATCATCATGACCATATTATTATTATTATTATTATTATTGTTGTTGTTGTTGTGGTGGTTCATTACCAATAAATTTGTGTTATTATGTTCATCCTTTTTTATATTAACAATTTCATTTCTATAA"}, {"seq": "TAAAGAATATTTTTATTTCTAATATTATGGCTAAAAGGAAAATTATTTAATTTCATTTTTTGTGGGTTACTTGTATCATTACAACTCATCATCATGACCATATTATTATTATTATTATTATTATTGTTGTTGTTGTTGTTGTGGTGGTTCATTACCAATAAATTTGTGTTATTATGTTCATCCTTTTTTATATTAACAATTTCATTTCTATAA"}, {"seq": "TAAAGAATATTTTTATTTCTAATATTATGGCTAAAAGGAAAATTATTTAATTTCATTTTTTGTGGGTTACTTGTATCATTACAACTCATCATCATGACCATATTATTATTATTATTATTATTGTTGTTGTTGTTGTTGTGGTGGTTCATTACCAATAAATTTGTGTTATTATGTTCATCCTTTTTTATATTAACAATTTCATTTATATAA"}, {"seq": "TAAAGAATATTTTTATTTCTAATATTATGGCTAAAAGGAAAATTATTTAATTTCATTTTTTGTGGGTTACTTGTATCATTACAACTCATCATCATGACCATATTATTATTATTATTATTGTTGTTGTTGTTGTTGTGGTGGTGGTTCATTACCAATAAATTTGTGTTATTATGTTCATCCTTTTTTATATTAACAATTTCATTTCTATAA"}, {"seq": "TAAAGAATATTTTTATTTCTAATATTATGGCTAAAAGGAAAATTATTTAATTTCATTTTTTGTGGGTTACTTGTATCATTACAACTCATCATCATGACCATATTATTATTATTATTATTATTATTATTGTTGTTGTTGTTGTGGTGGTTCATTACCAATAAATTTGTGTTATTATGTTCATCCTTTTTTATATTAACAATTTCATTTCTATAA"}, {"seq": "TAAAGAATATTTTTATTTCTAATATTATGGCTAAAAGGAAAATTATTTAATTTCATTTTTTGTGGGTTACTTGTATCATTACAACTCATCATCATGACCATATTATTATTATTATTGTTGTTGTTGTTGTTGTTGTGGTGGTTCATTACCAATAAATTTGTGTTATTATGTTCATCCTTTTTTATATTAACAATTTCATTTCTATAA"}], "target_id": 75}, {"microhaplotypes": [{"seq": "ATAATGATATGTTATTTCATCATCAGCATCGACTTCTTTTTTATTATGTTCAAACAAATTCTTATATTTTATATTATTGCATTTTTGTCTTTCCATATTTATAAAAGATTCTATTTTCTTTTTATAATCATTCCTTTTTATATAATTACACATTCCTTCATTTTGGTTGTCATAACTCTTCT"}, {"seq": "ATAATGATATGTTATTTCATCATCAGCATCGACTTCTTTCTTATTATGTTCAAACAAATTCTTATATTTTATATTATTGCATTTTTGTCTTTCCATATTTATAAAAGATTCTATTTTCTTTTTATAATCATTCCTTTTTATATAATTACACATTCCTTCATTTTGGTTGTCATAACTCTTCT"}, {"seq": "ATAATGATATGTTATTTCATCATCAGCATCGACTTCTTTCTTATTATGTTCAAACAAATTCTTATATTTTATATTATTGCATTTTTGTCTTTCCATATTTATAAAAGATTCTATTTTCTTTTTATAATCATTCCTTATTATATAATTACACATTCCTTCATTTTGGTTGTCATAACTCTTCT"}, {"seq": "ATAATGATATGTTATTTCATCATCAGCATCGACTTCTTTCTTATTATGTTCAAACAAATTCTTATATTTTATATTATTGCATTTTTGTCTTTCCATATTTATAAAAGATTCTATTTTCTTTTTATAATCATTCCTTTTTATATAATTACACATTCCTTCATTTTGGTTGTCATAACTTTTCT"}], "target_id": 76}, {"microhaplotypes": [{"seq": "TATAGTTTTGTAATTTATTGGTATGTGTTGTTAAAGGAGAATTTTTTTAATATCCCTTGTCATGGGCAAAATGAGAAAAAAGAAATAAAAAACTTTTATGTTCAACATGAAGATATTTGTGAACACACTATTGGTAATCATATGTTAGGTGATAAATTAAAAATGTGTACATCTAATATTAATG"}, {"seq": "TATGGTTTTGTAATTTATTGGTATGTGTTGTTAAAGGAGAATTTTTTTAATATCCCTTGTCATGGGCAAAATGAGAAAAAAGAAATAAAAAACTTTTATGTTCAACATGAAGATATTTGTGAACACACTATTGGTAATCATATGTTAGGTGATAAATTAAAAATGTGTACATCTAATATTAATG"}, {"seq": "TATAGTTTTGTAATTTATTGGTATGTGTTGTTAAAGGAGAATTTTTTTAATATCCCTTGTCATGGGCAAAAGGAGAAAAAAGAAATAAAAAACTTTTATGTTCAACATGAAGATATTTGTGAACACACTATTGGTAATCATATGTTAGGTGATAAATTAAAAATGTGTACATCTAATATTAATG"}, {"seq": "TATGGTTTTGTAATTTATTGGTATGTGTTGTTAAAGGAGAATTTTTTTAATATCCCTTGTCATGGGCAAAAGGAGAAAAAAGAAATAAAAAACTTTTATGTTCAACATGAAGATATTTGTGAACACACTATTGGTAATCATATGTTAGGTGATAAATTAAAAATGTGTACATCTAATATTAATG"}, {"seq": "TATGGTTTTGTAATTTATTGGTATGTGTTGTTAAAGGAGAATTTTTTTAATATCCCTTGTCATGGGAAAAATGAGAAAAAAGAAATAAAAAACTTTTATGTTCAACATGAAGATATTTGTGAACACACTATTGGTAATCATATGTTAGGTGATAAATTAAAAATGTGTACATCTAATATTAATG"}, {"seq": "TATAGTTTTGTAATTTATTGGTATGTGCTGTTAAAGGAGAATTTTTTTAATATCCCTTGTCATGGGCAAAATGAGAAAAAAGAAATAAAAAACTTTTATGTTCAACATGAAGATATTTGTGAACACACTATTGGTAATCATATGTTAGGTGATAAATTAAAAATGTGTACATCTAATATTAATG"}, {"seq": "TATAGTTTTGTAATTTATTGGTATGTGTTGTTAAAGGAGAATTTTTTTAATATCCCTTGTCATGGGCAAAATGAGAAAAAAGAAATAAAAAACTTTTATGTTCAACATGAAGATATTTGTGAACACACTATTGGTAATCATATGTTAGGTGATAAATTAAAATTGTGTACATCTAATATTAATG"}, {"seq": "TATAGTTTTGTAATTTATTGGTATGTGTTGTTAAAGGAGAATTTTTTTAATATCCCTTGTCATGGGCAAAATGAGAAAAAAGAAATAAAAAACTTTTATGTTCAACATGAAGATATTTGTGAACACACTATTGGTAATCATATGTTAGGTGATAAATTAAAAATGTGTACATCTAATGTTAATG"}, {"seq": "TATAGTTTTGTAATTTATTGGTATGTGTTGTTAAAGGAGAATTTTTTTAATATCCCGTGTCATGGGCAAAATGAGAAAAAAGAAATAAAAAACTTTTATGTTCAACATGAAGATATTTGTGAACACACTATTGGTAATCATATGTTAGGTGATAAATTAAAAATGTGTACATCTAATATTAATG"}, {"seq": "TATAGTTTTGTAATTTATTGGTATGTGTTGTTAAAGGAGAATTTTTTTAATATCCCTTGTCATGGGCAAAATGAGAAAAAAGAAATAAAAAACTTGTATGTTCAACATGAAGATATTTGTGAACACACTATTGGTAATCATATGTTAGGTGATAAATTAAAAATGTGTACATCTAATATTAATG"}], "target_id": 77}, {"microhaplotypes": [{"seq": "TATTTGACTAGTCGAATAATATTTAATATTTTTGTTTAGGAAGTTTTCAAAATTGATGACATTGATAACCGTTTTTATTAAATCGCTTGGGTTGTTTGTGTGTTCTATAGTAGAAGACATAATTTTAAGAATGTGTTTTTGTGTTATTAAACAAAACTTTGTTACTATATGGAATCGTATGTTAT"}, {"seq": "TATTTGACTAGTCGAATAATATTTAATATTTTTGTTTAGGAAGTTTTCAAAATTGATGACATTGATAACCGTTTTTATTAAATCGCTTGGGTTGTTTGTGTGTTCCATTGTAGAAGACATAATTTTAAGAATGTGTTTTTGTGTTATTAAACAAAACTTTGTTACTATATGGAATCGTATGTTAT"}, {"seq": "TATTTGACTAGTCGAATAATATTTAATATTTTTGTTTAGGAAGTTTTCAAAATTGATGACATTGATAACCGTTTTTATTAAATCGCTTGGGTTGTTTGTGTGTTCCATTGTAGATGACATAATTTTAAGAATGTGTTTTTGTGTTATTAAACAAAACTTTGTTACTATATGGAATCGTATGTTAT"}, {"seq": "TATTTGACTAGTCCAATAATATTTAATATTTTTGTTTAGGAAGTTTTCAAAATTGATGACATTGATAACCGTTTTTATTAAATCGCTTGGGTTGTTTGTGTGTTCTATAGTAGAAGACATAATTTTAAGAATGTGTTTTTGTGTTATTAAACAAAACTTTGTTACTATATGGAATCGTATGTTAT"}, {"seq": "TATTTTACTAGTCGAATAATATTTAATATTTTTGTTTAGGAAGTTTTCAAAATTGATGACATTGATAACCGTTTTTATTAAATCGCTTGGGTTGTTTGTGTGTTCCATTGTAGAAGACATAATTTTAAGAATGTGTTTTTGTGTTATTAAACAAAACTTTGTTACTATATGGAATCGTATGTTAT"}, {"seq": "TATTTGACTAGTCGAATAATATTTAATATTTTTGTTTAGGAAGTTTTCAAAATTGATGACATTGATAACCGTTTTTATTAAATCGCTTGGGTTGTTTGTGGGTTCCATTGTAGAAGACATAATTTTAAGAATGTGTTTTTGTGTTATTAAACAAAACTTTGTTACTATATGGAATCGTATGTTAT"}, {"seq": "TATTTGACTAGTCGAATAATATTTAATATTTTTGTTTAGGAAGTTTTCAAAATTCATGACATTGATAACCGTTTTTATTAAATCGCTTGGGTTGTTTGTGTGTTCTATAGTAGAAGACATAATTTTAAGAATGTGTTTTTGTGTTATTAAACAAAACTTTGTTACTATATGGAATCGTATGTTAT"}, {"seq": "TATTTGACTAGTCGAATAATATTTAATATTTTTGTTTAGGAAGTTTTCAAAATTGATGACATTGATAACCGTTTTTATTAAATCGCTTGGGTTGTTTGTGTGTTCCATTGTAGTAGACATAATTTTAAGAATGTGTTTTTGTGTTATTAAACAAAACTTTGTTACTATATGGAATCGTATGTTAT"}, {"seq": "TATTTGACTAGTCGAATAATATTTAATATTTTTGTTTAGGAAGTTTTCAAAATTGATGACATTGATAACCGTTTTTATTAAATCGCTTGGGTTGTTTGTGTGTTCTATAGTAGAAGACATAATTTTAAGAATGTGTTTTTGTGTTATTAAACAAAACTTGGTTACTATATGGAATCGTATGTTAT"}], "target_id": 78}, {"microhaplotypes": [{"seq": "TACCTTCATCTATTGAATTAATTTTCTCAAGTAACATATTTTTGTCTTGACTACTTTCATCTGTAAATGGAACGAGTACTCTTTGCTTACCTGCAAAAAGGACAACTGACATATGAGCCTTATCCTTACTTACATTCGAATTAAAGACCATAGATTCTAAAAATGGTATAGTTCCTTTTAACCAATAATC"}, {"seq": "TACCTTCATCTATTGAATTAATTTTCTCAAGTAACATATTTTTGTCTTGACTACTTTCATCTGTAAATGGAACCAATACTCTTTGCTTACCTGCAAAAAGGACAACTGACATATGAGCCTTATCCTTACTTACATTCGAATTAAAGACCATAGATTCTAAAAATGGTATAGTTCCTTTTAACCAATAATC"}, {"seq": "TACCTTCATCTATTGAATTAATTTTCTCAAGTAACATATTTTTGTCTTGACTACTTTCATCTGTAAATGGAACGACTACTCTTTGCTTACCTGCAAAAAGGACAACTGACATATGAGCCTTATCCTTACTTACATTCGAATTAAAGACCATAGATTCTAAAAATGGTATAGTTCCTTTTAACCAATAATC"}, {"seq": "TACCTTCATCTATTGAATTAATTTTCTCAAGTAACATATTTTTGTCTTGACTACTTTCATCTGTAAATGGAACGAATACTCTTTGCTTACCTGCAAAAAGGACAATTGACATATGAGCCTTATCCTTACTTACATTCGAATTAAAGACCATAGATTCTAAAAATGGTATAGTTCCTTTTAACCAATAATC"}, {"seq": "TACCTTCATCTATTGAATTAATTTTCTCAAGTAACATATTTTTGTCTTGACTACTTTCATCTGTAAATGGAACGAATACTCTTTGCTTACCTGCAAAAAGGACAACTGACATATGAGCCTTATCCTTACTTACATTCGAATTAAAGACCATAGATTCTAAAAATGGTATAGTTCCTTTTAACCAATAATC"}, {"seq": "TACCTTCATCTATTGAATTAATTTTCTCAAGTAACATATTTTTGTCTTGACTACTTTCATCTGTAAATGGAACTAATACTCTTTGCTTACCTGCAAAAAGGACAACTGACATATGAGCCTTATCCTTACTTACATTCGAATTAAAGACCATAGATTCTAAAAATGGTATAGTTCCTTTTAACCAATAATC"}, {"seq": "TACCTTCATCTATTGAATTAATTTTCTCAAGTAACATATTTTTGTCTTGACTACTTTCATCTGTAAATGGAACGACTACTCTTTGCTTACCTGCAAAAAGGACAATTGACATATGAGCCTTATCCTTACTTACATTCGAATTAAAGACCATAGATTCTAAAAATGGTATAGTTCCTTTTAACCAATAATC"}], "target_id": 79}, {"microhaplotypes": [{"seq": "TAACAACGAACCCATAAATTTACAGAAAAATTTAGATTTAATCATATGGCTAAAAAAGAATATAAAAGAAGGAGAAGCTTTAATTTCTGATATACCTACATCAAGTTTTTTAAGGTGTACTACAAATTATAAATTTGTATTGCATCCCCAATATGAAGATAGT"}, {"seq": "TAACAACGAACCCATAAATTTACAGAAAAATTTAGATTTAATCATATGGCTAAAAAAGAATATAAAAGAAGGAGAAGCTTTAATTTCTGATATACCCACATCAAGTTTTTTAAGGTGTACTACAAATTATAAATTTGTATTGCATCCACAATATGAAGATAGT"}, {"seq": "TAACAACGAACCCATAAATTTACAAAAAAATTTAGATTTAATCATATGGCTAAAAAAGAATATAAAAGAAGGAGAAGCTTTAATTTCTGATATACCTACATCAAGTTTTTTAAGGTGTACTACAAATTATAAATTTGTATTGCATCCCCAATATGAAGATAGT"}, {"seq": "TAACAACGAACCCATAAATTTACAGAAAAATTTAGATTTAATCATATGGCTAAAAAAGAATATAAAAGAAGGAGAAGCTTTAATTTCTGATATACCCACATCAAGTTTTTTAAGGTGTACTACAAATTATAAATTTGTATTGCATCCCCAATATGAAGATAGT"}, {"seq": "TAACAACGAACCCATAAATTTACAAAAAAATTTAGATTTAATCATATGGCTAAAAAAGAATATAAAAGAAGGAGAAGCTTTAATTTCTGATATACCTACATCAAGTTTTTTAAGGTGTACTACAAATTATAAATTTGTATTGCATCCACAATATGAAGATAGT"}, {"seq": "TAACAACGAACCCATAAATTTACAAAAAAATTTAGATTTAATCATATGGCTAAAAAAGAATATAAAAGAAGGAGAAGCTTTAATTTCTGATATACCCACATCAAGTTTTTTAAGGTGTACTACAAATTATAAATTTGTATTGCATCCACAATATGAAGATAGT"}, {"seq": "TAACAACGAACCCATAAATTTACAGAAAAATTTAGATTTAATCATATGGCTAAAAAAGAATATAAAAGAAGGAGAAGCTTTAATTTCTGATATACCTACATCAAGTTTTTTAAGGTGTACTACAAATTATAAATTTGTATTGCATCCACAATATGAAGATAGT"}, {"seq": "TAACAACGAACCCATAAATTTACAAAAAAATTTAGATTTAATCATATGGCTAAAAAAGAATATAAAAGAAGGAGAAGCTTTAATTTCTGATATACCCACATCAAGTTTTTTAAGGTGTACTACAAATTATAAATTTGTATTGCATCCCCAATATGAAGATAGT"}, {"seq": "TAACAACGAACCCATAAATTTACAGAAAAATTTAGATTTAATCATATGGCTAAAAAAGAATATAAAAGAAGGAGAAGCTTTAATTTCTGATATACCCACATCAAGTTTTTTAAGGTGTACTACAAATTATAAATTTGTTTTGCATCCACAATATGAAGATAGT"}, {"seq": "TAACAACGAACCAATAAATTTACAGAAAAATTTAGATTTAATCATATGGCTAAAAAAGAATATAAAAGAAGGAGAAGCTTTAATTTCTGATATACCCACATCAAGTTTTTTAAGGTGTACTACAAATTATAAATTTGTATTGCATCCACAATATGAAGATAGT"}, {"seq": "TAACAACGAACCCATAAATTTACAGAAAAATTTAGATTTAATCATATGGCTAAAAAAGAATATAAAAGAAGGAGAAGCTTTAATTTCTGATATACCCACATCGAGTTTTTTAAGGTGTACTACAAATTATAAATTTGTATTGCATCCACAATATGAAGATAGT"}], "target_id": 80}, {"microhaplotypes": [{"seq": "CTTTTCTTCACCTTGGTTTATTACATTATTATTTTCATCATTGTGTTGAATGTCCTTATAAATATGTTCATTAATAATATCTTTGGAAGTATCTTCCATATTTTCTTCTTTATCAATTTTAAATACTTTTTCATAACTTTCATTTTCTTTTTTCTCCTTGGATGTTTCTAATTTATTCTCGTCATTTTTATCAAAATTATTTTTATAACTTTCA"}, {"seq": "CTTTTCTTCACCTTGGTTTATTACATTATTATTTTCATCATTGTGTTGAATGTCTTTATAAATATGTTCATTAATAATATCTTTGGAAGTATCTTCCATATTTTCTTCTTTATCAATTTTAAATACTTTTTCATAACTTTCATTTTCTTTTTTCTCCTTGGATGTTTCTAATTTATTCTCGTCATTTTTATCAAAATTATTTTTATAACTTTCA"}, {"seq": "CTTTTCTTCACCTTGGTTTATTACATTATTATTTTCATCATTGTGTTGAATGTCCTTATAAATATGTTCATTAATAATATCTTTGGAAGTATCTTCCATATTTTCTTCTTTATCAATTTTAAATACTTTTTCATAACTTTCATTTTCTTTTTTCTCCTTGGATGTTTCTAATTTATTCAAGTCATTTTTATCAAAATTATTTTTATAACTTTCA"}, {"seq": "CTTTTCTTCACCTTGGTTTATTACATTATTATTTTCATCATTGTGTTGAATGTCTTTATAAATATGTTCATTAATAATATCTTTGGAAGTATCTTCCATATTTTCTTCTTTATCAATTTTAAATACTTTTTCATAACTTTCATTTTCTTTTTTCTCCTTGGATGTTTCTAATTTATTCAAGTCATTTTTATCAAAATTATTTTTATAACTTTCA"}], "target_id": 81}, {"microhaplotypes": [{"seq": "ATGAAGAAATATACGAATATATACTTATAAACGATATTTTTAATTTAAAAAAAGAAATAAAAAATTTCAATATATTAAATAAATATGATGTATTTGAATATATTATTATTATTTTAAAATTGTATGATAAAATATATCCTGATGCAGAGTACATCGAATGTGTACGAGAAACATCACAGAATGGTGACCTTTTA"}, {"seq": "ATGAAGAAATATACGAATATATACTTATAAACGATATTTTTAATTTAAAAAAAGAAATAAAAAATTTCAATATATTAAATAAATATGATGTATTTGAATATATTATTATTATTTTAAAATTGTATGATAAAATATATCCTGATGCAAAGTACATCGAATGTGTACGAGAAACATCACAGAATGGTGACCTTTTA"}, {"seq": "ATGAAGAAATATACGAATATATACTTATAAACGATATTTTTAATTTAAAAAAAGAAATAAAAAATTTCAATATATTAAATAAATATGATGTATTTGAATATATTATTATTATTTTAAAATTGTATGATAAAATATATCCTGATGCAGAGTACATCGAATGTGTACGAGAAACATCACAGAATGGTGATCCTTTA"}, {"seq": "ATGAAGAAATATACGAATATATACTTATAAACGATATTTTTAATTTAAAAAAAGAAATAAAAAATTTCAATATATTAAATAAATATGATGTATTTGAATATATTATTATTATTTTAAAATTGTATGATAAAATATATCCTGATGCAAAGTACATCGAATGTGTACGAGAAACATCACAGAATGGTGATCCTTTA"}, {"seq": "ATGAAGAAATATACGAATATATACTTATAAACGATATTTTTAATTTAAAAAAAGAAATAAAAAATTTCAATATATTAAATAAATATGATGTATTTGAATATATTATTATTATTTTAAAATTGTATGATAAAATATATCCTGATGCAGAGTACATCGAATGTGTACGAGAAACATCACAGAATGGTGATTCTTTA"}, {"seq": "ATGAAGAAATATACGAATATATACTTATAAACGATATTTTTAATTTAAAAAAAGAAATAAAAAATTTCAATATATTAAATAAATATGATGCATTTGAATATATTATTATTATTTTAAAATTGTATGATAAAATATATCCTGATGCAAAGTACATCGAATGTGTACGAGAAACATCACAGAATGGTGACCTTTTA"}, {"seq": "ATGAAGAAATATACGAATATATACTTATAAACGATATTTTTAATTTAAAAAAAGAAATAAAAAATTTCAATATATTAAATAAATATGATGTATTTGAATATATTATTATTATTTTAAAATTGTATGATAAAATATATCCTGATGTAGAGTACATCGAATGTGTACGAGAAACATCACAGAATGGTGATCCTTTA"}], "target_id": 82}, {"microhaplotypes": [{"seq": "CAAACACATGATAAACAAAAGTGTAAGGAAAATTTTTCAAATTCTTTTGTTAATGAAATATATGAAAAAGAAGAAAAAGAAACGCAAAAAATGAAAGAATATTTAGAACAACATGAAGAACATTTTTCAACGTTTAGAAATTCAATTTTATGTAAATTAAGAATAGCTGAAGAATT"}, {"seq": "CAAACACATGATAAACAAAAGTGTAAGGAAAATTTTTCAAATTCATTTGTTAATGAAATATATGAAAAAGAAGAAAAAGAAACGCAAAAAATGAAAGAATATTTAGAACAACATGAAGAACATTTTTCAACGTTTAGAAATTCAATTTTATGTAAATTAAGAATAGCTGAAGAATT"}, {"seq": "CAAACACATGATAACCAAAAGTGTAAGGAAAATTTTTCAAATTCATTTGTTAATGAAATATATGAAAAAGAAGAAAAAGAAACGCAAAAAATGAAAGAATATTTAGAACAACATGAAGAACATTTTTCAACGTTTAGAAATTCAATTTTATGTAAATTAAGAATAGCTGAAGAATT"}, {"seq": "CAAATACATGATAAACAAAAGTGTAAGGAAAATTTTTCAAATTCTTTTGTTAATGAAATATATGAAAAAGAAGAAAAAGAAACGCAAAAAATGAAAGAATATTTAGAACAACATGAAGAACATTTTTCAACGTTTAGAAATTCAATTTTATGTAAATTAAGAATAGCTGAAGAATT"}], "target_id": 83}, {"microhaplotypes": [{"seq": "ACGTGCTGTTCAAAGAATGTTTGAAATGATAAATGAAGGTGCTAGTGTTATAGATATAGGTGGAGAATCCTCTGGTCCTTTTGTTATACCTAATCCAAAAATTAGTGAAAGAGATTTAGTAGTACCTGTATTACAATTATTTCAAAAAGAATGGAATGATATAAA"}, {"seq": "ACGTGCTGTTCAAAGAATGTTTGAAATGATAAATGAAGGTGCTAGTGTTATAGATATAGGTGGAGAATCCGCTGGTCCTTTTGTTATACCTAATCCAAAAATTAGTGAAAGAGATTTAGTAGTACCTGTATTACAATTATTTCAAAAAGAATGGAATGATATAAA"}, {"seq": "ACGTGCTGTTCAAAGAATGTTTGAAATGATAAATGAAGGTGCTAGTGTTATAGATATAGGTGGAGAATCCGCTGCTCCTTTTGTTATACCTAATCCAAAAATTAGTGAAAGAGATTTAGTAGTACCTGTATTACAATTATTTCAAAAAGAATGGAATGATATAAA"}, {"seq": "ACGTGCTGTTCAAAGAATGTTTGAAATGATAAATGAAGGTGCTAGTGTTATAGATATAGGTGGAGAATCCTATGCTCCTTTTGTTATACCTAATCCAAAAATTAGTGAAAGAGATTTAGTAGTACCTGTATTACAATTATTTCAAAAAGAATGGAATGATATAAA"}, {"seq": "ACGTGCTGTTCAAAGAATGTTTGAAATGATAAATGAAGGTGCTAGTGTTATAGATGTAGGTGGAGAATCCGCTGGTCCTTTTGTTATACCTAATCCAAAAATTAGTGAAAGAGATTTAGTAGTACCTGTATTACAATTATTTCAAAAAGAATGGAATGATATAAA"}], "target_id": 84}, {"microhaplotypes": [{"seq": "GATAAACTAACAAATTATGATAATCTAGTTTATGATATAAAAAATTATTTAGAACAAAGATTAAATTTTCTTGTATTAAATGGAATACCTCGTTATAGGATACTATTTGATATTGGATTAGGATTTGCGAAGAAACATGATCAATCTATTAAACTCTTACAAAATATACATGTATATGATGAGTATCCACTT"}, {"seq": "GATGAACTAACAAATTATGATAATCTAGTTTATGATATAAAAAATTATTTAGAACAAAGATTAAATTTTCTTGTATTAAATGGAATACCTCGTTATAGGATACTATTTGATATTGGATTAGGATTTGCGAAGAAACATGATCAATCTATTAAACTCTTACAAAATATACATGTATATGATGAGTATCCACTT"}, {"seq": "GATAAACTAACAAATTATGATAATCTAGTTTATGATATAAAAAATTATTTAGAACAAAGATTAAATTTTCTTGTATTAAATGGAATACCTCGTTATAGGATACTATTTGATATTGGATTAGGATTTGGGAAGAAACATGATCAATCTATTAAACTCTTACAAAATATACATGTATATGATGAGTATCCACTT"}], "target_id": 85}, {"microhaplotypes": [{"seq": "ACTATTTGATATTGGATTAGGATTTGCGAAGAAACATGATCAATCTATTAAACTCTTACAAAATATACATGTATATGATGAGTATCCACTTTTTATTGGATATTCAAGAAAAAGATTTATTGCCCATTGCATGAATGATCAAAATGTTGTAATAAATACACAACAAAAATTACATGATGAACAACAAAATGAAAATAAAAATA"}, {"seq": "ACTATTTGATATTGGATTAGGATTTGCGAAGAAACATGATCAATCTATTAAACTCTTACAAAATATACATGTATATGATGAGTATCCACTTTTTATTGGATATTCAAGAAAAAGATTTATTTCCCATTGCATGAATGATCAAAATGTTGTAATAAATACACAACAAAAATTACATGATGAACAACAAAATGAAAATAAAAATA"}, {"seq": "ACTATTTGATATTGGATTAGGATTTGGGAAGAAACATGATCAATCTATTAAACTCTTACAAAATATACATGTATATGATGAGTATCCACTTTTTATTGGATATTCAAGAAAAAGATTTATTTCCCATTGCATGAATGATCAAAATGTTGTAATAAATACACAACAAAAATTACATGATGAACAACAAAATGAAAATAAAAATA"}], "target_id": 86}, {"microhaplotypes": [{"seq": "TGAAAACTTTTCATGTACGGTTAATAAACAAAATAATTCTGAATTATATATAAGTAAAACTTCTTCTACATCTCTAAATTTATGCATTGTAGCTCTTTTAAGATAATAAGGCAAATATTTTACAATATATTTTTGTTTAAAAAAACCTTGATGACCAACATTAATATCTTCCATTTTGGAAAAGGTTCCACTTAACG"}, {"seq": "TGAAAACTTTTCATGTACGGTTAATAAACAAAATAATTCTGAATTATATATAAGTAAAACTTCTTCTACATCTCTAAATTTATGCATTGTAGCTCTTTTAATATAATAAGGCAAATATTTTACAATATATTTTTGTTTAAAAAAACCTTGATGACCAACATTAATATCTTCCATTTTGGAAAAGGTTCCACTTAACG"}, {"seq": "TGAAAACTTTTCATGTAAGGTTAATAAACAAAATAATTCTGAATTATATATAAGTAAAACTTCTTCTACATCTCTAAATTTATGCATTGTAGCTCTTTTAAGATAATAAGGCAAATATTTTACAATATATTTTTGTTTAAAAAAACCTTGATGACCAACATTAATATCTTCCATTTTGGAAAAGGTTCCACTTAACG"}], "target_id": 87}, {"microhaplotypes": [{"seq": "AAACACATCATCAAAAGTTTCTGATATTGGCTTGTTTGATTCTTTATATTTAAAATCTTTATATAAATAAAATCTATCTTTCTTAAAATATGGATCTTTACGTACTTCAATCGAATCACTATCAGTTACAATATTTATATCTTTTAATGTTAAGTGGAAATTAGAATCAATAATAGCTA"}, {"seq": "AAACACATCATCAAAAGTTTCTGATATTGGCTTGTTTGATTCTTTATATTTAAAATCTTTATATAAATAAAATCTATCTTTCTTAAAATATGGATCTTTACGTAGTTCAATCGAATCCCTATCAGTTACAATATTTATATCTTTTAATGTTAAGTGGAAATTAGAATCAATAATAGCTA"}], "target_id": 88}, {"microhaplotypes": [{"seq": "TGTAAATATAAATCATACGTATGACATGAATCATCATTTAATGCATTCTTAATTGTTAATGCTAATCTACTTACAATAATATAAGCAAAGTTTATATGAGAATGAATACCTTCTTTTCCTAAAAAGTTATAAAGACTAACAAATGGAGCATATATTATAAATTTATCATACTTTTTTTTGTGCATAACTTCATTTAATAAAATATTT"}], "target_id": 89}, {"microhaplotypes": [{"seq": "GTGTTAACGATAATTATAATGCAATAAGCACAACTAATTTTTCAGATGACATGGATGAATTGATAAAGAATCTTTCTATTATGGGTTTGTGTAAAGAGAAAATAGTGTTAACAGAAAAGGCAACAATATTTAATAACATTGAATTGTTGTATTCATATTATCTTATAGTTCAGA"}, {"seq": "GTGTTAACGATAATTATAATGCAATAAGCACAACTAATTTTTCAGATGACATGGATGAATTGATAAAGAATCTTTCTATTATGGGTTTGTGTAAAGAGAAAATAGTGTTAACAGAAAAGGCAACACTATTTAATAACATTGAATTGTTGTATTCATATTATCTTATAGTTCAGA"}, {"seq": "GTGTTAAGGATAATTATAATGCAATAAGCACAACTAATTTTTCAGATGACATGGATGAATTGATAAAGAATCTTTCTATTATGGGTTTGTGTAAAGAGAAAATAGTGTTAACAGAAAAGGCAACAATATTTAATAACATTGAATTGTTGTATTCATATTATCTTATAGTTCAGA"}, {"seq": "GTGTTAACGATAATTATAATGCAATAAGCACAACTAATTTTTCAGATGACATGGATGAATTGATAAAGAATCTTTCTATTATGGGTTTGTGTAAAGAGAAAATAGTGTTAACAGAAAAGGCAACCATATTTAATAACATTGAATTGTTGTATTCATATTATCTTATAGTTCAGA"}, {"seq": "GTGTTAAGGATAATTATAATGCAATAAGCACAACTAATTTTTCAGATGACATGGATGAATTGATAAAGAATCTTTCTATTATGGGTTTGTGTAAAGAGAAAATAGTGTTAACAGAAAAGGCAACAATATTTAATAACATTGAATTGTTGTATTCATATTTTCTTATAGTTCAGA"}, {"seq": "GTGTTAACGATAATTATAATGCAATAAGCACAACTAATTTTTCAGATGACATGGATGAATTGATAAAGAATCTTTCTATTATGGGTTTGTGTAAAGAGAAAATAGTGTTAACAGAAAAGGCAACAATATTTAATAACATTGAATTGTTGTATTCATATTTTCTTATAGTTCAGA"}, {"seq": "GTGTTAAGGATAATTATAATGCAATAAGCACAACTAATTTTTCAGATGACATGGATGAATTGATAAAGAATCTTTCTATTATGGGTTTGTGTAAAGAGAAAATAGTGTTAACAGAAAAGGCAACACTATTTAATAACATTGAATTGTTGTATTCATATTATCTTATAGTTCAGA"}], "target_id": 90}, {"microhaplotypes": [{"seq": "AAAAAATAAAAAATCAAACAAGATAAATAATAATGTATATAATACTAGTGGTATAAAAAATAATGATCAAAATATGGATAATATGAATCAAAAAGGAAAAAGTAACAAAAATTCAAATAAATATAATTTTGATGAAGAGGATTTATGGTTTTTATGTGATTTATGTAATAATCCTATAAGTCCGTTATGTTA"}, {"seq": "AAAAAATAAAAAATCAAACAAGATAAATAATAATGTATATAATACTAGTGGTATAAAAAATAATGATCAAAATATGGATAATATGAATCAAAAAGGGAAAAGTAACAAAAATTCAAATAAATATAATTTTGATGAAGAGGACTTATGGTTTTTATGTGATTTATGTAATAATCCTATAAGTCCGTTATGTTA"}, {"seq": "AAAAAATAAAAAATCAAACAAGATAAATAATAATGTATATAATACTAGTGGTATAAAAAATAATGATCAAAATATGGATAATATGAATCAAAAAGGAAAAAGTAACAAAAATTCAAATAAATATAATTTTGATGAAGAGGACTTATGGTTTTTATGTGATTTATGTAATAATCCTATAAGTCCGTTATGTTA"}, {"seq": "AAAAAATAAAAAATCAAACAAGATAAATAATAATGTATATAATACTAGTGGTATAAAAAATAATGATCAAAATATGGATAATATGAATCAAAAAGGGAAAAGTAACAAAAATTCAAATAAATATAATTTTGATGAAGAGGATTTATGGTTTTTATGTGATTTATGTAATAATCCTATAAGTCCGTTATGTTA"}, {"seq": "TAAAAATAAAAAATCAAACAAGATAAATAATAATGTATATAATACTAGTGGTATAAAAAATAATGATCAAAATATGGATAATATGAATCAAAAAGGAAAAAGTAACAAAAATTCAAATAAATATAATTTTGATGAAGAGGATTTATGGTTTTTATGTGATTTATGTAATAATCCTATAAGTCCGTTATGTTA"}], "target_id": 91}, {"microhaplotypes": [{"seq": "TACATCCAATGAATATTTTACACTTAAAAGAAATAAACAAATTATTCATAATAAAATACATATACTCTCTATGCAAAAAAATAAACAAAATACAAACGAGCTAAACAAATCATGTAATATTAACGCCATCATATTTAATATTAATTCTGATGATTTTGAGGTAGGCGATGAAATTGT"}, {"seq": "TACATCCAATGAATATTTTACACTTAAAAGAAATAAACAAATTATTCATAATAAAATACATATACTTTCTATGCAAAAAAATAAACAAAATACAAACGAGCTAAACAAATTATGTAATATTAACGCCATCATATTCAATATTAATTCTGATGATTTTGAGGTAGGCGATGAAATTGT"}, {"seq": "TACATCCAATGAATATTTTACACTTAAAAGAAATAAACAAATTATTCATAATAAAATACATATACTTTCTATGCAAAAAAATAAACAAAATACAAACGAGCTAAACAAATCATGTAATATTAACGCCATCATATTTAATATTAATTCTGATGATTTTGAGGTAGGCGATGAAATTGT"}, {"seq": "TACATCCAATGAATATTTTACACTTAAAAGAAATAAACAAATTATTCATAATAAAATACATATACTCTCTATGCAAAAAAATAAACAAAATACAAACGAGCTAAACAAATCATGTAATATTAACGCCATCATATTCAATATTAATTCTGATGATTTTGAGGTAGGCGATGAAATTGT"}, {"seq": "TACATCCAATGAATATTTTACACTTAAAAGAAATAAACAAATTATTCATAATAAAATACATATACTCTCTATGCAAAAAAATAAACAAAATACAAACGAGCTAAACAAATTATGTAATATTAACGCCATCATATTCAATATTAATTCTGATGATTTTGAGGTAGGCGATGAAATTGT"}, {"seq": "TACATCCAATGAATATTTTACACTTAAAAGAAATAAACAAATTATTCATAATAAAATACATATACTTTCTATGCAAAAAAATAAACAAAATACAAACGAGCTAAACAAATCATGTAATATTAACGCCATCATATTCAATATTAATTCTGATGATTTTGAGGTAGGCGATGAAATTGT"}, {"seq": "TACATCCAATGAATATTTTACACTTAAAAGAAATAAACAAATTATTCATAATAAAATACATATACTTTCTATGCAAAAAAATAAACAAAATACAAACGAGCTAAACAAATTATGTAATATTAACGCCATCATATTTAATATTAATTCTGATGATTTTGAGGTAGGCGATGAAATTGT"}, {"seq": "TACATCCAATGAATATTTTACACTTAAAAGAAATAAACAAATTATTCATAATAAAATACATATACTCTCTATGCAAAAAAATAAACAAAATACAAACGAGCTAAACAAATTATGTAATATTAACGCCATCATATTTAATATTAATTCTGATGATTTTGAGGTAGGCGATGAAATTGT"}, {"seq": "TACATCCAATGAATATTTTACACTTAAAAGAAATAAACAAATTATTCATAATAAAATACCTATACTTTCTATGCAAAAAAATAAACAAAATACAAACGAGCTAAACAAATTATGTAATATTAACGCCATCATATTCAATATTAATTCTGATGATTTTGAGGTAGGCGATGAAATTGT"}], "target_id": 92}, {"microhaplotypes": [{"seq": "TGAGAGACATAGATATATGATAGAAAAATGGAAAAAAGAAGATTGGTTTTGTGATTTAAAAGAAACGTTGAAAAATGAATTTGAAGAACAGATGGATATAGGAAAAGTATCTTTTTTATATGAAAATAATAGAGAGTATGGAAAAAATTTTTATTTGGAAAAGCAAAAAATTATATGGAAAAGATGG"}, {"seq": "TGAGAGACATAGATATATGATAGAAAAATGGAAAAAAGAAGATTGGTTTTGTGATTTAAAAGAAACGTTGAAAAATGAATTCGAAGAACAGATGGATATAGGAAAAGTATCTTTTTTATATGAAAATAATAGAGAGTATGGAAAAAATTTTTATTTGGAAAAGCAAAAAATTATATGGAAAAGATGG"}, {"seq": "TGAGAGACATAGATATATGATAGAAAAATGGAAAAAAGAAGATTGGTTTTGTGATTTAAAAGAAACGTTGAAAAATGAATTTGAAGAAGAGATGGATATAGGAAAAGTATCTTTTTTATATGAAAATAATAGAGAGTATGGAAAAAATTTTTATTTGGAAAAGCAAAAAATTATATGGAAAAGATGG"}, {"seq": "TGAGAGACATAGATATATGATAGAAAAATGGAAAAAAGAAGATTGGTTTTGTGATTTAAAAGAAACGTTGAAAAATGAATTTGAAGAACAGATGGATATAGGAAAAGTATCTTTTTTATATGAAAATAATAGAGAGTATGGACAAAATTTTTATTTGGAAAAGCAAAAAATTATATGGAAAAGATGG"}], "target_id": 93}, {"microhaplotypes": [{"seq": "ATAAAAAAGAAAAAATTATTGTCAAAAGTTTTCATAGATATATATATGATGGTATTAGAAGATTTTAAAGAAGAAGAATGTAAAAAAAATAAAGAAATATTTCTTGATACTTATATAGATGAACTAAAAAAAGATTCACAAAGTGAAAAAAATAAAAGCATGTTAAATATATTAGATGAAATAAAAAGTGATATTCATATAGGATATC"}, {"seq": "ATAAAAAAGAAAAAATTATTGTCAAAAGTTTTCATAGATATATATATGATGGTATTAGAAGATTTTAAAGAAGAAGAATGTAAAAAAAATAAAGAAATATTTCTTGATACTTATATAGATGAACTAAAAAAAGATTCGCAAAGTGAAAAAAATAAAAGCATGTTAAATATATTAGATGAAATAAAAAGTGATATTCATATAGGATATC"}, {"seq": "ATAAAAAAGAAAAAATTATTGTCAAAAGTTTTCATAGATATATATATGATGGTATTAGAAGATTTTAAAGAAGAAGAATGTAAAAAGAATAAAGAAATATTTCTTGATACTTATATAGATGAACTAAAAAAAGATTCGCAAAGTGAAAAAAATAAAAGCATGTTAAATATATTAGATGAAATAAAAAGTGATATTCATATAGGATATC"}, {"seq": "ATAAAAAAGAAAAAATTATTGTCAAAAGTTTTCATAGATATATATATGATGGTATTAGAAGATTTTAAAGAAGAAGAATGTAAAAAGAATAAAGAAATATTTCTTGATACTTATATAGATGAACTAAAAAAAGATTCACAAAGTGAAAAAAATAAAAGCATGTTAAATATATTAGATGAAATAAAAAGTGATATTCATATAGGATATC"}, {"seq": "ATAAAAAAGAAAAAATTATTGTCAAAAGTTTTCATAGATATATATATGATGGTATTAGAAGATTTTAAAGAAGAAGAATGTAAAAAAAATAAAGAAATATTTCTTGATACTTATATATATGAACTAAAAAAAGATTCGCAAAGTGAAAAAAATAAAAGCATGTTAAATATATTAGATGAAATAAAAAGTGATATTCATATAGGATATC"}, {"seq": "ATAAAAAAGAAAAAATTATTGTCAAAAGTTTTCATAGATATATATATGATGGTATTAGAAGATTTTAAAGAAGAAGAATGTAAAAAAAATAAAGAAATATTTCTTGATACCTATATAGATGAACTAAAAAAAGATTCACAAAGTGAAAAAAATAAAAGCATGTTAAATATATTAGATGAAATAAAAAGTGATATTCATATAGGATATC"}, {"seq": "ATAAAAAAGAAAAATTTATTGTCAAAAGTTTTCATAGATATATATATGATGGTATTAGAAGATTTTAAAGAAGAAGAATGTAAAAAAAATAAAGAAATATTTCTTGATACTTATATAGATGAACTAAAAAAAGATTCGCAAAGTGAAAAAAATAAAAGCATGTTAAATATATTAGATGAAATAAAAAGTGATATTCATATAGGATATC"}, {"seq": "ATAAAAAAGAAAAAATTATTGTCAAAAGTTTTCATAGATATATATATGATGGTATTAGAAGATTTTAAAGAAGAAGAATGTAAAAAAAATAAAGAAATATTTCTTGATACTTATATAGATGAACTAAAAAAAAATTCACAAAGTGAAAAAAATAAAAGCATGTTAAATATATTAGATGAAATAAAAAGTGATATTCATATAGGATATC"}, {"seq": "ATAAAAAAGAAAAAATTATTGTCAAAAGTTTTCATAGATATATATATGATGGTATTAGAAGATTTTAAAGATGAAGAATGTAAAAAGAATAAAGAAATATTTCTTGATACTTATATAGATGAACTAAAAAAAGATTCACAAAGTGAAAAAAATAAAAGCATGTTAAATATATTAGATGAAATAAAAAGTGATATTCATATAGGATATC"}], "target_id": 94}, {"microhaplotypes": [{"seq": "TATCTTTTCCATATATAATAACGCATGAATTCTTTAAATATATCTTTTACTTTATCTGTAAGTTTCATGGAATCTATTATTTCATGTGCATATTTTATTTTTGCCTCGTTTATATATTTACCTGCTTCTAATTTACATAAACATTTTTCTATTAAGTTTTG"}, {"seq": "TATCTTTTCCATATATAATAACGCATGAATTCTTTAAATATATCTTTTACTTTATCTGTAAGTTTCATGGAATCTATTATTTCATGTGCATATTTTATTTTTGCCTCGTTTATATATTTACCTGCTTTTAATTTACATAAACATTTTTCTATTAAGTTTTG"}, {"seq": "TATCTTTTCCATATATAATAACGCATGAATTCTTTAAATATATCTTTTACTTTATCTGTAAGTTTCATGGAATCTATTATTTCATCTGCATATTTTATTTTTGATTCGTTTATATATTTACCTGCTTCTAATTTACATAAACATTTTTCTATTAAGTTTTG"}, {"seq": "TATCTTTTCCATATATAATAACGCATGAATTCTTTAAATATATCTTTTACTTTATCTGTAAGTTTCATGGAATCTATTATTTCATCTGCATATTTTATTTTTGCCTCGTTTATATATTTACCTGCTTTTAATTTACATAAACATTTTTCTATTAAGTTTTG"}, {"seq": "TATCTTTTCCATATATAATAACGCATGAATTCTTTAAATATATCTTTTACTTTATCTGTAAGTTTCATGGAATCTATTATTTCATCTGCATATTTTATTTTTGCCTCGTTTATATATTTACCTGCTTCTAATTTACATAAACATTTTTCTATTAAGTTTTG"}], "target_id": 95}, {"microhaplotypes": [{"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAGTATTACAACATTCACTTGTAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCATAAGCGATCAGAAATGCACTAAAAGTATAACAATATTCACATGGAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAGTATAAGAACATTCACTTGGAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAGTATAACAACATTCACTTAGAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAGTATTACAACATTCACTTGGAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAGTATAACCATATTCACTTAGAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAGTATAACAATATACACATGGAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAGTACAACAACATTCACTTGGAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAATATAAAAATATTCACTTAGAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAGTATTACAACATTCACTTGAAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAATATAACAACAATCACTTAGAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAATATAACCATATTCACTTGGAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAGTATAATAATATCCACTTGTAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAGTATAACAATATTCACATGAAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAATATAACAACATTCACTTAGAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGAAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAGTATAACAATATTCACATGAAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCATAAGCGATCAGAAATGCACTAAAAGTATAACCATATCCACTTGGAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGAAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAGTATAACCATATCCACTTGGAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAGTATAACCATATCCACTTGGAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAAAAGCGATCAGAAATGCACTAAAAGTATAACAATATTCACTTGAAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAATATAACCATATTCACTTGTAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAGTATAAAAATATTCACTTGTAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCATAAGCGATCAGAAATGCACTAAAAGTATAACAATATTCACATGAAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCATAAGCGATCAGAAATACACTAAAAGTATAACCATATCCACTTGGAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCATAAGCGATCAGAAATGCACTAAAAGTATAACAATATTCACTTGGAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGAAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAGTATAACCATATTCACTTGTAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCGCTAAAAGTATTACAACATTCACTTGGAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAGTATAACAATATTCACATTGAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAGTATAACCATATTCACTTGTAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAGTATAACAATATTTACATGGAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAGTATAATAATATCCACTTGGAATAAGAGTAGCGATAAAACTAAAAATAGC"}, {"seq": "TTTATCATCTTTAGGCCATAACCAGAGTACAAGCAATCCAACTATAACAATTGTAATTAACATTATAAATACTGTAATACCATAAACACTACCAGAAGCGATCAGAAATGCACTAAAAGTATAACAATATTCACATGGAATAAGAGTAGCGATAAAACTAAAAATAGC"}], "target_id": 96}, {"microhaplotypes": [{"seq": "GTAATAATAATAATAATAATGTATTTCTTTCATCAAGTGATCCAAATAAATTAAACACAACACCATCACCATTTGGTTTATCATCTATTGGAAATCTAAATACAAACAATAAATTAAATAGCTTTCCAGATTTTAGTCAAGCTAATAAAACATTTCTACAAAATGATAGCTTAT"}, {"seq": "GTAATAATAATAATAATAATGTATTTCTTTCATCAAGTGATCCAAATAAATTAAACACAACACCATCACCATTTGGTTTATCATCTATTGGAAATCTAAATACAAACAATAAATTAAATAGCTTTCCAGACTTTAGTCAAGCTAATAAAACATTTCTACAAAATGATAGCTTAT"}, {"seq": "GTAATAATAATAATAATAATGTATTTCTTTCATCAAGTGATCCAAATAAATTAAACACAACACCATCACCATTTGGTTTATCATCTATTGGAAATCTAAATACAAACAATAAATTAAATAGCTTTCCAGATTTTAGTCAAGCTAATAAAACATTTCTACAAAATGATAGATTAT"}, {"seq": "AAAGTAATAATAATAATAATGTATTTCTTTCATCAAGTGATCCAAATAAATTAAACACAACACCATCACCATTTGGTTTATCATCTATTGGAAATCTAAATACAAACAATAAATTAAATAGCTTTCCAGATTTTAGTCAAGCTAATAAAACATTTCTACAAAATGATAGCTTAT"}, {"seq": "GTAATAATAATAATAATAATGTATTTCTTTCATCAAGTGATCCAAATAAATTAAACACAACACAATCACCATTTGGTTTATCATCTATTGGAAATCTAAATACAAACAATAAATTAAATAGCTTTCCAGACTTTAGTCAAGCTAATAAAACATTTCTACAAAATGATAGCTTAT"}, {"seq": "GTAATAATAATAATAATAATGTATTTCTTTCATCAAGTGATCCAAATAAATTAAACACAACACCATCACCGTTTGGTTTATCATCTATTGGAAATCTAAATACAAACAATAAATTAAATAGCTTTCCAGATTTTAGTCAAGCTAATAAAACATTTCTACAAAATGATAGCTTAT"}, {"seq": "GTAATAATAATAATAATAATGTATTTCTTTCATCAAGTGATCCAAATAAATTAAACACAACACCATCACCATTTGGTTTATCATCTATTGGAAATCTAAATGCAAACAATAAATTAAATAGCTTTCCAGATTTTAGTCAAGCTAATAAAACATTTCTACAAAATGATAGCTTAT"}, {"seq": "GTAATAATAATAATAATAATGTATTTCTTTCATCAAGTGTTCCAAATAAATTAAACACAACACCATCACCATTTGGTTTATCATCTATTGGAAATCTAAATACAAACAATAAATTAAATAGCTTTCCAGATTTTAGTCAAGCTAATAAAACATTTCTACAAAATGATAGCTTAT"}], "target_id": 97}, {"microhaplotypes": [{"seq": "ATCAACTGGTGTTGCAAAACCATTAGTTACCAATTTTAATTCTCCATTTAGTGCTTTTGGTAAAACAAATACCAGTGATATATTTAAAACTAATACTACTGCATCAACTACAAATGCAACTGCAACTGCAACTCCTGCTCCCTTTGGATCAGCATTTGGAGCGCAAAAGAATAATGATAGCTTGTTTGGAAATAATGCATTCAAGCTTTCG"}, {"seq": "ATCAACTGGTGTTGCAAAACCATTAGTTACCAATTTTAATTCTCCATTTAGTGCTTTTGGTAAAACAAATACCAGTGATATATTTAAAACTAATACTACTGCATCAACTACAAATGCAACTGCAAATGCAACTCCTGCTCCCTTTGGATCAGCATTTGGAGCGCAAAAAAATAATGATAGCTTGTTTGGAAATAATGCATTCAAGCTTTCG"}, {"seq": "ATCAACTGGTGTTGCAAAACCATTAGTTACCAATTTTAATTCTCCATTTAGTGCTTTTGGTAAAACAAATACCAGTGATATATTTAAAACTAATACTACTGCATCAACTACAAATGCAACTGCAACTGCAACTCCTGCTCCCTTTGGATCAGCATTTGGAGCGCAAAAAAATAATGATAGCTTGTTTGGAAATAATGCATTCAAGCTTTCG"}, {"seq": "ATCAACTGGTGTTGCAAAACCATTAGTTACCAATTTTAATTCTCCATTTAGTGCTTTTGGTAAAACAAATACCAGTGATATATTTAAAACTAATACTACTGCATCAACTACAAATGCAACTGCAACTGCAACTGCAACTCCTGCTCCCTTTGGATCAGCATTTGGAGCGCAAAAGAATAATGATAGCTTGTTTGGAAATAATGCATTCAAGCTTTCG"}, {"seq": "ATCAACTGGTGTTGCAAAACCATTAGTTACCAATTTTAATTCTCCATTTAGTGCTTTTGGTAAAACAAATACCAGTGATATATTTAAAACTAATACTACTGCATCAACTACAAATGCAACTGCAAATGCAACTCCTGCTCCCTTTGGATCAGCATTTGGAGCGCAAAAGAATAATGATAGCTTGTTTGGAAATAATGCATTCAAGCTTTCG"}, {"seq": "ATCAACTGGTGTTGCAAAACCATTAGTTACCAATTTTAATTCTCCATTTAGTGCTTTTGGTAAAACAAATACCAGTGATATATTTAAAACTAATACTACTGCATCAACTACAAATGCAACTGCAACTGCAACTCCTGCTCCCTTTGGATCAGCATTTGGAGCGCAAAAGAATAATGATAACTTGTTTGGAAATAATGCATTCAAGCTTTCG"}, {"seq": "ATCAACTGGTGTTGCAAAACCATTAGTTACCAATTTTAATTCTCCATTTAGTGCTTTTGGTAAAACAAATACCAGTGATATATTTAAAACTAATACTACTGCATCAACTACAAATGCAACTGCAACTGCAACTCCTTCTCCCTTTGGATCAGCATTTGGAGCGCAAAAGAATAATGATAGCTTGTTTGGAAATAATGCATTCAAGCTTTCG"}, {"seq": "ATCAACTGGTGTTGCAAAACCATTAGTTACCAATTTTAATTCTCCATTTAGTGCTTTTGGTAAAACAAATACCAGTGATATATTTAAAACTAATACTACTGCATCAACTACAAATGCACCTGCAACTGCAACTCCTGCTCCCTTTGGATCAGCATTTGGAGCGCAAAAGAATAATGATAGCTTGTTTGGAAATAATGCATTCAAGCTTTCG"}, {"seq": "ATCAACTGGTGTTGCAAAACCATTAGTTACCAATTTTAATTCTCCATTTAGTGCTTTTGGTAAAACAAATAACAGTGATATATTTAAAACTAATACTACTGCATCAACTACAAATGCAACTGCAACTGCAACTCCTGCTCCCTTTGGATCAGCATTTGGAGCGCAAAAGAATAATGATAGCTTGTTTGGAAATAATGCATTCAAGCTTTCG"}, {"seq": "ATCAACTGGTGTTGCAAAACCATTAGTTACCAATTTTAATTCTCCATTTAGTTCTTTTGGTAAAACAAATACCAGTGATATATTTAAAACTAATACTACTGCATCAACTACAAATGCAACTGCAACTCCTGCTCCCTTTGGATCAGCATTTGGAGCGCAAAAGAATAATGATAGCTTGTTTGGAAATAATGCATTCAAGCTTTCG"}, {"seq": "ATCAACTGGTGTTGCAAAACCATTAGTTACCAATTTTAATTCTCCATTTAGTGCATTTGGTAAAACAAATACCAGTGATATATTTAAAACTAATACTACTGCATCAACTACAAATGCAACTGCAACTGCAACTCCTGCTCCCTTTGGATCAGCATTTGGAGCGCAAAAGAATAATGATAGCTTGTTTGGAAATAATGCATTCAAGCTTTCG"}, {"seq": "ATCAACTGGTGTTGCAAAACCATTAGTTACCAATTTTAATTCTCCATTTAGTGCTTTTGGTAAAACAAATACCAGTGATATATTTAAAACTAATACTACTGCATCAACTACAAATGCAACTGCAACTGCAACTCCTGCTCCCTTTGGATCAGCATTTGGAGCGCAAAAGAATAATGATAGCTTGTTTGGAAATAATACATTCAAGCTTTCG"}], "target_id": 98}, {"microhaplotypes": [{"seq": "AATATACAAAGAATGCATATGATAAAATATTCTTTGTCCTTTAAAATTTTTTGTTCTTGTACTTTGTTTTTTATAATCTATTAAATTCATATCTGATGAAATATCATATTTATATTCCCCTTTATGAGCATTTACAAAAGTTTCGCTATTTCTTTTATTAATATATGTATTTGAGCACATATTTTTAT"}, {"seq": "AATATACAAAGAATGTATATGATAAAATATTCTTTGTCCTTTAAAATTTTTTGTTCTTGTACTTTGTTTTTTATAATCTATTAAATTCATATCTGATGAAATATCATATTTATATTCCCCTTTATGAGCATTTACAAAAGTTTCGTTATTTCTTTTATTAATATATGTATTTGAGCACATATATTTAT"}, {"seq": "AATATACAAAGAATGTATATGATAAAATATTCTTTGTCCTTTAAAATTTTTTGTTCTTGTACTTTGTTTTTTATAATCTATTAAATTCATATCTGATGAAATATCATATTTATATTCCCCTTTATGAGCATTTACAAAAGTTTCGCTATTTCTTTTATTAATATATGTATTTGAGCACATATTTTTAT"}, {"seq": "AATATACAAAGAATGCATATGATAAAATATTCTTTGTCCTTTAAAATTTTTTGTTCTTGTACTTTGTTTTTTATAATCTATTAAATTCATATCTGATGAAATATCATATTTATATTCCCCTTTATGAGCATTTACAAAAGTTTCGTTATTTCTTTTATTAATATATGTATTTGAGCACATATATTTAT"}, {"seq": "AATATACAAAGAATGTATATGATAAAATATTCTTTGTCCTTTAAAATTTTTTGTTCTTGTACTTTGTTTTTTATAATCTATTAAATTCATATCTGATGAAATATCATATTTATATTCCCCTTTATGAGCATTTACAAAAGTTTCGTTATTTCTTTTATTAATATATGTATTTGAGCACATATTTTTAT"}, {"seq": "AATATACAAAGAATGTATATGATAAAATATTCTTTGTCCTTTAAAATTTTTTGTTCTTGTACTTTGTTTTTTATAATCTATTAAATTCATATCTGATGAAATATCATATTTATATTCCCCTTTATGAGCATTTACAAAAGTTTCGCTATTTCTTTTATTAATATATGTATTTGAGCACATATATTTAT"}, {"seq": "AATATACAAAGAATGCATATGATAAAATATTCTTTGTCCTTTAAAATTTTTTGTTCTTGTACTTTGTTTTTTATAATCTATTAAATTCATATCTGATGAAATATCATATTTATATTCCCCTTTATGAGCATTTACAAAAGTTTCGCTATTTCTTTTATTAATATATGTATTTGAGCACATATATTTAT"}, {"seq": "AATATACAAAGAATGTATATGATAAAATATTCTTTGTCCTTTAAAATTTTTTGTTCTTGTACTTTGTTTTTTATAATCTATTAAATTCATAACTGATGAAATATCATATTTATATTCCCCTTTATGAGCATTTACAAAAGTTTCGCTATTTCTTTTATTAATATATGTATTTGAGCACATATTTTTAT"}, {"seq": "AATATACAAAGAATGCATATGATAAAATATTCTTTGTCCTTTAAAATTTTTTGTTCTTGTACTTTGTTTTTTATAATCTATTAAATTCATATCTGATGAAATATCATATTTATATTCCCCTTTATGAGCATTTACAAAAGTTTCGTTATTTCTTTTATTAATATATGTATTTGAGCACATATTTTTAT"}, {"seq": "AATATAGAAAGAATGCATATGATAAAATATTCTTTGTCCTTTAAAATTTTTTGTTCTTGTACTTTGTTTTTTATAATCTATTAAATTCATATCTGATGAAATATCATATTTATATTCCCCTTTATGAGCATTTACAAAAGTTTCGCTATTTCTTTTATTAATATATGTATTTGAGCACATATTTTTAT"}, {"seq": "AATATACAAAGAATGCATATGATAAAATATTCTTTGTCCTTTAAAATTTTTTGTTCTTGTACTTTGTTTTTTATAATCTATTAAATTCATATCTGATGAAATATCATATTTATATTCCCCTTTAGGAGCATTTACAAAAGTTTCGTTATTTCTTTTATTAATATATGTATTTGAGCACATATTTTTAT"}, {"seq": "AATATACAAAGAATGCATATGATAAAATATTCTTTGTCCTTTAAAATTTTTTTTTTTTGTACTTTGTTTTTTATAATCTATTAAATTCATATCTGATGAAATATCATATTTATATTCCCCTTTATGAGCATTTACAAAAGTTTCGCTATTTCTTTTATTAATATATGTATTTGAGCACATATTTTTAT"}, {"seq": "AATATACAAAGAATGCATATGATAAAATATTCTTTGTCCTTTAAAATTTTTTGTTCTTGTACTTTGTTTTTTATAATCTATTAAATTCATATCTGATGAAATATCATAATTATATTCCCCTTTATGAGCATTTACAAAAGTTTCGCTATTTCTTTTATTAATATATGTATTTGAGCACATATTTTTAT"}, {"seq": "AATATACAAAGAATGTATATGATAAAATATTCTTTGTCCTTTAAAATTTTTTGTTCTTGTACTTTGTTTTTTATAATCTATTAAATTCATATCTGATGAAATATCATAATTATATTCCCCTTTATGAGCATTTACAAAAGTTTCGCTATTTCTTTTATTAATATATGTATTTGAGCACATATTTTTAT"}], "target_id": 99}, {"microhaplotypes": [{"seq": "CTTTGTATGTATTATCTGTTGTTTTATCTTCACCTTGATTTCCTGTACTTGTAGATTCAGTAGATGGACCTTCAGAACCTGCTAATTCATCACTAGTAGATGCAGCACTTGTACTTTTAGATTGTTCTTTTAATGGTCCCATATATTTGTATAATTCTATTTCTAAATCTTGATCCTTGGTTTTTTCTTCTAA"}, {"seq": "CTTTGTATGTATTATCTGTTGTTTTATCTTCACCTTGATTTCCTGTACTTGTAGATTCAGTAGATGGACCTTCAGAACCTGATAATTCATTACTAGTAGATGCAGCACTTGTACTTTTAGATTGTTCTTTTAATGGTCCCATATATTTGTATAATTCTATTTCTAAATCTTGATCCTTGGTTTTTTCTTCTAA"}, {"seq": "CTTTGTATGTATTATCTGTTGTTTTATCTTCACCTTGATTTCCTGTACTTGTAGATTCAGTAGATGGACCTTCAGAACCTGATATTTCATCACTAGTAGATGCAGCACTTGTACTTTTAGATTGTTCTTTTAATGGTCCCATATATTTGTATAATTCTATTTCTAAATCTTGATCCTTGGTTTTTTCTTCTAA"}, {"seq": "CTTTGTATGTATTATCTGTTGTTTTATCTTCACCTTGATTTCCTGTACTTGTAGATTCAGTAGATGGACCTTCAGAACCTGATAATTCATCAGTAGTAGATGCAGCACTTGTACTTTTAGATTGTTCTTTTAATGGTCCCATATATTTGTATAATTCTATTTCTAAATCTTGATCCTTGGTTTTTTCTTCTAA"}, {"seq": "CTTTGTATGTATTATCTGTTGTTTTATCTTCACCTTGATTTCCTGTACTTGTAGATTCAGTAGATGGACCTTCAGAACCTGATAATTCATCACTAGTAGATGCAGCACTTGTACTTTTAGATTGTTCTTTTAATGGTCCCATATATTTGTATAATTCTATTTCTAAATCTTGATCCTTGGTTTTTTCTTCTAA"}, {"seq": "CTTTGTATGTATTATCTGTTGTTTTATCTTCACCTTGATTTCCCGTACTTGTAGATTCAGTAGATGGACCTTCAGAACCTGCTAATTCATCACTAGTAGATGCAGCACTTGTACTTTTAGATTGTTCTTTTAATGGTCCCATATATTTGTATAATTCTATTTCTAAATCTTGATCCTTGGTTTTTTCTTCTAA"}, {"seq": "CTTTGTATGTATTATCTGTTGTTTTATCTTCACCTTGATTTCCTGTACTTGTAGATTCAGTAGATGGACCTTCAGAACGTGATAATTCATCACTAGTAGATGCAGCACTTGTACTTTTAGATTGTTCTTTTAATGGTCCCATATATTTGTATAATTCTATTTCTAAATCTTGATCCTTGGTTTTTTCTTCTAA"}], "target_id": 100}, {"microhaplotypes": [{"seq": "ATAGAAGGATATATAAAAAATTATCAAGAATCATATAATATAAATGACCATTGTAAATTAGTTCCATTAAATTTTTATAAAGATTCTATTTCTAATGATTTAGGTACTCCATGCCCTGTGAATAGTATTACCTTAAATGTGGGCGCAAAAACTATAAATGAATGTTTGTGTAATAAAGGATATTTCTATAATGTCAAGAAACAACAATGTGA"}, {"seq": "ATAGAAGGATATATAAAAAATTATCAAGAATCATATAATATAAATGACCATTGTAAATTAGTTCCATTAAATTTTTATAAAGATTCTATTTCTAATGATTTAGGTACTCCATGCCCTGTGAATAGTATTACCTTAAATGTGGGCGCAAAAACTATAAATGAATGTTTGTGTAATAAAGGATATTTCTATAATGTCAAGAAACAACAATGTAA"}, {"seq": "ATAGAAGGATATATAAAAAATTATCAAGAATCATATAATATAAATGACCATTGTAAATTAGTTCCATTAAATTTTTATAAAGATTCTATTTCTAATGATTTAGGTACTCCATGCCCCGTGAATAGTATTACCTTAAATGTGGGCGCAAAAACTATAAATGAATGTTTGTGTAATAAAGGATATTTCTATAATGTCAAGAAACAACAATGTGA"}, {"seq": "ATAGAAGGATATATAAAAAATTATCAAGAATCATATAATATAAATGACCATTGTAAATTAGTTCCATTAAATTTTTATAAAGATTCTATTTCTAATGATTTAGGTACTCCATGCCCTGTAAATAGTATTACCTTAAATGTGGGCGCAAAAACTATAAATGAATGTTTGTGTAATAAAGGATATTTCTATAATGTCAAGAAACAACAATGTGA"}], "target_id": 101}, {"microhaplotypes": [{"seq": "ATAATTTTTTCATCGTTCTTATACATTAATGATAAAGTCTTTTTGCAAAATTTTTTGAAGAGATCAGATTTGAGATAAAGACGTTTGGCTAATTTATACGAGAATTCGAGAGCATCTAATTTTATATTTAAACATTTTTTCGTATCCAATATATTATAATTTTGTTCATAAGTCTGTTCGTTTATATTATTTAATACTTTT"}, {"seq": "ATAATTTTTTCATCGTTCTTATACATGAATGATAAAGTCTTTTTGCAAAATTTTTTGAAGAGATCAGATTTGAGATAAAGACGTTTGGCTAATTTATACGAGAATTCGAGAGCATCTAATTTTATATTTAAACATTTTTTCGTATCCAATATATTATAATTTTGTTCATAAGTCTGTTCATTTATATTATTTAATACTTTT"}, {"seq": "ATAATTTTTTCATCGTTCTTATACATTAATGATAAAGTCTTTTTGCAAAATTTTTTGAAGAGATCAGATTTGAGATAAAGACGTTTGGCTAATTTATACGAGAATTCGAGAGCATCTAATTTTATATTTAAACATTTTTTCGTATCCAATATATTATAATTTTGTTCATAAGTCTGTTCATTTATATTATTTAATACTTTT"}, {"seq": "ATAATTTTTTCATCGTTCTTATACATGAATGATAAAGTCTTTTTGCAAAATTTTTTGAAGAGATCAGATTTGAGATAAAGACGTTTGGCTAATTTATACGAGAATTCGAGAGCATCTAATTTTATATTTAAACATTTTTTCGTATCCAATATATTATAATTTTGTTCATAAGTCTGTTCGTTTATATTATTTAATACTTTT"}, {"seq": "ATAATTTTTTCATCGTTCTTATACATTAATGATAAAGTCTTTTTGCAAAATTTTTTGAAGAGATCAGATTTGAGATAAAGACGTTTGGCTAATCTATAGGAGAATTCTAGAGCATCTAATTTTATATTTAAACATTTTTTCGTATCCAATATATTATAATTTTGTTCATAAGTCTGTTCGTTTATATTATTTAATACTTTT"}, {"seq": "ATAATTTTTTCATCGTTCTTATACATGAATGATAAAGTCTTTTTGCAAAATTTTTTGAAGAGATCAGATTTGAGATAAAGACGTTTGGCTAATCTATAGGAGAATTCTAGAGCATCTAATTTTATATTTAAACATTTTTTCGTATCCAATATATTATAATTTTGTTCATAAGTCTGTTCGTTTATATTATTTAATACTTTT"}, {"seq": "ATAATTTTTTCATCGTTCTTATACATGAATGATAAAGTCTTTTTGCAAAATTTTTTGAAGAGATCAGATTTGAGATAAAGACGTTTGGCTAATCTATAGGAGAATTCTAGAGCATCTAATTTTATATTTAAACATTTTTTCGTATCCAATATATTATAATTTTGTTCATAAGTCTGTTCATTTATATTATTTAATACTTTT"}, {"seq": "ATAATTTTTTCATCGTTCTTATACATTAATGATAAAGTCTTTTTGCAAAATTTTTTGAAGAGATCAGATTTGAGATAAAGACGTTTGGCTAATCTATAGGAGAATTCTAGAGCATCTAATTTTATATTTAAACATTTTTTCGTATCCAATATATTATAATTTTGTTCATAAGTCTGTTCATTTATATTATTTAATACTTTT"}, {"seq": "ATAATTTTTTCATCGTTCTTATACATGAATGATAAAGTCTTTTTGCAAAATTTTTTGAAGAGATCAGATTTGAGATAAAGACGTTTGGCTAATTTATACGAGAATTCTAGAGCATCTAATTTTATATTTAAACATTTTTTCGTATCCAATATATTATAATTTTGTTCATAAGTCTGTTCGTTTATATTATTTAATACTTTT"}, {"seq": "ATAATTTTTTCATCGTTCTTATACATTAATGATAAAGTCTTTTTGCAAAATTTTTTGAAGAGATCAGATTTGAGATAAAGACGTTTGGCTAATTTATACGAGAATTCTAGAGCATCTAATTTTATATTTAAACATTTTTTCGTATCCAATATATTATAATTTTGTTCATAAGTCTGTTCGTTTATATTATTTAATACTTTT"}, {"seq": "ATAATTTTTTCATCCTTCTTATACATTAATGATAAAGTCTTTTTGCAAAATTTTTTGAAGAGATCAGATTTGAGATAAAGACGTTTGGCTAATCTATAGGAGAATTCTAGAGCATCTAATTTTATATTTAAACATTTTTTCGTATCCAATATATTATAATTTTGTTCATAAGTCTGTTCATTTATATTATTTAATACTTTT"}, {"seq": "ATAATTTTTTCATCGTTCTTATACATGAATGATAAAGTCTTTTTGCAAAATTTTTTGAAGAGATCAGATTTGAGATAAAGACGTTTGGCTAATCTATAGGAGAATTCTAGAGCATCTAATTTTATATTTAAACATTTTTTCGTATCCAATATATTATAATTTTGTTCATAAGTCTGTTCGTTTATATTATTTAATAGTTTT"}, {"seq": "ATAATTTTTTCATCGTTCTTATACATTAATGATAAAGTCTTTTTGCAAAATTTTTTGAAGAGATCAGATTTGAGATAAAGACGTTTGGCTAATCTATAGGAGAATTCTAGAGCATCTAATTTTATATTTAAACATTTTTTCGTATCCAATATATTATAATTTTGTTCATAAGTCTGTTCGTTTATATTATTTAATATTTTT"}, {"seq": "ATAATTTTTTCATCGTTCTTATACATTAATGATAAAGTCTTTTTGCAAAATTTTTTGAAGAGATCAGATTTGAGATAAAGACGTTTGGCTAATTTATAGGAGAATTCTAGAGCATCTAATTTTATATTTAAACATTTTTTCGTATCCAATATATTATAATTTTGTTCATAAGTCTGTTCGTTTATATTATTTAATACTTTT"}, {"seq": "ATAATTTTTTCATCGTTCTTATACATGAATGATAAAGTCTTTTTGCAAAATTTTTTGAAGAGATCAGATTTGAGATAAAGACGTTTGGCTAATCTATAGGAGAATTCGAGAGCATCTAATTTTATATTTAAACATTTTTTCGTATCCAATATATTATAATTTTGTTCATAAGTCTGTTCGTTTATATTATTTAATACTTTT"}, {"seq": "ATAATTTTTTCATCGTTCTTATACATGAATGATAAAGTCTTTTTGCAAAATTTTTTGAAGAGATCAGATTTGAGATAAAGACGTTTGGCTAATTTATACGAGAATTCGAGAGCATCTAATTTTATATTTAAACATTTTTTCGTATCCAATATATTATAATTTTGTTCATAAGTTTGTTCGTTTATATTATTTAATACTTTT"}, {"seq": "ATAATTTTTTCATCGTTCTTATACATTAATGATAAAGTCTTTTTGCAAAATTTTTTGAAGAGATCAGATTTGAGATAAAGACGTTTGGCTAATTTATACGAGAATTCTAGAGCATCTAATTTTATATTTAAACATTTTTTCGTATCCAATATATTATAATTTTGTTCATAAGTCTGTTCATTTATATTATTTAATACTTTT"}, {"seq": "ATAATTTTTTCATCGTTCTCATACATGAATGATAAAGTCTTTTTGCAAAATTTTTTGAAGAGATCAGATTTGAGATAAAGACGTTTGGCTAATCTATAGGAGAATTCTAGAGCATCTAATTTTATATTTAAACATTTTTTCGTATCCAATATATTATAATTTTGTTCATAAGTCTGTTCATTTATATTATTTAATACTTTT"}], "target_id": 102}, {"microhaplotypes": [{"seq": "ATTATTTAATTTTTCATCTTTTATATTTTTCAGATTTTTTATATGAAGATATAGGAATACAACTAAATTAACAGCTGAAAATAATCTTACTAACAAAAATAATTTGAGGAATTCTTCATCATATAAATCTTTTGGAATATTATTTGTGTATTCATAAATTTCTATTAAGGATATAATAGTTATGA"}, {"seq": "ATTATTTAATTTTTCATCTTTTATATTTTTCAGATTTTTTATATGAAGATGTAGGAATACAACTAAATTAACAGCTGAAAATAATCTTACTAACAAAAATAATTTGAGGAATTCTTCATCATATAAATCTTTTGGAATATTATTTGTGTATTCATAAATTTCTATTAAGGATATAATAGTTATGA"}, {"seq": "ATTATTTAATTTTTCATCTTTTATATTTTTCAGATTTTTTATATGAAGATGTAGGAATACAACTAAATTAACAGCTGAAAATAATCTTACTAACAAAAATAATTTGAGGAATTCTTCATCATATAAATCTTTTGGAATATTATTTGTGGATTCATAAATTTCTATTAAGGATATAATAGTTATGA"}, {"seq": "ATTATTTAATTTTTCATCTTTTATATTTTTCAGATTTTTTATATGAAGATGTAGGAATACAACTAAATTAACAGCTGAAAATAATCTTACTAACAAAAATAATTTGAGGAATTCTTCATCATATAAATCTTTTGGAATATTATTTGTGCATTCATAAATTTCTATTAAGGATATAATAGTTATGA"}, {"seq": "ATTATTTAATTTTTCATCTTTTATATTTTTCAGATTTTTTATATGAAGATTTAGGAATACAACTAAATTAACAGCTGAAAATAATCTTACTAACAAAAATAATTTGAGGAATTCTTCATCATATAAATCTTTTGGAATATTATTTGTGTATTCATAAATTTCTATTAAGGATATAATAGTTATGA"}, {"seq": "ATTATTTAATTTTTCATCTTTTATATTTTTCAGATTTTTTATATGAAGATATAGGAATACAACTAAATTAACAGCTGAAAATAATCTTACTAACAAAAATAATTTGAGGAATTCTTCATCATATAAATCTTTTGGAATATTATTTGTGGATTCATAAATTTCTATTAAGGATATAATAGTTATGA"}, {"seq": "ATTATTTAATTTTTCATCTTTTATATTTTCCAGATTTTTTATATGAAGATATAGGAATACAACTAAATTAACAGCTGAAAATAATCTTACTAACAAAAATAATTTGAGGAATTCTTCATCATATAAATCTTTTGGAATATTATTTGTGTATTCATAAATTTCTATTAAGGATATAATAGTTATGA"}, {"seq": "ATTATTTAATTTTTCATCTTTTATATTTTTCAGATTTTTTATATGAAGGTGTAGGAATACAACTAAATTAACAGCTGAAAATAATCTTACTAACAAAAATAATTTGAGGAATTCTTCATCATATAAATCTTTTGGAATATTATTTGTGCATTCATAAATTTCTATTAAGGATATAATAGTTATGA"}, {"seq": "ATTATTTAATTTTTCATCTTTTATATTTTTCTGATTTTTTATATGAAGATGTAGGAATACAACTAAATTAACAGCTGAAAATAATCTTACTAACAAAAATAATTTGAGGAATTCTTCATCATATAAATCTTTTGGAATATTATTTGTGTATTCATAAATTTCTATTAAGGATATAATAGTTATGA"}, {"seq": "ATTATTTAATTTTTCATCTTTTATATTTTTCAGATTTTTTATATGAAGATATAGGAATACAACTAAATTAACAGCTGAAAATAATCTTACTAACAAAAATAATTTGAGGAATTCTTCATCATATAAATCTTTTGGAATATTATTTGTGCATTCATAAATTTCTATTAAGGATATAATAGTTATGA"}], "target_id": 104}, {"microhaplotypes": [{"seq": "TCTCAGATTATCATAGTGTTGTGGATGAAGATTTAATTAATTTTAATGATGATGTTACTTTAGAAACACAATCCATGATAGCACACGGAGGGTCTTTGTCAGAAATAGAAGAAACTGGAGATTTATCTTCAGATGTTGATAGATTACTTTCATCAATCGAAACTACTCCAAGAGATGATGTTGTATATATACGAGGTGATATTATATT"}, {"seq": "TCTCAGATTATCATAGTGTTGTGGATGAAGATTTAATTAATTTTAATGATGATGTTACTTTAGAAACACAATCCATGATAGCACACGGAGGGTCTTTGTCAGAAATAGAAGAAACTGGAGATTTATCTTCAGATGTTGATAGATTACATTCATCAATCGAAACTACTCCAAGAGATGATGTTGTATATATACGAGGTGATATTGTATT"}, {"seq": "TCTCAGATTATCATAGTGTTGTGGATGAAGATTTAATTAATTTTAATGATGATGTTACTTTAGAAACACAATCCATGATAGCACACGGAGGGTCTTTGCCAGAAATAGAAGAAACTGGAGATTTATCTTCAGATGTTGATAGATTACTTTCATCAATCGAAACTACTCCAAGAGATGATGTTGTATATATACGAGGTGATATTATATT"}, {"seq": "TCTCAGATTATCATAGTGTTGTGGATGAAGATTTAATTAATTTTAATGATGATGTTACTTTAGAAACACAATCCATGATAGCACACGGAGGGTCTTTGTCAGAAATAGAAGAAACTGGAGATTTATCTTCAGATGTTGATAGATTACATTCATCAATCGAAACTACTCCAAGAGATGATGTTGTATATATACGAGGTGATATTATATT"}, {"seq": "TCTCAGATTATCATAGTGTTGTGGATGAAGATTTAATTAATTTTAATGATGATGTTACTTTAGAAACACAACCCATGATAGCACACGGAGGGTCTTTGTCAGAAATAGAAGAAACTGGAGATTTATCTTCAGATGTTGATAGATTACTTTCATCAATCGAAACTACTCCAAGAGATGATGTTGTATATATACGAGGTGATATTATATT"}, {"seq": "TCTCAGATTATCATAGTGTTGTGGATGAAGATTTAATTAATTTTAATGATGATGTTACTTTAGAAACACAATCCATGATAGCACATGGAGGGTCTTTGTCAGAAATAGAAGAAACTGGAGATTTATCTTCAGATGTTGATAGATTACTTTCATCAATCGAAACTACTCCAAGAGATGATGTTGTATATATACGAGGTGATATTATATT"}, {"seq": "TCTCAGATTATCATAGTGTTGTGGATGAAGATTTAATTAATTTTAATGATGATGTTACTTTAGAAACACAATCCATGATAGAACACGGAGGGTCTTTGTCAGAAATAGAAGAAACTGGAGATTTATCTTCAGATGTTGATAGATTACTTTCATCAATCGAAACTACTCCAAGAGATGATGTTGTATATATACGAGGTGATATTATATT"}], "target_id": 105}, {"microhaplotypes": [{"seq": "TCATTATATTTTTAAAAAAAAAAATTATGATATAAAATCTTCAATTAATAAAAGATCTATCCAGTTCTTTAAAGACACTAATATAGATCATTATATAGCATATGAATATTATAAGGAGGACCGTACGGAATTTATATTAACTATTATGAATGAAAAAAATATTACTCATCAAGAAACTCAAAGTCTTGAAATGAAAAAGTTGAAAG"}, {"seq": "TCATTATATTTTTAAAAAAAAAAATTATGATATAAAATCTTCAATTAATAAAAGATCTATCCAGTTCTTTAGAGACACTAATATAGATCATTATATAGCATATGAATATTATAAGGAGGACCGTACAGAATTTATATTAACTATTATGAATGAAAAAAATATTACTCATCAAGAAACTCAAAGTCTTGAAATGAAAAAGTTGAAAG"}, {"seq": "TCATTATATTTTTAAAAAAAAAAATTATGATATAAAATCTTCAATTAATAAAAGATCTATCCAGTTCTTTAAAGACACTAATATAGATCATTATATAGCATATGAATATTATAAGGAGGACCGTACAGAATTTATATTAACTATTATGAATGAAAAAAATATTACTCATCAAGAAACTCAAAGTCTTGAAATGAAAAAGTTGAAAG"}, {"seq": "TCATTATATTTTTAAAAAAAAAAATTATGATATAAAATCTTCAATTAATAAAAGATCTATCCAGTTCTTTAGAGACACTAATATAGATCATTATATAGCATATGAATATTATAAGGAGGACCGTACGGAATTTATATTAACTATTATGAATGAAAAAAATATTACTCATCAAGAAACTCAAAGTCTTGAAATGAAAAAGTTGAAAG"}, {"seq": "TCATTATATTTTTAAAAAAAAAAATTATGATATAAAATCTTCAATTAATAAAAGATCTATCCAGTTCTTTAAAGACACTAATATAGATCATTATATAGCATATGAATATTATAAGGAGGACCGTACAGAATTTATATTAACTATTATGAATGAAAAAAATATTATTCATCAAGAAACTCAAAGTCTTGAAATGAAAAAGTTGAAAG"}, {"seq": "TCATTATATTTTTAAAAAAAAAAATTATGATATAAAATCTTCAATTAATAAAAGATCTATCCAGTTCTTTAGAGACACTAATATAGATCATTATATAGCATATGAATATTATAAGGAGGACCGTACAGAATTTATATTAACTATTATGAATGAAAAAAATATTATTCATCAAGAAACTCAAAGTCTTGAAATGAAAAAGTTGAAAG"}, {"seq": "TCATTATATTTTTAAAAAAAAAAATTATGATATAAAATCTTCAATTAATAAAAGATCTATCCAGTTCTTTACAGACACTAATATAGATCATTATATAGCATATGAATATTATAAGGAGGACCGTACAGAATTTATATTAACTATTATGAATGAAAAAAATATTACTCATCAAGAAACTCAAAGTCTTGAAATGAAAAAGTTGAAAG"}], "target_id": 106}, {"microhaplotypes": [{"seq": "GAAAATAATAAAATGCACAGTATCAATTCTGATAGAAATAAAAATGATTATATTCCATCTTCCTATTTACATACAATATATAAAACATTTAGCGAACATATAAACCGAGATAATGGAAATATTTATGATGATGAAAAAAAAAATTTATATGATGGAACTGTTTTTTATATAGAAACATTAAACGAATTAAGAATTATAAATATATTATTTTCA"}, {"seq": "GAAAATAATAAAATGCACAGTATCAATTCTGATAGAAATAAAAATGATTATATTCCATCTTCCTATTTACATACAATATATAAAACATTTAGCGAACATATAAACCGAGATAATGGAAATATTTATGATGATGAAAAAAAAAATTTATATGATGGAACTGTTTTTTATATAGAAACATTAAACGAATTAAGAATTATCAATATATTATTTTCA"}, {"seq": "GAAAATAATAAAATGCACAGTATCAATTCTGATAGAAATAAAAATGATTATATTCCATCTTCCTATTTACATACAATATATAAAACATTTAGCGAACATATAAACCGAGATAATGAAAATATTTATGATGATGAAAAAAAAAATTTATATGATGGAACTGTTTTTTATATAGAAACATTAAACGAATTAAGAATTATAAATATATTATTTTCA"}, {"seq": "GAAAATAATAATATGCACAGTATCAATTCTGATAGAAATAAAAATGATTATATTCCATCTTCCTATTTACATACAATATATAAAACATTTAGCGAACATATAAACCGAGATAATGGAAATATTTATGATGATGAAAAAAAAAATTTATATGATGGAACTGTTTTTTATATAGAAACATTAAACGAATTAAGAATTATAAATATATTATTTTCA"}], "target_id": 107}, {"microhaplotypes": [{"seq": "CGATTTTGGTAGGGAACAGGTTAAATATATTGAAGACGTGGTTTGATAATCAGGTATTTCTTTAATTAAATATTCATGATATTGTTCGTTAGATACATAAATTAATTCGTCCTCCACATTTTGCTGTTCTGTTATAATTTGTGAAGAAGCTTGGTTTGTCTTATTTGGTAATTGCTCTTTTATGA"}, {"seq": "CGATTTTGGTAGAGAACAGGTTAAATATATTGAAGACGTGGTTTGATAATCAGGTATTTCTTTAATTAAATATTCATGATATTGTTCGTTAGATACATAAATTAATTCATCCTCCACATTTTGCTGTTCTGTTATAATTTGTGAAGAAGCTTGGTTTGTTTTATTTGGTAATTGCTCTTTTATGA"}, {"seq": "CGATTTTGGTAGGGAACAGGTTAAATATATTGAAGACGTGGTTTGATAATCAGGTATTTCTTTAATTAAATATTCATGATATTGTTCGTTAGATACATAAATTAATTCATCCTCCACATTTTGCTGTTCTGTTATAATTTGTGAAGAAGCTTGGTTTGTTTTATTTGGTAATTGCTCTTTTATGA"}, {"seq": "CGATTTTGGTAGAGAACAGGTTAAATATATTGAAGACGTGGTTTGATAATCAGGTATTTCTTTAATTAAATATTCATGATATTGTTCGTTAGATACATAAATTAATTCGTCCTCCACATTTTGCTGTTCTGTTATAATTTGTGAAGAAGCTTGGTTTGTCTTATTTGGTAATTGCTCTTTTATGA"}, {"seq": "CGATTTTGGTAGGGAACAGGTTAAATATATTGAAGACGTGGTTTGATAATCAGGTATTTCTTTAATTAAATATTCATGATGTTGTTCGTTAGATACATAAATTAATTCGTCCTCCACATTTTGCTGTTCTGTTATAATTTGTGAAGAAGCTTGGTTTGTCTTATTTGGTAATTGCTCTTTTATGA"}, {"seq": "CGATTTTGGTAGAGAACAGGTTAAATATATTGAAGACGTGGTTTGATAATCAGGTATTTCTTTAATTAAATATTCATGATATTGTTCGTTAGATACATAAATTAATTCATCCTCCACATTTTGCTGTTCTGTTATAATTTGTGAAGAAGCTTGGTTTGTTTTATTTGGTAATTGCTGTTTTATGA"}, {"seq": "CGATTTTGGTAGGGAACAGGTTAAATATATTGAAGACGTGGTTTGATAATCAGGTATTTCTTTAATTAAATATTCATGATATTGTTCGTTAGATACATAAATTAATTCGTCCTCCACATTTTGCTGTTCTGTTATAATTTGTGAAGAAGCTTGGTTTGTTTTATTTGGTAATTGCTCTTTTATGA"}, {"seq": "CGATTTTGGTAGGGAACAGGTTAAATATATTGAAGACGTGGTTTGATAATCAGGTATTTCTTTAATTAAATATTCATGATATTGTTCGTTAGATACATAAATTAATTCATCCTCCACATTTTGCTGTTCTGTTATAATTTGTGAAGAAGCTTGGTTTGTCTTATTTGGTAATTGCTCTTTTATGA"}, {"seq": "CGATTTTGGTAGGGAACAGGTTAAATATATTGAAGACGTGGTTTGATAATCAGGTATTTCTTTAATTAAATATTCATGATATTGTTCGTTAGATACATAAATTAATTCATCCTCCACATTTTGCTGTTCTGTTATAATTTGTGAAGAAGCTTGGTTTGTTTTATTTGGTAATTGCTGTTTTATGA"}, {"seq": "CGATTTTGGTAGAGAACAGGTTAAATATATTGAAGACGTGGTTTGATAATCAGGTATTTCTTTAATTAAATATTCATGATATTGTTCGTTAGATACATAAATTAATTCGTCTTCCACATTTTGCTGTTCTGTTATAATTTGTGAAGAAGCTTGGTTTGTCTTATTTGGTAATTGCTCTTTTATGA"}, {"seq": "CGATTTTGGTAGGGAACAGGTTAAATATATTGAAGACGTGGTTTGATAATCAGGTATTTCTTTAATTAAATATTCATGATATTGTTCGTTAGATACATAAATTAATTCGTCTTCCACATTTTGCTGTTCTGTTATAATTTGTGAAGAAGCTTGGTTTGTCTTATTTGGTAATTGCTCTTTTATGA"}, {"seq": "CGATTTTGGTAGAGAACAGGTTAAATATATTGAAGACGTGGTTTGATAATCAGGTATTTCTTTAATTAAATATTCATGATATTGTTCGTTAGATACATAAATTAATTCATCCTCCACATTTTGCTGTTCTGTTATAATTTGTGAAGAAGCTTGGTTTGTCTTATTTGGTAATTGCTCTTTTATGA"}, {"seq": "CGATTTTGGTAGAGAACAGGTTAAATATATTGAAGACGTGGTTTGATAATCAGGTATTTCTTTAATTAAATATTCATGATATTGTTCGTTAGATACATAAATTAATTCGTCCTCCACATTTTGCTGTTCTGTTATAATTTGTGAAGAAGCTTGGTTTGTTTTATTTGGTAATTGCTCTTTTATGA"}], "target_id": 108}, {"microhaplotypes": [{"seq": "TGATGAAAATGATGATTCCCTTATTTCTAATTCTTTAGTACCCGAAACAAGTTACAATCAAGATTACTCTTTATACACTATTAATATTTTGAATGGACTTCCTGATAAAAAAAGTAATATGAAAAATATTGATTTAGAAAAATTTAAAGATACTTCAATACATACAAAGGAAGAGGGACCCATTGTA"}, {"seq": "TGATGAAAATGATGATTCCCTTATTTCTAATTCTTTAGTACCCGAAACAAGTTACAATCAAGATTACTCTTTATACACTATTAATATTTTGAATGGACTTCCTGATAAAGAAAGTAATATGAAAAATATTGATTTAGAAAAATTTAAAGATACTTCAATACATACAAAGGAAGAGGGACCCATTGTA"}, {"seq": "TGATGAAAATGATGATTCCCATTTTTCTAATTCTTTAGTATCTGAAACGAGTTACAATCAAGATTACTCTTTATACACTATTAATATTTTGAATGGACTTCCTGATAAAAAAAGTAATATGAAAAATATTGATTTAGAAAAATTTAAAGATACTTCAATACATACAAAGGAAGAGGGACCCATTGTA"}, {"seq": "TGATGAAAATGATGATTCCCATTTTTCTAATTCTTTAGTATCTGAAACGAGTTACAATCAAGATTACTCTTTATACACTATTAATATTTTGAATGGACTTCCTGATAAAGAAAGTAATATGAAAAATATTGATTTAGAAAAATTTAAAGATACTTCAATACATACAAAGGAAGAGGGACCCATTGTA"}, {"seq": "TGATGAAAATGATGATTCCCATTTTTCTAATTCTTTAGTACCTGAAACGAGTTACAATCAAGATTACTCTTTATACACTATTAATATTTTGAATGGACTTCCTGATAAAAAAAGTAATATGAAAAATATTGATTTAGAAAAATTTAAAGATACTTCAATACATACAAAGGAAGAGGGACCCATTGTA"}, {"seq": "TGATGAAAATGATGATTCCCTTATTTCTAATTCTTTAGTACCTGAAACGAGTTACAATCAAGATTACTCTTTATACACTATTAATATTTTGAATGGACTTCCTGATAAAAAAAGTAATATGAAAAATATTGATTTAGAAAAATTTAAAGATACTTCAATACATACAAAGGAAGAGGGACCCATTGTA"}], "target_id": 109}, {"microhaplotypes": [{"seq": "GACCTGAATGGAAAGGTCAATGTGATAAATTTGAAAAAGAAAAAAGTAAATATGAAGATACTAAAAGTAGAACTGCTGAAATATATTTAAAAGAAATATGTTCTGAATGTGATTGTAAATATAAAGATTTGGATAATACATTTAAAGAATTTAAAGATAACGTTACGCTTCTTAAAGCAGTAATTGATAACAAA"}, {"seq": "GACCTGAATGGAAAGGTCAATGTGATAAATTTGAAAAAGAAAAAAGTAAATATGAAGATACTAAAAGTAGAACTGCTGAAATATATTTAAAAGAAATATGTTCTGAATGTGATTGTAAATATAAAGATTTGGATAATACATTTAAAGAATTTAATGATAACGTTACGCTTCTTAAAGCAGTAATTGATAACAAA"}, {"seq": "GACCTGAATGGAAAGGCCAATGTGATAAATTTGAAAAAGAAAAAAGTAAATATGAAGATACTAAAAGTATAACTGCTGAAAAATATTTAAAAGAAATATGTTCTGAATGTGATTGTAAATATAAAGATTTGGATAATACATTTAAAGAATTTAAAGATAACGTTACACTTCTTAAAGCAGTAATTGATAACAAA"}, {"seq": "GACCTGAATGGAAAGGCCAATGTGATAAATTTGAAAAAGAAAAAAGTAAATATGAAGATACTAAAAGTATAACTGCTGAAAAATATTTAAAAGAAATATGTTCTGAATGTGATTGTAAATATAAAGATTTGGATAATACATTTAAAGAATTTAATGATAACGTTACGCTTCTTAAAGCAGTAATTGATAACAAA"}, {"seq": "GACCTGAATGGAAAGGTCAATGTGATAAATTTGAAAAAGAAAAAAGTAAATATGAAGATACTAAAAGTAGAACTGCTGAAATATATTTAAAAGAAATATGTTCTGAATGTGATTGTAAATATAAAGATTTGGATAATACATTTAAAGAATTTAAAGATAACGTTACACTTCTTAAAGCAGTAATTGATAACAAA"}, {"seq": "GACCTGAATGGAAAGGCCAATGTGATAAATTTGAAAAAGAAAAAAGTAAATATGAAGATACTAAAAGTATAACTGCTGAAAAATATTTAAAAGAAATATGTTCTGAATGTGATTGTAAATATAAAGATTTGGATAATACATTTAAAGAATTTAAAGATAACGTTACGCTTCTTAAAGCAGTAATTGATAACAAA"}, {"seq": "GACCTGAATGGAAAGGTCAATGTGATAAATTTGAAAAAGAAAAAAGTAAATATGAAGATACTAAAAGTAGAACTGCTGAAATATATTTGAAAGAAATATGTTCTGAATGTGATTGTAAATATAAAGATTTGGATAATACATTTAAAGAATTTAAAGATAACGTTACGCTTCTTAAAGCAGTAATTGATAACAAA"}, {"seq": "GACCTGAATGGAAAGGTCAATGTGATAAATTTGAAAAAGAAAAAAGTAAATATGAAGATACTAAAAGTATAACTGCTGAAAAATATTTAAAAGAAATATGTTCTGAATGTGATTGTAAATATAAAGATTTGGATAATACATTTAAAGAATTTAAAGATAACGTTACACTTCTTAAAGCAGTAATTGATAACAAA"}, {"seq": "GACCTGAATGGAAAGGCCAATGTGATAAATTTGAAAAAGAAAAAAGTAAATATGAAGATACTAAAAGTATAACTGCTGAAAAATATTTAAAAGAAATATGTTCTGAATGTGATTGTAAATATAAAGATTTGGATAATACATTCAAAGAATTTAAAGATAACGTTACGCTTCTTAAAGCAGTAATTGATAACAAA"}, {"seq": "GACCTGAATGGAAAGGCCAGTGTGATAAATTTGAAAAAGAAAAAAGTAAATATGAAGATACTAAAAGTATAACTGCTGAAAAATATTTAAAAGAAATATGTTCTGAATGTGATTGTAAATATAAAGATTTGGATAATACATTTAAAGAATTTAAAGATAACGTTACACTTCTTAAAGCAGTAATTGATAACAAA"}, {"seq": "GACCTGAATGGAAAGGTCAATGTGATAAATTTGAAAAAGAAAAAAGTAAATATGAAGATACTAAAAGTATAACTGCTGAAAAATATTTAAAAGAAATATGTTCTGAATGTGATTGTAAATATAAAGATTTGGATAATACATTTAAAGAATTTAAAGATAACGTTACGCTTCTTAAAGCAGTAATTGATAACAAA"}, {"seq": "GACCTGAATGGAAAGGTCAATGTGATAAATTTGAAAAAGAAAAAAGTAAATATGAAGATACTAAAAGTAGAACTGCTGAAATATATTTAAAAGAAATATGTTCTGAATGTGATTGTAAATATAAAGATTTGGATAATACATTCAAAGAATTTAAAGATAACGTTACGCTTCTTAAAGCAGTAATTGATAACAAA"}, {"seq": "GACCTGAATGGAAAGGCCAATGTGATAAATTTGAAAAAGAAAAAAGTAAATATGAAGATACTAAAAGTAGAACTGCTGAAATATATTTAAAAGAAATATGTTCTGAATGTGATTGTAAATATAAAGATTTGGATAATACATTTAAAGAATTTAATGATAACGTTACGCTTCTTAAAGCAGTAATTGATAACAAA"}, {"seq": "GACCTGAATGGAAAGGCCAATGTGATAAATTTGAAAAAGAAAAAAGTAAATATGAAGATACTAAAAGTAGAACTGCTGAAATATATTTAAAAGAAATATGTTCTGAATGTGATTGTAAATATAAAGATTTGGATAATACATTTAAAGAATTTAAAGATAACGTTACGCTTCTTAAAGCAGTAATTGATAACAAA"}, {"seq": "GACCTGAATGGAAAGGTCAATGTGATAAATTTGAAAAAGAAAAAAGTAAATATGAAGATACTAAAAGTATAACTGCTGAAAAATATTTAAAAGAAATATGTTCTGAATGTGATTGTAAATATAAAGATTTGGATAATACATTTAAAGAATTTAATGATAACGTTACGCTTCTTAAAGCAGTAATTGATAACAAA"}], "target_id": 110}, {"microhaplotypes": [{"seq": "ATCTAGATCAACGAGGGAATATAACAACATCTCAAGGAAATTCACACCGTGCAACTGTTGTGCAACAAGCTGATCAAACCAACAGATTAGATAATGTAAACTCTGTAACGCAAAGAGGAAATAATAACTACAACAATAATTTAGAGCGTGGATTGGGTTCTGGTGCT"}, {"seq": "ATCTAAATCAACGAGGGAATATAACAACATCTCAAGGAAATTCACACCGTGCAACTGTTGTGCAACAAGCTGATCAAACCAACAGATTAGATAATGTAAACTCTGTAACGCAAAGAGGAAATAATAACTACAACAATAATTTAGAGCGTGGATTGGGTTCTGGTGCT"}], "target_id": 111}, {"microhaplotypes": [{"seq": "ACCTCCAGATGTTATAAATATTATATTATCATCATCATTTGGAAGGAAATTCTCCTCTAATGTTTTTAATATTTCATCTATATTTTTAGGTCTCAATTTACTATTGAAAAATTTTGAATACTTCAAAAAATAATCATCATCTTTTACATTACATATATTATCATTATTTTCATTTTGTTTTAGTAGTTCATCTTTTTTATTATC"}, {"seq": "ACCTCCCGATGTTATAAATATTATATTATCATCATCATTTGGAAGGAAATTCTCCTCTAATGTTTTTAATATTTCATCTATATTTTTAGGTCTCAATTTACTATTGAAAAATTTTGAATACTTCAAAAAATAATCATCATCTTTTACATTACATATATTATCATTATTTTCATTTTGTTTTAGTAGTTCATCTTTTATATTATC"}, {"seq": "ACCTCCAGATGTTATAAATATTATATTATCATCATCATTTGGAAGGAAATTCTCCTCTAATGTTTTTAATATTTCATCTATATTTTTAGGTCTCAATTTACTATTGAAAAATTTTGAATACTTCAAAAAATAATCATCATCTTTTACATTACATATATTATCATTATTTTCATTTTGTTTTAGTAGTTCATCTTTTATATTATC"}, {"seq": "ACCTCCCGATGTTATAAATATTATATTATCATCATCATTTGGAAGGAAATTCTCCTCTAATGTTTTTAATATTTCATCTATATTTTTAGGTCTCAATTTACTATTGAAAAATTTTGAATACTTCAAAAAATAATCATCATCTTTTACATTACATATATTATCATTATTTTCATTTTGTTTTAGTAGTTCATCTTTTTTATTATC"}, {"seq": "ACCTCCAGATGCTATAAATATTATATTATCATCATCATTTGGAAGGAAATTCTCCTCTAATGTTTTTAATATTTCATCTATATTTTTAGGTCTCAATTTACTATTGAAAAATTTTGAATACTTCAAAAAATAATCATCATCTTTTACATTACATATATTATCATTATTTTCATTTTGTTTTAGTAGTTCATCTTTTTTATTATC"}, {"seq": "ACCTCCAGATGTTATAAATATTATATTATCATCATCATTTGGAAGGAAATTCTCCTCTAATGTTTTTAATATTTCATCTATATTTTTAGGTCTCAATTTACTATTGAAAAATTTTGAATACTTCAAAAAATAATCATCATCTTTTACATTACACATATTATCATTATTTTCATTTTGTTTTAGTAGTTCATCTTTTTTATTATC"}, {"seq": "ACCTCCAGATGTTATAAATATTATATTATCATCATCATTTTGAAGGAAATTCTCCTCTAATGTTTTTAATATTTCATCTATATTTTTAGGTCTCAATTTACTATTGAAAAATTTTGAATACTTCAAAAAATAATCATCATCTTTTACATTACATATATTATCATTATTTTCATTTTGTTTTAGTAGTTCATCTTTTATATTATC"}], "target_id": 112}, {"microhaplotypes": [{"seq": "CTCCTTTATATTCATCAAGAAATTTCATCCAAGAGTAATTATGTTTTTCTTGTTGATATTTTGCTTTATACAAACGAGCAAGATACTTTTTATACGATTCATGCTCTTTAATTTTCTTTTCAAAAGTTTTGGTTATAATGTGTTCAAGTGATTGTAAAGTATTTTTCTTTAATTTTCTCCATATTAATCTACATGCGATTATAAGAA"}, {"seq": "CTCCTTTATATTCATCAAGAAATTTCATCCAAAAGTAATTATGTTTTTCTTGTTGATATTTTGCTTTATACAAACGAGCAAGATACTTATTATACGATTCATGCTCTTTAATTTTCTTTTCAAAAGTTTTGGTTATAATGTGTTGAAGTGATTGTAAAGTATTTTTCTTTAATTTTCTCCATATTAATCTACATGCGATTATAAGAA"}, {"seq": "CTCCTTTATATTCATCAAGAAATTTCATCCAAGAGTAATTATGTTTTTCTTGTTGATATTTTGCTTTATACAAACGAGCAAGATACTTATTATACGATTCATGCTCTTTAATTTTCTTTTCAAAAGTTTTGGTTATAATGTGTTGAAGTGATTGTAAAGTATTTTTCTTTAATTTTCTCCATATTAATCTACATGCGATTATAAGAA"}, {"seq": "CTCCTTTATATTCATCAAGAAATTTCATCCAAGAGTAATTATGTTTTTCTTGTTGATATTTTGCTTTATACAAACGAGCAAGATACTTTTTATACGATTCATGCTCTTTAATTTTCTTTTCAAAAGTTTTGGTTATAATGTGTTGAAGTGATTGTAAAGTATTTTTCTTTAATTTTCTCCATATTAATCTACATGCGATTATAAGAA"}, {"seq": "CTCCTTTATATTCATCAAGAAATTTCATCCAAAAGTAATTATGTTTTTCTTGTTGATATTTTGCTTTATACAAACGAGCAAGATACTTATTATACGATTCATGCTCTTTAATTTTCTTTTCAAAAGTTTTGGTTATAATGTGTTCAAGTGATTGTAAAGTATTTTTCTTTAATTTTCTCCATATTAATCTACATGCGATTATAAGAA"}, {"seq": "CTCCTTTATATTCATCAAGAAATTTCATCCAAGAGTAATTATGTTTTTCTTGTTGATATTTTGCTTTATACAAACGAGCAAGATACTTTTTATACGATTCATGCTCTTCAATTTTCTTTTCAAAAGTTTTGGTTATAATGTGTTGAAGTGATTGTAAAGTATTTTTCTTTAATTTTCTCCATATTAATCTACATGCGATTATAAGAA"}, {"seq": "CTCCTTTATATTCATCAAGAAATTTCATCCAAGAGTAATTATGTTTTTCTTGTTGATATTTTGCTTTATACAAACGAGCAAGATACTTATTATACGATTCATGCTCTTTAATTTTCTTTTCAAAAGTTTTGGTTATAATGTGTTCAAGTGATTGTAAAGTATTTTTCTTTAATTTTCTCCATATTAATCTACATGCGATTATAAGAA"}, {"seq": "CTCCTTTATATTCATCAAGAAATTTCATCCAAAAGTAATTATGTTTTTCTTGTTGATATTTTGCTTTATACAAACGAGCAAGATACTTTTTATACGATTCATGCTCTTTAATTTTCTTTTCAAAAGTTTTGGTTATAATGTGTTCAAGTGATTGTAAAGTATTTTTCTTTAATTTTCTCCATATTAATCTACATGCGATTATAAGAA"}], "target_id": 113}, {"microhaplotypes": [{"seq": "TATGAAGAAGGTTTAAAATATTGTGCGTCATCAATTAATTTATGGATATGTGCTATCGATTTACAAATAGAAAAAAAGAATTATACAGGTGCTAGAGCTTTGACGGAGAAAGCAAAAATCAAAATCAAGTATTTAAATTCTTTTAATAATAATAGTCATATTTTAAAAAGTAAAGAAATTATTGAA"}, {"seq": "TACGAAGAAGGTTTAAAATATTGTGCGTCATCAATTAATTTATGGATATGTGCTATCGATTTACAAATAGAAAAAAAGAATTATACAGGTGCTAGAGCTTTGACGGAGAAAGCAAAAATCAAAATCAAGTATTTAAATTCTTTTAATAATAATAGTCATATTTTAAAAAGTAAAGAAATTATTGAA"}, {"seq": "TATGAAGAAGGTTTAAAATATTGTGCGTCATCAATTAATTTATGGATATGTGCTATCGATTTACAAATAGAAAAAAAGAATTATACAGGTGCTAGGGCTTTGACGGAGAAAGCAAAAATCAAAATCAAGTATTTAAATTCTTTTAATAATAATAGTCATATTTTAAAAAGTAAAGAAATTATTGAA"}, {"seq": "TACGAAGAAGGTTTAAAATATTGTGCGTCATCAATTAATTTATGGATATGTGCTATCGATTTACAAATAGAAAAAAAGAATTATACAGGTGCTAGGGCTTTGACGGAGAAAGCAAAAATCAAAATCAAGTATTTAAATTCTTTTAATAATAATAGTCATATTTTAAAAAGTAAAGAAATTATTGAA"}, {"seq": "TATGAAGAAGGCTTAAAATATTGTGCGTCATCAATTAATTTATGGATATGTGCTATCGATTTACAAATAGAAAAAAAGAATTATACAGGTGCTAGGGCTTTGACGGAGAAAGCAAAAATCAAAATCAAGTATTTAAATTCTTTTAATAATAATAGTCATATTTTAAAAAGTAAAGAAATTATTGAA"}, {"seq": "TATGAAGAAGGTTTAAAATATTGTGCATCATCAATTAATTTATGGATATGTGCTATCGATTTACAAATAGAAAAAAAGAATTATACAGGTGCTAGAGCTTTGACGGAGAAAGCAAAAATCAAAATCAAGTATTTAAATTCTTTTAATAATAATAGTCATATTTTAAAAAGTAAAGAAATTATTGAA"}], "target_id": 114}, {"microhaplotypes": [{"seq": "AGAGTGTTAATAATACTACAGCTAGTAATATTTCCAAATCCAAAAATGAACTTGAAAAAAAGTCATCAGTTAATAATAATGCTTATATTAAAATTATCGAAAATTATGATTTATTATGGTTAAAATTAATAGAAATTGAATTATGTTGTAATAATAAAAATTTAAATCCTATA"}, {"seq": "AGAGTGTTAATAATACTACAGCTAGTCATATTTCCAAATCCAAAAATGAACTTGAAAAAAAGTCATCAGCTAATAATAATGCTTATATTAAAATAATCGAAAATTATGATTTATTATGGTTAAAATTAATAGAAATTGAATTATGTTGTAATAATAAAAATTTAAATCCTATA"}, {"seq": "AGAGTGTTAATAATACTACAGCTAGTCATATTTCCAAATCCAAAAATGAACTTGAAAAAAAGTCATCAGTTAATAATAATGCTTATATTAAAATTATCGAAAATTATGATTTATTATGGTTAAAATTAATAGAAATTGAATTATGTTGTAATAATAAAAATTTAAATCCTATA"}, {"seq": "AGAGTGTTAATAATACTACAGCTAGTCATATTTCCAAATCCAAAAATGAACTTGAAAAAAAGTCATCAGCTAATAATAATGCTTATATTAAAATAATAGAAAATTATGATTTATTATGGTTAAAATTAATAGAAATTGAATTATGTTGTAATAATAAAAATTTAAATCCTATA"}, {"seq": "ATAGTGTTAATAATACTACAGCTAGTAATATTTCCAAATCCAAAAATGAACTTGAAAAAAAGTCATCAGTTAATAATAATGCTTATATTAAAATTATCGAAAATTATGATTTATTATGGTTAAAATTAATAGAAATTGAATTATGTTGTAATAATAAAAATTTAAATCCTATA"}, {"seq": "AGAGTGTTAATAATACTACAGCTAGTAATATTTCCAAATCCAAAAATGAACTTGAAAAAAAGTCATCAGCTAATAATAATGCTTATATTAAAATTATCGAAAATTATGATTTATTATGGTTAAAATTAATAGAAATTGAATTATGTTGTAATAATAAAAATTTAAATCCTATA"}, {"seq": "AGAGTGTTAATAATACTACAGCTAGTCATATTTCCAAATCCAAAAATGAACTTGAAAAAAAGTCATCAGCTAATAATAATGCTTATATTAAAATTATCGAAAATTATGATTTATTATGGTTAAAATTAATAGAAATTGAATTATGTTGTAATAATAAAAATTTAAATCCTATA"}, {"seq": "AGAGTGTTAATAATACTACAGCTAGTAATATTTCCAAATCCAAAAATGAACTTGAAAAAAAGTCATCAGCTAATAATAATGCTTATATTAAAATAATCGAAAATTATGATTTATTATGGTTAAAATTAATAGAAATTGAATTATGTTGTAATAATAAAAATTTAAATCCTATA"}, {"seq": "AGAGTGTTAATAATACTACAGCTAGTAATATTTCCAAATCCAAAAATGAACTTGAAAAAAAGTCATCAGTTAATAATAATGCTTATATTAAAATAATCGAAAATTATGATTTATTATGGTTAAAATTAATAGAAATTGAATTATGTTGTAATAATAAAAATTTAAATCCTATA"}, {"seq": "AGAGTGTTAATAATACTACAGCTAGTAATATTTCCAAATCCAAAAATGAACTTGAAAAAAAGTCATCAGCTAATAATAATGCTTATATTAAAATAATAGAAAATTATGATTTATTATGGTTAAAATTAATAGAAATTGAATTATGTTGTAATAATAAAAATTTAAATCCTATA"}], "target_id": 115}, {"microhaplotypes": [{"seq": "TTTTAGATTTAATTGAATATTCATTTTTAAATTATACTAGTTCTAATTTAAATACAATAAATAATAATAATGACAAAAAAAAACAAAATCAAAAAAATAAAAATCGCAAATATAGTAAAAATAATATTTTAGATCTCTATGAACACGTAAGTACGATCAGTTTATTTTATCACACGTTTAATTTACCTAAGGAGTATAATGAAAAATTGTT"}, {"seq": "TTTTAGATTTAATTGAATATTCATTTTTAAATTATACTAGTTCTAATTTAAATACAATAAATAATAATAATGACAAAAAAAAACAAAATCAAAAAAATAAAAATCGCAAATATAGTAAAAATAATATTTTAGATCTCTATGAACACGTACGTACGATCAGTTTATTTTATCACACGTTTAATTTACCTAAGGAGTATAATGAAAAATTGTT"}, {"seq": "TTTTAGATTTAATTGAATATTCATTTTTAAATTATACTAGTTCTAATTTAAATACAATAAATAATAATAATGACAAAAAAAAACAAAATCAAAAAAATAAAAATCGCAAATATAGTAAAAATAATATTTTAGATCTCTATGAACACGCAAGTACGATCAGTTTATTTTATCACACGTTTAATTTACCTAAGGAGTATAATGAAAAATTGTT"}, {"seq": "TTTTAGATTTAATTGAATATTCATTTTTAAATTATACTAGTTCTAATTTAAATACAATAAATAATAATAATGACAAAAAAAAACAAAATCAAAAAAATAAAAATCGCAAATATAGTAAAAATAATATTTTAGATCTGTATGAACACGTAAGTACGATCAGTTTATTTTATCACACGTTTAATTTACCTAAGGAGTATAATGAAAAATTGTT"}, {"seq": "TTTTAGATTTAATTGAATATTCATTTTTAAATTATACTAGTTCTAATTTAAATACAATAAATAATAATAATGACAAAAAAAAACAAAATCAAAAAAATAAAAATCGCAAATATAGTAAAAATAATATTTTAGATCTCTATGAACACGTAAGTGCGATCAGTTTATTTTATCACACGTTTAATTTACCTAAGGAGTATAATGAAAAATTGTT"}, {"seq": "TTTTAGATTTAATTGAATATTCATTTTTTAATTATACTAGTTCTAATTTAAATACAATAAATAATAATAATGACAAAAAAAAACAAAATCAAAAAAATAAAAATCGCAAATATAGTAAAAATAATATTTTAGATCTCTATGAACACGTAAGTACGATCAGTTTATTTTATCACACGTTTAATTTACCTAAGGAGTATAATGAAAAATTGTT"}, {"seq": "TTTTAGATTTAATTGAATATTCATTTTTAAATTATACTAGTTCTAATTTAAATACAATAAATAATAATAATAATGACAAAAAAAAACAAAATCAAAAAAATAAAAATCGCAAATATAGTAAAAATAATATTTTAGATCTCTATGAACACGTAAGTACGATCAGTTTATTTTATCACACGTTTAATTTACCTAAGGAGTATAATGAAAAATTGTT"}, {"seq": "TTTTAGATTTAATTGAATATTCATTTTTAAATTATACTAGTTCTAATTTAAATACAATAAATAATAATAATGACAAAAAAAAACAAAATCAAAAAAATAAAAATCGCAAATATAGTAAAAATAATATTTTAGATCTCTATGAACACGTAAGTACGATCAGTTTATTTTTTCACACGTTTAATTTACCTAAGGAGTATAATGAAAAATTGTT"}, {"seq": "TTTTAGATTTAATTGAATATTCATTTTTAAATTATACTAGTTCTAATTTAAATACAATAAATAATAATAATGACAAAAAAAAACAAAATCAAAAAAATAAAAATCGCAAATATAGTAAAAATAATATTTTAGATCTGTATGAACACGTACGTACGATCAGTTTATTTTATCACACGTTTAATTTACCTAAGGAGTATAATGAAAAATTGTT"}], "target_id": 116}, {"microhaplotypes": [{"seq": "GTGGGGGAGAGAATTTTACCTTGATATGCTCCCATGTTTTATCCTTTATACAATACATATAAGTGTCATTGGTAATATATGACCCTCTTTTACCTCCGTAAAGAAATAAACAATCTTCTTTTTTTTCAGTGGAGTAAATTAAATTTAATTTTGCAAAATAGCGTGG"}, {"seq": "GTGGGGGAGAGAATTTTACCTTGATACGCTCCCATGTTTTATCCTTTATACAATACACATAAGTGTCATTGGTAATATATGACCCTCTTTTACCTCCGTAAAGAAATAAACAATCTTCTTTTTTTTCAGTGGAGTAAATTAAATTTAATTTTGCAAAATAGCGTGG"}, {"seq": "GTGGGGGAGAGAATTTTACCTTGATATGCTCCCATGTTTTATCCTTTATACAATACACATAAGTGTCATTGGTAATATATGACCCTCTTTTACCTCCGTAAAGAAATAAACAATCTTCTTTTTTTTCAGTGGAGTAAATTAAATTTAATTTTGCAAAATAGCGTGG"}, {"seq": "GTGGGGGAGAGAATTTTACCTTGATATGCTCCCATGTTTTATCCTTTATACAATACATATAAGTGTCATTGGTAATATATGACCCTCTTTTACCTCCGTAAAGAAATAAACAATCTTCTTTTTTTTCAGTGGAGTAAATTAAATTTAATTTTGCAAAATAACGTGG"}, {"seq": "GTGGGGGAGAGAATTTTACCTTGATATGCTCCCATGTTTTATCCTTTATGCAATACATATAAGTGTCATTGGTAATATATGACCCTCTTTTACCTCCGTAAAGAAATAAACAATCTTCTTTTTTTTCAGTGGAGTAAATTAAATTTAATTTTGCAAAATAGCGTGG"}], "target_id": 117}, {"microhaplotypes": [{"seq": "TTTTTGATTCATATCATTATCATAATTATATATATATTGATCTCTGTCTATATGGGGAGCAAAAAAATATAAAGGATGTTGTGTTAAGGCTAATAATAATTCTGTAGCTATACTACTACTTATGTTACTTATACCACATCTAGTGACTGTACATTTTTCATCTAATGTTCTATAGGATAAAGAATCTGAAGGACAATGCATATCAT"}, {"seq": "TTTTTGATTCATATCATTATCATAATTATATATATATTGATCTCTGTCTATATGGGGAGCAAAAAAATATAAAGGATGTTGTGTCAAGGCTAATAATAATTCTGTAGCTATACTACTACTTATGTTACTTATACCACATCTAGTGACTGTGCATTTTTCATCTAATGTTCTATAGGATAAAGAATCTGAAGGACAATGCATATCAT"}, {"seq": "TTTTTGATTCATATCATTATCATAATTATATATATATTGATCTCTGTCTATATGGGGAGCAAAAAAATATAAAGGATGTTGTGTCAAGGCTAATAATAATTCTGTAGCTATACTACTACTTATGTTACTTATACCACATCTAGTGACTGTACATTTTTCATCTAATGTTCTATAGGATAAAGAATCTGAAGGACAATGCATATCAT"}, {"seq": "TTTTTGATTCATATCATTATCATAATTATATATATATTGATCTCTGTCTATATGGGGAGCAAAAAAATATAAAGGATGTTGTGTTAAGGCTAATAATAATTCTGTAGCTATACTACTACTTATGTTACTTATACCACATCTAGTGACTGTGCATTTTTCATCTAATGTTCTATAGGATAAAGAATCTGAAGGACAATGCATATCAT"}, {"seq": "TTTTTGATTCATATCATTATAATAATTATATATATATTGATCTCTGTCTATATGGGGAGCAAAAAAATATAAAGGATGTTGTGTTAAGGCTAATAATAATTCTGTAGCTATACTACTACTTATGTTACTTATACCACATCTAGTGACTGTACATTTTTCATCTAATGTTCTATAGGATAAAGAATCTGAAGGACAATGCATATCAT"}, {"seq": "TTTTTGATTCATATCATTATCATAATTATATATATACTGATCTCTGTCTATATGGGGAGCAAAAAAATATAAAGGATGTTGTGTTAAGGCTAATAATAATTCTGTAGCTATACTACTACTTATGTTACTTATACCACATCTAGTGACTGTACATTTTTCATCTAATGTTCTATAGGATAAAGAATCTGAAGGACAATGCATATCAT"}, {"seq": "TTTTTGATTCATATCATTATCATAATTATATATATATTGATCTCTGTCTATATGGGGAGCAAAAAAATATAAAGGATGTTGTGTCAAGGATAATAATAATTCTGTAGCTATACTACTACTTATGTTACTTATACCACATCTAGTGACTGTGCATTTTTCATCTAATGTTCTATAGGATAAAGAATCTGAAGGACAATGCATATCAT"}], "target_id": 118}, {"microhaplotypes": [{"seq": "TCAAAACTTATTGCTACCGTAATACCTAAAGGAGGCATTTTACATAATCTTTTTACACTCGTAAGAATATTATTATAAAAGATTTCTTGATATCTATCATACATATGAATATTATTTAGAGATTTATATATATTATTATTTTGTTCATATAATAATATATTATTTAAAGACTTATCCATAATTTTTGTACATTTTATATTTTCTATA"}, {"seq": "TCAAAACTTATTGCTACCGTAATACCTAAAGGAGGCATTTTACATAATCTTTTTACACTCGTAAGAATATTATTATAAAAGATTTCTTGATACCTATCATACATATGAATATTATTTAGAGATTTATATATATTATTATTTTGTTCATATAATAATATATTATTTAAAGACTTATCCATAATTTTTGTACATTTTATATTTTCTATA"}, {"seq": "TCAAAACTTATTGCTACCGTAATACCTAAAGGAGGCATTTTACATAATCTTTTTACACTGGTAAGAATATTATTATAAAAGATTTCTTGATATCTATCATACATATGAATATTATTTAGAGATTTATATATATTATTATTTTGTTCATATAATAATATATTATTTAAAGACTTATCCATAATTTTTGTACATTTTATATTTTCTATA"}, {"seq": "TCAAAACTTATTGCTACCGTAATACCTAAAGGAGGCATTTTACATAATTTTTTTACACTCGTAAGAATATTATTATAAAAGATTTCTTGATACCTATCATACATATGAATATTATTTAGAGATTTATATATATTATTATTTTGTTCATATAATAATATATTATTTAAAGACTTATCCATAATTTTTGTACATTTTATATTTTCTATA"}], "target_id": 119}, {"microhaplotypes": [{"seq": "AACATTTTAATATTCCTAATTTCGAAAATATGATGAAAGGAGTTTTTGGAATTATTCAAAATCCTTTTGAAAATGGCCAACCCACTTTCCCATTCTTTAAAAATATTAATTCGATCTCTGGAATCGGTAATGTTGATATCCCCAAAAATTTTATGAATGATTTTTTGAATAATGGAAATGATCAAAACA"}, {"seq": "AACATTTTAATAGTCCTAATTTCGAAAATATGATGAAAGGAGTTTTTGGAATTATTCAAAATCCTTTTGAAAATGGCCAACCCACTTTCCCATTCTTTAAAAATATTAATTCGATCTCTGGAATCGGTAATGTTGATATCCCCAAAAATTTTATGAATGATTTTTTGAATAATGGAAATGATCAAAACA"}, {"seq": "AACATTTTAATAGTCCTAATTTCGAAAATATGATGAAAGGAGTTTTTGGAATTATTCAAAATCCTTTTGAAAATGGCCAACTCACTTTCCCATTCTTTAAAAATATTAATTCGATCTCTGGAATCGGTAATGTTGATATCCCCAAAAATTTTATGAATGATTTTTTGAATAATGGAAATGATCAAAACA"}, {"seq": "AACATTTTAATAGTCCTAATTTCGAAAATATGATGAAAGGAATTTTTGGAATTATTCAAAATCCTTTTGAAAATGGCCAACCCACTTTCCCATTCTTTAAAAATATTAATTCGATCTCTGGAATCGGTAATGTTGATATCCCCAAAAATTTTATGAATGATTTTTTGAATAATGGAAATGATCAAAACA"}, {"seq": "AACATTTTAATAGTCCTAATTTCGAAAATATGATGAAAGGAGTTTTTGGAATTATTCTAAATCCTTTTGAAAATGGCCAACCCACTTTCCCATTCTTTAAAAATATTAATTCGATCTCTGGAATCGGTAATGTTGATATCCCCAAAAATTTTATGAATGATTTTTTGAATAATGGAAATGATCAAAACA"}, {"seq": "AACATTTTAATATTCCTAATTTCGAAAATATGATGAAAGGAGTTTTTGGAATTATTCAAAATCCTTTTGAAAATGGCCAACCCACTTTCCCATTCTTCAAAAATATTAATTCGATCTCTGGAATCGGTAATGTTGATATCCCCAAAAATTTTATGAATGATTTTTTGAATAATGGAAATGATCAAAACA"}, {"seq": "AACATTTTAATAGTCCTAATTTCGAAAATATGTTGAAAGGAGTTTTTGGAATTATTCAAAATCCTTTTGAAAATGGCCAACCCACTTTCCCATTCTTTAAAAATATTAATTCGATCTCTGGAATCGGTAATGTTGATATCCCCAAAAATTTTATGAATGATTTTTTGAATAATGGAAATGATCAAAACA"}, {"seq": "AACATTTTAATAGTCCTAATTTCGAAAATATGATGAAAGGAGTTTTTGGAATTATTCAAAATCCTTTTGAAAATGGCCAACCCATTTTCCCATTCTTTAAAAATATTAATTCGATCTCTGGAATCGGTAATGTTGATATCCCCAAAAATTTTATGAATGATTTTTTGAATAATGGAAATGATCAAAACA"}, {"seq": "AACATTTTAATAGTCCTAATTTCGAAAATATGTTGAAAGGAGTTTTTGGAATTATTCAAAATCCTTTTGAAAATGGCCAACCCACTTTCCCATTCTTTAAAAATATTAATTCGATCTCTGGAATCGGTAATATTGATATCCCCAAAAATTTTATGAATGATTTTTTGAATAATGGAAATGATCAAAACA"}, {"seq": "AACATTTTAATATTCCTAATTTCGAAAATATGATGAAAGCAGTTTTTGGAATTATTCAAAATCCTTTTGAAAATGGCCAACCCACTTTCCCATTCTTTAAAAATATTAATTCGATCTCTGGAATCGGTAATGTTGATATCCCCAAAAATTTTATGAATGATTTTTTGAATAATGGAAATGATCAAAACA"}, {"seq": "AACATTTTAATATTCCTAATTTCGAAAATATGATGAAAGGAGTTTTTGGAATTATTCAAAATCCTTTTGAAAATGGCCAACCCACTTTCCCATTCTTTAAAAATATTAATTCGATCTTTGGAATCGGTAATGTTGATATCCCCAAAAATTTTATGAATGATTTTTTGAATAATGGAAATGATCAAAACA"}, {"seq": "AACATTTTAATAGTCCTAATTTCGAAAATATGATAAAAGGAGTTTTTGGAATTATTCAAAATCCTTTTGAAAATGGCCAACCCACTTTCCCATTCTTTAAAAATATTAATTCGATCTCTGGAATCGGTAATGTTGATATCCCCAAAAATTTTATGAATGATTTTTTGAATAATGGAAATGATCAAAACA"}, {"seq": "AACATTTTAATATTCCTAATTTCGAAAATATGATGAAAGGAGTTTTTGGAATTATTCAAAATCCTTTTGAAAATGGCCAACTCACTTTCCCATTCTTTAAAAATATTAATTCGATCTCTGGAATCGGTAATGTTGATATCCCCAAAAATTTTATGAATGATTTTTTGAATAATGGAAATGATCAAAACA"}, {"seq": "AACATTTTAATAGTCCTAATTTCGAAAATATGATGAAAGGAGTTTTTGGAATTATTCAAAATCCTTTTGAATATGGCCAACCCACTTTCCCATTCTTTAAAAATATTAATTCGATCTCTGGAATCGGTAATGTTGATATCCCCAAAAATTTTATGAATGATTTTTTGAATAATGGAAATGATCAAAACA"}, {"seq": "AACATTTTAATATTCCTAATTTCGAAAATATGATGAAAGGAGTTTTTGGAATTATTCAAAATCCTTTTGAAAATGGCCTACCCACTTTCCCATTCTTTAAAAATATTAATTCGATCTCTGGAATCGGTAATGTTGATATCCCCAAAAATTTTATGAATGATTTTTTGAATAATGGAAATGATCAAAACA"}], "target_id": 120}, {"microhaplotypes": [{"seq": "TCCATATCAAAAAAGTGATGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACGAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCTGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAAAAGTGTTGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACCAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAAAAGTCATGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAAAATACGAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAATAGTGGTGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACCAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAAAAGTGATGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAAAATACGAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAATAGTGATGTGTATCGTCCAATCAACGAACATAGGGAACATCCAAAAGAATACGAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAATAGTAATGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACGAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAATAGTAATGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACCAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAAAAGTGATGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACAAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCTGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAAAAGTGATGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACCAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCTGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAAAAGTGATGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACGAATATTCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCTGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAATAGTAATGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACCAATATCCATTACACCAGAAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAAAAGTGATGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACGAATATCCATTACACCAGAAACATACATACCAACAAGAAGATTCAGGAGAAGTCGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCTGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAATAGTAATGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACAAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAATAGTGATGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACCAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAAAAGTGATGTGTATCATCCAATCAACGAACATAGGGAATATCCAAAAGAATACGAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCTGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAATAGTGGTGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAAAATACGAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAAAAGTGTTGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACCAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCTGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "ACCATATCAAAATAGTGATGTGTATCATCCAATCAACGAACATAGGGAACATTCAAAAGAATACGAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "CCCATATCAAAAAAGTGATGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAAAATACGAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAAAAGTGATGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACGAATATTCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAAAAGTGATGTGTATCGTCCAATCAACGAACATAGGGAACATCCAAAAGAATACGAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAAAAGTGATGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACGAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAAAAGTGATGTGTATCATCCAATCAACGAACATAGGGAACATTCAAAAGAATACGAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAAAAGTGATGTGTATCGTCCAATCAACGAACATAGGGAACATCCAAAAGAATACGAATATTCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCTGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAATAGTAATGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACCAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCTGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAATAGTAATGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACGAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCTGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAATAGTGATGTGTATCGTCCAATCAACGAACATAGGGAACATCCAAAAGAATACGAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCTGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAAAAGTGATGTGTATCATCCAATCAACGAACATAGGGAATATCCAAAAGAATACGAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAATAGTAATGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACCAATATCCATTACACCAGAAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCTGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAATAGTGGTGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACCAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCTGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAATAGTGGTGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACCAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAACACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAAAAGTGATGTGTATCATCCAATCAACGAACATAGGGAACATCCAAAAGAATACCAATATCCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}, {"seq": "TCCATATCAAAAAAGTGATGTGTATCGTCCAATCAACGAACATAGGGAACATCCAAAAGAATACGAATATTCATTACACCAGGAACATACATACCAACAAGAAGATTCAGGAGAAGACGAAAATACATTACAACACGCATATCCAATAGACCACGAAGGTGCCGAACCCGCACCACAAGAACAAAATTTAT"}], "target_id": 121}, {"microhaplotypes": [{"seq": "AAAAGATAAATCATTTCAAAACTATACATATTTAAGTAAAAATGTAGTTGATAACTGGGAAAAAGTTTGCCCTAGAAAGAATTTAGAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTTCAGCAAATGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATAAATTATTTGAAAACTATACATATTTAAGTAAAAATGTAGTTGATAACTGGGAAGAAGTTTGCCCTAGAAAGAATTTAGAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTTCAGCAAATGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATAAATCATTTCAAAACTATACATATTTAAGTAAAAATGTAGTTGATAACTGGGAAGAAGTTTGCCCTAGAAAGAATTTAGAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTTCAGCAAATGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATATATCATTTCAAAACTATACATATTTAAGTAAAAATGTAGTTGATAACTGGGAAAAAGTTTGCCCTAGAAAGAATTTACAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTTCAGCAATTGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATAAATCATTTCAAAACTATACATATTTAAGTAAAAATGTAGTTGATAACTGGGAAAAAGTTTGCCCTAGAAAGAATTTACAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTCCAGCAATTGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATAAATTATTTGAAAACTATACATATTTAAGTAAAAATGTAGTTCATAACTGGGAAAAAGTTTGCCCTAGAAAGAATTTACAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTTCAGCAAATGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATAAATCATTTCAAGACTATACATATTTAAGTAAAAATGTAGTTGATAACTGGGAAAAAGTTTGCCCTAGAAAGAATTTAGAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTTCAGCAAATGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATATATCATTTCAAAACTATACATATTTAAGTAAAAATGTAGTTGATAACTGGGAAAAAGTTTGCCCTAGAAAGAATTTAGAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCAGATGTAAATGAATTTTCAGCAAATGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATAAATCATTTCAAAACTATACATATTTAAGTAAAAATGTAGTTCATAACTGGGAAAAAGTTTGCCCTAGAAAGAATTTAGAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTTCAGCAAATGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATATATCATTTCAAAACTATACATATTTAAGTAAAAATGTAGTTGATAACTGGGAAAAAGTTTGCCCTAGAAAGAATTTAGAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTTCAGCAAATGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATAAATCATTTCAAAACTATACATATTTAAGTAAAAATGTAGTTGATAACTGGGAAGAAGTTTGCCCTAGAAAGAATTTAGAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTCCAGCAATTGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATATATCATTTCAAAACTATACATATTTAAGTAAGAATGTAGTTGATAACTGGGAAAAAGTTTGCCCTAGAAAGAATTTACAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTCCAGCAATTGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATAAATTATTTGAAAACTATACATATTTAAGTAAAAATGTAGTTGATAACTGGGAAAAAGTTTGCCCTAGAAAGAATTTACAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTTCAGCAAATGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATAAATTATTTGAAAACTATACATATTTAAGTAAAAATGTAGTTGATAACTGGGAAGAAGTTTGCCCTAGAAAGAATTTAGAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATAAATTTTCAGCAAATGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATAAATCATTTCAAAACTATACATATTTAAGTAAAAATGTAGTTGATAACTGGGAAAAAGTTTGCCCTAGAAAGAATTTAGAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTTCAGCAATTGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATAAATTATTTGAAAACTATACATATTTAAGTAAAAATGTAGTTGATAACTGGGAAAAAGTTTGCCCTAGAAAGAATTTAGAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATAAATTTTCAGCAAATGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATAAATTATTTCAAAACTATACATATTTAAGTAAAAATGTAGTTCATAACTGGGAAGAAGTTTGCCCTAGAAAGAATTTAGAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTTCAGCAAATGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATAAATTATTTCAAAACTATACATATTTAAGTAAAAATGTAGTTCATAACTGGGAAGAAGTTTGCCCTAGAAAGAATTTACAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCAGATGTAAATGAATTTTCAGCAAATGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATAAATCATTTCAAAACTATACATATTTAAGTAAAAATGTAGTTGATAACTGGGAAAAAGTTTGCCCTAGAAAGAATTTACAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTTCAGCAATTGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATAAATTATTTGAAAACTATACATATTTAAGTAAAAATGTAGTTGATAACTGGGAAGAAGTTTGCCCTAGAAAGAATTTAGAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTCCAGCAATTGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATATATCATTTCAAGACTATACATATTTAAGTAAAAATGTAGTTGATAACTGGGAAAAAGTTTGCCCTAGAAAGAATTTACAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTTCAGCAATTGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATAAATTATTTGAAAACTATACATATTTAAGTAAAAATGTAGTTGATAACTGGGAAGAAGTTTGCCCTAGAAAGAATTTAGAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTTCAGCAATTGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATAAATCATTTCAAAACTATACATATTTAAGTAAAAATGTAGTTGATAACTGGGAAAAAGTTTGCCCTAGAAAGAATTTAGAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTCCAGCAATTGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATAAATCATTTCAAGACTATACATATTTAAGTAAAAATGTAGTTGATAACTGGGAAAAAGTTTGCCCTAGAAAGAATTTAGAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTCCAGCAATTGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATAAATCATTTCAAAACTATACATATTTAAGTAAAAATGTAGTTCATAACTGGGAAAAAGTTTGCCCTAGAAAGAATTTAGAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTCCAGCAATTGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}, {"seq": "AAAAGATATATCATTTCAAAACTATACATATTTAAGTAAGAATGTAGTTGATAACTGGGAAAAAGTTTGCCCTAGAAAGAATTTACAGAATGCAAAATTCGGATTATGGGTCGATGGAAATTGTGAAGATATACCACATGTAAATGAATTTTCAGCAAATGATCTTTTTGAATGTAATAAATTAGTTTTTGAATTG"}], "target_id": 122}, {"microhaplotypes": [{"seq": "ACTACTGCTTTGTCCCATCCCATCGAAGTTGAACACAATTTTCCATGTTCATTATATAAAGATGAAATAAAGAAAGAAATCGAAAGAGAATCAAAACGAATTAAATTAAATGATAATGATGATGAAGGGAATAAAAAAATTATAGCTCCAAGAATTTTTATTTCAGATGATATA"}, {"seq": "ACTACTGCTTTGTCCCATCCCAACGAAGTTGAACACAATTTTCCATGTTCATTATATAAAGATGAAATAAAGAAAGAAATCGAAAGAGAATCAAAACGAATTAAATTAAATGATAATGATGATGAAGGGAATAAAAAAATTATAGCTCCAAGAATTTTTATTTCAGATGATATA"}, {"seq": "ACTACTGCTTTGTCCCATCCCATCGAAGTTGAAAACAATTTTCCATGTTCATTATATAAAAATGAAATAATGAAAGAAATCGAAAGAGAATCAAAACGAATTAAATTAAATGATAATGATGATGAAGGGAATAAAAAAATTATAGCTCCAAGAATTTTTATTTCAGATGATAAA"}, {"seq": "ACTACTGCTTTGTCCCATCCCATCGAAGTTGAAAACAATTTTCCATGTTCATTATATAAAGATGAAATAATGAAAGAAATCGAAAGAGAATCAAAACGAATTAAATTAAATGATAATGATGATGAAGGGAATAAAAAAATTATAGCTCCAAGAATTTTTATTTCAGATGATAAA"}, {"seq": "ACTACTGCTTTGTCCCATCCCATCGAAGTTGAAGACAATTTTCCATGTTCATTATATAAAGATGAAATAATGAAAGAAATCGAAAGAGAATCAAAACGAATTAAATTAAATGATAATGATGATGAAGGGAATAAAAAAATTATAGCTCCAAGAATTTTTATTTCAGATGATAAA"}, {"seq": "ACTACTGCTTTGTCCCATCCCATCGAAGTTGAACACAATTTTCCATGTTCATTATATAAAAATGAAATAATGAAAGAAATCGAAAGAGAATCAAAACGAATTAAATTAAATGATAATGATGATGAAGGGAATAAAAAAATTATAGCTCCAAGAATTTTTATTTCAGATGATAAA"}, {"seq": "ACTACTGCTTTGTCCCATCCCATCGAAGTTGAACACAATTTTCCATGTTCATTATATAAAGATGAAATAAAGAAAGAAATCGAAAGAGAATCAAAACGAATTAAATTAAATGATAATGATGATGAAGGGAATAAAAAAATTATAGCTCCAAGAATTTTTATTTCAGATGATAAA"}, {"seq": "ACTACTGCTTTGTCCCATCCCAACGAAGTTGAACACAATTTTCCATGTTCATTATATAAAGATGAAATAAAGAAAGAAATCGAAAGAGAATCAAAACGAATTAAATTAAATGATAATGATGATGAAGGGAATAAAAAAATTATAGCTCCAAGAATTTTTATTTCAGATGATAAA"}, {"seq": "ACTACTGCTTTGTCCCATCCCAACGAAGTTGAACACAAATTTCCATGTTCATTATATAAAGATGAAATAAAGAAAGAAATCGAAAGAGAATCAAAACGAATTAAATTAAATGATAATGATGATGAAGGGAATAAAAAAATTATAGCTCCAAGAATTTTTATTTCAGATGATATA"}, {"seq": "ACTACTGCTTTGTCCCATCCCACCGAAGTTGAAAACAATTTTCCATGTTCATTATATAAAGATGAAATAATGAAAGAAATCGAAAGAGAATCAAAACGAATTAAATTAAATGATAATGATGATGAAGGGAATAAAAAAATTATAGCTCCAAGAATTTTTATTTCAGATGATAAA"}, {"seq": "ACTACTGCTTTGTCCCATCCCATCGAAGTTGAAAACAATTTTCCATGTTCATTATATAAAAATGAAATAATGAAAGAAATCGAAAGAGAATCAAAACGAATTAAATTAAATGATAATGATGATGAAGGGAATAAAAAAATTATAGCTCCAAGAATTTTTATTTCAGATGATATA"}, {"seq": "ACTACTGCTTTGTCCCATCCCATCGAAGTTGAAGACAATTTTCCATGTTCATTATATAAAGATGAAATAATGAAAGAAATCGAAAGAGAATCAAAACGAATTAAATTAAATGATAATGATGATGAAGGGAATAAAAAAATTATAGCTCCAAGAATTTTTATTTCAGATGATATA"}, {"seq": "ACTACTGCTTTGTCCCATCCCATCGAAGTTGAAAACAATTTTCCATGTTCATTATATAAAGATGAAATAATGAAAGAAATCGAAAGAGAATCAAAACGAATTAAATTAAATGATAATGATGATGAAGGGAATAAAAAAATTATAGCTCCAAGAATTTTTATTTCAGATGATATA"}, {"seq": "ACTACTGCTTTGTCCCATCCCATCGAAGTTGAAAACAATTTTCCATGTTCATTATATAAGAATGAAATAATGAAAGAAATCGAAAGAGAATCAAAACGAATTAAATTAAATGATAATGATGATGAAGGGAATAAAAAAATTATAGCTCCAAGAATTTTTATTTCAGATGATAAA"}, {"seq": "ACTACTGCTTTGTCCCATCCCATCGAAGTTGAACACAATTTTCCATGTTCATTATATAAAAATGAAATAATGAAAGAAATCGAAAGAGAATCAAAACGAATTAAATTAAATGATAATGATGATGAAGGGAATAAAAAAATTATAGCTCCAAGAATTTTTATTTCAGATGATATA"}, {"seq": "ACTACTGCTTTGTCCCATCCCATCGAAGTTGAAAACAATTTTCCATGTTCATTATATAAAGATGAAATAAAGAAAGAAATCGAAAGAGAATCAAAACGAATTAAATTAAATGATAATGATGATGAAGGGAATAAAAAAATTATAGCTCCAAGAATTTTTATTTCAGATGATATA"}, {"seq": "ACTACTGCTTTGTCCCATCCCAACGAAGTTGAACACAAATTTCCATGTTCATTATATAAAGATGAAATAAAGAAAGAAATCGAAAGAGAATCAAAACGAATTAAATTAAATGATAATGATGATGAAGGGAATAAAAAAATTATAGCTCCAAGAATTTTTATTTCAGATGATAAA"}, {"seq": "ACTACTGCTTTGTCCCATCCCATCGAAGTTGAACACAATTTTCCATGTTCATTATATAAAGATGAAATAATGAAAGAAATCGAAAGAGAATCAAAACGAATTAAATTAAATGATAATGATGATGAAGGGAATAAAAAAATTATAGCTCCAAGAATTTTTATTTCAGATGATAAA"}], "target_id": 123}, {"microhaplotypes": [{"seq": "AAGTAACATCAAATAATGAAGTTGTAGTTAAAGAAGAATATAAAGATGAATATGCAGATATTCCTGAACATAAACCAACTTATGATAAAATGAAAATTATAATTGCATCATCAGCTGCTGTCGCTGTATTAGCAACTATTTTAATGGTTTATCTTTATAAAAGAA"}, {"seq": "AAGTAACATCAAATAATGAAGTTGTAGTTAAAGAAGAATATAAAGATGAATATGCAGATATTCCTGAACATAAACCAACTTATGATAACATGAAAATTATAATTGCATCATCAGCTGCTGTCGCTGTATTAGCAACTATTTTAATGGTTTATCTTTATAAAAGAA"}, {"seq": "AAGTAACATCAAATAATGAAGTTGTAGTTAAAGTAGAATATAAAGATGAATATGCAGATATTCCTGAACATAAACCAACTTATGATAAAATGAAAATTATAATTGCATCATCAGCTGCTGTCGCTGTATTAGCAACTATTTTAATGGTTTATCTTTATAAAAGAA"}], "target_id": 124}, {"microhaplotypes": [{"seq": "TTTTTAAATGAAAATCTCCAAAGCTTCTGGTTGGTTGTAATCTACCTTTAACATAACAATTATCATAATGATGTGATAAGAGATGAAAAGGTGTTTTACATAATTCATATGTATTATTATTATTAACAGTTTTATAATCTCGAGTACATATTTTACATACTAATATA"}, {"seq": "TTTTTAAATGAAAATCTCCAAAGCTTCTGGTTGGTTGTAATCTACCTTTAACATAACAATTATCATAATGATGTGATAAGAGATGAAAAGGTGTTTTACATAATTTATATGTATTATTATTATTAACAGTTTTATAATCTCGAGTACATATTTTACATACTAATATA"}, {"seq": "TTTTTAAATGAAAATCTCCAAAGCTTCTGGTTGGTTGTAATCTACCTTTAACATAACAATTATCATAATGATGTGATAAGAGATGAAAAGGTGTTTTACATAATTCATATTTATTATTATTATTAACAGTTTTATAATCTCGAGTACATATTTTACATACTAATATA"}, {"seq": "TTTTTAAATGAAAATCTCCAAAGCTTCTGGTTGGTTGTAATCTACCTTTAACATAACAATTATCATAATGATGTGATAAGAGATGAAAAGGTGTTTTACATAATTCATATCTATTATTATTATTAACAGTTTTATAATCTCGAGTACATATTTTACATACTAATATA"}, {"seq": "TTTTTAAATGAAAATCTCCAAAGCTTCTGGTTGGTTGTAATCTACCTTTAACATAACAATTATCATAATGATGTGATAAGAGATGAAAAGGTGTTTTACATAATTCATATGTATTATTATTATTAACAGTTTTATAATCTCGAGTACACATTTTACATACTAATATA"}, {"seq": "TTTTTAAATGAAAATCTCCAAAGCTTCTGGTTGGTTGTAATCTACCTTTAACATAACAATTATCATAATGATGTGATAAGAGATGAAAAGGTGTTTTACATAATTCATATGTATTATTATTATTAACAGTTTTATAATTTCGAGTACATATTTTACATACTAATATA"}], "target_id": 125}, {"microhaplotypes": [{"seq": "TCGTTATGTACCCTAATAAATTTTTTTTCATTATTTGAATCTATATTATTTACATTAGTATTTTGAGTTGTACCATAAATTTCAGTGTTATTATTATTTCTATTCATATAATTATGTCCGCTTATATAATTATGACCATTAAAAAAATGTCTTCCATGTATATCATCTCTTCTAATGTATTTA"}, {"seq": "TCGTTATGTACCCTAATAAATTTTTTTTCATTATTTGAATCTATATTATTTACATTAGTATTTTGAGTTGTACCATAAATTTCAGTGTTATTATTATTTCTATTCATATAATTATGTCCGCTTATATAATTATGACCATTAAAAAAACGTCTTCCATGTATATCATCTCTTCTAATGTATTTA"}, {"seq": "TCGTTATGTACCCTAATAAAATTTTTTCCATTATTTGAATCTATATTATTTACATTAGTATTTTGAGTTGTACCATAAATTTCAGTGTTATTATTATTTCTATTCATATAATTATGTCCGCTTATATAATTATGACCATTAAAAAAACGTCTTCCATGTATATCATCTCTTCTAATGTATTTA"}], "target_id": 126}, {"microhaplotypes": [{"seq": "TTTCTGGCTCGATATAATCCATTTCAATATTTATATTAGATATGAAACATCTATCTTCAATAGGTGAATTTGCTGCAAATTGAGCCATAGAAAAATGATTCTCATTCCTTTGAAAATATGAACTATTCAACTCATCAAGTTTTTCATATGTTATTTCATAACTGCCATCATCTGAATCCTCTTCATCA"}, {"seq": "TTTCTGGCTCGATATAATCCATTTCAATATTTATATTAGATATGAAACATCTATCTTCAATAGGTGAATTTGCTGCAAATTGAGCCATAGAAAAATGATTCTCATTCCTTTGAAAATATGAACTATTCAACTCATCAAGGTTTTCATATGTTATTTCATAACTGCCATCATCTGAATCCTCTTCATCA"}, {"seq": "TTTCTGGCTCGATATAATCCATTTCAATATTTATATTAGATATGAAACATCTATCTTCAATAGGTGAATTTGCTGCAAATTGAGCCATAGAAAAATGATGCTCATTCCTTTGAAAATATGAACTATTCAACTCATCAAGTTTTTCATATGTTATTTCATAACTGCCATCATCTGAATCCTCTTCATCA"}], "target_id": 127}, {"microhaplotypes": [{"seq": "TTGGGTAGATATCGTTATAAGGGCTATAATGTATTGACTTCTCCGGGTTTGTTACATTATCATTACAACCAATATTATTAAGGTTAATATTATTTTTATCATTATTATTGTTGTTTTCATTTGTGTGGTTATATAATAACAATGATGTGTCGTCTATTGGATCATT"}, {"seq": "TTGGGTAGATATCGTTATAAGGGCTATAATGTATTGACTTCTCCGGGTTGGTTACATTATCATTACAACCAATATTATTAAGGTTAATATTATTTTTATCATTATTATTGTTGTTTTCATTTGTGTGGTTATATAATAACAATGATGTGTCGTCTATTGGATCATT"}, {"seq": "TTGGGTAGATATCGTTATAAGGGCTATAATGTATTGACTTCTCCGGGTTTGTTACATTATCATTACAACCAATATTATTAAGGTTCATATTATTTTTATCATTATTATTGTTGTTTTCATTTGTGTGGTTATATAATAACAATGATGTGTCGTCTATTGGATCATT"}, {"seq": "TTGGGTAGATATCGTTATAAGGGCTATAATGTATTGACTTCTCCGGGTTTGTTACATTATCATTACAACCAATATTATTAAGGTTAATACTATTTTTATCATTATTATTGTTGTTTTCATTTGTGTGGTTATATAATAACAATGATGTGTCGTCTATTGGATCATT"}, {"seq": "TTGGGTAGATATCGTTATAAGGGCTATAATGTATTGACTTCTCCGGGTTGGTTACATTATCATTACAACCAATATTATTAAGGTTCATATTATTTTTATCATTATTATTGTTGTTTTCATTTGTGTGGTTATATAATAACAATGATGTGTCGTCTATTGGATCATT"}, {"seq": "TTGGGTAGATATCGTTATAAGGGCTATAATGTATTGACTTCTCCGGGTTGGTTACATTATCATTACAACCAATATTATTAAGGTTAATACTATTTTTATCATTATTATTGTTGTTTTCATTTGTGTGGTTATATAATAACAATGATGTGTCGTCTATTGGATCATT"}, {"seq": "TTGGGTAGATATCGTTATAAGGGCTATAATGTATTGACTTCTCCGGGTTTGTTACATTATCATTACAACCAATATTATTAAGCTTAATATTATTTTTATCATTATTATTGTTGTTTTCATTTGTGTGGTTATATAATAACAATGATGTGTCGTCTATTGGATCATT"}, {"seq": "TTGGGTAGATATCGTTATAAGGGCTATAATGTATTGACTTCTCCGGGTTTGTTATATTATCATTACAACCAATATTATTAAGGTTCATATTATTTTTATCATTATTATTGTTGTTTTCATTTGTGTGGTTATATAATAACAATGATGTGTCGTCTATTGGATCATT"}, {"seq": "TTGGGTAGATATCGTTATAAGGGCTATAATGTATTGACTTCTCCGGGTTTGTTACATTCTCATTACAACCAATATTATTAAGGTTAATATTATTTTTATCATTATTATTGTTGTTTTCATTTGTGTGGTTATATAATAACAATGATGTGTCGTCTATTGGATCATT"}, {"seq": "TTGGGTAGATATCGTTATAAGGGCTATAATGTATTGACTTCTCCGGGTTTGTTATATTATCATTACAACCAATATTATTAAGGTTAATATTATTTTTATCATTATTATTGTTGTTTTCATTTGTGTGGTTATATAATAACAATGATGTGTCGTCTATTGGATCATT"}], "target_id": 128}, {"microhaplotypes": [{"seq": "TGATGTGCCAATATTAAGGATACATTTTCTAAAGCTTCTATCAGATAATGAAAATTTTTTCTGCGATTTTCATTTAAATCATTAAATATATTGGTTAGTTCTTGTATTGACGTTTTTGGATCTAAGGATGTAATTTGTTCATTTAATTCTTCTGTATATTCTAGATTAAAGTTTAAATTATTAAAATAACCTTCAGCATTATTTTCATTTTT"}, {"seq": "TGATGTGCCAATATTAAGGATACATTTTCTAAAGCTTCTAACAGATAATGAAAATTTTTTCTGCGATTTTCATTTAAATCATTAAATATATTGGTTAGTTCTTGTATTGACGTTTTTGGATCTAAGGATGTAATTTGTTCATTTAATTCTTCTGTATATTCTAGATTAAAGTTTAAATTATTAAAATAACCTTCAGCATTATTTTCATTTTT"}, {"seq": "TGATGTGCCAATATTAAGGATACATTTTCTAAAGCTTCTATCAGATAATGAAAATTTTTTTTGCGATTTTCATTTAAATCATTAAATATATTGGTTAGTTCTTGTATTGACGTTTTTGGATCTAAGGATGTAATTTGTTCATTTAATTCTTCTGTATATTCTAGATTAAAGTTTAAATTATTAAAATAACCTTCAGCATTATTTTCATTTTT"}, {"seq": "TGATGTGCCAATATTAAGGATACATTTTCTAAAGCTTCTATCAGATAATGAAAATTTTTTCTGCGATTTTCATTTAAATCATTAAATATATTGGTTAGTTCTTGTATTGACGTTTTTGGATCTAAGGATGTAATTTGTTCATTTAATTCTTCTGTATATTCTAGATTAAAGTTTAAATCATTAAAATAACCTTCAGCATTATTTTCATTTTT"}, {"seq": "TGATGTGCCAATATTAAGGATACATTTTCTAAAGCTTCTATCAGATAATGAAAATCTTTTCTGCGATTTTCATTTAAATCATTAAATATATTGGTTAGTTCTTGTATTGACGTTTTTGGATCTAAGGATGTAATTTGTTCATTTAATTCTTCTGTATATTCTAGATTAAAGTTTAAATTATTAAAATAACCTTCAGCATTATTTTCATTTTT"}], "target_id": 129}, {"microhaplotypes": [{"seq": "TTTCCGTCATAATAGTTGCATACATTCTATTAAAAACTTTGGGTACTCCTAATATAATTTCACCTTTTGAATTACATATGTCTGTATTCAAAAATTTTATATCTCTACTCCATATATTTATCTTTACACCCAAAAACAAAGCAATGAAAAAAATAACCCTTTCATA"}, {"seq": "TTTCCGTCATAATAGTTGCATACATTCTATTAAAAACTTTGGGTACTCCTAATATAATTTCAGCTTTTGAATTACATATGTCTGTATTCAAAAATTTTATATCTCTACTCCATATATTTATCTTTACACCCAAAAACAAAGTAATGAAAAAAATAACCCTTTCATA"}, {"seq": "TTTCCGTCATAATAGTTGCATACATTCTATTAAAAACTTTGGGTACTCCTAATATAATTTCACCTTTTGAATTACATATGTCTGTATTCAAAAATTTTATATCTCTACTCCATATATTTATCTTTACACCCAAAAACAAAGCAATGAAAAAAACAACCCTTTCATA"}, {"seq": "TTTCCGTCATAATAGTTGCATACATTCTATTAAAAACTTTGGGTACTCCTAATATAATTTCAGCTTTTGAATTACATATGTCTGTATTCAAAAATTTTATATCTCTACTCCATATATTTATCTTTACACCCAAAAACAAAGCAATGAAAAAAATAACCCTTTCATA"}, {"seq": "TTTCCGTCATAATAGTTGCATACATTCTATTAAAAACTTTGGGTACTCCTAATATAATTTCACCTTTTGAATTACATATGTCTGTATTCAAAAATTTTATATCTCTACTCCATATATTTATCTTTACACCCAAAAACAAAGTAATGAAAAAAATAACCCTTTCATA"}, {"seq": "TTTCCGTCATAATAGTTGCATACATTCTATTAAAAACTTTGGGTACTCCTAATAAAATTTCACCTTTTGAATTACATATGTCTGTATTCAAAAATTTTATATCTCTACTCCATATATTTATCTTTACACCCAAAAACAAAGAAATGAAAAAAATAACCCTTTCATA"}, {"seq": "TTTCCGTCATAATAGTTGCATACATTCTATTAAAAACTTTGGGTACTCCTAATATAATTTCACCTTTTGAATTACATATGTCTGTATTCAAAAATTTTATATCTCTACTCCATATATTTATCTTTACATCCAAAAACAAAGCAATGAAAAAAACAACCCTTTCATA"}, {"seq": "TTTCCGTCATAATAGTTGCATACATTCTATTAAAAACTTTGGGTACTCCTAATATAATTTCACCTTTTGAATTACATATGTCTGTATTCAAAAATTTTATATCTCTACTCCATATATTTATCTTTACACCCAAAAACAAAGTCATGAAAAAAATAACCCTTTCATA"}, {"seq": "TTTCCGTCATAATAGTTGCATACATTCTATTAAAAACTTTGGGTACTCCTAATATAATTTCAGCTTTTGAATTACATATGTCTGTATTCAAAAATTTTATATCTCTACTCCATATATTTATCTTTACACCCAAAAACAAAGAAATGAAAAAAATAACCCTTTCATA"}, {"seq": "TTTCCGTCATAATAGTTGCATACATTCTATTAAAAACTTTGGGTACTCCTAATATAATTTCAGATTTTGAATTACATATGTCTGTATTCAAAAATTTTATATCTCTACTCCATATATTTATCTTTACACCCAAAAACAAAGCAATGAAAAAAATAACCCTTTCATA"}, {"seq": "TTTCCGTCATAATAGTTGCATACATTCTATTAAAAACTTTGGGTACTCCTAATATAATTTCAGCTTTTGAATTACATATGTCTGTATTCAAAAATTTTATATCTCTACTCCATATATTTATCTTTACACCCAAAAACAAAGCAATGAAAAAAACAACCCTTTCATA"}, {"seq": "TTTCCGTCATAATAGTTGCATACATTCTATTAAAAACTTTGGGTACTCCTAATATAATTTCAGCTTTTGAATTACATATGTCTGTATTCAAAAATTTTATATCTCTACTCCATATATTTATCTTTACATCCAAAAACAAAGCAATGAAAAAAACAACCCTTTCATA"}], "target_id": 130}, {"microhaplotypes": [{"seq": "CAAAAATATCATTCCCCAAATTTGTACTACTAATTGTTCCAATAGTTCCTATAGTTGTGGTAATTTGCTCATATGTATTTTTTCCTAAAGATTTATTAGACACATTTGAAGGATCATTATTTTGTTCCAAATTCTTGGGCACAGTATTATTACATGAGAATAATGAAAAGTTATTATCATAATTCTTTTGTT"}, {"seq": "CAAAAATATCATTCCCCAAATTTGTACTACTAATTGTTCCAATAGTTCCTATAGTTGTGGTAATTTGCTCATATGTCTTTTTTCCTAAAGATTTATTAGACACATTTGAAGGATCATTATTTTGTTCCAAATTCTTGGGCACAGTATTATTACATGAGAATAATGAAAAGTTATTATCATAATTCTTTTGTT"}, {"seq": "CAAAAATATCATTCCCCAAATTTATACTACTAATTGTTCCAATAGTTCCTATAGTTGTGGTAATTTGCTCATATGTATTTTTTCCTAAAGATTTATTAGACACATTTGAAGGATCATTATTTTGTTCCAAATTCTTGGGCACAGTATTATTACATGAGAATAATGAAAAGTTATTATCATAATTCTTTTGTT"}, {"seq": "CAAAAATATCATTCCCCAAATTTGTACTACTAATTGTTCCAATAGTTCCTATAGTTGTGGTAATTTGCTCATATGTCTTTTTTCCTAAAGATTTATTAGACACATTTGAAAGATCATTATTTTGTTCCAAATTCTTGGGCACAGTATTATTACATGAGAATAATGAAAAGTTATTATCATAATTCTTTTGTT"}, {"seq": "CAAAAATATCATTCCCCAAATTTGTACTACTAATTGTTCCAATAGTTGCTATAGTTGTGGTAATTTGCTCATATGTATTTTTTCCTAAAGATTTATTAGACACATTTGAAGGATCATTATTTTGTTCCAAATTCTTGGGCACAGTATTATTACATGAGAATAATGAAAAGTTATTATCATAATTCTTTTGTT"}, {"seq": "CAAAAATATCATTCCCCAAATTTGTACTACTAATTGTTCGAATAGTTCCTATAGTTGTGGTAATTTGCTCATATGTATTTTTTCCTAAAGATTTATTAGACACATTTGAAGGATCATTATTTTGTTCCAAATTCTTGGGCACAGTATTATTACATGAGAATAATGAAAAGTTATTATCATAATTCTTTTGTT"}, {"seq": "CAAAAATATCATTCCCCAAATTTGTACTACTAATTGTTCCAATAGTTGCTATAGTTGTGGTAATTTGCTCATATGTCTTTTTTCCTAAAGATTTATTAGACACATTTGAAGGATCATTATTTTGTTCCAAATTCTTGGGCACAGTATTATTACATGAGAATAATGAAAAGTTATTATCATAATTCTTTTGTT"}, {"seq": "CAAAAATATCATTCCCCAAATTTGTACTACTAATTGTTCCAATAGTTCCTATAGTTGTGGTAATTTTCTCATATGTATTTTTTCCTAAAGATTTATTAGACACATTTGAAGGATCATTATTTTGTTCCAAATTCTTGGGCACAGTATTATTACATGAGAATAATGAAAAGTTATTATCATAATTCTTTTGTT"}, {"seq": "CAAAAATATCATTCCCCAAATTTGTACTACTAATTGTTCCAATAGTTCCTATAGTTGTGGTAATTTGCTCATATGTATTTTTTCCTAAAGATTTATTAGACACATTTGAAAGATCATTATTTTGTTCCAAATTCTTGGGCACAGTATTATTACATGAGAATAATGAAAAGTTATTATCATAATTCTTTTGTT"}, {"seq": "CAAAAATATCATTCCCCAAATTTGTACTACTAATTGTTCCAATAGTTCCTATAGTTGTGGTAATTTGCTCATATGTATTTTTTCCTAAAGATTTATTAGACACATTTGAAGGATCATTATTTTGTTCCAAATTCTTGGGAACAGTATTATTACATGAGAATAATGAAAAGTTATTATCATAATTCTTTTGTT"}, {"seq": "CAAAAATATCATTCCCCAAATTTGTACTACTAATTGTTCCAATAGTTCCTATAGTTGTGGTAATTTGCTCATATGTATTTTTTCCTAAAGATTTATTAGGCACATTTGAAGGATCATTATTTTGTTCCAAATTCTTGGGCACAGTATTATTACATGAGAATAATGAAAAGTTATTATCATAATTCTTTTGTT"}, {"seq": "CAAAAATATCATTCCCCAAATTTGTACTACAAATTGTTCCAATAGTTCCTATAGTTGTGGTAATTTGCTCATATGTATTTTTTCCTAAAGATTTATTAGACACATTTGAAGGATCATTATTTTGTTCCAAATTCTTGGGCACAGTATTATTACATGAGAATAATGAAAAGTTATTATCATAATTCTTTTGTT"}], "target_id": 131}, {"microhaplotypes": [{"seq": "GCTCCCCAAAAGTTAACTGCTTCATTATTTTGTGGATCCCAAAAACTAACATTCGTTACCCATCCAACATAATCGGTAGATATCCTATATTCATAACTACTACAGAAATATTTATACTCATGGTATACATTTGCATCATTTACATCTACCAAATTAACAGTTTTACACAAATTGTGAATGCCATTCAAGTTATAAAAACCTGTACAT"}, {"seq": "GCTCCCCAAAAGTTAACTGCTTCATTATTTTTTGGATCCCAAAAACTAACATTCGTTACCCATCCAACATAATCGGTAGATATCCTATATTCATAACTACTACAGAAATATTTATACTCATGGTATACATTTGCATCATTTACATCTACCAAATTAACAGTTTTACACAAATTGTGAATGCCATTCAAGTTATAAAAACCTGTACAT"}, {"seq": "GCTCCCCAAAAGTTAACTGCTTCATTATTTTGTGGATCCCAAAAACTAACATTCGTTACCCATCCAACATAATCGGTAGATATCCTATATTCATAACTACTACAGAAATATTTATACTCATGGTATACATTTGCATCATTTACATCTACCAAATTAACAGTTTTACACAAATTGTGAATTCCATTCAAGTTATAAAAACCTGTACAT"}, {"seq": "GCTCCCCAAAAGTTAACTGCTTCATTATTTTGTGGATCCCAAAAACTAACATTCGTTACCCATCCAACATAATCGGTAGATATCCTATATTCATAACTACTACAGAAATATTTATACTCATGGTATACATTTGCATCATTTACATCTACCAAATTAACAGTTTTACACAAATTGTGAATGCTATTCAAGTTATAAAAACCTGTACAT"}, {"seq": "GCTCCCCAAAAGTTAACTGCTTCATTATTTTGTGGATCCCAAAAACTAACATTCGTTACCCATCCAACATAATCGGTAGATATCCTATATTCATAACTACTACAGAAATATTTATACTCATGGTATACATTTGCATCCTTTACATCTACCAAATTAACAGTTTTACACAAATTGTGAATGCCATTCAAGTTATAAAAACCTGTACAT"}, {"seq": "GCTCCCCAAAAGTTAACTGCTTCATTATTTTTTGGATCCCAAAAACTAACATTCGTTACCCATCCAACATAATCGGTAGATATCCTATATTCATAACTACTACAGAAATATTTATACTCATGATATACATTTGCATCATTTACATCTACCAAATTAACAGTTTTACACAAATTGTGAATGCCATTCAAGTTATAAAAACCTGTACAT"}, {"seq": "GCTCCCCAAAAGTTAACTGCTTCATTATTTTTTGGATCCCAAAAACTAACATTCGTTACCCATCCAACATAATCGGTAGATATCCTATATTCATAACTACTACAGAAATATTTATACTCATGGTATACATTTGCATCATTTACATCTACCAAATTAACAGTTTTACACAAATTGTGAATTCCATTCAAGTTATAAAAACCTGTACAT"}, {"seq": "GCTCCCCAAAAGTTAACTGCTTCATTATTTTGTGGATCCCAAAAACTAACATTCGTTACCCATCCAACATAATCGGTAGATATCCTATATTCATAACTACTACAGAAATATTTATACTCATGGTATACATTTGCATCATTTACATCTACCAAATTAACAGTTTTACACAAATTGTGTATGCCATTCAAGTTATAAAAACCTGTACAT"}, {"seq": "GCTCCCCAAAAGTTAACTGCTTCATTATTTTTTGGATCCCAAAAACTAACATTCGTTACCCATCCAACATAATCGGTAGATATCCTATATTCATAACTACTACAGAAATATTTATACTCATGGTATACATTTGCATCATTTACATCTACCAAATTAACAGTTTTACACAAATTGTGAATGCTATTCAAGTTATAAAAACCTGTACAT"}, {"seq": "GCTCCCCAAAAGTTAACTGCTTCATTATTTTTTGGATCCCAAAAACTAACATTCGTTACCCATCCAACATAATCGGTAGATATCCTATATTCATAACTACTACAGAAATATTTATACTCATGGTATACATTTGCATCATTTACATCTACCAAATTAACAGTTTTACACAAATTGTGTATGCCATTCAAGTTATAAAAACCTGTACAT"}], "target_id": 132}, {"microhaplotypes": [{"seq": "GGTGGTTTAACATTTTCAGCTACGACTTTTTCGACTGATGGCAATCCTACTTTGATTAATTCCTTTAACATAGATTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGACTTTTTCGACTGATGGCAATCCTACTTTGATTAATTCCTTTAACATAGATTTTGCGTGTCTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTATGAGTTTTTCGACTGGTGGCAATCCTACTTTGATTAATTCCTTTAACATAGATTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGACTTTTTCGACTGATGGCAATCCTAATTTGATTAATTCCTTTAACATATGTTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGAGTTTTTCGAATGATGGCAATCCTACTTTGATTAATTCCTTTAACATAGATTTTGCGTGGTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTATGAGATTTTCGACTGATGGCAATCCTACTTTGATTAATTCCTTTAACATATATTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGAGTTTTTCGAATGATGGCAATCCTACTTTGATTAATTCCTTTAACATAAGTTTTGCGTGGTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGAGTTTTTCGAATGATGGCAATCCTACTTTGATTAATTGCTTTAACATAAGTTTTGCGTGGTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTATGAGATTTTCGACTGATGGCAATCCTACTTTGATTAATTCCTTTAACATAATTTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTGCAGCTACGAGTTTTTCGACTGATGGCAATCCTAATTTGATTAATTCCTTTAACATAATTTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTGAGCTACGAGATTTTCGACTGATGGCAATCCTAATTTGATTAATTCCTTTAACATAATTTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGAGACTTTCGACTGATGGCAATCCTACTTTGATTAATTCCTTTAACATAAATTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGACTTTTTCGACTGATGGCAATCCTACTTTGATTAATTCCTTTAACATAATTTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGACTTTTTCGACTGATGGCAATCCTAATTTGATTAATTCCTTTAACATATGTTTTGCGTGGTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGAGATTTTCGAATGATGGCAATCCTACTTTGATTAATTCCTTTAACATAGATTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGAGATTTTCGACTGATGGCAATCCTATTTTGATTAATTCCTTTAACATAAGTTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGAGATTTTCGAATGATGGCAATCCTACTTTGATTAATTCCTTTAACATAAGTTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTATGAGTTTTTCGACTGATGGCAATCCTACTTTGATTAATTCCTTTAACATAAGTTTTGCGTGTCTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTGAGCTACGAGTTTTTCGACTGATGGCAATCCTACTTTGATTAATTCCTTTAACATAGATTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTGAGCTATGAGTTTTTCGAATGATGGCAATCCTACTTTGATTAATTCCTTTAACATAAGTTTTGCGTGGTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGACTTTTTCGACTGATGGCAATCCTAATTTGATTAATTCCTTTAACATAGATTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGAGTTTTTCGACTGATGGCAATCCTACTTTGATTAATTCCTTTAACATAAGTTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTATGAGTTTTTCGAATGATGGCAATCCTACTTTGATTAATTCCTTTAACATAAGTTTTGCGTGGTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGACTTTTTCGACTGATGGCAATCCTAATTTGATTAATTCCTTTAACATATATTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTGAGCTACGAGTTGTTCGACTGATGGCAATCCTACTTTGATTAATTCCTTTAACATAAGTTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGACTTTTTCGACTGATGGCAATCCTGCTTTGATTAATTCCTTTAACATAGATTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTATGAGATTTTCGACTGATGGCAATCCTAATTTGATTAATTCCTTTAACATAATTTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTATGAGTCTTTCGACTGATGGCAATCCTACTTTGATTAATTCCTTTAACATAGATTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGACTTTTTCGACTGATGGCAATCCTAATTTGATTAATTCCTTTAACATAATTTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGACTTTTTCGACTGATGGCAATCCTAGTTTGATTAATTCCTTTAACATAGATTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTATGAGTTTTTCGACTGGTGGCAATCCTACTTTGATTAATTCCTTTAACATAAGTTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTGAGCTACGAGATTTTCGACTGATGGCAATCCTATTTTGATTAATTCCTTTAACATAAGTTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTGAGCTATGAGTTTTTCGAATGATGGCAATCCTACTTTGATTAATTCCTTTAACATAGATTTTGCGTGGTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGAGATTTTCGAATGATGGCAATCCTACTTTGATTAATTCCTTTAACATAGATTTTGCGTGGTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGACTTTTTCGACTGATGGCAATCCTATTTTGATTAATTCCTTTAACATAGATTTTGCGTGTCTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTATGAGATTTTCGAATGATGGCAATCCTACTTTGATTAATTCCTTTAACATAAGTTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTATGAGATTTTCGACTGATGGCAATCCTACTTTGATTAATTCCTTTAACATAGATTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTATGAGTTTTTCGACTGGTGGCAATCCTACTTTGATTAATTCCTTTAACATAAGTTTTGCGTGGTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTGCAGCTACGAGTTTTTCGACTGATGGCAATCCTACTTTGATTAATTCCTTTAACATAGATTTTGCGTGTCTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGAGATTTTCGACTGATGGCAATCCTAATTTGATTAATTCCTTTAACATAAGTTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTCAGCTACGAGTTTTTCGACTGGTGGCAATCCTACTTTGATTAATTCCTTTAACATAAGTTTTGCGTGTTTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTGAGCTACGAGATTTTCGACTGATGGCAATCCTACTTTGATTAATTCCTTTAACATAAATTTTGCGTGTCTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}, {"seq": "GGTGGTTTAACATTTTGAGCTACGAGTTTTTCGAATGATGGCAATCCTACTTTGATTAATTCCTTTAACATAAGTTTTGCGTGTCTTTTTACTTCTGATTTGATATCAAAGCTTGATTCTAAAAAGGTTGGTGAATTTTTTTGTAAAACACTGACAAGTTCATTTGATATGGTCTCTGCTAAATCATCACCA"}], "target_id": 133}, {"microhaplotypes": [{"seq": "ACCTAATGTTGGTAAGTCTACCATTTTTAATCGACTAACTCGAAAATATCAAGATGGTAGTATTGTTTTAGATGTTAGTAGTACGAGAGATAAACTTTATGGAGAAGTTGAGTGGGAAGGATATAAATTTGAACTTGTGGATACAGGAGGTTTAGTTTTTGA"}, {"seq": "ACCTAATGTTGGTAAGTCTACCATTTTTAATCGACTAACTCGAAAATATCAAGATGGTAGTATTGTTTTTGATGTTAGTAGTACGAGAGATAAACTTTATGGAGAAGTTGAGTGGGAAGGATATAAATTTGAACTTGTGGATACAGGAGGTTTAGTTTTTGA"}, {"seq": "ACCTAATGTTGGTAAGTCTACCATTTTTAATCGACTAACTCGAAAATATCAAGATGGTAGTATTGTATTAGATGTTAGTAGTACGAGAGATAAACTTTATGGAGAAGTTGAGTGGGAAGGATATAAATTTGAACTTGTGGATACAGGAGGTTTAGTTTTTGA"}, {"seq": "ACCTAATGTTGGTAAGTCTACCATTTTTAATCGACTAACTCGAAAATATCAAGATGGTAGTATTGTTTTAGGTGTTAGTAGTACGAGAGATAAACTTTATGGAGAAGTTGAGTGGGAAGGATATAAATTTGAACTTGTGGATACAGGAGGTTTAGTTTTTGA"}, {"seq": "ACCTAATGTTGGTAAGTCTACCATTTTTAATCGACTAACTCGAAAATATCAAGATGGTAGTATTGTTTTGGATGTTAGTAGTACGAGAGATAAACTTTATGGAGAAGTTGAGTGGGAAGGATATAAATTTGAACTTGTGGATACAGGAGGTTTAGTTTTTGA"}, {"seq": "ACCTAATGTTGGTAAGTCTACCATTTTTAATCGACTAACTCGAAAATATCAAGATGGTAGTATTGTTTTAGAGGTTAGTAGTACGAGAGATAAACTTTATGGAGAAGTTGAGTGGGAAGGATATAAATTTGAACTTGTGGATACAGGAGGTTTAGTTTTTGA"}, {"seq": "ACCTAATGTTGGGAAGTCTACCATTTTTAATCGACTAACTCGAAAATATCAAGATGGTAGTATTGTTTTAGATGTTAGTAGTACGAGAGATAAACTTTATGGAGAAGTTGAGTGGGAAGGATATAAATTTGAACTTGTGGATACAGGAGGTTTAGTTTTTGA"}, {"seq": "ACCTAATGTTGGTAAGTCTACCATTTTTAATCGACTAACTCGAAAATATCAAGATGGTAGTATTGTTTTAGATGTTAGTAGTACTAGAGATAAACTTTATGGAGAAGTTGAGTGGGAAGGATATAAATTTGAACTTGTGGATACAGGAGGTTTAGTTTTTGA"}, {"seq": "ACCTAATGTTGGTAAGTCTACCATTTTTAATCGACTAACTCGAAAATATCAAGATGGTAGTATTGTTTTAAATGTTAGTAGTACGAGAGATAAACTTTATGGAGAAGTTGAGTGGGAAGGATATAAATTTGAACTTGTGGATACAGGAGGTTTAGTTTTTGA"}, {"seq": "ACCTAATGTTGGTAAGTCTACCATTTTTAATCGACTAACTCGAAAATATCAAGATGGTAGTATTATTTTAGATGTTAGTAGTACGAGAGATAAACTTTATGGAGAAGTTGAGTGGGAAGGATATAAATTTGAACTTGTGGATACAGGAGGTTTAGTTTTTGA"}], "target_id": 134}, {"microhaplotypes": [{"seq": "ATATAATTTTAAGATGTCCTATCAAGACGTTCAGGAAAAAAAAAATGAAGATATAAATTATGATGAAATAGCTAGCAGCATGCTAGAGAAGATGGACAAACATATAAATGGAGAAAAACAACCAACGATACATTATGAAAATTTAAATGTACAAGAGCAAGAGGGAGCACATGCTTATTACTCAAATCAAGATATAAATAACATAAATA"}, {"seq": "ATATAATTTTAAGATGTCCTATCAAGACGTTCAGGAAAAAAAAAATGAAGATATAAATTATGATGAAATAGCTAGCAGCATGCTAGAGAAGATGGACAAACATATAAATGGAGAAAAACAACCAACGATACATTATGAAAATTTAAATGTACAAGAGCAAGGGGGAGCACATGCTTATTACTCAAATCAAGATATAAATAACATAAATA"}, {"seq": "ATATAATTTTAAGATGTCCTATCAAGACGTTCAGGAAAAAAAAAATGAAGATATAAATTATGATGAAATAGCTAGCAGCATGCTAGAGAAGATGGACAAACATATAAATGGAGAAAAACAACTAACGATACATTATGAAAATTTAAATGTACAAGAGCAAGAGGGAGCACATGCTTATTACTCAAATCAAGATATAAATAACATAAATA"}, {"seq": "ATATAATTTTAAGATGTCCTATCAAGACGTTCAGGAAAAAAAAAATGAAGATATAAATTATGATGAAATAGCTAGCAGCATGCTAGAGAAGATGGACAAACATATAAATGGAGAAAAAAAACCAACGATACATTATGAAAATTTAAATGTACAAGAGCAAGAGGGAGCACATGCTTATTACTCAAATCAAGATATAAATAACATAAATA"}], "target_id": 135}, {"microhaplotypes": [{"seq": "ATGGGAAGACGATAAGAGAAGAGAAATTAATTTCTGAGGGAGCGTATTCATTTGTTTATATGGCGAAGGATTTAAACACGAATCGAGCTTATACTATAAAGAAGACCATATGTCAAGATAAAGAGAAAATAGATATGGCGAATAAAGAAATCAACATTCTTAAAAGTTTACCTCCACATAAAAATATA"}, {"seq": "ATGGGAAGACGATAAGAGAAGAGAAATTAATTTCTGAGGGAGCGTATTCATTTGTTTATATGGCGAAGGATTTAAACACGAATCGAGCTTATACTATAAAGAAGACCATATGTCAAGATAAAGAGAAAATAGATATGGCGAATAAAGAGATCAACATTCTTAAAAGTTTACCTCCACATAAAAATATA"}, {"seq": "ATGGGAAGACGATAAGAGAAGAGAAATTAATTTCTGAGGGAGCGTATTCATTTGTTTATATGGCGAAGGATTTAAACACGAATCGAGCTTATACTATAAAGAAGACCATATGTCAAGATAAAGAGAAAATAGATATGGCGTATAAAGAAATCAACATTCTTAAAAGTTTACCTCCACATAAAAATATA"}, {"seq": "ATGGGAAGACGATAAGAGAAGAGAAATTAATTTCTGAGGGAGCGTATTCATTTGTTTATATGGCGAAGGATTTAAACACGAATCGAGCTTATACTATAAAGAAGACCATATGTCAAGATAAAGAGAAAATAGATATGGCGAAAAAAGAAATCAACATTCTTAAAAGTTTACCTCCACATAAAAATATA"}, {"seq": "ATGGGAAGACGATAAGAGAAGAGAAATTAATTTCTGAGGGAGCGTATTCATTTGTTTATATGGCGAAGGATTTAAACACGAATCGAGCTTATACTATAAAGAAGACCATATGCCAAGATAAAGAGAAAATAGATATGGCGAATAAAGAAATCAACATTCTTAAAAGTTTACCTCCACATAAAAATATA"}, {"seq": "ATGGGAAGACGATAAGAGAAGAGAAATTAATTTCTGAGGGAGCGTATTCATTTGTTTATATGGCGAAGGATTTAAACACGAATCGAGCTTATACTATAAAGAAGACCATATGTCAAGATAAAGAGAAAATAGATATGGTGAATAAAGAAATCAACATTCTTAAAAGTTTACCTCCACATAAAAATATA"}, {"seq": "ATGGGAAGACGATAAGAGAAGAGAAATTAATTTCTGAGGGAGCGTATTCATTTGTTTATATGGCGAAGGATTTAAACACGAATCGAGCTTATACTATAAAGAAGACCATATGTCAAGATAAAGAGAAAATAGATATGGCGCATAAAGAAATCAACATTCTTAAAAGTTTACCTCCACATAAAAATATA"}, {"seq": "ATGGGAAGACGATAAGAGAAGAGAAATTAATTTCTGAGGGAGCGTATTCATTTGTTTATATGGCGAAGGATTTAAACACGAATCGAGCTTATACTATAAAGAAGACCATATGTCAAGATAAAGAGAAAATAGATATGGCGAATAAGGAAATCAACATTCTTAAAAGTTTACCTCCACATAAAAATATA"}], "target_id": 136}, {"microhaplotypes": [{"seq": "AGTTGAAGGGGGAGGAATGATCGGAGTTATCAGATTAGAAAATCAAGTGAGAAATCCCCCTGTAATAAAATTGAAGAGTCATACATCTCCCATCCTTGATTTGTCATTTAACCCGTGTTATAGTGAGATATTAGCTTCATGTTCAGAAGATATGTCTATAAGAATATGGGAGATACGTCATGAGGATGAGAATGTGAATGAGGTA"}, {"seq": "AGTTGAAGGGGGAGGAATGATCGGAGTTATCAGATTAGAAAATCAAGTGAGAAATCCCCCTGTAATAAAATTGAAGAGTCATACATCTTCCATCCTTGATTTGTCATTTAACCCGTGTTATAGTGAGATATTAGCTTCATGTTCAGAAGATATGTCTATAAGAATATGGGAGATACGTCATGAGGATGAGAATGTGAATGAGGTA"}, {"seq": "AGTTGAAGGGGGAGGAATGATCGGAGTTATCAGATTAGAAAATCAAGTGAGAAATCCCCCTGTAATAAAATTGAAGAGTCATACATCTCCCATCCTTGATTTGTCATTTAACCCGTGTTATAGTGAGATATTAGCTTCATGTTCAGAAGATATGTCTATAAGAATATGGGAGATACGTCATGAGGATGAAAATGTGAATGAGGTA"}, {"seq": "AGTTGAAGGGGGAGGAATGATCGGAGTTATCAGATTAGAAAATCAAATGAGAAATCCCCCTGTAATAAAATTGAAGAGTCATACATCTCCCATCCTTGATTTGTCATTTAACCCGTGTTATAGTGAGATATTAGCTTCATGTTCAGAAGATATGTCTATAAGAATATGGGAGATACGTCATGAGGATGAGAATGTGAATGAGGTA"}], "target_id": 137}, {"microhaplotypes": [{"seq": "GAGATATTAGCTTCATGTTCAGAAGATATGTCTATAAGAATATGGGAGATACGTCATGAGGATGAGAATGTGAATGAGGTAAAGGATCCTTTATGTATATTAAATGGTCATAAGAAAAAAGTAAATATATTATCATGGAATCCTATGAATTATTTTATATTATCATCT"}, {"seq": "GAGATATTAGCTTCATGTTCAGAAGATATGTCTATAAGAATATGGGAGATACGTCATGAGGATGAAAATGTGAATGAGGTAAAGGATCCTTTATGTATATTAAATGGTCATAAGAAAAAAGTAAATATATTATCATGGAATCCTATGAATTATTTTATATTATCATCT"}], "target_id": 138}, {"microhaplotypes": [{"seq": "AAAGTATTTGTAATAGATTAAACGATGAACTAAATGAAGAAATATGTGGTTATCAAATTAGGTTTGAAAAATCGTATTTTTTAAAACATAGTAAAATTAAAGTTATGACAGAAGGAATTTTATTGAAAGAAATTATGAGTGATTTTATTTTATCAAAATATAGTGTTATCATTCTTGA"}, {"seq": "AAAGTATTTGTAATAGATTGAACGATGAACTAAATGAAGAAATATGTGGTTATCAAATTAGGTTTGAAAAATCGTATTTTTTAAAACATAGTAAAATTAAAGTTATGACAGAAGGAATTTTATTGAAAGAAATTATGAGTGATTTTATTTTATCAAAATATAGTGTTATCATTCTTGA"}, {"seq": "AAAGTATTTGTAATAGATTAAACGATGAACTAAATGAAGAAATATGTGGTTATCAAATTAGGTTTGAAAAATCGTATTTTTTAAAACATAGTAAAATTAAAGTTATGACAGAAGGAATTTTATTGAAAGAAATTATGAGTGATTTTATTTTATCAAAATATAGTGTTATTATTCTTGA"}, {"seq": "AAAGTATTTGTAATAGATTGAACGATGAACTAAATGAAGAAATATGTGGTTATCAAATTAGGTTTGAAAAATCGTATTTTTTAAAACATAGTAAAATTAAAGTTATGACAGAAGGAATTTTATTGAAAGAAATTATGAGTGATTTTATTTTATCAAAATATAGTGTTATTATTCTTGA"}], "target_id": 139}, {"microhaplotypes": [{"seq": "ATTATATGATATTTATATAAAATTAGAAAATCTAATTTTAGAAAAAATAACTGAAAGTATATACAATAGTACACCTCCATATAGAGTTATTATGTTCGAATTAATGACCAGATTATTTCGATTTTATACAAAACCAATAGACCTTATTATTACTATGAATACAC"}, {"seq": "ATTATATGATATTTATATAAAATTAGAAAATCTAATTTTAGAAAAAATAACTGAAAGTATATACAATAGTACACCTCCATATAGAGTTATTATGTTCGAATTAATGACCAGATTGTTTCGATTTTATACAAAACCAATAGACCTTATTATTACTATGAATACAC"}], "target_id": 140}, {"microhaplotypes": [{"seq": "TCCTTTTATGTGAACAAATTAAATATTGTAAATGATTTCTTTTTTGAAACACACCATAAAGATACACATCAAGACAGTCAAAATGAACACAAAACGGATGAACCTAAAATACATAATGTTTTCAAAAAAAAAAATAACGATATCTTTGTTAATATTCCTCTACCAAAAATATTTAAAAATTTCTTACATTCCATATATTTTAGAACTCC"}, {"seq": "TCCTTTTATGTGAACAAATTAAATATTGTAAATGATTTCTTTTTTGGAACACACCATAAAGATACACCTCAAGACAGTCAAAATGAACACAAAACGGATGAACCTAAAATACATAATGTTTTCAAAAAAAAAAATAACGATATCTTTGTTAATATTCCTCTACCAAAAATATTTAAAAATTTCTTACATTCCATATATTTTAGAACTCC"}, {"seq": "TCCTTTTATGTGAACAAATTAAATATTGTAAATGATTTCTTTTTTGAAACACACCATAAAGATACACCTCAAGACAGTCAAAATGAACACAAAACGGATGAACCTAAAATACATAATGTTTTCAAAAAAAAAAATAACGATATCTTTGTTAATATTCCTCTACCAAAAATATTTAAAAATTTCTTACATTCCATATATTTTAGAACTCC"}, {"seq": "TCCTTTTATGTGAACAAATTAAATATTGTAAATGATTTCTTTTTTGGAACACACCATAAAGATACACATCAAGACAGTCAAAATGAACACAAAACGGATGAACCTAAAATACATAATGTTTTCAAAAAAAAAAATAACGATATCTTTGTTAATATTCCTCTACCAAAAATATTTAAAAATTTCTTACATTCCATATATTTTAGAACTCC"}, {"seq": "TCCTTTTATGTGAACAAATTAAATATTATAAATGATTTCTTTTTTGGAACACACCATAAAGATACACCTCAAGACAGTCAAAATGAACACAAAACGGATGAACCTAAAATACATAATGTTTTCAAAAAAAAAAATAACGATATCTTTGTTAATATTCCTCTACCAAAAATATTTAAAAATTTCTTACATTCCATATATTTTAGAACTCC"}, {"seq": "TCCTTTTATGTGAACAAATTAAATATTGTAAATGATTTCTTTTTTGAAACACACCATAAAGATACACATCAAGACAGTCAAAATGAACACAAAACGGATGAACCTAAAATACATAATGTTTTCAAAAAAAAAAATAACGATATCTTTGTTAATATTGCTCTACCAAAAATATTTAAAAATTTCTTACATTCCATATATTTTAGAACTCC"}, {"seq": "TCCTTTTATGTGAACAAATTAAATATTGTAAATGATTTCTTTTTTGGAACACACCATAAAGATACACCTCAAGACAGTCAAAATGAACACAAAACGGATGAACCTAAAATACATAATGTTTTCAAAAAAAAAAATAACGATATCTTTGTTAATATACCTCTACCAAAAATATTTAAAAATTTCTTACATTCCATATATTTTAGAACTCC"}, {"seq": "TCCTTTTATGTGAACAAATTAAATATTGTAAATGATTTCTTTTTTGAAACACACCATAAAGATACACATCAAGACAGTCAAAATGAACACAAAACGGATGAACCTAAAATACATAATGTTTTCAAAAAAAAAAATAACGATATCTTTGTTAATATTCCGCTACCAAAAATATTTAAAAATTTCTTACATTCCATATATTTTAGAACTCC"}, {"seq": "TCCTTTTATGTGAACAAATTAAATATTGTAAATGATTTCTTTTTTGAAACACACCATAAAGATACACATCAAGACAGTCAAAATGAACACAAAACGGATGAACCTAAAATACATAATGTTTTCAAAAAAAAAAATGACGATATCTTTGTTAATATTCCTCTACCAAAAATATTTAAAAATTTCTTACATTCCATATATTTTAGAACTCC"}], "target_id": 141}, {"microhaplotypes": [{"seq": "ATATATCTTTATTCATATGTTCTATATATTGTCTTTGTCTCTTTTCCTTTCTCATATCAGATATTATTGAATAATTTCCTTTATCACATACATATCTAGGATTATGTGATAATTCATAAGCTGCTCTTTTTAAAACTCTATTCTTTTCTTTAAAACTATTAAATTTTATATTATTGTTCATATTAGATGTGTTCCTTTTAATAATA"}, {"seq": "ATATATCTTTATTCATATGTTCTATATATTGTCTTTGTCTCTTTTCCTTTCTCATATCAGATATTATTGAATAATTTCCTTTATCACATACATATCTAGGATTATGTGATAATTCATAAGCTGCTCTTTTTAAAACTCTATTCTTTTCTTTAAAACTATTAAATTTTATATTATTGTTCATATTAGATGTGTTACTTTTAATAATA"}, {"seq": "ATATATCTTTATTCATATGTTCTATATATTGTCTTTGTCTCTTTTCCTTTCTCATATCAGATATTATTGAATAATTTCCTTTATCACATACATATCTAGGATTATGTGATAATTCATAAGCTGCTCTTTTTAAAACTCTATTCTTTTCTTTAAAACTATTAAATTTTATATTATTGTTCCTATTAGATGTGTTACTTTTAATAATA"}, {"seq": "ATATATCTTTATTCATATGTTCTATATATTGTCTTTGTCTCTTTTCCTTTCTCATATCAGATATTATTGAATAATTTCCTTTATCACATACATATCTAGGATTATGTGATAATTCATAAGCTGCTCCTTTTAAAACTCTATTCTTTTCTTTAAAACTATTAAATTTTATATTATTGTTCATATTAGATGTGTTCCTTTTAATAATA"}, {"seq": "ATATATCTTTATTCATATGTTCTATGTATTGTCTTTGTCTCTTTTCCTTTCTCATATCAGATATTATTGAATAATTTCCTTTATCACATACATATCTAGGATTATGTGATAATTCATAAGCTGCTCTTTTTAAAACTCTATTCTTTTCTTTAAAACTATTAAATTTTATATTATTGTTCATATTAGATGTGTTCCTTTTAATAATA"}, {"seq": "ATATATCTTTATTCATATGTTCTATATATTGTCTTTGTCTCTTTTCCTTTCTCATAACAGATATTATTGAATAATTTCCTTTATCACATACATATCTAGGATTATGTGATAATTCATAAGCTGCTCTTTTTAAAACTCTATTCTTTTCTTTAAAACTATTAAATTTTATATTATTGTTCATATTAGATGTGTTCCTTTTAATAATA"}, {"seq": "ATATATCTTTATTCATATGTTCTATATATTGTCTTTGTCTCTTTTCCTTTCTCATATCAGATATTATTGAATAATTTCCTTTATCACATACATATCTAGGATTATGTGATAATTCATAAGCTGCTCTTTTTAAAACTCTATTCTTTTCTTTAAAACTATTAAATTTTATATTATTGTTCATATTAGATGTGTTCCTTTTAATCATA"}, {"seq": "ATATATCTTTATTCATATGTTCTATATATTGTCTTTGTCTCTTTTCCTTTCTCATATCAGATATTATTGAATAATTTCCTTTATGACATACATATCTAGGATTATGTGATAATTCATAAGCTGCTCTTTTTAAAACTCTATTCTTTTCTTTAAAACTATTAAATTTTATATTATTGTTCATATTAGATGTGTTCCTTTTAATAATA"}, {"seq": "ATATATCTTTATTCATATGTTCTATATATTGTCTTTGTCTCTTTTCCTTTCTCATATCAGATATTATTGAATAATTTCCTTTATCACATACATATCTAGGATTATGTGATAATTCATAAGCTTCTCTTTTTAAAACTCTATTCTTTTCTTTAAAACTATTAAATTTTATATTATTGTTCATATTAGATGTGTTACTTTTAATAATA"}, {"seq": "ATATATCTTTATTCATATGTTCTATATATTGTCTTTGTCTCTTTTCCTTTCTCATATCAGATATTATTGAATAATTTCCTTTACCACATACATATCTAGGATTATGTGATAATTCATAAGCTGCTCTTTTTAAAACTCTATTCTTTTCTTTAAAACTATTAAATTTTATATTATTGTTCATATTAGATGTGTTCCTTTTAATAATA"}, {"seq": "ATATATCTTTATTCATATGTTCTATATATTGTCTTTGTCTCTTTTCCTTTCTCATATCAGATATTATTGAATAATTTCCTTTATCACATACATATCTAGGATTATGTGATAATTCATAAGCTACTCTTTTTAAAACTCTATTCTTTTCTTTAAAACTATTAAATTTTATATTATTGTTCATATTAGATGTGTTCCTTTTAATAATA"}], "target_id": 142}, {"microhaplotypes": [{"seq": "CTAGAGACGAATTTGATGATAAAAGAAAATTAAAAGAAGAGAAAATTAAACAATGCCAACTATTAAATGAAAAACAACTAGAAGAAAAAGAAAAAGAAAAAAGAATTCTGAGAGAAAAAGCTGTTGAATATACCTTACAAAATGAAGAAGAATATAAACAACTAAAACGAAAATT"}, {"seq": "CTAGAGACGAATTTGATGATAAAATAAAATTAAAAGAAGAGAAAATTAAACAATGCCAACTATTAAATGAAAAACAACTAGAAGAAAAAGAAAAAGAAAAAAGAATTCTGAGAGAAAAAGCTGTTGAATATACCTTACAAAATGAAGAAGAATATAAACAACTAAAACGAAAATT"}, {"seq": "CTAGAGACGAATTTGATGATAAAAGAAAATTAAAAGAAGAGAAAATTAAACAATGCCAACTATTAAATGAAAAACAACTAGAAGAAAAAGAAAAAGAAAAAAGAATCCTGAGAGAAAAAGCTGTTGAATATACCTTACAAAATGAAGAAGAATATAAACAACTAAAACGAAAATT"}, {"seq": "CTAGAGACGAATTTGATGATAAAAGAAAATTAAAAGAAGAGAAAATTAAACAATGCCAACTATTAAATGAAAAACAACTAGAAGAAAAAGAAACAGAAAAAAGAATTCTGAGAGAAAAAGCTGTTGAATATACCTTACAAAATGAAGAAGAATATAAACAACTAAAACGAAAATT"}, {"seq": "CTAGAGACGAATTGGATGATAAAAGAAAATTAAAAGAAGAGAAAATTAAACAATGCCAACTATTAAATGAAAAACAACTAGAAGAAAAAGAAAAAGAAAAAAGAATTCTGAGAGAAAAAGCTGTTGAATATACCTTACAAAATGAAGAAGAATATAAACAACTAAAACGAAAATT"}, {"seq": "CTAGAGACGAATTTGATGATAAAAGAAAATTAAAAGAAGAGAAAATTAAACAATGCCAACTATTAAATGAAAAACAACGAGAAGAAAAAGAAAAAGAAGAAAGAATTCTGAGAGAAAAAGCTGTTGAATATACCTTACAAAATGAAGAAGAATATAAACAACTAAAACGAAAATT"}], "target_id": 143}, {"microhaplotypes": [{"seq": "ATGATGTAGATGCTAACACAACATCCTGGTCAGTATCTTGTGATAAATAATTTAATTTGTCCGCTAAAAAATAAAGTATAATTTCACAGCTTTTTTTATTTGTATCTGTGTTTTTCATGTTATCATAAAAAGACAAAGATGAAGTAGCACATGAGTTAATTA"}, {"seq": "ATGATGTAGATGCTAATAGCACATCCTGGTCAGTATCTTGTGATAAATAATTTAATTTATCCGCTAAAAAATAAAGTATAATTTCACAGCTTTTTTTATTTGTATCTGTGTTTTTCATGTTATCATAAAAAGACAAAGATGAAGTAGCACATGAGTTAATTA"}, {"seq": "ATGATGTAGATGCTAACACAACATCCTGGTCAGTATCTTGTGATAAATAATTTAATTTATCCGCTAAAAAATAAAGTATAATTTCACAGCTTTTTTTATTTGTATCTGTGTTTTTCATGTTATCATAAAAAGACAAAGATGAAGTAGCACATGAGTTAATTA"}, {"seq": "ATGATGTAGATGCTAATAGCACATCCTGGTCAGTATCTTGTGATAAATAATTTAATTTGTCCGCTAAAAAATAAAGTATAATTTCACAGCTTTTTTTATTTGTATCTGTGTTTTTCATGTTATCATAAAAAGACAAAGATGAAGTAGCACATGAGTTAATTA"}, {"seq": "ATGATGTAGATGCTAACACAACATCCTGGTCAGTATCTTGTGATAAATAATTTAATTTGTCCGCTAAAAAATAAAGTATAATTTCACAGCTTTTTTTATTTGTATCTGTGTTTTTCATGTTATCATAAAAAGACAAAGATGAAGTAGCACATGAATTAATTA"}], "target_id": 144}, {"microhaplotypes": [{"seq": "TACGAAATGATGAATTAAAAGAATTAACATTTATGAAAAATAAAGAAAATAGGAATGCAGATACATATGTTTTTCATTATCCTAAAAAAGAGAAATATGACCAATTAGTTTTTGAATTACGTAAACATAATTTTAATATAACAAGCATGAATACATATAAAAAACTAACAAATGAAACATCATCACAAAAAGAAGAAAATGCTTCTATAATAAGTT"}, {"seq": "TACGAAATGATGAATTAAAAGAATTAACATTTATGAAAAATAAAGAAAATAGGAATGCAGATACATATGTTTTTGATTATCCTAAAAAAGAGAAATATGACCAATTAGTTTTTGAATTACGTAAACATAATTTTAATATAACAAGCATGAATACATATAAAAAACTAACAAATGAAACATCATCACAAAAAGAAGAAAATGCTTCTATAATAAGTT"}, {"seq": "TACGAAATGATGAATTAAAAGAATTAACATTTATGAAAAATAAAGAAAATAGGAATGCAGATACATATGTTTTTCATTATCCTAAAAAAGAGAAATATGACCAATTAGTTTTTGAATTACGTAAACATAATTTTAATATAACAAGCATGAATACATATAAAAAACTAAATAATGAAACATCATCACAAAAAGAAGAAAATGCTTCTATAATAAGTT"}, {"seq": "TACGAAATGATGAATTAAAAGAATTAACATTTATGAAAAATAAAGAAAATAGGAATGCAGATACATATGTTTTTGATTATCCTAAAAAAGAGAAATATGACCAATTAGTTTTTGAATTACGTAAACATAATTTTAATATAACAAGCATAAATACATATAAAAAACTAAAAAATGAAACATCATCACAAAAAGAAGAAAATGCTTCTATAATAAGTT"}, {"seq": "TACGAAATGATGAATTAAAAGAATTAACATTTATGAAAAATAAAGAAAATAGGAATGCAGATACATATGTTTTTGATTATCCTAAAAAAGAGAAATATGACCAATTAGTTTTTGAATTACGTAAACATAATTTTAATATAACAAGCATTAATACATATAAAAAACTAACAAATGAAACATCATCACAAAAAGAAGAAAATGCTTCTATAATAAGTT"}, {"seq": "TACGAAATGATGAATTAAAAGAATTAACATTTATGAAAAATAAAGAAAATAGGAATGCAGATACATATGTTTTTGATTATCCTAAAAAAGAGAAATATGACCAATTAGTTTTTGAATTACGTAAACATAATTTTAATATAACAAGCATGAATACATATAAAAAACTAAATAATGAAACATCATCACAAAAAGAAGAAAATGCTTCTATAATAAGTT"}, {"seq": "TACGAAATGATGAATTAAAAGAATTAACATTTATGAAAAATAAAGAAAATAGGAATGCAGATACATATGTTTTTGATTATCCTAAAAAAGAGAAATATGACCAATTAGTTTTTGAATTACGTAAACATAATTTTAATATAACAAGCATCAATACATATAAAAAACTAAAAAATGAAACATCATCACAAAAAGAAGAAAATGCTTCTATAATAAGTT"}, {"seq": "TACGAAATGATGAATTAAAAGAATTAACATTTATGAAAAATAAAGAAAATAGGAATGCAGATACATATGTTTTTCATTATCCTAAAAAAGAGAAATATGACCAATTAGTTTTTGAATTACGTAAACATAATTTTAATATAACAAGCATTAATACATATAAAAAACTAACAAATGAAACATCATCACAAAAAGAAGAAAATGCTTCTATAATAAGTT"}, {"seq": "TACGAAATGATGAATTAAAAGAATTAACATTTATGAAAAATAAAGAAAATAGGAATGCAGATACATATGTTTTTCATTATCCTAAAAAAGAGAAATATGACCAATTAGTTTTTGAATTACGTAAACATAATTTTAATATAACAAGCATGAATACATATAAAAAACTAAAAAATGAAACATCATCACAAAAAGAAGAAAATGCTTCTATAATAAGTT"}, {"seq": "TACGAAATGATGAATTAAGAGAATTAACATTTATGAAAAATAAAGAAAATAGGAATGCAGATACATATGTTTTTGATTATCCTAAAAAAGAGAAATATGACCAATTAGTTTTTGAATTACGTAAACATAATTTTAATATAACAAGCATGAATACATATAAAAAACTAACAAATGAAACATCATCACAAAAAGAAGAAAATGCTTCTATAATAAGTT"}, {"seq": "TACGAAATGATGAATTAAAAGAATTAACATTTATGAAAAATAAAGAAAATAGGAATGCAGATACATATGTTTTTGATTATCCTAAAAAAGAGAAATATGACCAATTAGTTTTTGAATTACGTAAACATAATTTTAATATAACAAGCATTAATACATATAAAAAACTAAAAAATGAAACATCATCACAAAAAGAAGAAAATGCTTCTATAATAAGTT"}, {"seq": "TACGAAATGATGAATTAAAAGAATTAACATTTATGAAAAATAAAGAAAATAGGAATGCAGATACATATGTTTTTCATTATCCTAAAAAAGAGAAATATGACCAATTAGTTTTTGAATTACGTAAACATAATTTTAATATAACAAGCATAAATACATATAAAAAACTAACAAATGAAACATCATCACAAAAAGAAGAAAATGCTTCTATAATAAGTT"}, {"seq": "TACGAAATGATGAATTAAAAGAATTAACATTTATGAAAAATAAAGAAAATAGGAATGCAGATACATATGTTTTTCATTATCCTAAAAAAGAGAAATATGACCAATTAGTTTTTGAATTACGTAAACATAATTTTAATATAACAAGCATCAATACATATAAAAAACTAACAAATGAAACATCATCACAAAAAGAAGAAAATGCTTCTATAATAAGTT"}, {"seq": "TACGAAATGATGAATTAAAAGAATTAACATTTATGAAAAATAAAGAAAATAGGAATGCAGATACATATGTTTTTCATTATCCTAAAAAAGAGAAATATGACCAATTAGTTTTTGAATTACGTAAACATAATTTTAATATAACAAGCATTAATACATATAAAAAACTAAAAAATGAAACATCATCACAAAAAGAAGAAAATGCTTCTATAATAAGTT"}, {"seq": "TACGAAATGATGAATTAAAAGAATTAACATTTATGAAAAATAAAGAAAATAGGAATGCAGATACATATGTTTTTGATTATCCTAAAAAAGAGAAATATGACCAATTAGTTTTTGAATTACGTAAGCATAATTTTAATATAACAAGCATGAATACATATAAAAAACTAACAAATGAAACATCATCACAAAAAGAAGAAAATGCTTCTATAATAAGTT"}, {"seq": "TACGAAATGATGAATTAAGAGAATTAACATTTATGAAAAATAAAGAAAATAGGAATGCAGATACATATGTTTTTCATTATCCTAAAAAAGAGAAATATGACCAATTAGTTTTTGAATTACGTAAGCATAATTTTAATATAACAAGCATGAATACATATAAAAAACTAACAAATGAAACATCATCACAAAAAGAAGAAAATGCTTCTATAATAAGTT"}, {"seq": "TACGAAATGATGAATTAAAAGAATTAACATTTATGAAAAATAAAGAAAATAGGAATGCAGATACATATGTTTTTCATTATCCTAAAAAAGAGAAATATGACCAATTAGTTTTTGAATTACGTAAGCATAATTTTAATATAACAAGCATGAATACATATAAAAAACTAACAAATGAAACATCATCACAAAAAGAAGAAAATGCTTCTATAATAAGTT"}, {"seq": "TACGAAATGATGAATTAAAAGAATTAACATTTATGAAAAATAAAGAAAATAGGAATGCAGATACATATGTTTTTGATTATCCTAAAAAAGAGAAATATGACCAATTAGTTTTTGAATTACGTAAACATAATTTTAATATAACAAGCATGAATACATATAAAAAACTAAAAAATGAAACATCATCACAAAAAGAAGAAAATGCTTCTATAATAAGTT"}, {"seq": "TACGAAATGATGAATTAAAAGAATTAACATTTATGAAAAATAAAGAAAATAAGAATGCAGATACATATGTTTTTGATTATCCTAAAAAAGAGAAATATGACCAATTAGTTTTTGAATTACGTAAACATAATTTTAATATAACAAGCATTAATACATATAAAAAACTAAAAAATGAAACATCATCACAAAAAGAAGAAAATGCTTCTATAATAAGTT"}], "target_id": 145}, {"microhaplotypes": [{"seq": "GAGCCAACAATTTGATTTTCCACAACTTACTGAATCTTTAAAACATTGTGAACAGGTATCTGACATTTTTTTATTATCTTTGGCTAGTTCCTTTTGAACACATTCCATAGTACTATCACCTGAACCTAAGTTATCAACAGAACATTTTAATAATATACTAAAAAATTTATTGCTAGGAGAAAGTTGTAAA"}, {"seq": "GAGCCAACAATTTGATTTTCCACAACTTACTGAATCTTTAAAACATTGTGAACAGGTATTTGACATTTTTTTATTATCTTTGGCTAGTTCCTTTTGAACACATTCCATAGTACTATCACCTGAACCTAAGTTATCAACAGAACATTTTAATAATATACTAAAAAATTTATTGCTAGGAGAAAGTTGTAAA"}, {"seq": "GAGCCAACAATTTGATTTTCCACAACTTACTGAATCTTTAAAACATTGTGAACAGGTATATGACATTTTTTTATTATCTTTGGCTAGTTCCTTTTGAACACATTCCATAGTACTATCACCTGAACCTAAGTTATCAACAGAACATTTTAATAATATACTAAAAAATTTATTGCTAGGAGAAAGTTGTAAA"}, {"seq": "GAGCCAACAATTTGATTTTCCACAACTTACTGAATCTTTAAAACATTGTGAACAGGTATCTGACATTTTTTTATTATCTTTGGCTAGTTCCTTTTGAACACATTCCATAGTACTATTACCTGAACCTAAGTTATCAACAGAACATTTTAATAATATACTAAAAAATTTATTGCTAGGAGAAAGTTGTAAA"}, {"seq": "GAGCCAACAATTTGATTTTCCACAACTTACTGAATCTTTAAAACATTGTGAACAGGTATCTGACATTTTTTTATTATCTTTGGCTAGTTCCTTTTGAACACATTTCATAGTACTATCACCTGAACCTAAGTTATCAACAGAACATTTTAATAATATACTAAAAAATTTATTGCTAGGAGAAAGTTGTAAA"}, {"seq": "GAGCCAACAATTTGATTTTCCACAACTTACTGAATCTTTAAAACATTTTGAACAGGTATCTGACATTTTTTTATTATCTTTGGCTAGTTCCTTTTGAACACATTCCATAGTACTATCACCTGAACCTAAGTTATCAACAGAACATTTTAATAATATACTAAAAAATTTATTGCTAGGAGAAAGTTGTAAA"}], "target_id": 146}, {"microhaplotypes": [{"seq": "CAAAATAATATGAATAGTAATAGTAATAGTTATAATAATTTTAATATAACAGATAGAAGTAAAGAAATAAAAAAAAATTATAAAAGAAACAAAATTTTAATAGTTATTAATAATATTAATACAAATCATATTTTATTATTAAATGAAAGTGTTATAAAAAAAAAAATACTTACATTTTATCTAGATCTTTTTTTTGATGATAATGAACAAAT"}, {"seq": "CAAAATAATATGAATAGTAATAGTAATAGTTATAATAATTTTAATATAACAGATAGAAGTAAAGAAATAAAAAAAGATTATAAAAGAAACAAAATTTTAATAGTTATTAATAATATTAATACAAATCATATTTTATTATTAAATGAAAGTGTTATAAAAAAAAAAATACTTACATTTTATCTAGATCTTTTTTTTGATGATAATGAACAAAT"}, {"seq": "CAAAATAATATGAATAGTAATAGTAATAGTTATAATAATTTTAATATAACAGATAGAAGTAAAGAAATAAAAAAAGATTATAAAAGAAACAAAATTTTAATAGTTATTAATAATATTAATACAAATCATATTTTATTATTAAATGAAAGTGTTATAAAAAAAAAAATACTTACATTCTATCTAGATCTTTTTTTTGATGATAATGAACAAAT"}, {"seq": "CAAAATAATATGAATAGTAATAGTAATAGTTATAATAATTTTAATATAACTGATAGAAGTAAAGAAATAAAAAAAGATTATAAAAGAAACAAAATTTTAATAGTTATTAATAATATTAATACAAATCATATTTTATTATTAAATGAAAGTGTTATAAAAAAAAAAATACTTACATTTTATCTAGATCTTTTTTTTGATGATAATGAACAAAT"}], "target_id": 147}, {"microhaplotypes": [{"seq": "TTACATCGTAAAAATAATTTAAAATATTATATATATTATCTTTTCCTTTTGGGGGGTCTCTTTTCTTTATATATATATTTACATTTCTCTTCATTTTATTACATGATAAATTAATATTTAATGTACTAATATATATATTATTAATTTTTATTTTCTTCTTCTTTTTTATATTAAAACAAAATGAAGATTCTTTAA"}, {"seq": "TTACATCGTAAAAATAATTTAAAATATTATATATATTATCTTTTCCTTTTGGGGGGTCTCTTTTCTTTATATATATATTTACATTTCTCTTCATTTTATTACATGATAAATTTATATTTAATGTACTAATATATATATTATTAATTTTTATTTTCTTCTTCTTTTTTATATTAAAACAAAATGAAGATTCTTTAA"}, {"seq": "TTACATCGTAAAAATAATTTAAAATATTATATATATTATCTTTTCCTTTTGGGGGGTCTCTTTTCTTTATATATATATTTACATTTCTCTTCATTTTATTACATGATAAATTAATATTTAATGTACTAATATATATATTATTAATTTTTATTTTCTTCTTCTTTTTTATATTAAAACAAAATGAAGATTCTTTAT"}, {"seq": "TTACATCGTAAAAATAATTTAAAATATTATATATATTATCTTTTCCTTTTGGGGGGTCTCTTTTCTTTATATATATATTTACATTTCTCTTCATTTTATTACATGATAAATTTATATTTAATGTACTAATATATATATTATTAATTTTTATTTTCTTCTTCTTTTTTATATTAAAACAAAATGAAGATTCCTTAA"}, {"seq": "TTACATCGTAAAAATAATTTAAAATATTATATATATTATCTTTTCCTTTTGGGGGGGCTCTTTTCTTTATATATATATTTACATTTCTCTTCATTTTATTACATGATAAATTAATATTTAATGTACTAATATATATATTATTAATTTTTATTTTCTTCTTCTTTTTTATATTAAAACAAAATGAAGATTCTTTAA"}, {"seq": "TTACATCGTAAAAATAATTTAAAATATTATATATATTATCTTTTCCTTTTGGGGGGTCTCTTTTCTTTATATATATATTTACATTTCTCTTCATTTTATTACATGATAAATTAATATTTAATGTACTAATATATATATTATTAATTTTTATTTTCTTCTTCTTTTTTATATTAAAACAAAATGAAGATTCCTTAA"}, {"seq": "TTACATCGTAAAAATAATTTAAAATATTATATATATTATCTTTTCCTTTGGGGGGGTCTCTTTTCTTTATATATATATTTACATTTCTCTTCATTTTATTACATGATAAATTAATATTTAATGTACTAATATATATATTATTAATTTTTATTTTCTTCTTCTTTTTTATATTAAAACAAAATGAAGATTCTTTAA"}, {"seq": "TTACATCGTAAAAATAATTTAAAATATTATATATATTATCTTTTCCTTTTGGGGGGTCTCTTTTCTTTATATATAAATTTACATTTCTCTTCATTTTATTACATGATAAATTAATATTTAATGTACTAATATATATATTATTAATTTTTATTTTCTTCTTCTTTTTTATATTAAAACAAAATGAAGATTCTTTAA"}, {"seq": "TTACATCGTAAAAATAATTTAAAATATTATATATATTATCTTTTCCTTTTGGGGGGTCTCTTTTCTTTATATATATATTTACATTTCTCTTCATTTTATTACATGATAAATTAATATTTAATGTACTAATATATATATTATTAATTTTTATTTTCTTCTTCTTTTTTATATTAAAACAAAATGAAGACTCTTTAA"}, {"seq": "TTACATCGTAAAAATAATTTAAAATATTATATATATTATCTTTTCCTTTTGGGGGGTCTCTTTTCTTTATATATATATTTACATTTCTCTTCATTTTATTACATGATAAATTAATATTTAATGTACTAATATATATATTATTAATTTTTATTTTCTTCTTCTTTTTTATATTAAAACAAAATGAAGAGTCTTTAA"}, {"seq": "TTACATCGTAAAAATAATTTAAAATATTATATATATTATCTTTTCCTTTTGGGGGGTCTCTTTTCTTTATATATATATTTACATTTCTCTTCATTTTATTACATGATAAATTAATATTTAATGTACTAATATATATATTATTAATTTTTATTTTCTTCTTCTTTTTTATATTAAAACAAAATGAAGATTTTTTAA"}, {"seq": "TTACATCGTAAAAATAATTTAAAATATTATATATATTATCTTTTCCTTTTGGGGGGTCTCTTTTCTTTATATATATATTTACATTTCTCTTCATTTTATTACATGATAAATTAATATTTAATGTACTAATATATATATTATTCATTTTTATTTTCTTCTTCTTTTTTATATTAAAACAAAATGAAGATTCTTTAA"}], "target_id": 148}, {"microhaplotypes": [{"seq": "AAATTTTCTCCTAAAGTTATGCCTTTGTTAATGAAGGAGAAGAACGTGAAACATAAAGCACCTCCTAAAGGTACTATAAAGCATACGCTAGAATATTTAAAAAGAGCAGCAGAATCAAGAATGAAAGAAAATGAATTATACAAATCAAAAAAAGATAGCACACTTAGTTCAATTGCAATTAGAAAAAATTCC"}, {"seq": "AAATTTTCTCCTAAAGTTATGCCTTTGTTAATGAAGGAGAAGAACGTGAAACATAAAGCACCTCCTAAAGGTACTATAAAGCATACGCTAGAATATTTAAAAAGAGCAGGAGAATCAAGAATGAAAGAAAATGAATTATACAAATCAAAAAAAGATAGCACACTTAGTTCAATTGCAATTAGAAAAAATTCC"}, {"seq": "AAATTTTCTCCTAAAGTTATGCCTTTGTTAATGAAGGAGAAGAACGTGAAACATAAAGCACCTCCTAAAGGTATTATAAAGCATACGCTAGAATATTTAAAAAGAGCAGCAGAATCAAGAATGAAAGAAAATGAATTATACAAATCAAAAAAAGATAGCACACTTAGTTCAATTGCAATTAGAAAAAATTCC"}, {"seq": "AAATTTTCTCCTAAAGTTATGCCTTTGTTAATGAAGGAGAAGAACGTGAAAAATAAAGCACCTCCTAAAGGTACTATAAAGCATACGCTAGAATATTTAAAAAGAGCAGCAGAATCAAGAATGAAAGAAAATGAATTATACAAATCAAAAAAAGATAGCACACTTAGTTCAATTGCAATTAGAAAAAATTCC"}, {"seq": "AAATTTTCTCCTAAAGTTATGCCTTTGTTAATGAAGGAGAAGAACGTGAAACTTAAAGCACCTCCTAAAGGTACTATAAAGCATACGCTAGAATATTTAAAAAGAGCAGCAGAATCAAGAATGAAAGAAAATGAATTATACAAATCAAAAAAAGATAGCACACTTAGTTCAATTGCAATTAGAAAAAATTCC"}, {"seq": "AAATTTTCTCCTAAAGTTATGCCTTTGTTAATGAAGGAGAAGAACGTGAAACATAAAGCACCTCCTAAAGGTACTATAAAGCATACGCTAGAATATTTAAAAAGAGCAGCAGAATCAAGAATGAAAGAAAATGAATTATACAAATCAAAAAAAGATAGAACACTTAGTTCAATTGCAATTAGAAAAAATTCC"}, {"seq": "AAATTTTCTCCTAAAGTTATGCCTTTGTTAATGAAGGAGAAGAACGTGAAACATAAAGCACCTCCTAAAGGTACTATAAAGAATACGCTAGAATATTTAAAAAGAGCAGCAGAATCAAGAATGAAAGAAAATGAATTATACAAATCAAAAAAAGATAGCACACTTAGTTCAATTGCAATTAGAAAAAATTCC"}], "target_id": 149}, {"microhaplotypes": [{"seq": "TCTATATGATCCTTATTTTTATCTTCATCACATTTATAATTTACATAATTTTCGACGTCATCATTTTCATTATTACTCATAATTGAATTATCCACAATGTTTGCCTCTTTTACAGCTTTACAAAGTTGGTAAAAAATATGATAATTCCTTTCACCTTCTTGTTGATCACACACCCGAACC"}, {"seq": "TCTATATGATCCTTATTTTTATCTTCATCACATTTATAATTTACATAATTTTCGACGTCATCATTTTCATTATTACTCATAATTGAATTATCCACAATGCTTGCCTCTTTTACAGCTTTACAAAGTTGGTAAAAAATATGATAATTCCTTTCACCTTCTTGTTGATCACACACCCGAACC"}, {"seq": "TCTATATGATCCTTATTTTTATCTTCATCACATTTATAATTTACATAATTTTCGACGTCATCATTTTCATTATTACTCATAATTGAATTATCCACAATGTGTGCCTCTTTTACAGCTTTACAAAGTTGGTAAAAAATATGATAATTCCTTTCACCTTCTTGTTGATCACACACCCGAACC"}, {"seq": "TCTATATGATCCTTATTTTTATCTTCATCACATTTATAATTTACATAATTTTCGACGTCATCATTTTCATTATTACTCATAATTGAATTATCCACAAAGTTTGCCTCTTTTACAGCTTTACAAAGTTGGTAAAAAATATGATAATTCCTTTCACCTTCTTGTTGATCACACACCCGAACC"}], "target_id": 150}, {"microhaplotypes": [{"seq": "TGTCATATACAGATTATAAAAATGATCATAGAATAAGCGAAATCTTAAATCGTTGTATTTTACGATTAAACGAGTTTGATCTAATTCATTTATCTTCTTTGGTCATATCTTTAAGTAAAATGAATTTTAGGAGTGTGTATTTTCAGGAACAAGTACAAAAGAAATT"}, {"seq": "TGTCATATACAGATTATAAAAATGATCATAGAATAAGCGAAATTTTAAATCGTTGTATTTTACGATTAAACGAGTTTGATCTAATTCATTTATCTTCTTTGGTCATATCTTTAAGTAAAATGAATTTTAGGAGTGTGTATTTTCAGGAACAAGTACAAAAGAAATT"}, {"seq": "TGTCATATACAGATTATAAAAATGATCATAGAATAAGCGAAATTTTAAATCGTTGTATTTTACGATTAAACGAGTTTGATCTAATTCATTTATCTTCTTTGGTCATATCTTTAAGTAAAATGAATTTTAGGAGTGTGTATTTTCTGGAACAAGTACAAAAGAAATT"}, {"seq": "TGTCATATACAGATTATAAAAATGATCATAGAATAAGCGAAATTTTAAATCGTTGTATTTTACGATTAAACGAGTTTGATCTAATTCATTTATCTTCTTTGGTCATATCTTTAAGTAAAATGAATTTTAGGAGTGTGTATTTTATGGAACAAGTACAAAAGAAATT"}, {"seq": "TGTCATATACAGATTATAAAAATGATCATAGAATAAGCGAAATCTTAAATCGTTGTATTTTACGATTAAACGAGTTTGATCTAATTCATTTATCTTCTTTGGTCATATCTTTAAGTAAAATGAATTTTAGGAGTGTGTATTTTCTGGAACAAGTACAAAAGAAATT"}, {"seq": "TGTCATATACAGATTATAAAAATGATCATAGAATAAGCGAAATCTTAAATCGTTGTATTTTACGATTAAACGAGTTTGATCTAATTCATTTATCTTCTTTGGTCATATCTTTAAGTAAAATGAATTTTAGGAGTGTGTATTTTATGGAACAAGTACAAAAGAAATT"}, {"seq": "TGTCATATACAGATTATAAAAATGATCATAGAATAAGCGAAATCTTAAATCGTTGTATTTTACGATTAAACGAGTTTGATCTAATTCATTTATCTTCTTTGGTCATATCTTTAAGTAAAATGAATTTTAGGAGTGTGTATTTTCTGGAGCAAGTACAAAAGAAATT"}, {"seq": "TGTCATATACAGATTATAAAAATGATCATAGAATAAGCGAAATTTTAAATCGTTGTATTTTACGATTAAACGAGTTTGATCTAATTCATTTATCTTCTTTGGTCATATCTTTAAGTAAAATGAATTTTAGGAGTGTGTATTTTCTGGAAAAAGTACAAAAGAAATT"}, {"seq": "TGTCATATACAGATTATAAAAATGATCATAGAATAAGCGAAATTTTAAATCGTTGTATTTTACGATTAAACGAGTTTGATCTAATTCATTTATCTTCTTTGGTCATATCTTTAAGTAAAATGAATTTTAGGAGTGTGTATTTTCTGGAGCAAGTACAAAAGAAATT"}], "target_id": 151}, {"microhaplotypes": [{"seq": "TCTTTTATATTAGTTGTTTCGTTATTTTCATTATGTTCCATATTTTGGTTATTTGTATATTTTATATTTTTTAAAAATTGGTAAATATATTCCGAGATGAAAGGTGTAAAAGGGGCCATAATTATTGTAAACAAATATAATGTTCTACATAAAACATTTAATGATTGGTGAGT"}, {"seq": "TCTTTTATATTAGTTGTTTCGTTATTTTCATTATGTTCCATATTTTGGTTATTTGTATATTTTATATTTTTTAAAAATTGGTAAATATATTCAGAGATGAAAGGTGTAAAAGGGGCCATAATTATTGTAAACAAATATAATGTTCTACATAAAACATTTAATGATTGGTGAGT"}, {"seq": "TCTTTTATATTAGTTGTTTCGTTATTTTCATTATGTTCCATATTTTGGTTATTTGTATATTTTATATTTTTTAAAAATTGGTAAATATATTCCGAGATGAAAGGTGTAAAAGGGGCCATAATTATTGTAAACAAATATAATGTTCTACATAAAATATTTAATGATTGGTGAGT"}, {"seq": "TCTTTTATATTAGTTGTTGCGTTATTTTCATTATGTTCCATATTTTGGTTATTTGTATATTTTATATTTTTTAAAAATTGGTAAATATATTCCGAGATGAAAGGTGTAAAAGGGGCCATAATTATTGTAAACAAATATAATGTTCTACATAAAACATTTAATGATTGGTGAGT"}], "target_id": 152}, {"microhaplotypes": [{"seq": "TTTCATGTCTTCTTAAATATGTTTTAAATTCATTATTTAATTTTTCATCATATTTAGGTACATTTTTTTTTGGAAATCTAGATGTTTCATTATTATCGTGATTTGATGAATATATATAATGAGTTTGTTTAAAATGTGGTTCATTCAAATTATCTTTTTTCTTATCTTCGTGTATATTTTTATTATAATTTGAATACTTC"}, {"seq": "TTTCAGGTCTTCTTAAATATGTTTTAAATTCATTATTTAATTTTTCATCATATTTAGGTACATTTTTTTTTGGAAATCTAGATGTTTCATTATTATCGTGATTTGATGAATATATATAATGAGTTTGTTTAAAATGTGGTTCATTCAAATTATCTTTTTTCTTATCTTCGTGTATATTTTTATTATAATTTGAATACTTC"}, {"seq": "TTTCATGTCTTCTTAAATATGTTTTAAATTGATTATTTAATTTTTCATCATATTTAGGTACATTTTTTTTTGGAAATCTAGATGTTTCATTATTATCGTGATTTGATGAATATATATAATGAGTTTGTTTAAAATGTGGTTCATTCAAATTATCTTTTTTCTTATCTTCGTGTATATTTTTATTATAATTTGAATACTTC"}, {"seq": "TTTCATGTCTTCTTAAATATGTTTTAAATTCATTATTTAATTTTTCATCATATTTAGGTACATTTTTTTTTGGAAATCTAGATGTTTCATTATTATCGTGATTTGATGAATATATATAATGAGTTTGTTTAAAATGTGGTTTATTCAAATTATCTTTTTTCTTATCTTCGTGTATATTTTTATTATAATTTGAATACTTC"}, {"seq": "TTTCATGTCTTCTTAAATATGTTTTAAATTCATTATTTAATTTTTCATCATATTTAGGTACATTTTTTTTTGGAAATCTAGATGTTTCATTATTATCGTGATTTGATGAATATATATAATGAGTTTGAGTTTGTTTAAAATGTGGTTCATTCAAATTATCTTTTTTCTTATCTTCGTGTATATTTTTATTATAATTTGAATACTTC"}, {"seq": "TTTCATGTCTTCTTAAATATGTTTTAAATTCATTATTTAATTTTTCATCATATTTAGGTACATTTTTTTTTGGAAATCTAGATTTTTCATTATTATCGTGATTTGATGAATATATATAATGAGTTTGTTTAAAATGTGGTTCATTCAAATTATCTTTTTTCTTATCTTCGTGTATATTTTTATTATAATTTGAATACTTC"}, {"seq": "TTTCATGTCTTCTTAAATATGTTTTAAATTCATTATTTAATTTTTCATCATATTTAGGTACATTTTTTTTTGGAAATCTAGATGTTTCATTATTATCGTGATTTGATGAATATATATAATGAGTTTGTTTAAAATGTGGTTCATTCAAATTATCTATTTTCTTATCTTCGTGTATATTTTTATTATAATTTGAATACTTC"}, {"seq": "TTTCATGTCTTCTTAAATATGTTTTAAATTCATTATTTAATTTTTCATCATGTTTAGGTACATTTTTTTTTGGAAATCTAGATGTTTCATTATTATCGTGATTTGATGAATATATATAATGAGTTTGTTTAAAATGTGGTTCATTCAAATTATCTTTTTTCTTATCTTCGTGTATATTTTTATTATAATTTGAATACTTC"}, {"seq": "TTTCATGTCTTCTTAAATATGTTTTAAATTCATTATTTAATTTTTCATCATATTTAGGTACATTTTTTTTTGGAAATCTAGATGTTTCATTATTATCGTGATTTGATGAATATATATAATGAGTTTGTTTAAAATGTGGTTCATTCAAATTATCTTTTTTCTTATCTTCGTGTATATTTTTATTATAATTCGAATACTTC"}, {"seq": "TTTCATGTCTTCCTAAATATGTTTTAAATTCATTATTTAATTTTTCATCATATTTAGGTACATTTTTTTTTGGAAATCTAGATGTTTCATTATTATCGTGATTTGATGAATATATATAATGAGTTTGTTTAAAATGTGGTTCATTCAAATTATCTTTTTTCTTATCTTCGTGTATATTTTTATTATAATTTGAATACTTC"}], "target_id": 153}, {"microhaplotypes": [{"seq": "TTTTGAAATCTGTATATTTTTTATCATGTTCATCGAGATTTATTTTGTTCTCTTTGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTCTTTTCGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTTTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTTTTTATCATGTTCATCGAGATTTATTTTGTTCTTTTTGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTCTTTTTGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTCTTTACCATATTTATCGAGATTTATTTTGTTCTCTTCGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTCTTTTTGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTTTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTCTTTACCATATTTATCGAGATTTATTTTGTTCTCTTCGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATGTAGGTCTTTTTGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTCTTTACCATATTTATCGAGATTTATTTTGTTCTCTTCGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTTTTAACTAGGTCTTTTCGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTTTTTATCATGTTCATCGAGATTTATTTTGTTCTCTTTGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTCTTTTTGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTTTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTCTTTACCATATTTATCGAGATTTATTTTGTTCTCTTCGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTTTTAACTAGGTCTTTTCGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTTTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTTTTTACCATATTCATCGAGATTTATTTTGTTCTCTTTGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTTTTAACTAGGTCTTTTCGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTCTTTACCATATTCATCGAGATTTATTTTGTTCTCTTTGTTTGAAATATAAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTCTTTTCGAAATGTCGATTCTCCTCCTTGTGCTGGTTCTTGTACTTCTTTTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTCTTTACCATATTTATCGAGATTTATTTTGTTCTCTTCGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTCTTTTTGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTCTTTACCATATTCATCGAGATTTATTTTGTCCTCTTTGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTACCTAGGTCTTTTCGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTTTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTCTTTATCATATTCATCGAGATTTATTTTGTTCTCTTTGTTTGAAATATAAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTCTTTTCGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTTTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTTTTTATCATGTTCATCGAGATTTATTTTGTTCTCTTTGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTCTTTTCGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTTTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTTTTTACCATATTCATCGAGATTTATTTTGTTCTCTTCGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTCTTTTTGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTTTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTCTTTACCATATTTATCGAGATTTATTTTGTTCTCTTCGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATGTAGGTCTTTTTGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTTTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTTTTTATCATGTTCATCGAGATTTATTTTGTTCTCTTTGTTTGAAATATCAATTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTCTTTTCGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTTTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTCTTTACCATATTCATCGAGATTTATTTTGTCCTCTTTGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATGTAGGTCTTTTTGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTCTTTACCATATTTATCGAGATTTATTTTGTTCTCTTCGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTCTTTTTGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTTTTGTCCTTGTGTTGATATCTCTTGTTCATTTTCAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTTTTTATCATGTTCATCGAGATTTATTTTGTTCTCTTCGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTCTTTTTGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTTTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTCTTTACCATATTCATCGAGATTTATTTTGTTCTCTTTGTTTGAAATATAAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTCTTTTCGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTCTTTACCATATTCATCGAGTTTTATTTTGTTCTCTTCGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTCTTTTTGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTTTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTTTTTACCATATTCATCGAGATTTATTTTGTTCTCTTCGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTTTTAACTAGGTCTTTTCGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTTTTTATCATGTTCATCGAGATTTATTTTGTTCTCTTTGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATGTAGGTCTTTTTGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTTTTTATCATGTTCATCGAGATTTATTTTGTTCTTTTTGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTCTTTTTGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTTTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTCTTTACCATATTCATCGAGATTTATTTTGTTCTCTTTGTTTGAAATATAAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATGTAGGTCTTTTTGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTCTTTACCATATTTATCGAGATTTATTTTGTTCTCTTTTTTTTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTTTTTTTGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTCTTTACTATATTCATCGAGATTTATTTTGTTCTCTTTGTTTGAAATATAAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTCTTTTCGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTTTTTATCATGTTCATCGAGATTTATTTTGTTCTCTTTGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATGTAGGTCTTTTTGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTTTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTCTTTACCATATTCATCGAGATTTATTTTGTTCTCTTTGTTTGAAATATAAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTCTTTTCGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTTTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTTTTTATCATGTTCATCGAGATTTATTTTGTTCTCTTTGTTTGAAATATAAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTCTTTTCGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTGTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTCTTTACCATATTCATCGAGTTTTATTTTGTTCTCTTCGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTCTTTTCGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTTTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTCTTTACCATATTTATCGAGATTTATTTTGTTCTCTTCGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTCTTATCTAGGTCTTTTCGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTTTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAG"}, {"seq": "TTTTGAAATCTGTATATTCTTTACCATATTTATCGAGATTTATTTTGTTCTCTTCGTTTGAAATATCAACTACATGATTAAAAACATCTCCTAAATTATATAATTTTTTAACTAGGTCTTTTCGAAATGTCGATTCTCCTCCTTGTGCTGGTTTTTGTACTTCTTTTCCTTGTGTTGATATCTCTTGTTCATTTTTAGATTGAA"}], "target_id": 154}, {"microhaplotypes": [{"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTGGACAGAAGAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCATCTGGAACATCTAATGGTTCCCATTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTTTGGTTCTTCGACAGCAAAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCATGTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTCGTATTTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCGTTTGGTTTTTCGACAACAAAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCATGTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTAATTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTCGACAGCAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCATGTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTTTGGTTCTTCGACAGCAAAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCATGTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTGGACAGAAGAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCTTCTGGAACATCTAATGGTTCCCATTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTAATTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTCGACAGCAAAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCATCTGGAACATCTAATGGTTCCCATTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTTTAATTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTCGACAACAAAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCTTCTGGAACATCTAATGGTTCCCATTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTAATTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTCGACAACAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCATGTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTTTTCTGGTTTTTCGACAGCAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCATGTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCCTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTTTGGTTCTTCGACAGCAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCATGTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTGGACAGAAGAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCATCTGGAACATCTAATGGTTCCCATTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTCGTGTGAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTGGACAGCAAAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCATGTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTAATTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTTTGGTTTTTCGAAAGCAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCTTCTGGAACATCTAATGGTTCCCATTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTAATTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCGTTTGGTTTTTCGACAGCAAAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCATGTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTAATTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTGGACAGAAGAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGATTCATCTGGAACATCTAATGGTTCCCATTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCGTTTGGTTTTTCGACAGCAAAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCATCTGGAACATCTAATGGTTCCCGTTTTGGAAGACATCTTTCTTCTTCACATTGTTCTTGTAATTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTTTGGTTTTTCGAAAGCAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCTTCTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTAATTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTCGACAACAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCTTGTGGAACATCTAATGGTTCCCATTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTAATTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTGGACAGCAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCTTCTGGAACATCTAATGGTTCCCATTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTAATTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTGGACAGAAGAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCATCTGGAACATCTAATGGTTCCCATTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTTGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTTTGGTTTTTCGACAACAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCTTCTGGAACATCTAATGGTTCCCATTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTAATTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTTTGGTTTTTCGAAAGCAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCATGTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTCGTGTGAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTCGACAACAAAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCATGTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTAATTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTTTGGTTCTTCGACAGCAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCATGTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTTGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTTTGGTTTTTCGACAACAAAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCATGTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTTGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTTTGGTTTTTCGAAAGCAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCTTCTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCGTTTGGTTTTTCGACAGCAAAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCATCTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTAATTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTTTGGTTTTTCGACAGCAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCATGTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTTTTCTGGTTTTTCGACAGCAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCTTCTGGAACATCTAATGGTTCCCATTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTAATTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTGGACAGCAAAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCATCTGGAACATCTAATGGTTCCCGTTTTGGAAGACATCTTTCTTCTTCACATTGTTCTTGTAATTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTGGACAGCAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCATGTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTAATTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTTTTCTGGTTTTTCGACAGCAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCATGTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACAGTGTTCTTGTATTTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCGTTTGGTTTTTCGACAGCAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCATGTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTCGACAACAAAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCATCTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTAATTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTCGACAGCAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCTTCTGGAACATCTAATGGTTCCCATTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTAATTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTGGACAGAAGAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCATGTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTTTATTTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTTTTCTGGTTTTTCGACAGCAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCTTCTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTGGACAGAAGAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCTTCTGGAACATCTAATGGTTCCCATTTTGGAGGACATCTTTCTTCTTCACAGTGTTCTTGTAATTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTGGACAGAAGAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCATGTGGAACATCTAATGGTTCCCATTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTTTTCTGGTTTTTCGACAGCAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCTTCTGGAACATCTAATGGTTCCCATTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTCTGGTTTTTCGACAACAAAATTATCTCCTCTTGGTCTAGGTTCATCATCTTCGGGTTCATGTGGAACATCTAATGGTTCCCGTTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTTGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCGTTTGGTTTTTCGACAGCAAAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCATCTGGAACATCTAATGGTTCCCATTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}, {"seq": "TCTTGTGGATTATTATCTATTATATTTTCTTTTGGTTTTTCGACAGCAAAATTATCTCCTCTTGGTCTAGGTTGATCATCTTCGGGTTCATCTGGAACATCTAATGGTTCCCATTTTGGAGGACATCTTTCTTCTTCACATTGTTCTTGTATTTCACTTGTACATCCTTCGTGTAAGATTTCTCTTTTTCTTGACCTGGTACCTTTACCACAAGTTACACTACATGGAGA"}], "target_id": 155}, {"microhaplotypes": [{"seq": "CATAAAGGGTCCGATAACATTTTTTACATTTTCCCATGCAGAATCAGCATACAAGTTACATTTACCATCTGATGGATGACAACCTACAAGAAATCTGTTGAAAGCTACATTAATACCTTGTCCAATACCAAAAACAGCTATTTTAACACCACGATCACTTAATTTTCTTGATTCTTTTAATGAATCTTGAATACTAT"}, {"seq": "CATAAAGGGTCCGATAACATTTTTTACATTTTCCCATGCAGAATCAGCATACAAGTTACATTTACCATCTGATGGATGACAACCTACAAGAAATCTGTTGAAAGCTACATTAATACCTTGTCCAATACCAAAAACAGCTATTTTAACACCAAGATCATTTAATTTTCTTGATTCTTTTAATGAATCTTGAATACTAT"}, {"seq": "CATAAAGGGTACGATAACATTTTTTACATTTTCCCATGCAGAATCAGCATACAAGTTACATTTACCATCTGATGGATGACAACCTACAAGAAATCTGTTGAAAGCTACATTAATACCTTGTCCAATACCAAAAACAGCTATTTTAACACCAAGATCATTTAATTTTCTTGATTCTTTTAATGAATCTTGAATACTAT"}, {"seq": "CATAAAGGGTCCGATAACATTTTTTACATTTTCCCATGCAGAATCAGCATACAAGTTACATTTACCATCTGATGGATGACAACCTACAAGAAATCTGTTGAAAGCTACATTAATACCTTGTCCAATACCAAAAACAGCTATTTTAACACCAAGATCATTTAATTTTCTTGATTCTTTTAATGAACCTTGAATACTAT"}, {"seq": "CATAAAGGGTCCGATAACATTTTTTACATTTTCCCATGCAGAATCAGCATACAAGTTACATTTACCATCTGATGGATGACAACCTACAAGAAATCTGTTGAAAGCTACATTAATACCTTGTCCAATACCAAAAACAGCTATTTTAACACCACGATCATTTAATTTTCTTGATTCTTTTAATGAATCTTGAATACTAT"}, {"seq": "CATAAAGGGTCCGATAACATTTTTTACATTTTCCCATGCAGAATCAGCATACAAGTTACATTTACCATCTGATGGATGACAACCTACAAGAAATCTGTTGAAAGCTACATTAATACCTTGTCCAATACCAAAAACAGCTATTTTAACACCACGATCCTTTAATTTTCTTGATTCTTTTAATGAATCTTGAATACTAT"}, {"seq": "CATAAAGGGTACGATAACATTTTTTACATTTTCCCATGCAGAATCAGCATACAAGTTACATTTACCATCTGATGGATGACAACCTACAAGAAATCTGTTGAAAGCTACATTAATACCTTGTCCAATACCAAAAACAGCTATTTTAACACCACGATCATTTAATTTTCTTGATTCTTTTAATGAATCTTGAATACTAT"}, {"seq": "CATAAAGGGTCCGATAACATTTTTTACATTTTCCCATGCAGAATCAGCATACAAGTTACATTTACCATCTGATGGATGACAACCTACAAGAAATCTGTTGAAAGCTACATTAATTCCTTGTCCAATACCAAAAACAGCTATTTTAACACCAAGATCATTTAATTTTCTTGATTCTTTTAATGAATCTTGAATACTAT"}, {"seq": "CATAAAGGGTCCGATAACATTTTTTACATTTTCCCATGCAGAATCAGCATACAAGTTACATTTACCATCTGATGGATGACAACCTACAAGAAATCTGTTGAAAGCTACATTAATACCTTGTCCAATACCAAAAACAGCTATTTTAACACCACGATCATGTAATTTTCTTGATTCTTTTAATGAATCTTGAATACTAT"}, {"seq": "CATAAAGGGTACGATAACATTTTTTACATTTTCCCATGCAGAATCAGCATACAAGTTACATTTACCATCTGATGGATGACAACCTACAAGAAATCTGTTGAAAGCTACATTAATACCTTGTCCAATACCAAAAACAGCTATTTTAACACCACGATCACTTAATTTTCTTGATTCTTTTAATGAATCTTGAATACTAT"}], "target_id": 156}, {"microhaplotypes": [{"seq": "CGCCATTTTCTCCTCCTGTAATTATATAAGAATCTGACAATGTGGCAGCTCCAAAATTCATTTTTTTCTCTGGTACACCATTTAGAAATTGCCATCTTTTATTAAATGGTTGATATTGTTCAACGGAATCTAATATGTTATGTTCATTATCAATACCTCCAACAACATATATTTGATTAAGGTAATTAAAAGCTGCTCCTGAACTTCTAG"}], "target_id": 157}, {"microhaplotypes": [{"seq": "TGGAAATTGTTCCCATTTATTCATTTTTTCTTCATATACTTCAATAGAATTTAATCTCTCACCATTAGTTCCACCAATGACATAAATTTTATTATCAAAAGCAACACACATAGCTGATGATCTAGGGGTATTCAAAGGTGCCACCTCTACCCATGCTTTCATACGATGATCATATGCTTCTAC"}, {"seq": "TGGAAATTGTTCCCATTTATTCATTTTTTCTTCATATACTTCAATAGAATTTAATCTCTCACCATTAGTTCCACCAATGACATAAATTTTATTATCAAAAGCAACACACATAGATGATGATCTAGGGGTATTCAAAGGTGCCACCTCTACCCATGCTTTCATACGATGATCATATGCTTCTAC"}, {"seq": "TGGAAATTGTTCCCATTTATTCATTTTTTCTTCATATACTTCAATAGAGTTTAATCTCTCACCATTAGTTCCACCAATGACATAAATTTTATTATCAAAAGCAACACACATAGCTGATGATCTAGGGGTATTCAAAGGTGCCACCTCTACCCATGCTTTCATACGATGATCATATGCTTCTAC"}, {"seq": "TGGAAATTGTTCCCATTTATTCATTTTTTCTTCATATACTTCAATAGAATTTAATCTCTCACCATTAGTCCCACCAATGACATAAATTTTATTATCAAAAGCAACACACATAGCTGATGATCTAGGGGTATTCAAAGGTGCCACCTCTACCCATGCTTTCATACGATGATCATATGCTTCTAC"}], "target_id": 158}, {"microhaplotypes": [{"seq": "CATAAATTTTATTATCAAAAGCAACACACATAGCTGATGATCTAGGGGTATTCAAAGGTGCCACCTCTACCCATGCTTTCATACGATGATCATATGCTTCTACATTCGGTATAATAGAAGAGCCATCATATCCCCCAATACAATAAATTCTACCATTTGACGTAACACCACAATTATTTCTTCTAGGTATATTTAAATTACTTGAAAC"}, {"seq": "CATAAATTTTATTATCAAAAGCAACACACATAGATGATGATCTAGGGGTATTCAAAGGTGCCACCTCTACCCATGCTTTCATACGATGATCATATGCTTCTACATTCGGTATAATAGAAGAGCCATCATATCCCCCAATACAATAAATTCTACCATTTGACGTAACACCACAATTATTTCTTCTAGGTATATTTAAATTACTTGAAAC"}], "target_id": 159}, {"microhaplotypes": [{"seq": "ATTATTTCTTCTAGGTATATTTAAATTACTTGAAACATACCATACATCTCTTAAACGATCATACACCTCAGTTTCAAATAAAGCCTTATAATCATAGTTATTACCACCAAAAACGTATAAGAAATTATTCAATACAGCACTTCCAAAATAAGCTTTTTTGGTAGACATAGGTGTACACATACGCCAGCATTGTTGACTAATATCTAATAATTCCA"}, {"seq": "ATTATTTCTTCTAGGTATATTTAAATTACTTGAAACATACCATACATCTCTTAAACGATCATATACCTCAGTTTCAAATAAAGCCTTATAATCATAGTTATTACCACCAAAAACGTATAAGAAATTATTCAATACAGCACTTCCAAAATAAGCTTTTTTGGTAGACATAGGTGTACACATACGCCAGCATTGTTGACTAATATCTAATAATTCCA"}, {"seq": "ATTATTTCTTCTAGGTATATTTAAATTACTTGAAACATACCATACATCTCTTAAACGATCATACACCTCAGTTTCAAATAAAGCCTTATAATCATAGTTATTACCACCAAAAACGTATAAGAAATTATTCAATACAGCACTTCCAAAATAAGCTTTTTTCGTAGACATAGGTGTACACATACGCCAGCATTGTTGACTAATATCTAATAATTCCA"}, {"seq": "ATTATTTCTTCTAGGTATATTTAAATTACTTGAAACATACCATACATCTCTTAAACGATCATACACCTCAGTTTCAAATAAAGCCTTATAATCATAGTTATTACCACCAAAAACGTATAAGAAATTATTCAATACAGCACTTCCAAAATAAGCTTTTTTGGTAGACATAGGTGTACACATACGCCAACATTGTTGACTAATATCTAATAATTCCA"}, {"seq": "ATTATTTCTTCTAGGTATATTTAAATTACTTGAAACATACCATACATCTCTTAAACGATCATACACCTCAGTTTCAAATAAAGCCTTATAATCATAGTTATTACCGCCAAAAACGTATAAGAAATTATTCAATACAGCACTTCCAAAATAAGCTTTTTTGGTAGACATAGGTGTACACATACGCCAGCATTGTTGACTAATATCTAATAATTCCA"}], "target_id": 160}, {"microhaplotypes": [{"seq": "ATCATAGTTATTACCACCAAAAACGTATAAGAAATTATTCAATACAGCACTTCCAAAATAAGCTTTTTTGGTAGACATAGGTGTACACATACGCCAGCATTGTTGACTAATATCTAATAATTCCATCGAATTTAAATATTCTACACCATCAAATCCACCTATACAAAATACTAATGGGAATGGTAAAAATTTAATACCA"}, {"seq": "ATCATAGTTATTACCACCAAAAACGTATAAGAAATTATTCAATACAGCACTTCCAAAATAAGCTTTTTTCGTAGACATAGGTGTACACATACGCCAGCATTGTTGACTAATATCTAATAATTCCATCGAATTTAAATATTCTACACCATCAAATCCACCTATACAAAATACTAATGGGAATGGTAAAAATTTAATACCA"}, {"seq": "ATCATAGTTATTACCGCCAAAAACGTATAAGAAATTATTCAATACAGCACTTCCAAAATAAGCTTTTTTGGTAGACATAGGTGTACACATACGCCAGCATTGTTGACTAATATCTAATAATTCCATCGAATTTAAATATTCTACACCATCAAATCCACCTATACAAAATACTAATGGGAATGGTAAAAATTTAATACCA"}, {"seq": "ATCATAGTTATTACCACCAAAAACGTATAAGAAATTATTCAATACAGCACTTCCAAAATAAGCTTTTTTGGTAGACATAGGTGTACACATACGCCAACATTGTTGACTAATATCTAATAATTCCATCGAATTTAAATATTCTACACCATCAAATCCACCTATACAAAATACTAATGGGAATGGTAAAAATTTAATACCA"}], "target_id": 161}, {"microhaplotypes": [{"seq": "GGTATGGGTATAGTTAACGGATTTCTTAAGAAGTTAAGTATAATTCTAAATAACTCACTATCCCTATCTAAGAATATTCTTCCTTGTTTATCTCTGGTTACATGATGTCTTCCACTTAATAATTTCTCTATAAATGAATCTTTTTGTTGTGTTAAGGTATGTCTAGATGTTTCAAAAATAG"}], "target_id": 162}, {"microhaplotypes": [{"seq": "AAATAGCTCCACCAACATTAATATCAATCATAGTTTCAGTAGCAATATTTGCATCAACAATTTTTTTTTTATCATTCTCAAAATTTTTATATTCTTGATAATATTTTTCTTTTTCTAAATATAATACTAATTTAATTTTATCGATTTCTTGTAAAAATCTTAATCTTTCTTCATCAA"}, {"seq": "AAATAGCTCCACCAACATTAATATCAATCATAGTTTCAGTAGCAATATTTGCATCAACAATTTTTTTTTTATCATTCTCAAAATTTTTATATTCTTGATAATATTTTTCTTTTTCTAAATATAATACTAATTTAATTTTATCAATTTCTTGTAAAAATCTTAATCTTTCTTCATCAA"}], "target_id": 163}, {"microhaplotypes": [{"seq": "CAAATCGTTTCCTATGTTCTTCTTTTTCTTTTTTTATTTGTTTATAACCATTAGATATATCAATATCTAATTTCTTTCTTTCATCATGTAATTTCTGTTCTTCAATATTTTTACGGTTTTCTAATTCTTTGTACAATCGTACTCTTTCCATTTCTAGTTCTTTCTTATCTTTAAATAATT"}, {"seq": "CAAATCGTTTCCTATGTTCTTCTTTTTCTTTTTTTATTTGTTTATAACCATTAGATATATCAATATCTAATTTCTTTCTTTCATCATGTAATTTCTGTTCTTCAATATTTTTACGGTTTTCTAATTCTTTGTACATTCGTACTCTTTCCATTTCTAGTTCTTTCTTATCTTTAAATAATT"}, {"seq": "CAAATCGTTTCCTATGTTCTTCTTTTTCTTTTTTTATTTGTTTATAACCATTAGATATATCAATATCTAATTTCTTTCTTTCATCATGTAATTTCTGTTCTTCAATATTTTTACGGTTTTCTAATTCTTTGTACAATCGTACTTTTTCCATTTCTAGTTCTTTCTTATCTTTAAATAATT"}], "target_id": 164}, {"microhaplotypes": [{"seq": "TTTCTAATTCTTTGTACAATCGTACTCTTTCCATTTCTAGTTCTTTCTTATCTTTAAATAATTTATCTTTTTCTCGAATAAAATTCATTTGTGTCTTTTTTAACCAATTAATAAATGTAATTCTTAAATCACCTACCATATTTTCAAAATCACTAGCATCACTTAAT"}, {"seq": "TTTCTAATTCTTTGTACATTCGTACTCTTTCCATTTCTAGTTCTTTCTTATCTTTAAATAATTTATCTTTTTCTCGAATAAAATTCATTTGTGTCTTTTTTAACCAATTAATAAATGTAATTCTTAAATCACCTACCATATTTTCAAAATCACTAGCATCACTTAAT"}, {"seq": "TTTCTAATTCTTTGTACAATCGTACTTTTTCCATTTCTAGTTCTTTCTTATCTTTAAATAATTTATCTTTTTCTCGAATAAAATTCATTTGTGTCTTTTTTAACCAATTAATAAATGTAATTCTTAAATCACCTACCATATTTTCAAAATCACTAGCATCACTTAAT"}, {"seq": "TTTCTAATTCTTTGTACAATCGTACTCTTTCCATTTCTAGTTCTTTCTTATCTTTAAATAATTTATCTTTTTCTCGAATAAAATTCATTTGTGTCTTTTTTAACCAATTAATAAATGTAATTCTTAAATCACCTACCATATTTTCAAAATCACTCGCATCACTTAAT"}], "target_id": 165}, {"microhaplotypes": [{"seq": "TATCAATGGATTCTAATAGGCTATCTTTAACATTTCCATAACTACTATTATTTAAAAGGAAACTATTATTTTCCGTTTTCTCATTTTTATCACTAGTTAGATTCATAAATGAATTAGAATCATTCTCGCTACTACTTCCGCTTTTATCATCACTATTGCTGTTACCACCAGATTCCCTATCATACGTCATAGAAAAATTCGAGATACTAT"}, {"seq": "TATCAATGGATTCTAATAGGCTATCTTTAACATTTCCATAACTACTATTATTTAAAAGGAAACTATTATTTTCCGTTTTCTCATTTTTATCACTAGTTAGATTCATAAATGAATTAGAATCATTCTCGCTACTACTTCCGCTTTTATCATCACTATTGCTGTTACCACCAGATTCCCTATCATACGTCATAGAAAAATTCGATATACTAT"}], "target_id": 166}, {"microhaplotypes": [{"seq": "TACTATCTGTAAAAGTATGTTTAGAACTAACATTTGAAGAGAAGTTACATCCGTGTATGACTTTTTTTTCATATTTTGGTTTTAAAACTATTTTATAATTATTATTTTTAAATTTGCATGTACATTCTGTATTAACATCTTTTGATGTAACATAAAATGGAGCTTTAAAGATAGTTAAGTTTTTATGATAAATTATTTTATTACTTTTATATA"}, {"seq": "AACTATCTGTAAAAGTATGTTTAGAACTAACATTTGAAGAGAAGTTACATCCGTGTATGACTTTTTTTTCATATTTTGGTTTTAAAACTATTTTATAATTATTATTTTTAAATTTGCATGTACATTCTGTATTAACATCTTTTGATGTAACATAAAATGGAGCTTTAAAGATAGTTAAGTTTTTATGATAAATTATTTTATTACTTTTATATA"}, {"seq": "TACTATCTGTAAAAGTATGTTTAGAACTAACATTTGAAGAGAAGTTACATCCGTGTATGACTTTTTTTTCATATTTTGGTTTTAAAACTATTTTATAATTATTATTTTTAAATTTGCATGTACATTCTGTATTAACATCTTTTGATGTAACATAAAATGGAGCTTTAAAGATAGTTAACTTTTTATGATAAATTATTTTATTACTTTTATATA"}, {"seq": "AACTATCTGTAAAAGTATGTTTAGAACTAACATTTGAAGAGAAGTTACATCCGTGTATGACTTTTTTTTCATATTTTGGTTTTAAAACTATTTTATAATTATTATTTTTAAATTTGCATGTACATTCTGTATTAACATCTTTTGATGTAACATAAAATGGAGCTTTAAAGATAGTTAACTTTTCATGATAAATTATTTTATTACTTTTATATA"}, {"seq": "TACTATCTGTAAAAGTATGTTTAGAACTAACATTTGAAGAGAAGTTACATCCGTGTATGACTTTTTTTTCATATTTTGGTTTTAAAACTATTTTATAATTATTATTTTTAAATTTGCATGTACATTCTGTATTAACATCTTTTGATGTAACATAAAATGGAGCTTTAAAGATAGTTAACTTTTCATGATAAATTATTTTATTACTTTTATATA"}, {"seq": "AACTATCTGTAAAAGTATGTTTAGAACTATCATTTGAAGAGAAGTTACATCCGTGTATGACTTTTTTTTCATATTTTGGTTTTAAAACTATTTTATAATTATTATTTTTAAATTTGCATGTACATTCTGTATTAACATCTTTTGATGTAACATAAAATGGAGCTTTAAAGATAGTTAACTTTTTATGATAAATTATTTTATTACTTTTATATA"}, {"seq": "AACTATCTGTAAAAGTATGTTTAGAACTAACATTTGAAGAGAAGTTACATCCGTGTATGACTTTTTTTTCATATTTTGGTTTTAAAACTATTTTATAATTATTATTTTTAAATTTGCATGTACATTCTGTATTAACATCTTTTGATGTAACATAAAATGGAGCTTTAAAGATAGTTAACTTTTTATGATAAATTATTTTATTACTTTTATATA"}, {"seq": "AACTATCTGTAAAAGTATGTTTAGAACTATCATTTGAAGAGAAGTTACATCCGTGTATGACTTTTTTTTCATATTTTGGTTTTAAAACTATTTTATAATTATTATTTTTAAATTTGCATGTACATTCTGTATTAACATCTTTTGATGTAACATAAAATGGAGCTTTAAAGATAGTTAAGTTTTTATGATAAATTATTTTATTACTTTTATATA"}, {"seq": "AACTATCTGTAAAAGTATGTTTAGAACTAACATTTGAAGAGAAGTTACATCCGTGTATGACTTTTTTTTCATATTTTGGTTTTAAAACTATTTTATAATTATTATTTTTAAATTTGCATGTACATTCTGTATTAACATCTTTTGATGTAACATAAAATGGAGCTTTAAATATAGTTAACTTTTTATGATAAATTATTTTATTACTTTTATATA"}, {"seq": "TACTATCTGTAAAAGTATGTTTAGAACTAACATTTGAAGAGAAGTTACATCCGTGTATGACTTTTTTTTCATATTTTGGTTTTAAAACTATTTTATAATTATTATTTTTAAATTTGCATGTACATTCTGTATTAACATCTTTTGATGTAACATAAAATGGAGCTTTAAAGATAGTTAACTTATTATGATAAATTATTTTATTACTTTTATATA"}, {"seq": "AACTATCTGTAAAAGTATGTTTAGAACTAACATTTGAAGAGAAGTTACATCCGTGTATGACTTTTTTTTCATATTTTGGTTTTAAAACTATTTTATAATTATTATTTTTAAATTTGCATGTACATTCTGTATTAACATCTTTTGATGTAACATAAAATGGAGCTTTAAAGATAGTTAACTTATTATGATAAATTATTTTATTACTTTTATATA"}, {"seq": "TACTATCTGTAAAAGTATGTTTAGAACTAACATTTGAAGAGAAGTTACATCCGTGTATGACTTTTTTTTCATATTTTGGTTTTAAAACTATTTTATAATTATTATTTTTAAATTTGCATGTACATTCTGTATTAACATCTTTTGATGTAACATAAAATGGAGCTTTAAATATAGTTAACTTTTTATGATAAATTATTTTATTACTTTTATATA"}], "target_id": 167}, {"microhaplotypes": [{"seq": "CTTCCATTAACTCAATATATAATTTATTAATAATTTTTAATTTGTTTATTTCAAAAAGGCATAGTTGTAACAAGGTTCTTAAGGTTCTATTACCCCCTAAGAGGTTAAAATGAATATTTCCTTTTTCTCGTATATGCAAAAAATCCCTTAACAATAAATCATATTCATCAGTATGAAATGT"}, {"seq": "CTTCCATTAACTCAATATATAATTTATTAATAATTTTTAATTTGTTTATTTCAAAAAGGCATAGTTTTAACATGGTTCTTAAGGTTCTATTACCCCCTAAGAGGTTAAAATGAATATTTCCTTTTTCTCGTATATGCAAAAAATCCCTTAACAATAAATCATATTCATCAGTATGAAATGT"}, {"seq": "CTTCCATTAACTCAATATATAATTTATTAATAATTTTTAATTTGTTTATTTCAAAAAGGCATAGTTTTAACAAGGTTCTTAAGGTTCTATTACCCCCTAAGAGGTTAAAATGAATATTTCCTTTTTCTCGTATATGCAAAAAATCCCTTAACAATAAATCATATTCATCAGTATGAAATGT"}, {"seq": "CTTCCATTAACTCAATATATAATTTATTAATAATTTTTAATTTGTTTATTTCAAAAAGGCATAGTTTTAACAAGGCTCTTAAGGTTCTATTACCCCCTAAGAGGTTAAAATGAATATTTCCTTTTTCTCGTATATGCAAAAAATCCCTTAACAATAAATCATATTCATCAGTATGAAATGT"}, {"seq": "CTTCCATTAACTCAATATATAATTTATTAATAATTTTTAATTTGTTTATTTCAAAAAGGCATAGTTGTAACAAGGCTCTTAAGGTTCTATTACCCCCTAAGAGGTTAAAATGAATATTTCCTTTTTCTCGTATATGCAAAAAATCCCTTAACAATAAATCATATTCATCAGTATGAAATGT"}, {"seq": "CTTCCATTAACTCAATATATAATTTATTAATAATTTTTAATTTGTTTATTTCAAAAAGGCATAGTTGTAACAAGGATCTTAAGGTTCTATTACCCCCTAAGAGGTTAAAATGAATATTTCCTTTTTCTCGTATATGCAAAAAATCCCTTAACAATAAATCATATTCATCAGTATGAAATGT"}, {"seq": "CTTCCATTAACTCAATATATAATTTATTAATAATTTTTAATTTGTTTATTTCAAAAAGGCATAGTTGTAACAAGGTTCTTAAGTTTCTATTACCCCCTAAGAGGTTAAAATGAATATTTCCTTTTTCTCGTATATGCAAAAAATCCCTTAACAATAAATCATATTCATCAGTATGAAATGT"}, {"seq": "CTTCCATTAACTCAATATATAATTTATTAATAATTTTTAATTTGTTTATTTCAAAAAGGCATAGTTGTAACATGGTTCTTAAGGTTCTATTACCCCCTAAGAGGTTAAAATGAATATTTCCTTTTTCTCGTATATGCAAAAAATCCCTTAACAATAAATCATATTCATCAGTATGAAATGT"}, {"seq": "CTTCCATTAACTCAATATATAATTTATTAATAATTTTTAATTTGTTTATTTCAAAGAGGCATAGTTTTAACACGGCTCTTAAGGTTCTATTACCCCCTAAGAGGTTAAAATGAATATTTCCTTTTTCTCGTATATGCAAAAAATCCCTTAACAATAAATCATATTCATCAGTATGAAATGT"}, {"seq": "CTTCCATTAACTCAATATATAATTTATTAATAATTTTTAATTTGTTTATTTCAAAAAGGCATAGTTTTAACAAGGTTCTTAAGTTTCTATTACCCCCTAAGAGGTTAAAATGAATATTTCCTTTTTCTCGTATATGCAAAAAATCCCTTAACAATAAATCATATTCATCAGTATGAAATGT"}], "target_id": 168}, {"microhaplotypes": [{"seq": "ATTCAATATATATAAAAATATAGCTAATAAACATTTCAAATCTCCATTAAGAACTTTATTCATCTTAACAAAAGCTCTATGAACTTCTGTATCTATAGTCGATTTTGTTATTCTAAGCATATCATTAAGTAAAAAATTTACGGTATCGACATTAACAGTGTAATAATTTCTTCCTAAATTTAAATGTTCTAAATAATTCAA"}, {"seq": "ATTCAATATATATAAAAATATAGCTAATAAACATTTCAAATCTCCATTAAGAACTTTATTCATCTTAACAAAAGCTCTATGAACTTCTGTATCTATAGTCGATTTTGTTATTCTAAGCATATCATTAAGTAAAAAATTTACGGTATCGACATTAACAGTGTAATAATTTCTTCCTAAATTTAAATGTTCTATATAATTCAA"}, {"seq": "ATTCAATATATATAAAAATATAGCTAATAAACATTTCAAATCTCCATTAAGAACTTTATTCATCTTAACAAAAGCTCTATGAACTTCTGTATCTATAGTCGATTTTGTTATTCTAAGCATATCATTAAGTAAAAAATTTACGGTATCGACATTAACAGTGTAATAATGTCTTCCTAAATTTAAATGTTCTAAATAATTCAA"}, {"seq": "ATTCAATATATATAAAAATATAGCTAATAAACATTTCAAATCTCCATTAAGAACTTTATTCATCTTAACAAAAGCTCTATGAACTTCTGTATCTATAGTCGATTTTGTTATTCTAAGCATATCATTAAGTAAAAAATTTACGGTATCGACATTAACAGTGTAATAATTTCCTCCTAAATTTAAATGTTCTAAATAATTCAA"}, {"seq": "ATTCAATATATATAAAAATATAGCTAATAAACATTTCAAATCTCCATTAAGAACTTTATTCATCTTAACAAAAGCTCTATGAACTTCTGTATCTATAGTCGATTTTGTTATTCTAAGCATATCATTAAGTAAAAAATTTATGGTATCGACATTAACAGTGTAATAATTTCTTCCTAAATTTAAATGTTCTAAATAATTCAA"}, {"seq": "ATTCAATATATATAAAAATATAGCTAATAAACATTTCAAATCTCCATTAAGAACTTTATTCATCTTAACAAAAGCTCTATGAACTTCTGTATCTATAGTCGATTTTGTTATTCTAAGCATATCATTAAGTAAAAAATTTAAGGTATCGACATTAACAGTGTAATAATTTCTTCCTAAATTTAAATGTTCTAAATAATTCAA"}], "target_id": 169}, {"microhaplotypes": [{"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGGATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATACATCTTGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCGTGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAAACATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCATGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAAAGATTTATTTTTAAGAAAGATTTCCATATATTCATATATATCTTGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTTTTATTTTTGAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATACATCTTGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACCTTTGGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGGATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTTTTATTTTTGAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCATGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTTTTATTTTTGAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGAATACCCCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACCTTTGGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTCGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATACATCTTGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTCGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGGATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACCTTTGGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAAACATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAAAAAGATTTCCATATATTCATATATATCTTGAATACACCA"}, {"seq": "ATGATTCCCCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTTTTATTTTTAAAAAAGGATATATCATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACCTTTGGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAACGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACCTTTGGTTATTTTTATTTTTGAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTCGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGCTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTCTTATTTTTAAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGTATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAACGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAAACATTTATTTTTGAGAAAGATTTCCATATATTCATATACATCTTGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTTTTATTTTTAAAAAAGGATATATGATCATCTAAGGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGAATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTTTTATTTTGAAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGGATACACCA"}, {"seq": "ATGATTCCTCAAAAGTTTAACATTCCACATAGTATCTGTTAAATTGATAGTTTGCAAACAATTATACGTTTGGTTATTTTTATTTTTGAAAAAGGATATATGATCATCTAAAGATTTATTTTTGAGAAAGATTTCCATATATTCATATATATCTTGGATACACCA"}], "target_id": 170}, {"microhaplotypes": [{"seq": "AATGACATGAACAAGTCAGGCGAAAAAGAGGAACATGTTATAAATAGTAAATGGAAAAATAAATTTTTCCATGAAGTTATACAAAATATGTTATATGATGATAATATAAATGATCATAAAGAAGAAATTAAGGAAGATAATTCTAATGAATATAATATCAATAATAAAAATGATAATTTATATGATATA"}, {"seq": "AATGACATGAACAAGTCAGGCGAAAAAGAGGAACATGTTATAAATAGTAAATGGAAAAATAAATTTTTCCATGAAGTAATACAAAATATGTTATATGATGATAATATAAATGATCATAAGGAAGAAATTAAGGAAGATAATTCTAATGAATATAATATCAATAATAAAAATGATAATTTATATGATATA"}, {"seq": "AATGACATGAACAAGTCAGGCGAAAAAGAGGAACATGTTATAAATAGTAAATGGAAAAATAAATTTTTCCATGAAGTTATACAAAATATGTTATATGATGATAATATAAATGATCATAAGGAAGAAATTAAGGAAGATAATTCTAATGAATATAATATCAATAATAAAAATGATAATTTATATGATATA"}, {"seq": "AATGACATGAACAAGTCAGGCGAAAAAGAGGAACATGTTATAAATAGTAAATGGAAAAATAAATTTTTCCATGAAGTAATACAAAATATGTTATATGATGATAATATAAATGATCATAAAGAAGAAATTAAGGAAGATAATTCTAATGAATATAATATCAATAATAAAAATGATAATTTATATGATATA"}, {"seq": "AATGACATGAACAAGTCAGGCGAAAAAGAGGAACATGTTATAAATAGTAAATGGAAAAATAAATTTTTCCATGAAGTAATACAAAATATGTTATATGATGATAATATAAATGATCATAAGGAAGAAATTAAGGAAGATAATTCTAATGAATATAATATCAATAATAAAAATGATAATTTATATGATACA"}, {"seq": "AATGACATGAACAAGTCAGGCGAAAAAGAGGAACATGTTATAAACAGTAAATGGAAAAATAAATTTTTCCATGAAGTTATACAAAATATGTTATATGATGATAATATAAATGATCATAAAGAAGAAATTAAGGAAGATAATTCTAATGAATATAATATCAATAATAAAAATGATAATTTATATGATATA"}], "target_id": 171}, {"microhaplotypes": [{"seq": "TTTTACAACATTATTTTTTTCTTCCTCCTCAGATAAAATAGGTACACATATCGCGTCCTTATCACATCCTCCATTGTTTACCTTACAATGTTCTTCGCATTCGAAATTTTTTTCAGGATTACTTGAAAAGCCTTCTGGACAATTACAATATTCATATCCATGAGTATTCTTACAAACACCTTTTCCACAATTTAAAA"}, {"seq": "TTTTACAACATTATTTTTTTCTTCCTCCTCAGATAAAATAGGTACACATATCGCGTCCTTATCACATCCTCCATTGTTTACCTTACAATGTTCTTCGCATTCGAAATTTTTTTCAGGATTACTTGAAAAGCCTTCTGGACAATTACAATATTCATATCCATGAGCATTCTTACAAACACCTTTTCCACAATTTAAAA"}, {"seq": "TTTTACAACATTATTTTTTTCTTCCTCCTCAGATAAAATAGGTACACATATCGCGTCCTTATCACATCCTCCATTGTTTACCTTACAATGTTCTTCGCATTCGAAATTTTTTTCAGGATTACTTGAAAAGCCTTCTGGACAATTACAATATTCATATCCATGAACATTCTTACAAACACCTTTTCCACAATTTAAAA"}, {"seq": "TTTTACAACATTATTTTTTTCTTCCTCCTCAGATAAAATAGGTACACATATCGCGTCCTTATCACATCCTCCATTGTTTACCTTACAATGTTCTTCGCATTCGAAATTTTTTTCAGGATTACTTGAAAAGCCTTCTGGACAATTACAATATTCATATCCATGATCATTCTTACAAACACCTTTTCCACAATTTAAAA"}, {"seq": "TTTTACAACATTATTTTTTTCTTCCTCCTCAGATAAAATAGGTACACATATCGCGTCCTTATCACATCCTCCATTGTTTACCTTACAATGTTCTTCGCATTCGAAATTTTTTTCAGGATTACTTGAAAAACCTTCTGGACAATTACAATATTCATATCCATGAACATTCTTACAAACACCTTTTCCACAATTTAAAA"}, {"seq": "TTTTACAACATTATTTTTTTCTTCCTCCTGAGATAAAATAGGTACACATATCGCGTCCTTATCACATCCTCCATTGTTTACCTTACAATGTTCTTCGCATTCGAAATTTTTTTCAGGATTACTTGAAAAGCCTTCTGGACAATTACAATATTCATATCCATGAGTATTCTTACAAACACCTTTTCCACAATTTAAAA"}, {"seq": "TTTTACAACATTATTTTTTTCTTCCTCCTCAGATAAAATAGGTACACATATCGCGTCCTTATCACATCCTCCATTGTTTACCTTACAATGTTCTTCGCATTCGAAATTTTTTTCAGGATTACTTGAAAAGCCTTCTGGACAATTACAATATTCATATCCATGAGAATTCTTACAAACACCTTTTCCACAATTTAAAA"}, {"seq": "TTTTACAACATTATTTTTTTCTTCCTCCTGAGATAAAATAGGTACACATATCGCGTCCTTATCACATCCTCCATTGTTTACCTTACAATGTTCTTCGCATTCGAAATTTTTTTCAGGATTACTTGAAAAGCCTTCTGGACAATTACAATATTCATATCCATGAGCATTCTTACAAACACCTTTTCCACAATTTAAAA"}, {"seq": "TTTTACAACATTATTTTTTTCTTCCTCCTCAGATAAAATAGGTACACATATCGCGTCCTTATCACATCCTCCATTGTTTACCTTACAATGTTCTTCGCATTCGAAATTTTTTTCAGGATTACTTGAAAAGCCTTCTGGACAATTACAATATTCATATCCATGAGCATTCCTACAAACACCTTTTCCACAATTTAAAA"}], "target_id": 172}, {"microhaplotypes": [{"seq": "ACCATTCATATTTTCTAGGTTTGTTTAACCAATTACATATATATAATATATTACAAAATAATTGTTTTAATAATATATGTTTAGTTAATATTAATTCAATACTACTTAATTTATTTCTTATATTTTTTAAAAGATCTTCATAAACAAAATCAAAATTATCTATTAATAATAAATAACCAAATCTTTTATGTACATTTTTTATTC"}, {"seq": "ACCATTCATATTTTCTAGGTTTGTTTAACCAATTACATATATATAATATATTACAAAATAATTGTTTTAATAATATATGTTTAGTTAATATTAATTCAATACTACTTAATTTATTTCTTATATTTTTTAAAAGATCTTCATAAACAAAATCAAAATTATCTATTAATAATAAATAACCAAATCTTTTATGCACATTTTTTATTC"}, {"seq": "ACCATTCATATTTTCGAGGTTTGTTTAACCAATTACATATATATAATATATTACAAAATAATTGTTTTAATAATATATGTTTAGTTAATATTAATTCAATACTACTTAATTTATTTCTTATATTTTTTAAAAGATCTTCATAAACAAAATCAAAATTATCTATTAATAATAAATAACCAAATCTTTTATGCACATTTTTTATTC"}], "target_id": 173}, {"microhaplotypes": [{"seq": "CATTTTTCTTTTAAATGAGAGCAATATATTTCTTAGGTTTATTCCGGATAAATGTTTAGTTATTAGCCAGGTGAGTAATAGTGATTCATATAAGGTAAATTGTATTAATTTCTCTGAAGGATTTTGTTGCTGTCATCCAATAAATAATTTAGCACTATTATATGGAGAGTATCAACAAAATCAAGAATCAAAAATTATGAAATTACCG"}, {"seq": "CATTTTTCTTTTAAATGAGAGCAATATATTTCTTAGGTTTATTCCGGATAAATGTTTAGTTATTAGCCAGGTGAGTTATAGTGATTCATATAAGGTAAATTGTATTAATTTCTCTGAAGGATTTTGTTGCTGTCATCCAATAAATAATTTAGCACTATTATATGGAGAGTATCAACAAAATCAAGAATCAAAAATTATCAAATTACCG"}, {"seq": "CATTTTTCTTTTAAATGAGAGCAATATATTTCTTAGGTTTATTCCGGATAAATGTTTAGTTATTAGCCAGGTGAATTATAGTGATTCATATAAGGTAAATTGTATTAATTTCTCTGAAGGATTTTGTTGCTGTCATCCAATAAATAATTTAGCACTATTATATGGAGAGTATCAACAAAATCAAGAATCAAAAATTATGAAATTACCG"}, {"seq": "CATTTTTCTTTTAAATGAGAGCAATATATTTCTTAGGTTTATTCCGGATAAATGTTTAGTTATTAGCCAGGTGAGTTATAGTGATTCATATAAGGTAAATTGTATTAATTTCTCTGAAGGATTTTGTTGCTGTCATCCAATAAATAATTTAGCACTATTATATGGAGAGTATCAACAAAATCAAGAATCAAAAATTATGAAATTACCG"}, {"seq": "CATTTTTCTTTTAAATGAGAGCAATATATTTCTTAGGTTTATTCCGGATAAATGTTTAGTTATTAGCCAGGTGAGTTATAGTGATTCATATAAGGTAAATTGTATTAATTTCTCTGAAGGATTTTGTTGCTGTCATCCAATAAATAATTTAGCACTATTATATGGAGAGTATCAACAAAATCAAGAATCAAAAATTATAAAATTACCG"}, {"seq": "CATTTTTCTTTTAAATGAGAGCAATATATTTCTTAGGTTTATTCCGGATAAATGTTTAGTTATTAGCCAGGTGAGTTATAGTGATTCATATAAGGTAAATTGTATTAATTTCTCTGAAGGATTTTGTTGCTGTCATCCAATAAATAATTTAGCACTATTATATGGAGAGTATCAACAAAATCAAGAATCAAACATTATGAAATTACCG"}, {"seq": "CATTTTCCTTTTAAATGAGAGCAATATATTTCTTAGGTTTATTCCGGATAAATGTTTAGTTATTAGCCAGGTGAGTAATAGTGATTCATATAAGGTAAATTGTATTAATTTCTCTGAAGGATTTTGTTGCTGTCATCCAATAAATAATTTAGCACTATTATATGGAGAGTATCAACAAAATCAAGAATCAAAAATTATGAAATTACCG"}, {"seq": "CATTTTTCTTTTAAATGAGAGCAATATATTTCTTAGGTTTATTCCGGATAAATGTTTAGTTATTAGCCAGGTGAGTTATAGTGATTCATATAAGGTAAATTGTATTAATTTCTCTGAAGGATTTTGTTGTTGTCATCCAATAAATAATTTAGCACTATTATATGGAGAGTATCAACAAAATCAAGAATCAAAAATTATCAAATTACCG"}, {"seq": "CATTTTTCTTTTAAATGAAAGCAATATATTTCTTAGGTTTATTCCGGATAAATGTTTAGTTATTAGCCAGGTGAGTAATAGTGATTCATATAAGGTAAATTGTATTAATTTCTCTGAAGGATTTTGTTGCTGTCATCCAATAAATAATTTAGCACTATTATATGGAGAGTATCAACAAAATCAAGAATCAAAAATTATGAAATTACCG"}, {"seq": "CATTTTTCTTTTAAATGAGAGCAATATATTTCTTAGGTTTATTCCGGATAAATGTTTAGTTATTAGCCAGGTGAGTAATAGTGATTCATATAAGGTAAATTGTATTAATTTCTCTGAAGGATTTTGTTGCTGTCATCCAATAAATAATTTAGCACTATTATATGGAGAGTATCAACAAAATCAAGAATCAAAAATTATCAAATTACCG"}, {"seq": "CATTTTTCTTTTAAATGAGAGCAATATATTTCTTAGGTTTATTCCGGATAAATGTTTAGTTATTAGCCAGGTGAGTAATAGTGATTCATATAAGGTAAATTGTATTAATTTCTCTGAAGGATTTTGTTGCTGTCATCCAATAAATAATTTAGCACTATTATATGGAGAGTATCAACAAAATCAAGAATCAAAAATTATAAAATTACCG"}], "target_id": 174}, {"microhaplotypes": [{"seq": "AAGCACATATGTAAAAGAGAGCTTCAAATTTTTTAAATCAGGTTATGCACAAAAAGGATATTTAGGAAGTGAAAATGACAGTATTGAATTAGATGATGTTGCTAATTTAATGTTTTATGGTGAAGGACAAATTGGAACTAATAAACAACCATTTATGTTTATTTTCGATA"}, {"seq": "AAGCACATATGTAAAAGAGAGCTTCAAATTTTTTAAATCAGGTTATGCACATAAAGGATATTTAGGAAGTGAAAATGACAGTATTGAATTAGATGATGTTGCTAATTTAATGTTTTATGGTGAAGGACAAATTGGAACTAATAAACAACCATTTATGTTTATTTTCGATA"}], "target_id": 175}, {"microhaplotypes": [{"seq": "TTAAATCATGACTTATATTGGCAAATAGATTTAGATATACACTTTGGTAAATATGTCATGCAAAAAGCAAATGCTGTTGTTGATAGTGGTACAAGTACTATAACAGCACCAACCAGTTTTCTTAATAAATTCTTTAGAGATATGAATGTTATTAAAGTACCATTCTTACCATTATAT"}, {"seq": "TTAAATCATGACTTATATTGGCAAATAGATTTAGATATACACTTTGGTAAATATGTCATGCAAAAAGCAAATGCTGTTGTTGATAGTGGTACAAGTACTATAACAGCACCAACCAGTTTTCTTAATAAATTCTTTACAGATATGAATGTTATTAAAGTACCATTCTTACCATTATAT"}], "target_id": 176}, {"microhaplotypes": [{"seq": "ATCTTATAGATAATGTATTATTCCCAAAAAATAAAAAGATAAATGAAATTATGAATACCTCAAAACATGTAATAATTGGATTTAGTATTGAAAATTCTCATGACAGAATTATGAAAACAGTAAAACAACACAGATTAAAAAATTATATTAAAGAATCCTTGAAATTTTTCAAAACAGGACTTACACAAAAACCACATTTAG"}, {"seq": "ATCTTATAGATAATGTATTATTCCCAAAAAATAAAAAGATAAATGAAATTATGAATACCTCAAAACATGTAATAATTGGATTTAGTATTGAAAATTCTCATGACAGAATTATGAAAACAGTAAAACAACACAGATTAAAAAATTATATTAAGGAATCCTTGAAATTTTTCAAAACAGGACTTACACAAAAACCACATTTAG"}], "target_id": 177}, {"microhaplotypes": [{"seq": "CACCAACTGAATTCCTTAACAAATTCTTTGAAGGTTTAGATGTTGTTAAAATACCTTTCTTACCATTATATATAACTACATGTAATAACCCTAAATTACCAACTCTAGAATTCAGATCAGCAACAAATGTTTATACCTTAGAACCAGAATACTACTTACAACAAATATTCGATTTTGGTATATCATT"}, {"seq": "CACCAACTGAATTCCTTAACAAATTCTTTGAAGGTTTAGATGTTGTTAAAATACCTTTCTTACCATTATATATAACTACATGTAATAACCCTAAATTACCAACTCTAGAATTCAGATCAGCAACAAATGTTTATACATTAGAACCAGAATACTACTTACAACAAATATTCGATTTTGGTATATCATT"}, {"seq": "CACCAACTGAATTCCTTAACAAATTCTTTGAAGGTTTAGATGTTGTTAAAATACCTTTCTTACCATTATATATAACTACATGTAATAACCCTAAATTACCAACTCTAGAATTCAGATCAGCAACAAATGTTTATACATTAGAACCAGAATACTACTTACAACGAATATTCGATTTTGGTATATCATT"}, {"seq": "CACCAGCTGAATTCCTTAACAAATTCTTTGAAGGTTTAGATGTTGTTAAAATACCTTTCTTACCATTATATATAACTACATGTAATAACCCTAAATTACCAACTCTAGAATTCAGATCAGCAACAAATGTTTATACCTTAGAACCAGAATACTACTTACAACAAATATTCGATTTTGGTATATCATT"}, {"seq": "CACCAACTGAATTCCTTAACAAATTCTTTGAAGGTTTAGATGTTGTTAAAATACCTATCTTACCATTATATATAACTACATGTAATAACCCTAAATTACCAACTCTAGAATTCAGATCAGCAACAAATGTTTATACCTTAGAACCAGAATACTACTTACAACAAATATTCGATTTTGGTATATCATT"}], "target_id": 178}, {"microhaplotypes": [{"seq": "TTTTGTAGTGTAATGTGTGGTTTATTTTATTATGTGTATGAAAATGTATGGCTTCAAAGAGATAATGAAATGAATGAAATTTTAAAAAATTCCGAACATTTAACTATTGGATTTAAAGTTGAAAATGCACATGATAGAATTTTGAAAACTATAAAAACACATAAATTAAAAAATTACATTAAAGAAT"}], "target_id": 179}, {"microhaplotypes": [{"seq": "CAGAATTTAGATGTTATCAAAGTCCCATTCTTACCTTTCTATGTAACTCTTTGTAACAACAGCAAATTACCAACTTTTGAATTTACCTCAGAAAATGGTAAATACACATTAGAACCTGAATACTACCTTCAACACATAGAAGATGTTGGTCCAGGATTATGTATGCTTAATATCATAGGATTAGATTTTCCAGTACCAACCTTTA"}, {"seq": "CAGAATTTAGATGTTATCAAAGTCCCATTCTTACCTTTCTATGTAACTCTTTGTAACAACAGCAAATTACCAACTTTTGAATTTACCTCAGAAAATGGTAAATACACATTAGAACCTGAATACTACCTTCAACACATAGAAGATGTTGGTCCAGGATTATGTATGCTTAATATCATAGGATTAAATTTTCCAGTACCAACCTTTA"}, {"seq": "CAGAATTTAGATGTTATCAAAGTCCCATTCTTACCTTTCTATGTAACTCTTTGTAACAACAGCAAATTACCAACTTTTGAATTTACCTCAGAAAATGGTAAATACACATTAGAACCTGAATACTACCTTCAACACATAGAAGATGTTGGTCCAGGATTATGTATGCTTAATGTCATAGGATTAGATTTTCCAGTACCAACCTTTA"}, {"seq": "CAGAATTTAGATGTTATCAAAGTCCCATTCTTACCTTTCTATGTAACTCTTTGTAACAACAGCAAATTACCAACTTTTGAATTTATCTCAGAAAATGGTAAATACACATTAGAACCTGAATACTACCTTCAACACATAGAAGATGTTGGTCCAGGATTATGTATGCTTAATATCATAGGATTAGATTTTCCAGTACCAACCTTTA"}, {"seq": "CAGAATTTAGATGTTATCAAAGTCCCATTCTTACCTTTCTATGTAACTCTTTGTAACAACAGCAAATTACCAACTTTTGAATTTACCTCAGAAAATGGTAAATACACATTAGAACCTGAATACTACCTTCAACACATAGAAGATGTTGGTCCAGGATTATGTATGCTTAATATCATAGGATTAGATTTTCCAGTATCAACCTTTA"}, {"seq": "CAGAATTTAGATGTTATCAAAGTCCCATTCTTACCTTTCTATGTAACTCTTTGTAACAACAGCAAATTACCAACTTTTGAATTTACCTCAGAAAATGGTAAATACACATTAGAACCTGAATACTACCTTCAACACATAGAAGATGTTGGTCCAGGATTATGTATGCTTAATATCATAGGATTAGATTTTCCATTACCAACCTTTA"}], "target_id": 180}, {"microhaplotypes": [{"seq": "AATTTAGATGTTATCAAAGTCCCATTCTTACCTTTCTATGTAACTCTTTGTAACAACAGCAAATTACCAACTTTTGAATTTACCTCAGAAAATGGTAAATACACATTAGAACCTGAATACTACCTTCAACACATAGAAGATGTTGGTCCAGGATTATGTATGCTTAATATCATAGGATTAGATTTTCCAGT"}, {"seq": "AATTTAGATGTTATCAAAGTCCCATTCTTACCTTTCTATGTAACTCTTTGTAACAACAGCAAATTACCAACTTTTGAATTTACCTCAGAAAATGGTAAATACACATTAGAACCTGAATACTACCTTCAACACATAGAAGATGTTGGTCCAGGATTATGTATGCTTAATATCATAGGATTAAATTTTCCAGT"}, {"seq": "AATTTAGATGTTATCAAAGTCCCATTCTTACCTTTCTATGTAACTCTTTGTAACAACAGCAAATTACCAACTTTTGAATTTACCTCAGAAAATGGTAAATACACATTAGAACCTGAATACTACCTTCAACACATAGAAGATGTTGGTCCAGGATTATGTATGCTTAATGTCATAGGATTAGATTTTCCAGT"}, {"seq": "AATTTAGATGTTATCAAAGTCCCATTCTTACCTTTCTATGTAACTCTTTGTAACAACAGCAAATTACCAACTTTTGAATTTATCTCAGAAAATGGTAAATACACATTAGAACCTGAATACTACCTTCAACACATAGAAGATGTTGGTCCAGGATTATGTATGCTTAATATCATAGGATTAGATTTTCCAGT"}, {"seq": "AATTTAGATGTTATCAAAGTCCCATTCTTACCTTTCTATGTAACTCTTTGTAACAACAGCAAATTACCAACTTTTGAATTTACCTCAGAAAATGGTAAATACACATTAGAACCTGAATACTACCTTCAACACATAGAAGATGTTGGTCCAGGATTATGTATGCTTAATATCATAGGATTAGATTTTCCATT"}], "target_id": 181}, {"microhaplotypes": [{"seq": "AGGAGGTTTTTCTTATTATATTTTTGAAAATTTCGTTTTTCAAAAGAACCGTAAAATTAATCACATAATTAAGACTTCAAAATATTCGACAGTAGGATTTAATATTGAAAATTCTTATGATAGACTTATGAAAACAATTAAAGAGCATAAATTAAAAAATTATATAAAAGAATCAGTAAAACTTTTTAATAAAGGTTTAACCAAAAA"}, {"seq": "AGGAGGTTTTTCTTATTATATTTTTGAAAATTTCGTTTTTCAAAAGAACCGTCAAATTAATCACATAATTAAGACTTCAAAATATTCGACAGTAGGATTTAATATTGAAAATTCTTATGATAGACTTATGAAAACAATTAAAGAGCATAAATTAAAAAATTATATAAAAGAATCAGTAAAACTTTTTAATAAAGGTTTAACCAAAAA"}, {"seq": "AGGAGGTTTTTCTTATTATATTTTTGAAAATTTCGTTTTTCAAAAGAACCGTAAAATTAATCACATAATTAAGACTTCAAAATATTCGACAGTAGGATTTAATATTGAAAATTCTTATGATAGACTTATGAAAACAATTAAAGAGCATAAATTAAAAAATTATATAAAAGAATCAGTAAAACTTTTTAATAAAGGATTAACCAAAAA"}], "target_id": 182}, {"microhaplotypes": [{"seq": "ACCCAGTATAAAATGTACATCAGAGTCTTGTGAAAGTAAAAATCATTATGATTCATCAAAATCAAAAACATATGAAAAAGATGATACGCCTGTTAAATTGACAAGTAAAGCTGGTACAATAAGTGGAATATTTAGTAAAGATTTAGTAACTATTGGTAAATTATCAG"}, {"seq": "ACCCAGTATAAAATGTACATCAGAGTCTTGTGAAAGTAAAAATCATTATGATTCATCAAAATCAAAAACATATGAAAAAGATGATACGCCTGTTAAATTGACAAGTAAAGCTGGTACAATAAGTGGAATATTTAGTAAGGATTTAGTAACTATTGGTAAATTATCAG"}], "target_id": 183}, {"microhaplotypes": [{"seq": "ACGATTTAATGTGGCAAGTTGATTTAGATGTACATTTTGGTAATGTATCTTCCAAAAAAGCAAACGTTATTTTAGATAGTGCCACCAGTGTCATAACTGTACCAACAGAATTTTTTAATCAATTCGTAGAATCTGCAAGTGTTTTCAAAGTTCCATTCTTATCTTTGTATGTAACCACTTGTGGTAACACGAAATTACCAA"}, {"seq": "ACGATTTAATGTGGCAAGTTGATTTAGATGTACATTTTGGTAATGTATCTTCCAAAAAAGCAAACGTTATTTTAGATAGTGTCACCAGTGTCATAACTGTACCAACAGAATTTTTTAATCAATTCGTAGAATCTGCAAGTGTTTTCAAAGTTCCATTCTTATCTTTGTATGTAACCACTTGTGGTAACACGAAATTACCAA"}, {"seq": "ACGATTTAATGTGGCAAGTTGATTTAGATGTACATTTTGGTAATGTATCTTCCAAAAAAGCAAAAGTTATTTTAGATAGTGCCACCAGTGTCATAACTGTACCAACAGAATTTTTTAATCAATTCGTAGAATCTGCAAGTGTTTTCAAAGTTCCATTCTTATCTTTGTATGTAACCACTTGTGGTAACACGAAATTACCAA"}], "target_id": 184}, {"microhaplotypes": [{"seq": "AAAGATATATCAACTGAAAAGATTTTATCAAATAATTGCTTTAATAATAAGTTAAAAAATTGATTTCCAATATCTATCATATTCATATAATCTAATGATTTAAAAATATATAATATACTCTTTGGACTAAATTTTAATTCATCATTTATTATTCTCTCTTTTACTATTGTTTTAATTTGATTAAAATATATAA"}, {"seq": "AAAGATATATCAACTGAAAAGATTTTATCAAATAATTGCTTTAATAATAAGTTAAAAAATTGATTTCCAACATCTATCATATTCATATAATCTAATGATTTAAAAATATATAATATACTCTTTGGACTAAATTTTAATTCATCATTTATTATTTTCTCTTTTACTATTGCTTTAATTTGATTAAAATATATAA"}, {"seq": "AAAGATATATCAACTGAAAAGATTTTATCAAATAATTGCTTTAATAATAAGTTAAAAAATTGATTTCCAATATCTATCATATTCATATAATCTAATGATTTAAAAATATATAATATACTCTTTGGACTAAATTTTAATTCATCATTTATTATTTTCTCTTTTACTATTGCTTTAATTTGATTAAAATATATAA"}, {"seq": "AAAGATATATCAACTGAAAATATTTTATCAAATAATTGCTTTAATAATAAGTTAAAAAATTGATTTCCAACATCTATCATATTCATATAATCTAATGATTTAAAAATATATAATATACTCTTTGGACTAAATTTTAATTCATCATTTATTATTTTCTCTTTTACTATTGCTTTAATTTGATTAAAATATATAA"}, {"seq": "AAAGATATATCAACTGAAAATATTTTATCAAATAATTGCTTTAATAATAAGTTAAAAAATTGATTTCCAACATCTATCATATTCATATAATCTAATGATTTAAAAATATATAATATACTCTTTGGACTAAATTTTAATTCATCATTTATTATTCTCTCTTTTACTATTGTTTTAATTTGATTAAAATATATAA"}, {"seq": "AAAGATATATCAACTGAAAATATTTTATCAAATAATTGCTTTAATAATAAGTTAAAAAATTGATTTCCAATATCTATCATATTCATATAATCTAATGATTTAAAAATATATAATATACTCTTTGGACTAAATTTTAATTCATCATTTATTATTCTCTCTTTTACTATTGTTTTAATTTGATTAAAATATATAA"}, {"seq": "AAAGATATATCAACTGAAAAGATTTTATCAAATAATTGCTTTAATAATAAGTTAAAAAATTGATTTCCAATATCTATCATATTCATATAATCTAATGATTTAAAAATATATAATATACTCTTTGGACTAAATTTTAATTCATCATTTATTATTCTCTCTTTTACTATTGCTTTAATTTGATTAAAATATATAA"}, {"seq": "AAAGATATATCAACTGAAAAGATTTTATCAAATAATTGCTTTAATAATAAGTTAAAAAATTGATTTCCAACATCTATCATATTCATATAATCTAATGATTTAAAAATATATAATATACTCTTTGGACTAAATTTTAATTCATCATTTATTATTCTCTCTTTTACTATTGTTTTAATTTGATTAAAATATATAA"}, {"seq": "AAAGATATATCAACTGAAAATATTTTATCAAATAATTGCTTTAATAATAAGTTAAAAAATTGATTTCCAATATCTATCATATTCATATAATCTAATGATTTAAAAATATATAATATACTCTTTGGACTAAATTTTAATTCATCATTTATTATTTTCTCTTTTACTATTGCTTTAATTTGATTAAAATATATAA"}, {"seq": "AAAGATATATCAACTGAAAATATTTTATCAAATAATTGCTTTAATAATAAGTTAAAAAATTGATTTCCAACATCTATCATATTCATATAATCTAATGATTTAAAAATATATAATATACTCTTTGGACTAAATTTTAATTCATCATTTATTATTCTCTCTTTTACTATTGCTTTAATTTGATTAAAATATATAA"}, {"seq": "AAAGATATATCAACTGAAAAGATTTTATCAAATAATTGCTTTAATAATAAGTTAAAAAATTGATTTCCAACATCTATCATATTCATATAATCTAATGATTTAAAAATATATAATATACTCTTTGGACTAAATTTTAATTCATCATTTATTATTCTCTCTTTTACTATTGCTTTAATTTGATTAAAATATATAA"}, {"seq": "AAAGATATATCAACTGAAAATATTTTATCAAATAATTGCTTTAATAATAAGTTAAAAAATTGATTTCCAATATCTATCATATTCATATAATCTAATGATTTAAAAATATATAATATACTCTTTGGACTAAATTTTAATTCATCATTTATTATTCTCTCTTTTACTATTGCTTTAATTTGATTAAAATATATAA"}, {"seq": "AAAGATATATCAACTGAAAATATTTTATCAAATAATTGCTTTAATAATAAGTTAAAAAATTGATTTCCAACATCTATCATATTCATATAATCTAATGATTTAAAAATATATAATATACTCTTTGGACTAAATTTTAATTCATCATTTATTATTTTCTCTTTTACTATTGTTTTAATTTGATTAAAATATATAA"}], "target_id": 185}, {"microhaplotypes": [{"seq": "CTTTCTTTCGTCTTTCTGTTCATTATCCATATAATCTTTTTCTCCTTCCTTTTCATTCTTTACTTTATTTCTATTAATACACAACTCTCCTTGAGTTAAGAGATTTACGATATTATCAATATTGTTTTCTTTCATATACTTCAACTTTTTACTATTCATTTTTAAAAGA"}, {"seq": "CTTTCTTTCGTCTTTCTGTTCATTATCCATATAATCTTTTTCTACTACCTTTTCATTCTTTACTTTATTTCTATTAATACACAACTCTCCTTGAGTTAAGAGATTTACGATATTATCAATATTGTTTTCTTTCATATACTTCAACTTTTTACTATTCATTTTTAAAAGA"}, {"seq": "CTTTCTTTCGTCTTTCTGTTCATTATCCATATAATCTTTTTCTACTACCTTTTCATTCTTTACTTTATTTCTATTAATACACAATTCTCCTTGAGTTAAGAGATTTACGATATTATCAATATTGTTTTCTTTCATATACTTCAACTTTTTACTATTCATTTTTAAAAGA"}, {"seq": "CTTTCTTTCGTCTTTCTGTTCATTATCCATATAATCTTTTTCTCCTTCCTTTTCATTCTTTACTTTATTTCTATTAATACACAATTCTCCTTGAGTTAAGAGATTTACGATATTATCAATATTGTTTTCTTTCATATACTTCAACTTTTTACTATTCATTTTTAAAAGA"}, {"seq": "CTTTCTTTCGTCTTTGTTTTCATTATCCATATAATCTTTTTCTACTACCTTTTCATTCTTTACTTTATTTCTATTAATACACAACTCTCCTTGAGTTAAGAGATTTACGATATTATCAATATTGTTTTCTTTCATATACTTCAACTTTTTACTATTCATTTTTAAAAGA"}, {"seq": "CTTTCTTTCGTCTTTGTTTTCATTATCCATATAATCTTTTTCTCCTTCCTTTTCATTCTTTACTTTATTTCTATTAATACACAACTCTCCTTGAGTTAAGAGATTTACGATATTATCAATATTGTTTTCTTTCATATACTTCAACTTTTTACTATTCATTTTTAAAAGA"}, {"seq": "CTTTCTTTCGTCTTTCTGTTCATTATCCATATAATCTTTTTCTCCTTCCTTTTCATTATTTGCTTTATTTCTATTAATACACAATTCTCCTTGAGTTAAGAGATTTACGATATTATCAATATTGTTTTCTTTCATATACTTCAACTTTTTACTATTCATTTTTAAAAGA"}, {"seq": "CTTTCTTTCGTCTTTCTGTTCATTATCCATATAATCTTTTTCTACTACCTTTTTATTCTTTACTTTATTTCTATTAATACACAACTCTCCTTGAGTTAAGAGATTTACGATATTATCAATATTGTTTTCTTTCATATACTTCAACTTTTTACTATTCATTTTTAAAAGA"}, {"seq": "CTTTCTTTCGTCTTTCTGTTCATTATCCATATAATCTTTTTCTCCTTCCTTTTCATTATTTGCTTTATTTCTATTAATACACAACTCTCCTTGAGTTAAGAGATTTACGATATTATCAATATTGTTTTCTTTCATATACTTCAACTTTTTACTATTCATTTTTAAAAGA"}, {"seq": "CTTTCTTTCGTCTTTGTTTTCATTATCCATATAATCTTTTTCTACTACCTTTTTATTCTTTACTTTATTTCTATTAATACACAACTCTCCTTGAGTTAAGAGATTTACGATATTATCAATATTGTTTTCTTTCATATACTTCAACTTTTTACTATTCATTTTTAAAAGA"}, {"seq": "CTTTCTTTCGTCTTTGTTTTCATTATCCATATAATCTTTTTCTCCTTCCTTTTCATTATTTACTTTATTTCTATTAATACACAACTCTCCTTGAGTTAAGAGATTTACGATATTATCAATATTGTTTTCTTTCATATACTTCAACTTTTTACTATTCATTTTTAAAAGA"}, {"seq": "CTTTCTTTCGTCTTTCTGTTCATTATCCATATAATCGTTTTCTACTACCTTTTCATTCTTTACTTTATTTCTATTAATACACAACTCTCCTTGAGTTAAGAGATTTACGATATTATCAATATTGTTTTCTTTCATATACTTCAACTTTTTACTATTCATTTTTAAAAGA"}, {"seq": "CTTTCTTTCGTCTTTCTGTTCATTATCCATATAATCTTTTTCTCCTTCCTTTTCATTATTTACTTTATTTCTATTAATACACAACTCTCCTTGAGTTAAGAGATTTACGATATTATCAATATTGTTTTCTTTCATATACTTCAACTTTTTACTATTCATTTTTAAAAGA"}, {"seq": "CTTTCTTTCGTCTTTCTGTTCATTATCCATATAATCTTTTTCTACTTCCTTTTCATTCTTTACTTTATTTCTATTAATACACAACTCTCCTTGAGTTAAGAGATTTACGATATTATCAATATTGTTTTCTTTCATATACTTCAACTTTTTACTATTCATTTTTAAAAGA"}, {"seq": "CTTTCTTTCGTCTTTGTTTTCATTATCCATATAATCTTTTTCTCCTTCCTTTTCATTCTTTACTTTATTTCTATTAATACACAATTCTCCTTGAGTTAAGAGATTTACGATATTATCAATATTGTTTTCTTTCATATACTTCAACTTTTTACTATTCATTTTTAAAAGA"}, {"seq": "CTTTCTTTCGTCTTTCTGTTCATTATCCATATAATCTTTTTCTCCTTCCTTTTCATTCTTTACTTTATTTCTATTAATACACAACTCTCCTTGAGTTAAGAGATTTACGATATTATCAATATTGTTTTCTTTCATGTACTTCAACTTTTTACTATTCATTTTTAAAAGA"}], "target_id": 186}, {"microhaplotypes": [{"seq": "TAAGAAAGATGAAGTAATAGAAAAAACTGAAGTATCAAAGAAAACATTTTCAGGTATAGGTTTTAATCTTACTGAGAAAGAAGCTAAAGTATTAGGTGTAGGTGTAACCTATCAAGAATATCCAGAAACCATGTTATATAACTGTCCAAACAATTCTA"}, {"seq": "TAAGAAAGATGAAGTAATAGAAAAAACTGAAGTATCAAAGAAAACATTTTCAGGTATAGGTTTTAATCTTACTGAAAAAGAAGCTAAAGTATTAGGTGTAGGTGTAACCTATCAAGAATATCCAGAAACCATGTTATATAACTGTCCAAACAATTCTA"}, {"seq": "TAAGAAAGATGAAGTAATAGAAAAAACTGAAGTATCAAAGAAAACATTTTCAGGTATAGGTTTTAATCTTACTGACAAAGAAGCTAAAGTATTAGGTGTAGGTGTAACCTATCAAGAATATCCAGAAACCATGTTATATAACTGTCCAAACAATTCTA"}], "target_id": 187}, {"microhaplotypes": [{"seq": "ACCCACGGGACATTTTAATTTATACCTATTGGAACATTTTTTATTAGGTCTTTCTTTATGATTCTTCTTTAAAATAGGTTCATCATTATTTGAGTAAACTAACAGATTATTATCGTTCTCAAAATTATTATAACCATCAATATTTTTATTTCCATATACATCTATAA"}, {"seq": "ACCCACGGGACATTTTAATTTATACCTATTGGAACATTTTTTATTAGGTCTTTCTTTATGATTCTTCTTTAAAATAGGTTCATCATTATTTGAGTAAACTAACAGATCATTATCGTTCTCAAATTTATTATAACCATCAATATTTTTATTTCCATATACATCTATAA"}, {"seq": "ACCCACGGGACATTTTAATTTATACCTATTGGAACATTTTTTATTAGGTCTTTCTTTATGATTCTTCTTTAAAATAGGTTCATCATTATTTGAGTAAACTAACAGATCATTATCGTTCTCAAAATTATTATAACCATCAATATTTTTATTTCCATATACATCTATAA"}, {"seq": "ACCCACGGGACATTTTAATTTATACCTATTGGAACATTTTTTATTAGGTCTTTCTTTATGATTCTTCTTTAAAATAGGTTCATCATTATTTGAGTAAACTAACAGATCATTATGGTTCTCAAAATTATTATAACCATCAATATTTTTATTTCCATATACATCTATAA"}, {"seq": "ACCCACGGGACATTTTAATTTATACCTATTGGAACATTTTTTATTAGGTCTTTCTTTATGATTCTTCTTTAAAATAGGTTCATCATTATTTGAGTAAACTAACAGATCATTATCGTTCCCAAAATTATTATAACCATCAATATTTTTATTTCCATATACATCTATAA"}, {"seq": "ACCCACGGGACATTTTAATTTATACCTATTGGAACATTTTTTATTAGGTCTTTCTTTATGATTCTTCTTTAAAATAGGTTCATCATTATTTGAGTAAACTAACAGATCATTATCCTTCTCAAAATTATTATAACCATCAATATTTTTATTTCCATATACATCTATAA"}, {"seq": "ACCCACGGGACATTTTAATTTATACCTATTGGAACATTTTTTATTAGGTCTTTCTTTATGATTCTTCTTTAAAATAGGTTCATCATTATTTGAGTAAACTAACAGATCATTATCGTTCTGAAAATTATTATAACCATCAATATTTTTATTTCCATATACATCTATAA"}, {"seq": "ACCCACGGGACATTTTAATTTATACCTATTGGAACATTTTTTATTAGGTCTTTCTTTATGATTCTTCTTTAAAATAGGTTCATCATTATTTGAGTAAACTAACAGATCATTATCGTTCTCAAAATTATTATAACCATGAATATTTTTATTTCCATATACATCTATAA"}, {"seq": "ACCCACGGGACATTTTAATTTATACCTATTGGAACATTTTTTATTAGGTCTTTCTTTATGATTCTTCTTTAAAATAGGTTCATCATTATTTGAGTAAACTAACAGATTATTATCGTTCTCAAATTTATTATAACCATCAATATTTTTATTTCCATATACATCTATAA"}, {"seq": "ACCCACGGGACATTTTAATTTATACCTATTGGAACATTTTTTATTAGGTCTTTCTTTATGATTCTTCTTTAAAATAGGTTCATCATTATTTGAGTAAACTAACAGATCATTATCGTTCTCAAAATTATTATAACCATCAATATTTCTATTTCCATATACATCTATAA"}], "target_id": 188}, {"microhaplotypes": [{"seq": "ACAATATTAATTTTATAAGTTCATTATTTCAATTTTATATTTAGGAGGATCTATATCCATATATTATTCATTTTAAAAATATTAAAATAAATACATATATAAATATATAAACATATAAAAACAGTCTTTTAAAAATTAATAAGATTTATATAAAATATGGTTATAAATCCTATTTTGTATTATATCAAA"}, {"seq": "ACAATATTAATTTTATAAGTTCATTATTTCAATTTTATATTTAGGAGGATCTATATCCATATATTATTCATTTTAAAAATATTAAAATAAATACATATATAAATATATAAACATATAAAAACAGTCTTTTAAAAATTAATAAGATTTATATAAAATATGGTTATAAATCCTATTTTGTATTATATTAAA"}, {"seq": "ACAATATTAATTTTTTAAGTTCATTATTTCAATTTTATATTTAGGAGGATCTATATCCATATATTATTCATTTTAAAAATATTAAAATAAATACATATATAAATATATAAACATATAAAAACAGTCTTTTAAAAATTAATAAGATTTATATAAAATATGGTTATAAATCCTATTTTGTATTATATCAAA"}, {"seq": "ACAATATTAATTTTTTAAGTTCATTATTTCAATTTTATATTTAGGAGGATCTATATCCATATATTATTCATTTTAAAAATATTAAAATAAATACATATATAAATATATAAACATATAAAAACAGTCTTTTAAAAATTAATAAGATTTATATAAAATATGGTTATAAATCCTATTTTGTATTATATTAAA"}, {"seq": "ACAATATTAATTTTTTAAGTTCATTATTTCAATTTTATATTTAGGAGGATCTATATCCATATATTATTCATTTTAAAAATATTAAAATAAATACATATATAAATATATAAACATATAAATACAGTCTTTTAAAAATTAATAAGATTTATATAAAATATGGTTATAAATCCTATTTTGTATTATATTAAA"}, {"seq": "ACAATATTAATTTTATAAGTTCATTATTTCAATTTTATATTTAGGAGGATCTATATCCATATATTATTCATTTTAAAAATATTAAAATAAATACATATATAAATATATAAACATATAAATACAGTCTTTTAAAAATTAATAAGATTTATATAAAATATGGTTATAAATCCTATTTTGTATTATATTAAA"}, {"seq": "ACAATATTAATTTTTTAAGTTCATTATTTCAATTTTATATTTAGGAGGATCTATATCCATATATTATTCATTTTAAAAATATTAAAATAAATACATATATAAATATATAAACATATAAATACAGTCTTTTAAAAATTAATAAGATTTATATAAAATATGGTTATAAATCCTATTTTGTATTATATCAAA"}, {"seq": "ACAATATTAATTTTATAAGTTCATTATTTCAATTTTATATTTAGGAGGATCTATATCCATATATTATTCATTTTAAAAATATTAAAATAAATACATATATAAATATATAAACATATAAATACAGTCTTTTAAAAATTAATAAGATTTATATAAAATATGGTTATAAATCCTATTTTGTATTATATCAAA"}, {"seq": "ACAATATTAATTTTATAAGTTCATTATTTCAATTTTATATTTAGGAGGATCTATATCCATATATTATTCATTTTAAAAATATTAAAATAAATACATATATAAACATATAAAAACAGTCTTTTAAAAATTAATAAGATTTATATAAAATATGGTTATAAATCCTATTTTGTATTATATTAAA"}, {"seq": "ACAATATTAATTTTATAAGTTCATTATTTCAATTTTATATTTAGGAGGATCTATATCCATATATTATTCATTTTAAAAATATTAAAATAAATACATATATAAATATATAAACATATAAAAACAGTCTTTTAAAAATTAATAAGATTTATATAAAATATGGTTATAATTCCTATTTTGTATTATATCAAA"}], "target_id": 189}, {"microhaplotypes": [{"seq": "ATTAATGATTTATACACTTCAACTACACTTTTTAATTTAGCCCATACAATTAATAAAGCTCTACGATAAATTTCTTTTTTATTTGATTTAGAAAAAGGAGAAAACCATTGAAACTTTTTGGCTAGATATTTATGGTCTTTATCAAAAATATATTCTGAAACTTCATCTTCTAGAAGT"}, {"seq": "ATTAATGATTTATACACTTCAACTACACTTTTTAATTTAGCCCATACAACTAATAAAGCTCTACGATAAATTTCTTTTTTATTTGATTTAGAAAAAGGAGAAAACCATTGAAACTTTTGGGCTAGATATTTATGGTCTTTATCAAAAATATATTCTGAAACTTCATCTTCTAGAAGT"}, {"seq": "ATTAATGATTTATACACTTCAACTACACTTTTTAATTTAGCCCATACAATTAATAAAGCTCTACGATAAATTTCTTTTTTATTTGATTTAGAAAAAGGAGAAAACCATTGAAACTTTTGGGCTAGATATTTATGGTCTTTATCAAAAATATATTCTGAAACTTCATCTTCTAGAAGT"}, {"seq": "ATTAATGATTTATACACTTCAACTACACTTTTTAATTTAGCCCATACAACTAATAAAGCTCTACGATAAATTTCTTTTTTATTTGATTTAGAAAAAGGAGAAAACCATTGAAACTTTTTGGCTAGATATTTATGGTCTTTATCAAAAATATATTCTGAAACTTCATCTTCTAGAAGT"}, {"seq": "ATTAATGATTTATACACTTCAACTACACTTTTTAATTTAGCCCATACAACTAATAAAGCTCTTCGATAAATTTCTTTTTTATTTGATTTAGAAAAAGGAGAAAACCATTGAAACTTTTTGGCTAGATATTTATGGTCTTTATCAAAAATATATTCTGAAACTTCATCTTCTAGAAGT"}], "target_id": 190}, {"microhaplotypes": [{"seq": "TTTTTGAATTATTAAATATATCTTCTATAAAAAAAGAATATCAAGCTATACATAACAATAAGTATTTTTTATGGAATATGGATGCAGATTTTTTTACTATAAAAAATCATCATAAGGATAATAAGGATAACAATGATGAAAATGTGAATGTAATAATACAACAAAATAATTTAGTTCTCGAAAAATATGATCATTTAATAGA"}, {"seq": "TTTTTGAATTATTAAATATATCTTCTATAAAAAAAGAATATCAAGCTATACATAACAATAAGTATTTTTTATGGAATATGGATGCAGATTTTTTTACTATAAAAAATCATCATAAGGATAATAAGGATAACAATGATGAAAATGTGAATGTAATAATACAACAAAATAATTTAGTTCTAGAAAAATATGATCATTTAATAGA"}, {"seq": "TTTTTGAATTATTAAATATATCTTCTATAAAAAAAGAATATCAAGCTATACATAACAATAAGTATTTTTTATGGAATATGGATGCAAATTTTTTTACTATAAAAAATCATCATAAGGATAATAAGGATAACAATGATGAAAATGTGAATGTAATAATACAACAAAATAATTTAGTTCTAGAAAAATATGATCATTTAATAGA"}, {"seq": "TTTTTGAATTATTAAATATATCTTCTATAAAAAAAGAATATCAAGCTATACATAACAATAAGTATTTTTTATGGAATATGGATGCAAATTTTTTTACTATAAAAAATCATCATAAGGATAATAAGGATAACAATGATGAAAATGTGAATGTAATAATACAACAAAATAATTTAGTTCTCGAAAAATATGATCATTTAATAGA"}, {"seq": "TTTTTGAATTATTAAATATATCTTCTATAAAAAAAGAATATCAAGCTATACATAACAATAAGTATTTTTTATGGAATATGGATGCAGATTTTTTTACTATAAAAAATCATCATAAGGATAACAAGGATAACAATGATGAAAATGTGAATGTAATAATACAACAAAATAATTTAGTTCTCGAAAAATATGATCATTTAATAGA"}, {"seq": "TTTTTGAATTATTAAATATATCTTCTATAAAAAAAGAATATCAAGCTATACATAACAATAAGTATTTTTTATGGAATATGGATACAGATTTTTTTACTATAAAAAATCATCATAAGGATAATAAGGATAACAATGATGAAAATGTGAATGTAATAATACAACAAAATAATTTAGTTCTAGAAAAATATGATCATTTAATAGA"}, {"seq": "TTTTTGAATTATTAAATATATCTTCTATAAAAAAAGAATATCAAGCTATACATAACAATAAGTATTTTTTATGGAATATGGATGCAGATTTTTTTACTATAAAAAATCATCATAAGCATAATAAGGATAACAATGATGAAAATGTGAATGTAATAATACAACAAAATAATTTAGTTCTAGAAAAATATGATCATTTAATAGA"}], "target_id": 191}, {"microhaplotypes": [{"seq": "ACATGTATTGTCCCCAGCATGAATCGGGTGATAAATATTATCAAGCGTATCAAAAAATGGATTGTAATTATTACTACTATTCATATCATTATTTTTTGTGGTGGTGGACTGTGAAATGTTTTCCTTATGATTTTGACTTGTGTGTATATCCCTACCAACAACATATTCAACATTATTATTATCAAAAA"}, {"seq": "ACATGTATTGTCCCCAGCATGAATCGGGTGATAAATATTATCAAGCGTATCAAAAAATGGATTGTAATTATTACTACTATTCATATCATTATTTTTTGTGGTGGTGGTGGACTGTGAAATGTTTTCCTTATGATTTTGACTTGTGTGTATATCCCTACCAACAACATATTCAACATTATTATTATCAAAAA"}, {"seq": "ACATGTATTGTCCCCAGCATGAATCGGGTGATAAATATTATCAAGCGTATCAAAAAATGGATTGTAATTATTACTACTATTCATATCATTATTTTTTGTGGTGGTGGACTGTGAAATGTTTTCCTTATGATTTTGACTTGTGTGTATATCCCTACCAACAATATATTCAACATTATTATTATCAAAAA"}, {"seq": "ACATGTATTGTCCCCAGCATGAATCGGGTGATAAATATTATCAAGCGTATCAAAAAATGGATTGTAATTATTACTACTATTCATATCATTATTTTTTGTGGTGGTGGTGGACTGTGAAATGTTTTCCTTATGATTTTGACTTGTGTGTATATCCCTACCAACAATATATTCAACATTATTATTATCAAAAA"}, {"seq": "ACATGTATTGTCCCCAGCATGAATCGGGTGATAAATATTATCAAGCGTATCAAAAAATGGATTGTAATTATTACTACTATTTATATCATTATTTTTTGTGGTGGTGGACTGTGAAATGTTTTCCTTATGATTTTGACTTGTGTGTATATCCCTACCAACAATATATTCAACATTATTATTATCAAAAA"}, {"seq": "ACATGTATTGTCCCCAGCATGAATCGGGTGATAAATATTATCAAGCATATCAAAAAATGGATTGTAATTATTACTACTATTCATATCATTATTTTTTGTGGTGGTGGACTGTGAAATGTTTTCCTTATGATTTTGACTTGTGTGTATATCCCTACCAACAACATATTCAACATTATTATTATCAAAAA"}, {"seq": "ACATGTATTGTCCCCAGCATGAATCTGGTGATAAATATTATCAAGCGTATCAAAAAATGGATTGTAATTATTACTACTATTCATATCATTATTTTTTGTGGTGGTGGACTGTGAAATGTTTTCCTTATGATTTTGACTTGTGTGTATATCCCTACCAACAACATATTCAACATTATTATTATCAAAAA"}, {"seq": "ACATATATTGTCCCCAGCATGAATCGGGTGATAAATATTATCAAGCGTATCAAAAAATGGATTGTAATTATTACTACTATTCATATCATTATTTTTTGTGGTGGTGGACTGTGAAATGTTTTCCTTATGATTTTGACTTGTGTGTATATCCCTACCAACAATATATTCAACATTATTATTATCAAAAA"}, {"seq": "ACATGTATTGTCCCCAGCATGAATCGGGTGATAAATATTATCAAGCGTATCAAAAAATGGATTGTAATTATTACTACTATTCATATCATTATTTTTTGTGGTGGTGTACTGTGAAATGTTTTCCTTATGATTTTGACTTGTGTGTATATCCCTACCAACAACATATTCAACATTATTATTATCAAAAA"}], "target_id": 192}, {"microhaplotypes": [{"seq": "TTCAGTATGTGGTTCATTTGATTTTGATTGCATATTCCACATTTCTGTGTATTCTCCATTACATTTTAATAAATCTAGATGTGTTCCTCTTTCTATAATTTTTCCTTTGTTCAATAAGATAATTAATTCAGCGGTTGTGATAGTACATAGTTTATGTGCTATAATAATAATGGTTCTATTTTTTCTTAAATCTTCTACAGCTTTTTGGAAAAGATA"}, {"seq": "TTCAGTATGTGGTTCATTTGATTTTGATTGCATGTTCCACATTTCTGTGTATTCTCCATTACATTTTAATAAATCTAGATGTGTTCCTCTTTCTATAATTTTTCCTTTGTTCAATAAGATAATTAATTCAGCGGTTGTGATAGTACATAGTTTATGTGCTATAATAATAATGGTTCTATTTTTTCTTAAATCTTCTACAGCTTTTTGGAAAAGATA"}], "target_id": 193}, {"microhaplotypes": [{"seq": "CTAATTTTTTTTCTCCACTTTGTAATTTTTATTGTTGAATATATATATAAAGTTAAACCTATAAATAATACACTACCTAATAAACTATTCTTATATTTAAAAATAAATATAATACATGTTATTAATCCTTCTATTGTTGCCGGAATAATATACATTAAAACAGAACTCATCAAATTATTAGCACTCTCGGTACCTCTATCAACTATTCTCA"}, {"seq": "CTAATTTTTTTTCTCCACTTTGTAATTTTTATTGTTGAATATATATATAAAGTTAAACCTATAAATAATACACTACCTAATAAACTATTCTTATATTTAAAAATAAATATAACACATGTTATTAATCCTTCTATTGTTGCCGGAATAATATACATTAAAACAGAACTCATCAAATTATTAGCACTCTCGGTACCTCTATCAACTATTCTCA"}], "target_id": 194}, {"microhaplotypes": [{"seq": "GTACTTGTGAATATAATACACCACAAACCTCTTTTAAAAATTTAGATATAAAAAAAAATGTTACATATAAACCTAAATAATATACTGAACTAGATAAACTCTTTTTTAATACTTCATTTGATGCCCAACCTAAATATATCGGAGAAATTACACTAAATACTTTTGATACTAATATAAATAAAAATATTAGAACAATATATGTACGTAATATA"}, {"seq": "GTACTTGTGAAAATAATACACCACAAACCTCTTTTAAAAATTTAGATATAAAAAAAAATGTTACATATAAACCTAAATAATATACTGAACTAGATAAACTCTTTTTTAATACTTCATTTGATGCCCAACCTAAATATATCGGAGAAATTACACTAAATACTTTTGATACTAATATAAATAAAAATATTAGAACAATATATGTACGTAATATA"}, {"seq": "GTACTTGTGAATATAATACACCACAAACCTCTTTTAAAAATTTAGATATAAAAAAAAATGTTACATATAAACCTAAATAATATACTGAACTAGATAAACTCTTTTTTAATACTTCATTTGATGCCCATCCTAAATATATCGGAGAAATTACACTAAATACTTTTGATACTAATATAAATAAAAATATTAGAACAATATATGTACGTAATATA"}, {"seq": "GTACTTGTGAATATAATACACCACAAACCTCTTTTAAAAATTTAGATATAAAAAAAAATGTTACATATAAAACTAAATAATATACTGAACTAGATAAACTCTTTTTTAATACTTCATTTGATGCCCAACCTAAATATATCGGCGAAATTACACTAAATACTTTTGATACTAATATAAATAAAAATATTAGAACAATATATGTACGTAATATA"}], "target_id": 195}, {"microhaplotypes": [{"seq": "TTATTAAATACATGTTAGTATTATAAAGAGGATTTTCTGATTTTATTACATAACTATAATTTATCATCTTTATTACATTCAATATAACTAAGATACCGGTTATATGTCTGGATAATACATACACCTTTCCTAATGTATTCAATTCTGTTAACTTTTTATGTAATCTAAATAAAATTACGGTGTATATTATTCTTA"}, {"seq": "TTATTAAATACATGTTAGTATTATAAAGAGGATTTTCTGATTTTATTACATAACTATAATTTATCATCTTTATTACATTCAATATAACTAAGATACCGGTTATATGTCTGGATAATACATAGACCTTTCCTAATGTATTAAATTCTGTTAACTTTTTATGTAATCTAAATAAAATTACGGTGTATATTATTCTTA"}, {"seq": "TTATTAAATACATGTTAGTATTATAAAGAGGATTTTCTGATTTTATTACATAACTATAATTTATCATCTTTATTACATTCAATATAACTAAGATACCGGTTATATGTCTGGATAATACATACACCTTTCCTAATGTATTCAATTCTGTTAACATTTTATGTAATCTAAATAAAATTACGGTGTATATTATTCTTA"}], "target_id": 196}, {"microhaplotypes": [{"seq": "ATTAAAACATTCCAACAATTTTATTTCCTTCTTTATAAAATTATATAAATTAATTATTTTCTTTTTATCACATTCAAAGACGGCATAAGGTGCACCCCATGAACATTTTTTACTTTTGCTACCATCAGGCATAATATAAACACCAGTACCATTTTTTTCTGATAAATTAATATTTTTTTGTATAACATCATA"}, {"seq": "ATTAAAACATTCCAACAATTTTATTTCCTTCTTTATAAAATTATATAAATTAATTATTTTCTTTTTATCACATTCAAAGACGGCATAAGGTGCACCCCATGAACATTTTTTACTTTTGCTACCATCAGGCATAATATAATCACCAGTACCATTTTTTTCTGATAAATTAATATTTTTTTGTATAACATCATA"}, {"seq": "ATTAAAACATTTCAACAATTTTATTTCCTTCTTTATAAAATTATATAAATTAATTATTTTCTTTTTATCACATTCAAAGACGGCATAAGGTGCACCCCATGAACATTTTTTACTTTTGCTACCATCAGGCATAATATAAACACCAGTACCATTTTTTTCTGATAAATTAATATTTTTTTGTATAACATCATA"}, {"seq": "ATTAAAACATTCCAACAATTTTATTTCCTTCTTTATAAAATTATATAAATTAATTATTTTCTTTTTATCACATTCAAAGACGGCATAAGGTGCACCCCATGAACATTTTTTACTTTTGCTACCATCAGGCATAATATAAACACCAGTACCATTTTTTTCTGATAAATTTATATTTTTTTGTATAACATCATA"}, {"seq": "ATTAAAACATTTCAACAATTTTATTTCCTTCTTTATAAAATTATATAAATTAATTATTTTCTTTTTATCACATTCAAAGACGGCATAAGGTGCACCCCATGAACATTTTTTACTTTTGCTACCATCAGGCATAATATAATCACCAGTACCATTTTTTTCTGATAAATTAATATTTTTTTGTATAACATCATA"}, {"seq": "ATTAAAACATTCCAACAATTTTATTTCCTTCTTTATAAAATTATATAAATTAATTATTTTCTTTTTATCACATTCAAAGACGGCATAAGGTGCACCCCATGAACATTTTTTACTTTTGCTACCATCAGGCATAATAGAAACACCAGTACCATTTTTTTCTGATAAATTAATATTTTTTTGTATAACATCATA"}], "target_id": 197}, {"microhaplotypes": [{"seq": "TATTTCCATATTATTGTAATAGGGCTTTTTCTTGCTCTTCTAATTTTTGTATATCTTGCTTATCCTTATCTAATTGTCCAAGAGCATTTAATTCATCTTCTACATTTATTTTATTTTCTTGAGAATATTCTTCAATTTTGTCTTCGAAACTGTCATATAATCTATTTATAATTGGTTG"}, {"seq": "TATTTCCATATTATTGTAATAGGGCTTTTTCTTGCTCTTCTAATTTTTGTATATCTTGCTTATCCTTATCTAATTGTCCAAGAGCATTTAATTCATCTTCTACATTTATTTTATTTTCTTGAGAATATTCTTCAATTTTGTCTTCGAAACTGTTATATAATCTATTTATAATTGGTTG"}, {"seq": "TATTTCCATATTATTGTAATAGGGCTTTTTCTTGCTCTTCTAATTTTTGTATATCTTGCTTATCCTTATCTAATTGTCCAAGAGCATCTAATTCATCATCTACATTTATTTTATTTTCTTGAGAATATTCTTCAATTTTGTCTTCGAAACTGTTATATAATCTATTTATAATTGGTTG"}, {"seq": "TATTTCCATATTATTGTAATAGGGCTTTTTCTTGCTCTTCTAATTTTTGTATATCTTGCTTATCCTTATCTAATTGTCCAAGAGCATTTAATTCATCATCTACATTTATTTTATTTTCTTGAGAATATTCTTCAATTTTGTCTTCGAAACTGTTATATAATCTATTTATAATTGGTTG"}, {"seq": "TATTTCCATATTATTGTAATAGGGCTTTTTCTTGCTCTTCTAATTTTTGTATATCTTGCTTATCCTTATCTAATTGTCCAAGAGCAGCTAATTCATCATCTACATTTATTTTATTTTCTTGAGAATATTCTTCAATTTTGTCTTCGAAACTGTTATATAATCTATTTATAATTGGTTG"}, {"seq": "TATTTCCATATTATTGTAATAGGGCTTTTTCTTGCTCTTCTAATTTTTGTATATCTTGCTTATCCTTATCTAATTGTCCAAGAGCTTCTAATTCATCATCTACATTTATTTTATTTTCTTGAGAATATTCTTCAATTTTGTCTTCGAAACTGTTATATAATCTATTTATAATTGGTTG"}, {"seq": "TATTTCCATATTATTGTAATAGGGCTTTTTCTTGCTCTTCTAATTTTTGTATATCTTGCTTATCCTTATCTAATTGTCCAAGAGCATCTAATTCTTCATCTACATTTATTTTATTTTCTTGAGAATATTCTTCAATTTTGTCTTCGAAACTGTTATATAATCTATTTATAATTGGTTG"}, {"seq": "TATTTCCATATTATTGTAATAGGGCTTTTTCTTGCTCTTCTAATTTTTGTATATCTTGCTTATCCTTATCTAATTGTCCAAGAGCATCTAATTCATCATCTACATTTATTTTATTTTCTTGAGAATATTCTTCAATTTTGTCTTCGAAACTGTCATATAATCTATTTATAATTGGTTG"}, {"seq": "TATTTCCATATTATTGTAATAGGGCTTTTTCTTGCTCTTCTAATTTTTGTATATCTTGCTTATCCTTATCTAATTGTCCAAGAGCATTTAATTCATCTTCTACATTTATTTTATTTTCTTGAGAATATTCTTCAATTTTGTCTTCGAAACTGCTATATAATCTATTTATAATTGGTTG"}, {"seq": "TATTTCCATATTATTGTAATAGGGCTTTTTCTTGCTCTTCTAATTTTTGTATATCTTGCTTATCCTTATCTAATTGTCCAAGAGCATCTAATTCATCATCTACATTTATTTTATTGTCTTGAGAATATTCTTCAATTTTGTCTTCGAAACTGTTATATAATCTATTTATAATTGGTTG"}, {"seq": "TATTTCCATATTATTGTAATAGGGCTTTTTCTTGCTCTTCTAATTTTTGTATATCTTGCTTATCCTTATCTAATTGTCCAAGAGCATGTAATTCATCATCTACATTTATTTTATTTTCTTGAGAATATTCTTCAATTTTGTCTTCGAAACTGTTATATAATCTATTTATAATTGGTTG"}, {"seq": "TTTTTCCATATTATTGTAATAGGGCTTTTTCTTGCTCTTCTAATTTTTGTATATCTTGCTTATCCTTATCTAATTGTCCAAGAGCATTTAATTCATCTTCTACATTTATTTTATTTTCTTGAGAATATTCTTCAATTTTGTCTTCGAAACTGTTATATAATCTATTTATAATTGGTTG"}, {"seq": "TATTTCCATATTATTGTAATAGGGCTTTTTCTTGCTCTTCTAATTTTTGTATATCTTGCTTATCCTTATCTAATTGTCCAAGAGCATTTAATTCATCTTCTACATTTATTTTATTTTCTTGAGAATATTCTTCAATTCTGTCTTCGAAACTGTTATATAATCTATTTATAATTGGTTG"}, {"seq": "TATTTCCATATTATTGTAATAGGGCTTTTTCTTGCTCTTCTAATTTTTGTATATCTTGCTTATCCTTATCTAATTGTCCAAGAGCATCTAATTCATCATCTACATTTATTTTATTTTCTTGAGAATATTCTTCAATTTTGTCTTCGAAACTGCTATATAATCTATTTATAATTGGTTG"}], "target_id": 198}, {"microhaplotypes": [{"seq": "CAAGAACATGAATATTTCTGTAAATACATAGACAAGTCCTCATTATGTCTTATCACAGGGTGCTCTTCTTTAATATGACAATATAATTTTATATGTTTTATTATTTCTTGATGAATTTCACATAATAAAAATAATGTGTGATTCATATGTTGACTACCCAATATAGAAAAGCCACTAACTAATTG"}, {"seq": "CAAGAACATGAATATTTCTGTAAATACATAGACAAGTCCTCATTATGTCTTATCACAGGGTGCTCTTCTTTAATATGACAATATAATTTTATATGTTTTATTATTTCTTGATGAATTTCACATAATAAAAATAATGTGTGATTCATATGTTGACTACTCAATATAGAAAAGCCACTAACTAATTG"}, {"seq": "CAAGAACATGAATATTTCTGTATATACATAGACAAGTCCTCATTATGTCTTATCACAGGGTGCTCTTCTTTAATATGACAATATAATTTTATATGTTTTATTATTTCTTGATGAATTTCACATAATAAAAATAATGTGTGATTCATATGTTGACTACCCAATATAGAAAAGCCACTAACTAATTG"}, {"seq": "CAAGAACATGAATATTTCTGTAAATACATAGACAAGTCCTCATTATGTCTTATCACAGGGTGCTCTTTTTTAATATGACAATATAATTTTATATGTTTTATTATTTCTTGATGAATTTCACATAATAAAAATAATGTGTGATTCATATGTTGACTACTCAATATAGAAAAGCCACTAACTAATTG"}, {"seq": "CAAGAACATGAATATTTCTGTATATACATAGACAAGTCCTCATTATGTCTTATCACAGGGTGCTCTTCTTTAATATGACAATATAATTTTATATGTTTTATTATTTCTTGATGAATTTCACATAATAAAAATAATGTGTGATTCATATGTTGACTACTCAATATAGAAAAGCCACTAACTAATTG"}, {"seq": "CAAGAACATGAATATTTCTGTAAATACATAGACAAGTCCTCATTATGTCTTATCACAGGGTGCTCTTTTTTAATATGACAATATAATTTTATATGTTTTATTATTTCTTGATGAATTTCACATAATAAAAATAATGTGTGATTCATATGTTGACTACCCAATATAGAAAAGCCACTAACTAATTG"}, {"seq": "CAAGAACATGAATATTTCTGTAAATACATAGACAAGTCCTCATTATGTCTTATCACAGGGTGCTCTTCTTTAATATGACAATATAATTTTATATGTTTTATTATTTCTTGATGAATTTCACATAATAAAAATAATGTGTGATTCATATGTTGACTACTCAATATAGAAAAGCCACTAACGAATTG"}, {"seq": "CAAGAACATGAATATTTCTGTAAATACATAGACAAGTCCTCATTATGTCTTATCACAGGGTGCTCTTCTTTAATATGACAATATAATTTTATATGTTTTATTATTTCTTGATGAATTTCACATAATAAAAATAATGTGTGATTCATATGTTGACTACCCAATATAGAAAATCCACTAACTAATTG"}, {"seq": "CAAGAACATGAATATTTCTGTAAATACATAGACAAGTCCTCATTATGTCTTATCACAGGGGGCTCTTCTTTAATATGACAATATAATTTTATATGTTTTATTATTTCTTGATGAATTTCACATAATAAAAATAATGTGTGATTCATATGTTGACTACCCAATATAGAAAAGCCACTAACTAATTG"}, {"seq": "CAAGAACATGAATATTTCTGTAAATACATAGACAAGTCCTCATTATGTCTTATCACAGGGTGCTCTTCTTTAATATGACAATATAATTTTATATGTTTTATTATTTCTTCATGAATTTCACATAATAAAAATAATGTGTGATTCATATGTTGACTACCCAATATAGAAAAGCCACTAACTAATTG"}], "target_id": 199}, {"microhaplotypes": [{"seq": "AATAACCATCAAATACAAACTCAACCAACAAATACAGTACAATATATTCAACCAAATTATGAACAAGTCATAACACAAGTAGATCAAAATGGTAATCTATTCAATCAACAGCTTGTAGGAAGTACAGTAATGCAAAATATGACACCACAAGGTGTAAACACGTTAAATTATCCTGCAACG"}, {"seq": "AATAACCATCAAATACAAACTCAACCAACAAATACAGTACAATATATTCAACCAAATTATGAACAAGTCATAACACAAGTAGATCAAAATCGTAATCTATTCAATCAACAGCTTGTAGGAAGTACAGTAATGCAAAATATGACACCACAAGGTGTAAACACGTTAAATTATCCTGCAACG"}, {"seq": "AATAACCATCAAATACAAACTCAACCAACAAATACAGTACAATATATTCAACCAAATTATCAACAAGTCATAACACAAGTAGATCAAAATGGTAATCTATTCAATCAACAGCTTGTAGGAAGTACAGTAATGCAAAATATGACACCACAAGGTGTAAACACGTTAAATTATCCTGCAACG"}, {"seq": "AATAACCATCAAATACAAACTCAACCAACAAATACAGTACAATATATTCAACCAAATTATCAACAAGTCATAACACAAGTAGATCAAAATCGTAATCTATTCAATCAACAGCTTGTAGGAAGTACAGTAATGCAAAATATGACACCACAAGGTGTAAACACGTTAAATTATCCTGCAACG"}, {"seq": "AATAACCATCAAATACAAACTCAACCAACAAATACAGTACAATATATTCAACCAAATTATGAACAAGTCATAACACAAGTAGATCAAAATGGTAATCTATTCAATCAACAGCTTGTAGGAAGTACAGTTATGCAAAATATGACACCACAAGGTGTAAACACGTTAAATTATCCTGCAACG"}, {"seq": "AACAACCATCAAATACAAACTCAACCAACAAATACAGTACAATATATTCAACCAAATTATGAACAAGTCATAACACAAGTAGATCAAAATGGTAATCTATTCAATCAACAGCTTGTAGGAAGTACAGTAATGCAAAATATGACACCACAAGGTGTAAACACGTTAAATTATCCTGCAACG"}], "target_id": 200}, {"microhaplotypes": [{"seq": "ACTTTTCTCGATTCACATTATCCAAACCCATTTAACGAGTATGAAAAATATGACAAACATTATTATGAACTTGAAAATATTTTAAAAAACAAACTTAATGAACAATCCTTAAATTATCAATCTTTGTTAAAAATGAAAAGATTTATAAGTATGAACGATATGGAAAATAATAA"}, {"seq": "ACTTTTCTCGATTCACATTATCCAAACCCATTTAACGAGTATGAAAAATATGACAAACATTATTATGAACTTGAAAATATTTTAAAAAACAAACTTAATGAACATTCCTTAAATTATCAATCTTTGTTAAAAATGAAAAGATTTATAAGTATGAACGATATGGAAAATAATAA"}, {"seq": "ACTTTTCTCGATTCACATTATCCAAACCCATTTAACGAGTATGAAAAATATGACAAACATTATTATGAACTTGAAAATATTTTAAAAAACAAACTTAATGAACATTCCTTAAATTATCAATCTTTGTTAAAAATGAAAAGATTTATAAGTATGAACCATATGGAAAATAATAA"}, {"seq": "ACTTTTCTCGATTCACATTATCCAAACCCATTTAACGAGTATGAAAAATATGACAAACATTATTATGAACTTGAAAATATTTTAAAAAACAAACTTAATGAACAATCCTTAAATTATCAATCTTTGTTAAAAATGAAAAGATTTATAAGTATGAACCATATGGAAAATAATAA"}, {"seq": "ACTTTTCTCGATTCACATTATCCAAACCCATTTAACGAGTATGAAAAATATGACAAACATGATTATGAACTTGAAAATATTTTAAAAAACAAACTTAATGAACATTCCTTAAATTATCAATCTTTGTTAAAAATGAAAAGATTTATAAGTATGAACGATATGGAAAATAATAA"}, {"seq": "ACTTTTCTCGATTCACATTATCCAAACCCATTTAACGAGTATGAAAAATATGACAAACATTATTATGAACTTGAAAATATTTTAAAAAACAAACTTAATGAACATTCCTTAAATTATCAATCTTTGTTAAAAATGAAAAGTTTTATAAGTATGAACGATATGGAAAATAATAA"}, {"seq": "ACTTTTCTCCATTCACATTATCCAAACCCATTTAACGAGTATGAAAAATATGACAAACATTATTATGAACTTGAAAATATTTTAAAAAACAAACTTAATGAACATTCCTTAAATTATCAATCTTTGTTAAAAATGAAAAGATTTATAAGTATGAACCATATGGAAAATAATAA"}, {"seq": "ACTTTTCTCGATTCACATTATCCAAACCCATTTAACGAGTATGAAAAATATGACAAACATTATTATGAACTTGAAAATATTTTAAAAAACAAACTTAATGAACAATCCTTAAATTATCAATCCTTGTTAAAAATGAAAAGATTTATAAGTATGAACGATATGGAAAATAATAA"}], "target_id": 201}, {"microhaplotypes": [{"seq": "CCATGTGGATAAAGACAGTAGAGAGCAATTCGAAATAAAACAGTACTCTTGCAAATTAGATATTTTTTTGAACTCATCTGTTCCTATAAAAAATTCTGAATGTAAGCAGAATAAATTATACACAAAAGAATATATATTCATTTTTATTTATTCACTTTATATATGTTTGTATGTATGTT"}, {"seq": "CCATGTGGATAAAGACAGTAGAGAGCAATTCGAAATAAAACAGTACTCTTGCAAATTAGATATTTTTTTGAACTCATCTGTTCCTATAAAAAATTCTGAATGTAAGCAGAATAAATTATACACAAAAGAATATATATTCATTTTTATTTATTCACTTTATATATGTTTGTATGTATGTA"}, {"seq": "CCATGTGGATAAAGACAGTAGAGAGCAATTCGAAATAAAACAGTACTCTTGCAAATTAGATATTTTTTTGAACTCATCTGTTCCTATAAAAAATTCTGAATGTAAGCAGAATAAATTATACACAAAAGAATATATATTCATTTTTATTTATTCACTTTATATATGTATGTATGTATGTT"}, {"seq": "CCATGTGGATAAAGACAGTAGAGAGCAATTCGAAATAAAACAGTACTCTTGCAAATTAGATATTTTTTTGAACTCATCTGTTCCTATAAAAAATTCTGAATGTAAGAAGAATAAATTATACACAAAAGAATATATATTCATTTTTATTTATTCACTTTATATATGTTTGTATGTATGTA"}, {"seq": "CCATGTGGATAAAGACAGTAGAGAGCAATTCGAAATAAAACAGTACTCTTGCAAATTAGATATTTTTTTGAACTCATCTGTTCCTATAAAAAATTCTGAATGTAAGTAGAATAAATTATACACAAAAGAATATATATTCATTTTTATTTATTCACTTTATATATGTATGTATGTATGTT"}, {"seq": "CCATGTGGATAAAGACAGTAGAGAGCAATTCGAAATAAAACAGTACTCTTGCAAATTAGATATTTTTTTGAACTCATCTGTTCCTATAAAAAATTCTGAATGTAAGCAGAATAAATTATACACAAAAGAATATATATTCATTTTTATCTATTCACTTTATATATGTTTGTATGTATGTT"}, {"seq": "CCATGTGGATAAAGACAGTAGGGAGCAATTCGAAATAAAACAGTACTCTTGCAAATTAGATATTTTTTTGAACTCATCTGTTCCTATAAAAAATTCTGAATGTAAGCAGAATAAATTATACACAAAAGAATATATATTCATTTTTATTTATTCACTTTATATATGTTTGTATGTATGTT"}], "target_id": 202}, {"microhaplotypes": [{"seq": "CGTTTTGTATCATATTATTAGATATAGTTATTTTATTATTATTTTCTACATTATTATTCAATATATTACATCCTGTTATGGAATTATTGTTAAAATATAAATTATTCGAATTGTTATTATTAAATTCTAATCCACTAACTGCTGTTGTATATAATGATGATGAGTTATTATTATAGAAATC"}, {"seq": "CGTTTTGTATCATATTATTAGATATAGTTATTTTATTATTATTTTCTACATTGTTATTCAATATATTACATCCTGTTATGGAATTATTGTTAAAATATAAATTATTCGAATTGTTATTATTAAATTCTAATCCACTAACTGCTGTTGTATATAATGATGATGAGTTATTATTATAGAAATC"}, {"seq": "CGTTCTGTATCATATTATTAGATATAGTTATTTTATTATTATTTTCTACATTATTATTCAATATATTACATCCTGTTATGGAATTATTGTTAAAATATAAATTATTCGAATTGTTATTATTAAATTCTAATCCACTAACTGCTGTTGTATATAATGATGATGAGTTATTATTATAGAAATC"}, {"seq": "CGTTTTGTATCATATTATTAGATATAGTTATTTTATTATTATTTTCTACATTATTATTCAATATATTACATCCTGTTATGGAATTATTGTTAAAATATAAATTATTCGAATTGTTGTTATTAAATTCTAATCCACTAACTGCTGTTGTATATAATGATGATGAGTTATTATTATAGAAATC"}, {"seq": "CGTTCTGTATCATATTATTAGATATAGTTATTTTATTATTATTTTCTACATTGTTATTCAATATATTACATCCTGTTATGGAATTATTGTTAAAATATAAATTATTCGAATTGTTATTATTAAATTCTAATCCACTAACTGCTGTTGTATATAATGATGATGAGTTATTATTATAGAAATC"}, {"seq": "CGTTTTGTATCATATTATTAGATATAGTTATTTTATTAATATTTTCTACATTATTATTCAATATATTACATCCTGTTATGGAATTATTGTTAAAATATAAATTATTCGAATTGTTATTATTAAATTCTAATCCACTAACTGCTGTTGTATATAATGATGATGAGTTATTATTATAGAAATC"}, {"seq": "CGTTTTGTATCATATTATTAGATATAGTTATTTTATTATTATTTTCTACATTATTATTCAATATATTACATCCTGTTATGGAATTATTGTTAAAATATAAATTATTCGAATTGTTATTATTAAATTCTAATCCACTAACTGCTGTTGTATATAATGATGATGAGTTATTATTATATAAATC"}, {"seq": "CGTTTTGTATCATATTATTAGATATAGTTATTTTATTATTATTTTCTACATTATTATTCAATATATTACATCCTGTTATGGAATTATTGTTAAAATATAAATTATTCGAATTGTTATTATTAAATTCTAATCTACTAACTGCTGTTGTATATAATGATGATGAGTTATTATTATAGAAATC"}], "target_id": 203}, {"microhaplotypes": [{"seq": "TCGATGTACATGCAGAAAAAATATTGGAACGTTTATTTGTAATTTATTTATGTGTATTAAAAGAATATGAAAAACATCCTCCTAAAATATTAAAATATTCATTACGTGCTATATCTAGATACTCGATGTATATAAATAAATTTATCATGGATGATATATTATTTGAAATTAAAAACCTTGCTGCA"}, {"seq": "TCGATGTACATGCAGAAAAAATATTGGAACGTTTATTTGTAATTTATTTATGTGTATTAAAAGAATATGAAAAACATCCTCCTAAAATATTAAAATATTCATTACGTGCTATATCGAGATACTCGATGTATATAAATAAATTTATCATGGATGATATATTATTTGAAATTAAAAACCTTGCTGCA"}, {"seq": "TCGATGTACATGCAGAAAAAATATTGGAACGTTTATTTGTAATTTATTTATGTGTATTAAAAGAATATGAAAAACATCCTCCTAAAATATTAAAATATTCCTTACGTGCTATATCTAGATACTCGATGTATATAAATAAATTTATCATGGATGATATATTATTTGAAATTAAAAACCTTGCTGCA"}, {"seq": "TCGATGTACATGCAGAAAAAATATTGGAACGTTTATTTGTAATTTATTTATGTGTATTAAAAGAATATGAAAAACATCCTCCTAAAATATTAAAATATTCATTACGTGCTATATCTAGATACTCGATGTATATAAATAAATTCATCATGGATGATATATTATTTGAAATTAAAAACCTTGCTGCA"}, {"seq": "TCGATGTACATGCAGAAAAAATATTGGAACGTTTATTTGTAATTTATTTATGTGTATTAAAAGAATATGAAAAACATCCTCCTAAAATATTAAAATATTCATTACGTGCTATATCGAGATACTCGATGCATATAAATAAATTTATCATGGATGATATATTATTTGAAATTAAAAACCTTGCTGCA"}], "target_id": 204}, {"microhaplotypes": [{"seq": "ATAGATTTTAATGACATAAAAAACACAACAAATGAGTATAATAATTTTGAGGAACATAATTATCAAGATGATAAATTTATATTTAATAAAGATATACATAATATTCTTTTAGAATTAAAGGAATCATTAAATGACATATCACGTGGAAGACTAAATACATTGATAAGAGATAATAAAATAAGTAGTTATATAATATATCA"}, {"seq": "ATAGATTTTAATGACATAAAAAACACAACAAATGAGTATAATAATTTTGAGGAACATAATTATCAAGATGATAAATTTATATTTAATAAAGATATACATAATATTCTTTTAGAATTAAAGGAATCATTAAATGACATATCACGTGGAAGACTAAATACATTGATAAGAGATAATAAAATAAGTAGTTGTATAATATATCA"}, {"seq": "ATAGATTTTAATGAAATAAAAAACACATCAAATGAGTATAATAATTTTGAGGAACATAATTATCAAGATGATAAATTTATATTTAATAAAGATATACATAATATTCTTTTAGAATTAAAGGAATCATTAAATGACATATCACGTGGAAGACTAAATACATTGATAAGAGATAATAAAATAAGTAGTTATATAATATATCA"}, {"seq": "ATAGATTTTAATGACATAAAAAACACAACAAATGAGTATAATAATTTTGAGGAACATAATTATCAAGATGATAAATTTATATTTAATAAAGATATACATAATATTCTTTTAGAATTAAAGGAATCATTAAATGACATATCACGTGGAAAACTAAATACATTGATAAGAGATAATAAAATAAGTAGTTATATAATATATCA"}, {"seq": "ATAGATTTTAATGACATAAAAAACACAACAAATGAGTATAATAATTTTGAGGAACATAATTATCAAGATGATAAATTTATATTTAATAAAGATATACATAATATTCTTTTAGAATTAAAGGAATCATTAAATGACATATTACGTGGAAGACTAAATACATTGATAAGAGATAATAAAATAAGTAGTTATATAATATATCA"}, {"seq": "ATAGATTTTAATGACATAAAAAACACAACAAATGAGTATAATAATTTTGAGGAACCTAATTATCAAGATGATAAATTTATATTTAATAAAGATATACATAATATTCTTTTAGAATTAAAGGAATCATTAAATGACATATCACGTGGAAGACTAAATACATTGATAAGAGATAATAAAATAAGTAGTTATATAATATATCA"}, {"seq": "ATAGATTTTAATGACATAAAAAACACAACAAATGAGTATAATAATTTTGAGGAACATAATTATCAAGATGATAAATTTATATTTAATAAAGATATACATAATATTCTTTTAGAATTAAAGGAATCATTAAATGACATATCACGTGGAAGACTAAATACATTTATAAGAGATAATAAAATAAGTAGTTGTATAATATATCA"}, {"seq": "ATAGATTTTAATGACATAAAAAACACAACAAATGAGTATAATAATTTTGAGGAACATAATTATCAAGATGATAAATTTATATTTAATAAAGATATACATAATATTCTTTTAGAATTAAAGGAATCATTAAATGACATATCACGTGGAAGATTAAATACATTGATAAGAGATAATAAAATAAGTAGTTGTATAATATATCA"}, {"seq": "ATAGATTTTAATGACATTAAAAACACAACAAATGAGTATAATAATTTTGAGGAACATAATTATCAAGATGATAAATTTATATTTAATAAAGATATACATAATATTCTTTTAGAATTAAAGGAATCATTAAATGACATATCACGTGGAAGACTAAATACATTGATAAGAGATAATAAAATAAGTAGTTATATAATATATCA"}, {"seq": "ATAGATTTTAATGAAATAAAAAACACATCAAATGAGTATAATAATTTTGAGGAACATAATTATCAAGATGATAAATTTATATTTAATAAAGATATACATAATATTCTTTTAGAATTAAAGGAATCATTAAATGACATATCACGTGGAAGACTAAATACATTGATAAGAGATAATAAAATAAGTAGTTGTATAATATATCA"}, {"seq": "ATAGATTTTAATGACATAAAAAACACAACAAATGAGTATAATAATTTTGAGGAACATAATTATCAAGATGATAGATTTATATTTAATAAAGATATACATAATATTCTTTTAGAATTAAAGGAATCATTAAATGACATATCACGTGGAAGACTAAATACATTGATAAGAGATAATAAAATAAGTAGTTATATAATATATCA"}, {"seq": "ATAGATTTTAATGACATAAAAAACACAACAAATGAGTATAATAATTTTGAGGAACCTAATTATCAAGATGATAAATTTATATTTAATAAAGATATACATAATATTCTTTTAGAATTAAAGGAATCATTAAATGACATATCACGTGGAAGACTAAATACATTGATAAGAGATAATAAAATAAGTAGTTGTATAATATATCA"}], "target_id": 205}, {"microhaplotypes": [{"seq": "TAATTGATCTTCTAGAGGAATTAGATATTTTGTCTATATCGAATAAAGATGAAGTAGAAAAACGAAGAAAGGAAACAACTCAAGAGACGCGGTTGTTAGGAAATATTGATTTAGGATATGGAAAATTAGGAGAGGGAATAAAGCATGAAAATTTACAGGAAGAATTAGGAAACAGATTATTTG"}, {"seq": "TAATTGATCTTCTAGAGGAATTAGATATTTTGTCTATATCGAATAAAGATGAAGTAGAAAAACGAAGAAAGGAAACAACTCAAGAGACGCGGTTGTTAGGAAATATTGATTTAGGATATGGAAAATTAGGAGAGGGAATAAAGTATGAAAATTTACAGGAAGAATTAGGAAACAGATTATTTG"}, {"seq": "TAATTGATCTTCTAGAGGAATTAGATATTTTGTCTATATCGAATAAAGATGAAGTAGAAAAACGAAGAAAGAAAACAACTCAAGAGACGCGGTTGTTAGGAAATATTGATTTAGGATATGGAAAATTAGGAGAGGGAATAAAGTATGAAAATTTACAGGAAGAATTAGGAAACAGATTATTTG"}, {"seq": "TAATTGATCTTCTAGAGGAATTAGATATTTTGTCTATATCGAATAAAGATGAAGTAGAAAAACGAAGAAAGGAAACAACTCAAGAGACGCGGTTGTTAGGAAATATTGATTTAGGATATGGAAAATTAGGAGAGGGAATAAAGCATGAAAATTTACAGGAAGAATTAGGATACAGATTATTTG"}, {"seq": "TAATTGATCTTCTAGAGGAATTAGATATTTTGTCTATATCGAATAAAGATGAAGTAGAAAAACGAAGAAAGAAAACAACTCAAGAGACGCGGTTGTTAGGAAATATTGATTTAGGATATGGAAAATTAGGAGAGGGAATAAAGTATGAAAATTTACAGGAAGAATTAGAAAACAGATTATTTG"}, {"seq": "TAATTGATCTTCTAGAGGAATTAGATATTTTGTCTATATCGAATAAAGATGAAGTAGAAAAACGAAGAAAGAAAACAACTCAAGAGACGCGGTTGTTAGGAAATATTGATTTAGGATATGGAAAATTAGGAGAGGGAATAAAGTATGAATATTTACAGGAAGAATTAGGAAACAGATTATTTG"}, {"seq": "TAATTGATCTTCTAGAGGAATTAGATATTTTGTCTATATCGAATAAAGATGAAGTAGAAAAACGAAGAAAGGAAACAACTCAAGAGACGCGGTTGTTAGGAAATATTGATTTAGGATATGGAAAATTAGGAGAGGGAATAAAGCATGAAAATTTACAGGAAGAATTAGGAAACACATTATTTG"}, {"seq": "TAATTGATCTTCTAGAGGAATTAGATATTTTGTCTATATCGAATAAAGATGAAGTAGAAAAACGAAGAAAGAAAACAACTCAAGAGACGCGGTTGTTAGGAAATATTGATTTAGGATATGGAAAATTAGGAGAGGGAATAAAGTATGAAAATTTACAGGAAGAATTAGGAAACACATTATTTG"}, {"seq": "TAATTGATCTTCTAGAGGAATTAGATATTTTGTCTATATCGAATAAAGATGAAGTAGAAAAACGAAGAAAGGAAACAACTCAAGAGACGCGGTTGTTAGGAAATATTGATTTAGGATATGGAAAATTAGGAGAGGGAATAAAGTATGAAAATTTACAGGAAGAATTAGGAAACACATTATTTG"}, {"seq": "TAATTGATCTTCTAGAGGATTTAGATATTTTGTCTATATCGAATAAAGATGAAGTAGAAAAACGAAGAAAGAAAACAACTCAAGAGACGCGGTTGTTAGGAAATATTGATTTAGGATATGGAAAATTAGGAGAGGGAATAAAGTATGAAAATTTACAGGAAGAATTAGGAAACACATTATTTG"}, {"seq": "TAATTGATCTTCTAGAGGAATTAGATATTTTGTCTATATCGAATAAAGATGAAGTAGAAAAACGAAGAAAGAAAACAACTCAAGAGACGCGGTTGTTAGGAAATATTGATTTAGGATATGGAAAATTAGGAGAGGGAATAAAGCATGAAAATTTACAGGAAGAATTAGGAAACAGATTATTTG"}, {"seq": "TAATTGATCTTCTAGAGGAATTAGATATTTTGTCTATATCGAATAAAGATGAAGTAGAAAAACGAAGAAAGGAAACAACTCAAGAGACGCGGTTGTTAGGAAATATTGATTTAGGATATGGAAAATTAGGAGAGGGAATAAAGCATGAAAATTTACAGGAAGAATTAGGAAACAGATTATTTA"}, {"seq": "TAATTGATCTTCTAGAGGATTTAGATATTTTGTCTATATCGAATAAAGATGAAGTAGAAAAACGAAGAAAGAAAACAACTCAAGAGACGCGGTTGTTAGGAAATATTGATTTAGGATATGGAAAATTAGGAGAGGGAATAAAGTATGAAAATTTACAGGAAGAATTAGAAAACAGATTATTTG"}, {"seq": "TAATTGATCTTCTAGAGGAATTAGATATTTTGTCTATATCGAATAAAGATGAAGTAGAAAAACGAAGAAAGAAAACAACTCAAGAGACGCGGTTGTTAGGAAATATTGATTTAGGATATGGAAAATTAGGAGAGGGAATAAAGCATGAAAATTTACAGGAAGAATTAGGAAAGAGATTATTTG"}, {"seq": "TAATTGATCTTCTAGAGGAATTAGATATTTTGTCTATATCGAATAAAGATGAAGTAGAAAAACGAAGAAAGGAAACAACTCAAGAGACGCGGTTGTTAGGAAATATTGATTTAGGATATGGAAAATTAGGAGAGGGAATAAAGCATGAAAATTTACAGGAAGAATTAGGAAGCAGATTATTTG"}, {"seq": "TAATTGATCTTCTAGAGGAATTAGATATTTTGTCTATATCGAATAAAGATGAAGTAGAAAAACGAAGAAAGGAAACAACTCAAGAGACGCGGTTGTTAGGAAATATTGATTTAGGATATGGAAAATTAGGAGAGGGAATAATGTATGAAAATTTACAGGAAGAATTAGGAAACAAATTATTTG"}, {"seq": "TAATTGATCTTCTAGAGGATTTAGATATTTTGTCTATATCGAATAAAGATGAAGTAGAAAAACGAAGAAAGAAAACAACTCAAGAGACGCGGTTGTTAGGAAATATTGATTTAGGATATGGAAAATTAGGAGAGGGAATAAAGTATGAAAATTTACAGGAAGAATTAGGAAACAGATTATTTG"}, {"seq": "TAATTGATCTTCTAGAGGAATTAGATATTTTGTCTATATCGAATAAAGATGAAGTAGAAAAACGAAGAAAGGAAACAACTCAAGAGACGCGGTTGTTAGGAAATATTGATTTAGGATATGGAAAATTAGGAGAGGGAATAAAGTATGAAAATTTACAGGAAGAATTAGAAAACAGATTATTTG"}, {"seq": "TAATTGATCTTCTAGAGGAATTAGATATTTTGTCTATATCGAATAAAGATGAAGTAGAAAAACGAAGAGAGAAAACAACTCAAGAGACGCGGTTGTTAGGAAATATTGATTTAGGATATGGAAAATTAGGAGAGGGAATAAAGCATGAAAATTTACAGGAAGAATTAGGAAACAGATTATTTG"}], "target_id": 206}, {"microhaplotypes": [{"seq": "ATTCTTATAATATTTAAGAATGAAGGGATTAAATATTTACATTTTAGCGAGGATACTCTGAAATATGTTAATTTTAATTATCCTGATTTTAACTTATATAAATGTATGAATTTATATAAGAAAAATTATGTTGATAGGGATGAGAAAGATATCTGTGATTTTTCAAATGAAGATTTTCCGTTAATAAAAGAAAATAACAAGAGAATCAG"}, {"seq": "ATTCTTATAATATTTAAGAATGAAGGGATTAAATATTTACATTTTAGCGACGATACTCTGAAATATGTTAATTTTAATTATCCTGATTTTAACTTATATAAATGTATGAATTTATATAAGAAAAATTATGTTGATAGGGATGAGAAAGATATCTGTGATTTTTCAAATGAAGATTTTCCGTTAATAAAAGAAAATAACAAGAGAATCAG"}, {"seq": "ATTCTTATAATATTTAAGAATGAAGGGATTAAATATTTACATTTTAGCGACGATACTCTGAAATATGTTAATTTTAATTATCCTGATTTTAACTTATATAAATATATGAATTTATATAAGAAAAATTATGTTGATAGGGATGAGAAAGATATCTGTGATTTTTCAAATGAAGATTTTCCGTTAATAAAAGAAAATAACAAGAGAATCAG"}, {"seq": "ATTCTTATAATATTTAAGAATGAAGGGATTAAATATTTATATTTTAGCGAGGATACTCTGAAATATGTTAATTTTAATTATCCTGATTTTAACTTATATAAATGTATGAATTTATATAAGAAAAATTATGTTGATAGGGATGAGAAAGATATCTGTGATTTTTCAAATGAAGATTTTCCGTTAATAAAAGAAAATAACAAGAGAATCAG"}, {"seq": "ATTCTTATAATATTTAAGAATGAAGGGATTAAATATTTATATTTTAGCGACGATACTCTGAAATATGTTAATTTTAATTATCCTGATTTTAACTTATATAAATGTATGAATTTATATAAGAAAAATTATGTTGATAGGGATGAGAAAGATATCTGTGATTTTTCAAATGAAGATTTTCCGTTAATAAAAGAAAATAACAAGAGAATCAG"}, {"seq": "ATTCTTATAATATTTAAGAATGAAGGGATTAAATATTTACATTTTAGCGAGGATACTCTGAAATATGTTAATTTTAATTATCCTGATTTTAACTTATATAAATGTATGAATTTATATAAGAAAAATTATGTTGATAGGGATGAGAAAGATATCTGTGATTTTTCAAATGAAGATATTCCGTTAATAAAAGAAAATAACAAGAGAATCAG"}, {"seq": "ATTCTTATAATATTTAAGAATGAAGGGATTAAATATTTATATTTTAGCGAGGATACTCTGAAATATGTTAATTTTAATTATCCTGATTTTAACTTATATAAATGTATGAATTTATATAAGAAAAATTATGTTGATAGGGATGAGAAAGATATCTGTGATTTTTCAAATGAAGATATTCCGTTAATAAAAGAAAATAACAAGAGAATCAG"}, {"seq": "ATTCTTATAATATTTAAGAATGAAGGGATTAAATATTTACATTTTAGCGACGATACTCTGAAATATGTTAATTTTAATTATCCTGATTTTAACTTATATAAATGTATGAATTTATATAAGAAAAATTATGTTGATAGGGATGAGAAAGATATCTGTGATTTTTCAAATGAAGATATTCCGTTAATAAAAGAAAATAACAAGAGAATCAG"}, {"seq": "ATTCTTATAATATTTAAGAATGAAGGGATTAAATATTTACATTTTAGCGAGGATACTCTGAAATATGTTAATTTTAATTATCCTGATTTTAACTTATATAAATATATGAATTTATATAAGAAAAATTATGTTGATAGGGATGAGAAAGATATCTGTGATTTTTCAAATGAAGATTTTCCGTTAATAAAAGAAAATAACAAGAGAATCAG"}, {"seq": "ATTCTTATAATATTTAAGAATGAAGGGATTAAATATTTATATTTTAGCGACGATATTCTGAAATATGTTAATTTTAATTATCCTGATTTTAACTTATATAAATGTATGAATTTATATAAGAAAAATTATGTTGATAGGGATGAGAAAGATATCTGTGATTTTTCAAATGAAGATTTTCCGTTAATAAAAGAAAATAACAAGAGAATCAG"}, {"seq": "ATTCTTATAATATTTAAGAATGAAGGGATTAAATATTTATATTTTAGCGACGATACTCTGAAATATGTTAATTTTAATTATCCTGATTTTAACTTATATAAATATATGAATTTATATAAGAAAAATTATGTTGATAGGGATGAGAAAGATATCTGTGATTTTTCAAATGAAGATTTTCCGTTAATAAAAGAAAATAACAAGAGAATCAG"}], "target_id": 207}, {"microhaplotypes": [{"seq": "TAAATAAAAAAGGATTAGATGATTTAATAAAAGATTTGTTAAAATATTTTCCAAAGAATTCAATTAGCGATCGTTTTGAATTGTTAGAATTTAAAATGACGGAGGATTGTTATACAAAAATGTGGTTTGATTTTATGAGTGATTTTGGAATAGCTACAATGAATGAAACCGAACATACTAGATCTTTTTATGGCTTAATCGAA"}, {"seq": "TAAATAAAAAAGGATTAGATGATTTAATAAAAGATTTGTTAAAATATTTTCCAAAGAATTCAATTAGCGATCGTTTTGAATTGTTAGAATTTAAAATGACGGAGGATTGTTATACAAAAATGTGGTTTGATTTTATGAGTGATTTTGGAATAGCTACAATGAATGAAAGCGAACATACTAGATCTTTTTATGGCTTAATCGAA"}, {"seq": "TAAATAAAAAAGGATTAGATGATTTAATAAAAGATTTGTTAAAATATTTTCCAAAGAATTCAATTAGCGATCGTTTTGAATTGTTAGAATTTAAAATGACGGAGGATTGTTATACAAAAATGTGGTTTGATTTTATGATTGATTTTGGAATAGCTACAATGAATGAAAACGAACATACTAGATCTTTTTATGGCTTAATCGAA"}, {"seq": "TAAATAAAAAAGGATTAGATGATTTAATAAAAGATTTGTTAAAATATTTTCCAAAGAATTCAATTAGCGATCGTTTTGAATTGACAGAATTTAAAATGACGGAGGATTGTTATACAAAAATGTGGTTTGATTTTATGATTGATTTTGGAATAGCTACAATGAATGAAAACGAACATACTAGATCTTTTTATGGCTTAATCGAA"}, {"seq": "TAAATAAAAAAGGATTAGATGATTTAATAAAAGATTTGTTAAAATATTTTCCAAAGAATTCAATTAGCGATCGTTTTGAATTGTTAGAATTTAAAATGACGGAGGATTGTTATACAAAAATGTGGTTTGATTTTATGAGTGATTTTGGAATAGCTACAATGAATGAAAACGAACATACTAGATCTTTTTATGGCTTAATCGAA"}, {"seq": "TAAATAAAAAAGGATTAGATGATTTAATAAAAGATTTGTTAAAATATTTTCCAAAGAATTCAATTAGCGATCGTTTTGAATTGACAGAATTTAAAATGACGGAGGATTGTTATACAAAAATGTGGTTTGATTTTATGAGTGATTTTGGAATAGCTACAATGAATGAAACCGAACATACTAGATCTTTTTATGGCTTAATCGAA"}, {"seq": "TAAATAAAAAAGGATTAGATGATTTAATAAAAGATTTGTTAAAATATTTTCCAAAGAATTCAATTAGCGATCGTTTTGAATTGTCAGAATTTAAAATGACGGAGGATTGTTATACAAAAATGTGGTTTGATTTTATGAGTGATTTTGGAATAGCTACAATGAATGAAAGCGAACATACTAGATCTTTTTATGGCTTAATCGAA"}], "target_id": 208}]}, "detected_microhaplotypes": [{"library_samples": [{"library_sample_id": 0, "target_results": [{"mhaps": [{"mhap_id": 0, "reads": 60}, {"mhap_id": 3, "reads": 16}], "mhaps_target_id": 0}, {"mhaps": [{"mhap_id": 0, "reads": 547}], "mhaps_target_id": 1}, {"mhaps": [{"mhap_id": 0, "reads": 373}, {"mhap_id": 2, "reads": 264}, {"mhap_id": 1, "reads": 143}], "mhaps_target_id": 2}, {"mhaps": [{"mhap_id": 0, "reads": 88}], "mhaps_target_id": 3}, {"mhaps": [{"mhap_id": 1, "reads": 644}, {"mhap_id": 7, "reads": 539}], "mhaps_target_id": 4}, {"mhaps": [{"mhap_id": 7, "reads": 127}, {"mhap_id": 0, "reads": 93}], "mhaps_target_id": 5}, {"mhaps": [{"mhap_id": 2, "reads": 558}, {"mhap_id": 0, "reads": 87}], "mhaps_target_id": 6}, {"mhaps": [{"mhap_id": 0, "reads": 342}, {"mhap_id": 1, "reads": 50}], "mhaps_target_id": 7}, {"mhaps": [{"mhap_id": 0, "reads": 149}, {"mhap_id": 3, "reads": 22}], "mhaps_target_id": 8}, {"mhaps": [{"mhap_id": 0, "reads": 452}, {"mhap_id": 1, "reads": 359}], "mhaps_target_id": 9}, {"mhaps": [{"mhap_id": 0, "reads": 322}, {"mhap_id": 2, "reads": 156}], "mhaps_target_id": 10}, {"mhaps": [{"mhap_id": 2, "reads": 145}, {"mhap_id": 0, "reads": 127}, {"mhap_id": 1, "reads": 122}], "mhaps_target_id": 11}, {"mhaps": [{"mhap_id": 1, "reads": 91}, {"mhap_id": 0, "reads": 38}, {"mhap_id": 4, "reads": 19}], "mhaps_target_id": 12}, {"mhaps": [{"mhap_id": 0, "reads": 1318}], "mhaps_target_id": 13}, {"mhaps": [{"mhap_id": 1, "reads": 252}, {"mhap_id": 0, "reads": 103}], "mhaps_target_id": 14}, {"mhaps": [{"mhap_id": 0, "reads": 113}, {"mhap_id": 1, "reads": 55}], "mhaps_target_id": 15}, {"mhaps": [{"mhap_id": 1, "reads": 129}, {"mhap_id": 8, "reads": 21}, {"mhap_id": 10, "reads": 11}], "mhaps_target_id": 16}, {"mhaps": [{"mhap_id": 4, "reads": 133}, {"mhap_id": 0, "reads": 123}, {"mhap_id": 1, "reads": 118}], "mhaps_target_id": 17}, {"mhaps": [{"mhap_id": 0, "reads": 729}, {"mhap_id": 1, "reads": 381}], "mhaps_target_id": 18}, {"mhaps": [{"mhap_id": 1, "reads": 50}, {"mhap_id": 0, "reads": 39}, {"mhap_id": 11, "reads": 26}], "mhaps_target_id": 19}, {"mhaps": [{"mhap_id": 0, "reads": 602}, {"mhap_id": 1, "reads": 256}], "mhaps_target_id": 20}, {"mhaps": [{"mhap_id": 0, "reads": 494}, {"mhap_id": 1, "reads": 338}], "mhaps_target_id": 21}, {"mhaps": [{"mhap_id": 0, "reads": 955}], "mhaps_target_id": 22}, {"mhaps": [{"mhap_id": 0, "reads": 408}], "mhaps_target_id": 23}, {"mhaps": [{"mhap_id": 0, "reads": 255}], "mhaps_target_id": 24}, {"mhaps": [{"mhap_id": 2, "reads": 187}, {"mhap_id": 5, "reads": 82}, {"mhap_id": 4, "reads": 67}, {"mhap_id": 3, "reads": 44}], "mhaps_target_id": 25}, {"mhaps": [{"mhap_id": 1, "reads": 91}], "mhaps_target_id": 26}, {"mhaps": [{"mhap_id": 0, "reads": 219}, {"mhap_id": 3, "reads": 62}], "mhaps_target_id": 27}, {"mhaps": [{"mhap_id": 0, "reads": 560}], "mhaps_target_id": 28}, {"mhaps": [{"mhap_id": 0, "reads": 274}], "mhaps_target_id": 29}, {"mhaps": [{"mhap_id": 0, "reads": 643}, {"mhap_id": 1, "reads": 112}], "mhaps_target_id": 30}, {"mhaps": [{"mhap_id": 2, "reads": 176}, {"mhap_id": 3, "reads": 122}, {"mhap_id": 1, "reads": 62}], "mhaps_target_id": 31}, {"mhaps": [{"mhap_id": 0, "reads": 735}], "mhaps_target_id": 32}, {"mhaps": [{"mhap_id": 0, "reads": 1053}], "mhaps_target_id": 33}, {"mhaps": [{"mhap_id": 0, "reads": 585}, {"mhap_id": 1, "reads": 165}, {"mhap_id": 3, "reads": 153}], "mhaps_target_id": 34}, {"mhaps": [{"mhap_id": 0, "reads": 242}, {"mhap_id": 5, "reads": 193}], "mhaps_target_id": 35}, {"mhaps": [{"mhap_id": 0, "reads": 58}, {"mhap_id": 3, "reads": 26}, {"mhap_id": 1, "reads": 25}], "mhaps_target_id": 36}, {"mhaps": [{"mhap_id": 2, "reads": 152}, {"mhap_id": 0, "reads": 107}, {"mhap_id": 3, "reads": 52}], "mhaps_target_id": 37}, {"mhaps": [{"mhap_id": 3, "reads": 88}, {"mhap_id": 0, "reads": 63}], "mhaps_target_id": 38}, {"mhaps": [{"mhap_id": 0, "reads": 114}], "mhaps_target_id": 39}, {"mhaps": [{"mhap_id": 5, "reads": 435}, {"mhap_id": 0, "reads": 248}, {"mhap_id": 2, "reads": 142}], "mhaps_target_id": 40}, {"mhaps": [{"mhap_id": 1, "reads": 272}, {"mhap_id": 2, "reads": 88}], "mhaps_target_id": 41}, {"mhaps": [{"mhap_id": 0, "reads": 168}], "mhaps_target_id": 42}, {"mhaps": [{"mhap_id": 1, "reads": 398}, {"mhap_id": 0, "reads": 370}], "mhaps_target_id": 43}, {"mhaps": [{"mhap_id": 0, "reads": 381}], "mhaps_target_id": 44}, {"mhaps": [{"mhap_id": 0, "reads": 467}], "mhaps_target_id": 45}, {"mhaps": [{"mhap_id": 0, "reads": 460}], "mhaps_target_id": 46}, {"mhaps": [{"mhap_id": 6, "reads": 235}, {"mhap_id": 0, "reads": 178}, {"mhap_id": 3, "reads": 109}], "mhaps_target_id": 47}, {"mhaps": [{"mhap_id": 0, "reads": 111}, {"mhap_id": 5, "reads": 20}, {"mhap_id": 2, "reads": 19}], "mhaps_target_id": 48}, {"mhaps": [{"mhap_id": 0, "reads": 952}], "mhaps_target_id": 49}, {"mhaps": [{"mhap_id": 0, "reads": 291}, {"mhap_id": 4, "reads": 167}], "mhaps_target_id": 50}, {"mhaps": [{"mhap_id": 0, "reads": 316}, {"mhap_id": 1, "reads": 55}], "mhaps_target_id": 51}, {"mhaps": [{"mhap_id": 2, "reads": 1064}, {"mhap_id": 1, "reads": 879}], "mhaps_target_id": 52}, {"mhaps": [{"mhap_id": 0, "reads": 533}], "mhaps_target_id": 53}, {"mhaps": [{"mhap_id": 2, "reads": 132}, {"mhap_id": 1, "reads": 44}], "mhaps_target_id": 54}, {"mhaps": [{"mhap_id": 1, "reads": 399}, {"mhap_id": 0, "reads": 171}], "mhaps_target_id": 55}, {"mhaps": [{"mhap_id": 1, "reads": 318}, {"mhap_id": 0, "reads": 96}], "mhaps_target_id": 56}, {"mhaps": [{"mhap_id": 1, "reads": 144}, {"mhap_id": 0, "reads": 71}], "mhaps_target_id": 57}, {"mhaps": [{"mhap_id": 0, "reads": 286}], "mhaps_target_id": 58}, {"mhaps": [{"mhap_id": 1, "reads": 411}, {"mhap_id": 0, "reads": 166}], "mhaps_target_id": 59}, {"mhaps": [{"mhap_id": 1, "reads": 219}, {"mhap_id": 0, "reads": 109}], "mhaps_target_id": 60}, {"mhaps": [{"mhap_id": 0, "reads": 1109}], "mhaps_target_id": 61}, {"mhaps": [{"mhap_id": 0, "reads": 709}], "mhaps_target_id": 62}, {"mhaps": [{"mhap_id": 0, "reads": 1070}], "mhaps_target_id": 63}, {"mhaps": [{"mhap_id": 1, "reads": 88}, {"mhap_id": 0, "reads": 56}], "mhaps_target_id": 64}, {"mhaps": [{"mhap_id": 0, "reads": 155}, {"mhap_id": 1, "reads": 25}], "mhaps_target_id": 65}, {"mhaps": [{"mhap_id": 0, "reads": 310}], "mhaps_target_id": 66}, {"mhaps": [{"mhap_id": 0, "reads": 835}], "mhaps_target_id": 67}, {"mhaps": [{"mhap_id": 0, "reads": 418}], "mhaps_target_id": 68}, {"mhaps": [{"mhap_id": 0, "reads": 227}, {"mhap_id": 2, "reads": 109}, {"mhap_id": 7, "reads": 94}, {"mhap_id": 3, "reads": 76}], "mhaps_target_id": 69}, {"mhaps": [{"mhap_id": 1, "reads": 477}], "mhaps_target_id": 70}, {"mhaps": [{"mhap_id": 3, "reads": 50}, {"mhap_id": 1, "reads": 41}, {"mhap_id": 0, "reads": 30}, {"mhap_id": 2, "reads": 25}], "mhaps_target_id": 71}, {"mhaps": [{"mhap_id": 0, "reads": 430}, {"mhap_id": 2, "reads": 268}, {"mhap_id": 1, "reads": 154}], "mhaps_target_id": 72}, {"mhaps": [{"mhap_id": 0, "reads": 215}], "mhaps_target_id": 73}, {"mhaps": [{"mhap_id": 0, "reads": 339}], "mhaps_target_id": 74}, {"mhaps": [{"mhap_id": 0, "reads": 201}], "mhaps_target_id": 75}, {"mhaps": [{"mhap_id": 0, "reads": 669}], "mhaps_target_id": 76}, {"mhaps": [{"mhap_id": 0, "reads": 987}], "mhaps_target_id": 77}, {"mhaps": [{"mhap_id": 0, "reads": 858}], "mhaps_target_id": 78}, {"mhaps": [{"mhap_id": 0, "reads": 457}, {"mhap_id": 1, "reads": 271}], "mhaps_target_id": 79}, {"mhaps": [{"mhap_id": 3, "reads": 418}, {"mhap_id": 2, "reads": 129}, {"mhap_id": 0, "reads": 99}], "mhaps_target_id": 80}, {"mhaps": [{"mhap_id": 1, "reads": 265}, {"mhap_id": 0, "reads": 122}], "mhaps_target_id": 81}, {"mhaps": [{"mhap_id": 1, "reads": 40}, {"mhap_id": 2, "reads": 18}], "mhaps_target_id": 82}, {"mhaps": [{"mhap_id": 0, "reads": 289}, {"mhap_id": 1, "reads": 183}], "mhaps_target_id": 83}, {"mhaps": [{"mhap_id": 0, "reads": 649}, {"mhap_id": 1, "reads": 328}], "mhaps_target_id": 84}, {"mhaps": [{"mhap_id": 0, "reads": 248}], "mhaps_target_id": 85}, {"mhaps": [{"mhap_id": 0, "reads": 606}], "mhaps_target_id": 86}, {"mhaps": [{"mhap_id": 0, "reads": 393}, {"mhap_id": 1, "reads": 177}], "mhaps_target_id": 87}, {"mhaps": [{"mhap_id": 0, "reads": 427}, {"mhap_id": 1, "reads": 87}], "mhaps_target_id": 88}, {"mhaps": [{"mhap_id": 0, "reads": 334}], "mhaps_target_id": 89}, {"mhaps": [{"mhap_id": 0, "reads": 2647}], "mhaps_target_id": 90}, {"mhaps": [{"mhap_id": 1, "reads": 105}, {"mhap_id": 2, "reads": 105}], "mhaps_target_id": 91}, {"mhaps": [{"mhap_id": 0, "reads": 347}, {"mhap_id": 1, "reads": 303}], "mhaps_target_id": 92}, {"mhaps": [{"mhap_id": 0, "reads": 315}, {"mhap_id": 1, "reads": 47}], "mhaps_target_id": 93}, {"mhaps": [{"mhap_id": 3, "reads": 65}, {"mhap_id": 2, "reads": 33}, {"mhap_id": 0, "reads": 12}], "mhaps_target_id": 94}, {"mhaps": [{"mhap_id": 0, "reads": 478}, {"mhap_id": 1, "reads": 258}], "mhaps_target_id": 95}, {"mhaps": [{"mhap_id": 0, "reads": 689}, {"mhap_id": 4, "reads": 506}, {"mhap_id": 2, "reads": 237}], "mhaps_target_id": 96}, {"mhaps": [{"mhap_id": 0, "reads": 380}], "mhaps_target_id": 97}, {"mhaps": [{"mhap_id": 4, "reads": 384}, {"mhap_id": 0, "reads": 93}, {"mhap_id": 3, "reads": 84}], "mhaps_target_id": 98}, {"mhaps": [{"mhap_id": 3, "reads": 245}, {"mhap_id": 2, "reads": 114}], "mhaps_target_id": 99}, {"mhaps": [{"mhap_id": 0, "reads": 635}, {"mhap_id": 1, "reads": 319}], "mhaps_target_id": 100}, {"mhaps": [{"mhap_id": 0, "reads": 200}], "mhaps_target_id": 101}, {"mhaps": [{"mhap_id": 0, "reads": 165}], "mhaps_target_id": 102}, {"mhaps": [{"mhap_id": 0, "reads": 184}], "mhaps_target_id": 103}, {"mhaps": [{"mhap_id": 5, "reads": 238}, {"mhap_id": 0, "reads": 141}, {"mhap_id": 1, "reads": 73}], "mhaps_target_id": 104}, {"mhaps": [{"mhap_id": 0, "reads": 73}, {"mhap_id": 1, "reads": 63}, {"mhap_id": 2, "reads": 48}], "mhaps_target_id": 105}, {"mhaps": [{"mhap_id": 0, "reads": 63}], "mhaps_target_id": 106}, {"mhaps": [{"mhap_id": 0, "reads": 624}], "mhaps_target_id": 107}, {"mhaps": [{"mhap_id": 1, "reads": 305}, {"mhap_id": 0, "reads": 144}], "mhaps_target_id": 108}, {"mhaps": [{"mhap_id": 3, "reads": 228}, {"mhap_id": 5, "reads": 61}], "mhaps_target_id": 109}, {"mhaps": [{"mhap_id": 0, "reads": 832}], "mhaps_target_id": 110}, {"mhaps": [{"mhap_id": 0, "reads": 48}, {"mhap_id": 2, "reads": 43}, {"mhap_id": 3, "reads": 40}], "mhaps_target_id": 111}, {"mhaps": [{"mhap_id": 0, "reads": 304}, {"mhap_id": 3, "reads": 73}], "mhaps_target_id": 112}, {"mhaps": [{"mhap_id": 0, "reads": 234}, {"mhap_id": 2, "reads": 86}], "mhaps_target_id": 113}, {"mhaps": [{"mhap_id": 0, "reads": 333}, {"mhap_id": 1, "reads": 149}], "mhaps_target_id": 114}, {"mhaps": [{"mhap_id": 0, "reads": 43}, {"mhap_id": 4, "reads": 14}], "mhaps_target_id": 115}, {"mhaps": [{"mhap_id": 0, "reads": 389}], "mhaps_target_id": 116}, {"mhaps": [{"mhap_id": 0, "reads": 39}, {"mhap_id": 1, "reads": 26}], "mhaps_target_id": 117}, {"mhaps": [{"mhap_id": 0, "reads": 95}], "mhaps_target_id": 118}, {"mhaps": [{"mhap_id": 1, "reads": 631}, {"mhap_id": 0, "reads": 158}], "mhaps_target_id": 119}, {"mhaps": [{"mhap_id": 2, "reads": 662}, {"mhap_id": 21, "reads": 108}], "mhaps_target_id": 120}, {"mhaps": [{"mhap_id": 2, "reads": 596}, {"mhap_id": 15, "reads": 93}], "mhaps_target_id": 121}, {"mhaps": [{"mhap_id": 0, "reads": 886}, {"mhap_id": 6, "reads": 151}], "mhaps_target_id": 122}, {"mhaps": [{"mhap_id": 1, "reads": 1114}, {"mhap_id": 0, "reads": 176}], "mhaps_target_id": 123}, {"mhaps": [{"mhap_id": 0, "reads": 850}], "mhaps_target_id": 124}, {"mhaps": [{"mhap_id": 0, "reads": 143}], "mhaps_target_id": 125}, {"mhaps": [{"mhap_id": 2, "reads": 370}, {"mhap_id": 0, "reads": 202}], "mhaps_target_id": 126}, {"mhaps": [{"mhap_id": 1, "reads": 595}, {"mhap_id": 2, "reads": 419}, {"mhap_id": 0, "reads": 283}, {"mhap_id": 3, "reads": 253}], "mhaps_target_id": 127}, {"mhaps": [{"mhap_id": 0, "reads": 124}], "mhaps_target_id": 128}, {"mhaps": [{"mhap_id": 2, "reads": 390}, {"mhap_id": 0, "reads": 185}, {"mhap_id": 6, "reads": 134}], "mhaps_target_id": 129}, {"mhaps": [{"mhap_id": 0, "reads": 296}, {"mhap_id": 10, "reads": 87}, {"mhap_id": 1, "reads": 67}], "mhaps_target_id": 130}, {"mhaps": [{"mhap_id": 1, "reads": 323}, {"mhap_id": 0, "reads": 71}], "mhaps_target_id": 131}, {"mhaps": [{"mhap_id": 7, "reads": 244}, {"mhap_id": 10, "reads": 81}, {"mhap_id": 14, "reads": 68}, {"mhap_id": 1, "reads": 62}], "mhaps_target_id": 132}, {"mhaps": [{"mhap_id": 1, "reads": 651}, {"mhap_id": 0, "reads": 333}], "mhaps_target_id": 133}, {"mhaps": [{"mhap_id": 0, "reads": 188}], "mhaps_target_id": 134}, {"mhaps": [{"mhap_id": 3, "reads": 218}, {"mhap_id": 0, "reads": 196}, {"mhap_id": 1, "reads": 103}], "mhaps_target_id": 135}, {"mhaps": [{"mhap_id": 0, "reads": 370}, {"mhap_id": 3, "reads": 71}], "mhaps_target_id": 136}, {"mhaps": [{"mhap_id": 0, "reads": 1157}], "mhaps_target_id": 137}, {"mhaps": [{"mhap_id": 1, "reads": 838}, {"mhap_id": 0, "reads": 182}], "mhaps_target_id": 138}, {"mhaps": [{"mhap_id": 0, "reads": 200}], "mhaps_target_id": 139}, {"mhaps": [{"mhap_id": 2, "reads": 95}, {"mhap_id": 0, "reads": 79}], "mhaps_target_id": 140}, {"mhaps": [{"mhap_id": 0, "reads": 291}], "mhaps_target_id": 141}, {"mhaps": [{"mhap_id": 0, "reads": 589}], "mhaps_target_id": 142}, {"mhaps": [{"mhap_id": 1, "reads": 143}, {"mhap_id": 0, "reads": 115}, {"mhap_id": 2, "reads": 112}], "mhaps_target_id": 143}, {"mhaps": [{"mhap_id": 0, "reads": 179}, {"mhap_id": 2, "reads": 34}], "mhaps_target_id": 144}, {"mhaps": [{"mhap_id": 0, "reads": 523}, {"mhap_id": 1, "reads": 335}], "mhaps_target_id": 145}, {"mhaps": [{"mhap_id": 0, "reads": 316}], "mhaps_target_id": 146}, {"mhaps": [{"mhap_id": 0, "reads": 876}], "mhaps_target_id": 148}, {"mhaps": [{"mhap_id": 0, "reads": 625}], "mhaps_target_id": 149}, {"mhaps": [{"mhap_id": 0, "reads": 788}, {"mhap_id": 5, "reads": 391}], "mhaps_target_id": 150}, {"mhaps": [{"mhap_id": 0, "reads": 714}], "mhaps_target_id": 151}, {"mhaps": [{"mhap_id": 0, "reads": 240}], "mhaps_target_id": 152}, {"mhaps": [{"mhap_id": 2, "reads": 80}, {"mhap_id": 0, "reads": 31}, {"mhap_id": 5, "reads": 23}, {"mhap_id": 1, "reads": 21}], "mhaps_target_id": 153}, {"mhaps": [{"mhap_id": 2, "reads": 311}, {"mhap_id": 8, "reads": 136}, {"mhap_id": 4, "reads": 86}, {"mhap_id": 1, "reads": 81}], "mhaps_target_id": 154}, {"mhaps": [{"mhap_id": 1, "reads": 476}, {"mhap_id": 4, "reads": 128}, {"mhap_id": 0, "reads": 90}], "mhaps_target_id": 155}, {"mhaps": [{"mhap_id": 0, "reads": 224}], "mhaps_target_id": 156}, {"mhaps": [{"mhap_id": 0, "reads": 975}], "mhaps_target_id": 157}, {"mhaps": [{"mhap_id": 0, "reads": 343}], "mhaps_target_id": 158}, {"mhaps": [{"mhap_id": 0, "reads": 166}], "mhaps_target_id": 159}, {"mhaps": [{"mhap_id": 0, "reads": 328}], "mhaps_target_id": 160}, {"mhaps": [{"mhap_id": 0, "reads": 447}], "mhaps_target_id": 161}, {"mhaps": [{"mhap_id": 0, "reads": 1066}], "mhaps_target_id": 162}, {"mhaps": [{"mhap_id": 0, "reads": 358}], "mhaps_target_id": 163}, {"mhaps": [{"mhap_id": 0, "reads": 972}], "mhaps_target_id": 164}, {"mhaps": [{"mhap_id": 0, "reads": 344}], "mhaps_target_id": 165}, {"mhaps": [{"mhap_id": 1, "reads": 352}], "mhaps_target_id": 166}, {"mhaps": [{"mhap_id": 4, "reads": 308}, {"mhap_id": 2, "reads": 205}], "mhaps_target_id": 167}, {"mhaps": [{"mhap_id": 1, "reads": 343}, {"mhap_id": 2, "reads": 194}], "mhaps_target_id": 168}, {"mhaps": [{"mhap_id": 15, "reads": 432}, {"mhap_id": 22, "reads": 353}, {"mhap_id": 2, "reads": 299}], "mhaps_target_id": 169}, {"mhaps": [{"mhap_id": 3, "reads": 171}, {"mhap_id": 1, "reads": 95}, {"mhap_id": 0, "reads": 31}], "mhaps_target_id": 170}, {"mhaps": [{"mhap_id": 3, "reads": 152}, {"mhap_id": 1, "reads": 108}, {"mhap_id": 0, "reads": 39}], "mhaps_target_id": 171}, {"mhaps": [{"mhap_id": 1, "reads": 32}, {"mhap_id": 0, "reads": 18}], "mhaps_target_id": 172}, {"mhaps": [{"mhap_id": 0, "reads": 255}], "mhaps_target_id": 173}, {"mhaps": [{"mhap_id": 0, "reads": 333}], "mhaps_target_id": 174}, {"mhaps": [{"mhap_id": 1, "reads": 212}, {"mhap_id": 0, "reads": 123}], "mhaps_target_id": 175}, {"mhaps": [{"mhap_id": 0, "reads": 119}], "mhaps_target_id": 176}, {"mhaps": [{"mhap_id": 1, "reads": 96}, {"mhap_id": 0, "reads": 82}], "mhaps_target_id": 177}, {"mhaps": [{"mhap_id": 0, "reads": 291}], "mhaps_target_id": 178}, {"mhaps": [{"mhap_id": 0, "reads": 488}], "mhaps_target_id": 179}, {"mhaps": [{"mhap_id": 0, "reads": 723}], "mhaps_target_id": 180}, {"mhaps": [{"mhap_id": 0, "reads": 139}], "mhaps_target_id": 181}, {"mhaps": [{"mhap_id": 0, "reads": 517}], "mhaps_target_id": 182}, {"mhaps": [{"mhap_id": 0, "reads": 176}], "mhaps_target_id": 183}, {"mhaps": [{"mhap_id": 2, "reads": 133}, {"mhap_id": 5, "reads": 31}, {"mhap_id": 8, "reads": 31}], "mhaps_target_id": 184}, {"mhaps": [{"mhap_id": 0, "reads": 347}, {"mhap_id": 2, "reads": 177}, {"mhap_id": 1, "reads": 148}], "mhaps_target_id": 185}, {"mhaps": [{"mhap_id": 0, "reads": 431}], "mhaps_target_id": 186}, {"mhaps": [{"mhap_id": 0, "reads": 703}, {"mhap_id": 1, "reads": 449}], "mhaps_target_id": 187}, {"mhaps": [{"mhap_id": 0, "reads": 70}, {"mhap_id": 7, "reads": 41}], "mhaps_target_id": 188}, {"mhaps": [{"mhap_id": 0, "reads": 478}, {"mhap_id": 2, "reads": 108}, {"mhap_id": 1, "reads": 92}], "mhaps_target_id": 189}, {"mhaps": [{"mhap_id": 2, "reads": 98}, {"mhap_id": 1, "reads": 60}, {"mhap_id": 0, "reads": 31}], "mhaps_target_id": 190}, {"mhaps": [{"mhap_id": 3, "reads": 184}, {"mhap_id": 0, "reads": 176}, {"mhap_id": 2, "reads": 120}], "mhaps_target_id": 191}, {"mhaps": [{"mhap_id": 0, "reads": 447}], "mhaps_target_id": 192}, {"mhaps": [{"mhap_id": 1, "reads": 167}, {"mhap_id": 0, "reads": 95}], "mhaps_target_id": 193}, {"mhaps": [{"mhap_id": 3, "reads": 164}, {"mhap_id": 1, "reads": 149}, {"mhap_id": 0, "reads": 138}], "mhaps_target_id": 194}, {"mhaps": [{"mhap_id": 0, "reads": 297}], "mhaps_target_id": 195}, {"mhaps": [{"mhap_id": 0, "reads": 128}, {"mhap_id": 1, "reads": 67}], "mhaps_target_id": 196}, {"mhaps": [{"mhap_id": 0, "reads": 123}, {"mhap_id": 1, "reads": 93}, {"mhap_id": 4, "reads": 49}], "mhaps_target_id": 197}, {"mhaps": [{"mhap_id": 1, "reads": 667}, {"mhap_id": 4, "reads": 102}], "mhaps_target_id": 198}, {"mhaps": [{"mhap_id": 0, "reads": 701}, {"mhap_id": 2, "reads": 593}], "mhaps_target_id": 199}, {"mhaps": [{"mhap_id": 0, "reads": 695}], "mhaps_target_id": 200}, {"mhaps": [{"mhap_id": 0, "reads": 389}, {"mhap_id": 5, "reads": 89}], "mhaps_target_id": 201}, {"mhaps": [{"mhap_id": 2, "reads": 230}, {"mhap_id": 1, "reads": 55}, {"mhap_id": 0, "reads": 47}], "mhaps_target_id": 202}, {"mhaps": [{"mhap_id": 1, "reads": 360}, {"mhap_id": 0, "reads": 69}], "mhaps_target_id": 203}, {"mhaps": [{"mhap_id": 0, "reads": 136}, {"mhap_id": 1, "reads": 114}], "mhaps_target_id": 204}, {"mhaps": [{"mhap_id": 0, "reads": 1393}], "mhaps_target_id": 205}, {"mhaps": [{"mhap_id": 0, "reads": 109}, {"mhap_id": 2, "reads": 12}], "mhaps_target_id": 206}, {"mhaps": [{"mhap_id": 0, "reads": 188}, {"mhap_id": 2, "reads": 166}, {"mhap_id": 1, "reads": 89}], "mhaps_target_id": 207}]}, {"library_sample_id": 3, "target_results": [{"mhaps": [{"mhap_id": 0, "reads": 35}, {"mhap_id": 2, "reads": 28}], "mhaps_target_id": 0}, {"mhaps": [{"mhap_id": 0, "reads": 207}, {"mhap_id": 3, "reads": 130}, {"mhap_id": 4, "reads": 31}], "mhaps_target_id": 1}, {"mhaps": [{"mhap_id": 2, "reads": 305}, {"mhap_id": 0, "reads": 89}], "mhaps_target_id": 2}, {"mhaps": [{"mhap_id": 0, "reads": 107}], "mhaps_target_id": 3}, {"mhaps": [{"mhap_id": 1, "reads": 654}, {"mhap_id": 0, "reads": 338}, {"mhap_id": 9, "reads": 105}, {"mhap_id": 2, "reads": 71}, {"mhap_id": 7, "reads": 68}, {"mhap_id": 12, "reads": 16}], "mhaps_target_id": 4}, {"mhaps": [{"mhap_id": 8, "reads": 62}, {"mhap_id": 1, "reads": 41}, {"mhap_id": 2, "reads": 20}, {"mhap_id": 0, "reads": 14}], "mhaps_target_id": 5}, {"mhaps": [{"mhap_id": 0, "reads": 557}, {"mhap_id": 3, "reads": 37}, {"mhap_id": 5, "reads": 34}], "mhaps_target_id": 6}, {"mhaps": [{"mhap_id": 0, "reads": 149}, {"mhap_id": 2, "reads": 137}, {"mhap_id": 1, "reads": 28}], "mhaps_target_id": 7}, {"mhaps": [{"mhap_id": 2, "reads": 55}, {"mhap_id": 1, "reads": 48}, {"mhap_id": 0, "reads": 21}], "mhaps_target_id": 8}, {"mhaps": [{"mhap_id": 0, "reads": 400}, {"mhap_id": 1, "reads": 254}], "mhaps_target_id": 9}, {"mhaps": [{"mhap_id": 0, "reads": 408}], "mhaps_target_id": 10}, {"mhaps": [{"mhap_id": 5, "reads": 99}, {"mhap_id": 0, "reads": 93}], "mhaps_target_id": 11}, {"mhaps": [{"mhap_id": 5, "reads": 55}, {"mhap_id": 3, "reads": 42}, {"mhap_id": 0, "reads": 22}, {"mhap_id": 6, "reads": 20}, {"mhap_id": 1, "reads": 18}], "mhaps_target_id": 12}, {"mhaps": [{"mhap_id": 0, "reads": 668}, {"mhap_id": 1, "reads": 202}], "mhaps_target_id": 13}, {"mhaps": [{"mhap_id": 1, "reads": 239}, {"mhap_id": 0, "reads": 56}], "mhaps_target_id": 14}, {"mhaps": [{"mhap_id": 0, "reads": 126}, {"mhap_id": 1, "reads": 47}], "mhaps_target_id": 15}, {"mhaps": [{"mhap_id": 0, "reads": 82}, {"mhap_id": 7, "reads": 36}, {"mhap_id": 2, "reads": 13}], "mhaps_target_id": 16}, {"mhaps": [{"mhap_id": 0, "reads": 186}, {"mhap_id": 3, "reads": 82}, {"mhap_id": 1, "reads": 64}], "mhaps_target_id": 17}, {"mhaps": [{"mhap_id": 2, "reads": 425}, {"mhap_id": 0, "reads": 296}, {"mhap_id": 8, "reads": 61}], "mhaps_target_id": 18}, {"mhaps": [{"mhap_id": 6, "reads": 54}, {"mhap_id": 15, "reads": 29}, {"mhap_id": 0, "reads": 23}], "mhaps_target_id": 19}, {"mhaps": [{"mhap_id": 1, "reads": 515}, {"mhap_id": 0, "reads": 108}, {"mhap_id": 2, "reads": 41}], "mhaps_target_id": 20}, {"mhaps": [{"mhap_id": 1, "reads": 767}, {"mhap_id": 0, "reads": 52}], "mhaps_target_id": 21}, {"mhaps": [{"mhap_id": 2, "reads": 385}, {"mhap_id": 1, "reads": 250}], "mhaps_target_id": 22}, {"mhaps": [{"mhap_id": 0, "reads": 272}, {"mhap_id": 5, "reads": 47}], "mhaps_target_id": 23}, {"mhaps": [{"mhap_id": 0, "reads": 299}], "mhaps_target_id": 24}, {"mhaps": [{"mhap_id": 9, "reads": 120}, {"mhap_id": 2, "reads": 65}, {"mhap_id": 5, "reads": 40}, {"mhap_id": 3, "reads": 30}, {"mhap_id": 1, "reads": 28}], "mhaps_target_id": 25}, {"mhaps": [{"mhap_id": 1, "reads": 65}, {"mhap_id": 0, "reads": 27}], "mhaps_target_id": 26}, {"mhaps": [{"mhap_id": 0, "reads": 223}, {"mhap_id": 2, "reads": 64}], "mhaps_target_id": 27}, {"mhaps": [{"mhap_id": 0, "reads": 413}], "mhaps_target_id": 28}, {"mhaps": [{"mhap_id": 0, "reads": 266}], "mhaps_target_id": 29}, {"mhaps": [{"mhap_id": 0, "reads": 442}, {"mhap_id": 1, "reads": 268}], "mhaps_target_id": 30}, {"mhaps": [{"mhap_id": 2, "reads": 137}, {"mhap_id": 3, "reads": 50}, {"mhap_id": 0, "reads": 34}], "mhaps_target_id": 31}, {"mhaps": [{"mhap_id": 1, "reads": 294}, {"mhap_id": 0, "reads": 271}], "mhaps_target_id": 32}, {"mhaps": [{"mhap_id": 0, "reads": 597}, {"mhap_id": 1, "reads": 73}, {"mhap_id": 3, "reads": 34}, {"mhap_id": 2, "reads": 19}], "mhaps_target_id": 33}, {"mhaps": [{"mhap_id": 0, "reads": 389}, {"mhap_id": 8, "reads": 267}], "mhaps_target_id": 34}, {"mhaps": [{"mhap_id": 0, "reads": 172}, {"mhap_id": 1, "reads": 114}, {"mhap_id": 3, "reads": 44}, {"mhap_id": 2, "reads": 19}], "mhaps_target_id": 35}, {"mhaps": [{"mhap_id": 1, "reads": 78}, {"mhap_id": 0, "reads": 26}], "mhaps_target_id": 36}, {"mhaps": [{"mhap_id": 4, "reads": 75}, {"mhap_id": 3, "reads": 70}, {"mhap_id": 5, "reads": 26}, {"mhap_id": 0, "reads": 26}], "mhaps_target_id": 37}, {"mhaps": [{"mhap_id": 0, "reads": 99}, {"mhap_id": 1, "reads": 39}, {"mhap_id": 2, "reads": 17}], "mhaps_target_id": 38}, {"mhaps": [{"mhap_id": 3, "reads": 25}, {"mhap_id": 4, "reads": 23}, {"mhap_id": 0, "reads": 23}], "mhaps_target_id": 39}, {"mhaps": [{"mhap_id": 10, "reads": 337}, {"mhap_id": 0, "reads": 284}, {"mhap_id": 2, "reads": 69}, {"mhap_id": 5, "reads": 12}], "mhaps_target_id": 40}, {"mhaps": [{"mhap_id": 1, "reads": 360}, {"mhap_id": 0, "reads": 83}, {"mhap_id": 3, "reads": 35}, {"mhap_id": 2, "reads": 25}], "mhaps_target_id": 41}, {"mhaps": [{"mhap_id": 0, "reads": 106}], "mhaps_target_id": 42}, {"mhaps": [{"mhap_id": 0, "reads": 419}, {"mhap_id": 1, "reads": 224}], "mhaps_target_id": 43}, {"mhaps": [{"mhap_id": 0, "reads": 423}], "mhaps_target_id": 44}, {"mhaps": [{"mhap_id": 0, "reads": 528}], "mhaps_target_id": 45}, {"mhaps": [{"mhap_id": 0, "reads": 415}, {"mhap_id": 1, "reads": 13}], "mhaps_target_id": 46}, {"mhaps": [{"mhap_id": 6, "reads": 217}, {"mhap_id": 4, "reads": 92}, {"mhap_id": 1, "reads": 84}, {"mhap_id": 7, "reads": 16}], "mhaps_target_id": 47}, {"mhaps": [{"mhap_id": 4, "reads": 88}, {"mhap_id": 3, "reads": 23}, {"mhap_id": 0, "reads": 21}], "mhaps_target_id": 48}, {"mhaps": [{"mhap_id": 1, "reads": 327}, {"mhap_id": 0, "reads": 181}, {"mhap_id": 2, "reads": 25}], "mhaps_target_id": 49}, {"mhaps": [{"mhap_id": 0, "reads": 371}, {"mhap_id": 9, "reads": 62}, {"mhap_id": 1, "reads": 42}, {"mhap_id": 2, "reads": 19}], "mhaps_target_id": 50}, {"mhaps": [{"mhap_id": 0, "reads": 235}, {"mhap_id": 1, "reads": 15}], "mhaps_target_id": 51}, {"mhaps": [{"mhap_id": 11, "reads": 647}, {"mhap_id": 2, "reads": 432}, {"mhap_id": 0, "reads": 218}, {"mhap_id": 5, "reads": 182}], "mhaps_target_id": 52}, {"mhaps": [{"mhap_id": 0, "reads": 380}, {"mhap_id": 1, "reads": 13}], "mhaps_target_id": 53}, {"mhaps": [{"mhap_id": 0, "reads": 116}, {"mhap_id": 2, "reads": 95}], "mhaps_target_id": 54}, {"mhaps": [{"mhap_id": 0, "reads": 335}, {"mhap_id": 1, "reads": 201}], "mhaps_target_id": 55}, {"mhaps": [{"mhap_id": 0, "reads": 219}, {"mhap_id": 1, "reads": 154}], "mhaps_target_id": 56}, {"mhaps": [{"mhap_id": 0, "reads": 41}, {"mhap_id": 1, "reads": 33}], "mhaps_target_id": 57}, {"mhaps": [{"mhap_id": 0, "reads": 240}], "mhaps_target_id": 58}, {"mhaps": [{"mhap_id": 1, "reads": 300}, {"mhap_id": 0, "reads": 183}], "mhaps_target_id": 59}, {"mhaps": [{"mhap_id": 1, "reads": 180}, {"mhap_id": 0, "reads": 125}], "mhaps_target_id": 60}, {"mhaps": [{"mhap_id": 0, "reads": 744}], "mhaps_target_id": 61}, {"mhaps": [{"mhap_id": 0, "reads": 871}], "mhaps_target_id": 62}, {"mhaps": [{"mhap_id": 0, "reads": 670}, {"mhap_id": 1, "reads": 112}], "mhaps_target_id": 63}, {"mhaps": [{"mhap_id": 1, "reads": 82}, {"mhap_id": 0, "reads": 36}], "mhaps_target_id": 64}, {"mhaps": [{"mhap_id": 0, "reads": 85}, {"mhap_id": 1, "reads": 33}], "mhaps_target_id": 65}, {"mhaps": [{"mhap_id": 1, "reads": 175}, {"mhap_id": 0, "reads": 81}], "mhaps_target_id": 66}, {"mhaps": [{"mhap_id": 0, "reads": 453}, {"mhap_id": 1, "reads": 237}], "mhaps_target_id": 67}, {"mhaps": [{"mhap_id": 0, "reads": 184}, {"mhap_id": 1, "reads": 114}], "mhaps_target_id": 68}, {"mhaps": [{"mhap_id": 0, "reads": 233}, {"mhap_id": 2, "reads": 25}], "mhaps_target_id": 69}, {"mhaps": [{"mhap_id": 0, "reads": 204}, {"mhap_id": 1, "reads": 177}], "mhaps_target_id": 70}, {"mhaps": [{"mhap_id": 0, "reads": 59}, {"mhap_id": 2, "reads": 27}, {"mhap_id": 9, "reads": 11}], "mhaps_target_id": 71}, {"mhaps": [{"mhap_id": 1, "reads": 248}, {"mhap_id": 0, "reads": 229}], "mhaps_target_id": 72}, {"mhaps": [{"mhap_id": 0, "reads": 243}], "mhaps_target_id": 73}, {"mhaps": [{"mhap_id": 0, "reads": 240}, {"mhap_id": 1, "reads": 16}], "mhaps_target_id": 74}, {"mhaps": [{"mhap_id": 0, "reads": 181}, {"mhap_id": 2, "reads": 17}], "mhaps_target_id": 75}, {"mhaps": [{"mhap_id": 0, "reads": 442}, {"mhap_id": 1, "reads": 126}], "mhaps_target_id": 76}, {"mhaps": [{"mhap_id": 1, "reads": 368}, {"mhap_id": 0, "reads": 276}, {"mhap_id": 2, "reads": 203}], "mhaps_target_id": 77}, {"mhaps": [{"mhap_id": 0, "reads": 567}, {"mhap_id": 1, "reads": 361}], "mhaps_target_id": 78}, {"mhaps": [{"mhap_id": 2, "reads": 255}, {"mhap_id": 0, "reads": 249}, {"mhap_id": 1, "reads": 126}], "mhaps_target_id": 79}, {"mhaps": [{"mhap_id": 0, "reads": 292}, {"mhap_id": 8, "reads": 92}, {"mhap_id": 2, "reads": 28}, {"mhap_id": 5, "reads": 25}, {"mhap_id": 1, "reads": 16}], "mhaps_target_id": 80}, {"mhaps": [{"mhap_id": 0, "reads": 152}, {"mhap_id": 1, "reads": 141}, {"mhap_id": 2, "reads": 16}], "mhaps_target_id": 81}, {"mhaps": [{"mhap_id": 2, "reads": 36}, {"mhap_id": 0, "reads": 23}], "mhaps_target_id": 82}, {"mhaps": [{"mhap_id": 1, "reads": 247}, {"mhap_id": 0, "reads": 180}], "mhaps_target_id": 83}, {"mhaps": [{"mhap_id": 0, "reads": 784}, {"mhap_id": 1, "reads": 41}], "mhaps_target_id": 84}, {"mhaps": [{"mhap_id": 1, "reads": 203}, {"mhap_id": 0, "reads": 202}], "mhaps_target_id": 85}, {"mhaps": [{"mhap_id": 0, "reads": 468}], "mhaps_target_id": 86}, {"mhaps": [{"mhap_id": 0, "reads": 313}], "mhaps_target_id": 87}, {"mhaps": [{"mhap_id": 0, "reads": 375}], "mhaps_target_id": 88}, {"mhaps": [{"mhap_id": 0, "reads": 335}], "mhaps_target_id": 89}, {"mhaps": [{"mhap_id": 3, "reads": 1228}, {"mhap_id": 0, "reads": 1030}, {"mhap_id": 2, "reads": 413}], "mhaps_target_id": 90}, {"mhaps": [{"mhap_id": 1, "reads": 129}, {"mhap_id": 2, "reads": 33}, {"mhap_id": 0, "reads": 19}], "mhaps_target_id": 91}, {"mhaps": [{"mhap_id": 0, "reads": 382}, {"mhap_id": 2, "reads": 155}, {"mhap_id": 3, "reads": 62}, {"mhap_id": 1, "reads": 52}], "mhaps_target_id": 92}, {"mhaps": [{"mhap_id": 1, "reads": 119}, {"mhap_id": 0, "reads": 94}], "mhaps_target_id": 93}, {"mhaps": [{"mhap_id": 0, "reads": 111}], "mhaps_target_id": 94}, {"mhaps": [{"mhap_id": 0, "reads": 429}, {"mhap_id": 1, "reads": 101}, {"mhap_id": 3, "reads": 30}], "mhaps_target_id": 95}, {"mhaps": [{"mhap_id": 0, "reads": 1056}, {"mhap_id": 20, "reads": 198}, {"mhap_id": 6, "reads": 75}], "mhaps_target_id": 96}, {"mhaps": [{"mhap_id": 0, "reads": 370}, {"mhap_id": 1, "reads": 49}], "mhaps_target_id": 97}, {"mhaps": [{"mhap_id": 0, "reads": 294}, {"mhap_id": 7, "reads": 30}], "mhaps_target_id": 98}, {"mhaps": [{"mhap_id": 1, "reads": 268}, {"mhap_id": 2, "reads": 84}, {"mhap_id": 0, "reads": 38}], "mhaps_target_id": 99}, {"mhaps": [{"mhap_id": 0, "reads": 739}, {"mhap_id": 2, "reads": 166}], "mhaps_target_id": 100}, {"mhaps": [{"mhap_id": 0, "reads": 149}, {"mhap_id": 1, "reads": 21}], "mhaps_target_id": 101}, {"mhaps": [{"mhap_id": 1, "reads": 147}, {"mhap_id": 0, "reads": 79}], "mhaps_target_id": 102}, {"mhaps": [{"mhap_id": 1, "reads": 57}, {"mhap_id": 0, "reads": 52}, {"mhap_id": 4, "reads": 24}], "mhaps_target_id": 103}, {"mhaps": [{"mhap_id": 0, "reads": 316}], "mhaps_target_id": 104}, {"mhaps": [{"mhap_id": 0, "reads": 59}, {"mhap_id": 4, "reads": 48}, {"mhap_id": 1, "reads": 46}, {"mhap_id": 2, "reads": 33}], "mhaps_target_id": 105}, {"mhaps": [{"mhap_id": 0, "reads": 55}], "mhaps_target_id": 106}, {"mhaps": [{"mhap_id": 7, "reads": 271}, {"mhap_id": 0, "reads": 179}], "mhaps_target_id": 107}, {"mhaps": [{"mhap_id": 1, "reads": 242}, {"mhap_id": 2, "reads": 79}], "mhaps_target_id": 108}, {"mhaps": [{"mhap_id": 0, "reads": 199}, {"mhap_id": 12, "reads": 25}, {"mhap_id": 2, "reads": 14}, {"mhap_id": 1, "reads": 14}], "mhaps_target_id": 109}, {"mhaps": [{"mhap_id": 0, "reads": 802}], "mhaps_target_id": 110}, {"mhaps": [{"mhap_id": 3, "reads": 53}, {"mhap_id": 2, "reads": 22}], "mhaps_target_id": 111}, {"mhaps": [{"mhap_id": 0, "reads": 165}, {"mhap_id": 1, "reads": 34}], "mhaps_target_id": 112}, {"mhaps": [{"mhap_id": 1, "reads": 156}, {"mhap_id": 0, "reads": 114}, {"mhap_id": 2, "reads": 16}], "mhaps_target_id": 113}, {"mhaps": [{"mhap_id": 0, "reads": 162}, {"mhap_id": 1, "reads": 72}], "mhaps_target_id": 114}, {"mhaps": [{"mhap_id": 0, "reads": 65}, {"mhap_id": 1, "reads": 37}], "mhaps_target_id": 115}, {"mhaps": [{"mhap_id": 0, "reads": 626}, {"mhap_id": 1, "reads": 32}], "mhaps_target_id": 116}, {"mhaps": [{"mhap_id": 0, "reads": 69}], "mhaps_target_id": 118}, {"mhaps": [{"mhap_id": 1, "reads": 238}, {"mhap_id": 5, "reads": 147}, {"mhap_id": 0, "reads": 103}], "mhaps_target_id": 119}, {"mhaps": [{"mhap_id": 12, "reads": 203}, {"mhap_id": 0, "reads": 140}, {"mhap_id": 3, "reads": 113}, {"mhap_id": 7, "reads": 32}, {"mhap_id": 8, "reads": 27}], "mhaps_target_id": 120}, {"mhaps": [{"mhap_id": 3, "reads": 170}, {"mhap_id": 6, "reads": 167}, {"mhap_id": 0, "reads": 159}, {"mhap_id": 5, "reads": 42}], "mhaps_target_id": 121}, {"mhaps": [{"mhap_id": 0, "reads": 299}, {"mhap_id": 2, "reads": 259}, {"mhap_id": 1, "reads": 186}], "mhaps_target_id": 122}, {"mhaps": [{"mhap_id": 1, "reads": 870}, {"mhap_id": 0, "reads": 348}], "mhaps_target_id": 123}, {"mhaps": [{"mhap_id": 0, "reads": 437}, {"mhap_id": 1, "reads": 172}], "mhaps_target_id": 124}, {"mhaps": [{"mhap_id": 0, "reads": 155}], "mhaps_target_id": 125}, {"mhaps": [{"mhap_id": 0, "reads": 263}, {"mhap_id": 1, "reads": 136}], "mhaps_target_id": 126}, {"mhaps": [{"mhap_id": 0, "reads": 776}, {"mhap_id": 2, "reads": 213}, {"mhap_id": 5, "reads": 52}], "mhaps_target_id": 127}, {"mhaps": [{"mhap_id": 0, "reads": 71}], "mhaps_target_id": 128}, {"mhaps": [{"mhap_id": 0, "reads": 245}, {"mhap_id": 2, "reads": 217}, {"mhap_id": 1, "reads": 37}, {"mhap_id": 4, "reads": 19}], "mhaps_target_id": 129}, {"mhaps": [{"mhap_id": 1, "reads": 215}, {"mhap_id": 2, "reads": 175}], "mhaps_target_id": 130}, {"mhaps": [{"mhap_id": 0, "reads": 259}, {"mhap_id": 2, "reads": 17}, {"mhap_id": 1, "reads": 16}], "mhaps_target_id": 131}, {"mhaps": [{"mhap_id": 4, "reads": 308}, {"mhap_id": 2, "reads": 112}, {"mhap_id": 12, "reads": 111}], "mhaps_target_id": 132}, {"mhaps": [{"mhap_id": 3, "reads": 433}, {"mhap_id": 0, "reads": 330}, {"mhap_id": 5, "reads": 34}], "mhaps_target_id": 133}, {"mhaps": [{"mhap_id": 1, "reads": 127}, {"mhap_id": 0, "reads": 105}], "mhaps_target_id": 134}, {"mhaps": [{"mhap_id": 0, "reads": 320}, {"mhap_id": 1, "reads": 209}], "mhaps_target_id": 135}, {"mhaps": [{"mhap_id": 0, "reads": 380}, {"mhap_id": 1, "reads": 46}], "mhaps_target_id": 136}, {"mhaps": [{"mhap_id": 0, "reads": 1160}], "mhaps_target_id": 137}, {"mhaps": [{"mhap_id": 3, "reads": 410}, {"mhap_id": 2, "reads": 180}, {"mhap_id": 0, "reads": 165}, {"mhap_id": 1, "reads": 128}], "mhaps_target_id": 138}, {"mhaps": [{"mhap_id": 0, "reads": 104}, {"mhap_id": 1, "reads": 65}], "mhaps_target_id": 139}, {"mhaps": [{"mhap_id": 0, "reads": 94}, {"mhap_id": 2, "reads": 66}, {"mhap_id": 3, "reads": 48}], "mhaps_target_id": 140}, {"mhaps": [{"mhap_id": 0, "reads": 322}, {"mhap_id": 1, "reads": 49}], "mhaps_target_id": 141}, {"mhaps": [{"mhap_id": 0, "reads": 460}], "mhaps_target_id": 142}, {"mhaps": [{"mhap_id": 0, "reads": 180}, {"mhap_id": 1, "reads": 76}, {"mhap_id": 4, "reads": 60}], "mhaps_target_id": 143}, {"mhaps": [{"mhap_id": 0, "reads": 177}, {"mhap_id": 1, "reads": 44}], "mhaps_target_id": 144}, {"mhaps": [{"mhap_id": 0, "reads": 494}, {"mhap_id": 5, "reads": 149}, {"mhap_id": 1, "reads": 132}], "mhaps_target_id": 145}, {"mhaps": [{"mhap_id": 1, "reads": 183}, {"mhap_id": 0, "reads": 72}], "mhaps_target_id": 146}, {"mhaps": [{"mhap_id": 1, "reads": 621}, {"mhap_id": 0, "reads": 83}], "mhaps_target_id": 148}, {"mhaps": [{"mhap_id": 0, "reads": 608}], "mhaps_target_id": 149}, {"mhaps": [{"mhap_id": 1, "reads": 459}, {"mhap_id": 2, "reads": 215}, {"mhap_id": 0, "reads": 102}], "mhaps_target_id": 150}, {"mhaps": [{"mhap_id": 1, "reads": 372}, {"mhap_id": 3, "reads": 115}, {"mhap_id": 0, "reads": 80}], "mhaps_target_id": 151}, {"mhaps": [{"mhap_id": 0, "reads": 128}, {"mhap_id": 1, "reads": 39}], "mhaps_target_id": 152}, {"mhaps": [{"mhap_id": 4, "reads": 59}, {"mhap_id": 1, "reads": 45}, {"mhap_id": 5, "reads": 18}], "mhaps_target_id": 153}, {"mhaps": [{"mhap_id": 22, "reads": 160}, {"mhap_id": 19, "reads": 102}, {"mhap_id": 12, "reads": 41}, {"mhap_id": 1, "reads": 23}, {"mhap_id": 20, "reads": 14}], "mhaps_target_id": 154}, {"mhaps": [{"mhap_id": 0, "reads": 341}, {"mhap_id": 1, "reads": 116}], "mhaps_target_id": 155}, {"mhaps": [{"mhap_id": 0, "reads": 159}], "mhaps_target_id": 156}, {"mhaps": [{"mhap_id": 0, "reads": 1005}, {"mhap_id": 1, "reads": 175}], "mhaps_target_id": 157}, {"mhaps": [{"mhap_id": 0, "reads": 288}, {"mhap_id": 1, "reads": 34}], "mhaps_target_id": 158}, {"mhaps": [{"mhap_id": 0, "reads": 233}], "mhaps_target_id": 159}, {"mhaps": [{"mhap_id": 0, "reads": 263}], "mhaps_target_id": 160}, {"mhaps": [{"mhap_id": 0, "reads": 379}], "mhaps_target_id": 161}, {"mhaps": [{"mhap_id": 0, "reads": 485}], "mhaps_target_id": 162}, {"mhaps": [{"mhap_id": 0, "reads": 210}], "mhaps_target_id": 163}, {"mhaps": [{"mhap_id": 0, "reads": 1197}], "mhaps_target_id": 164}, {"mhaps": [{"mhap_id": 0, "reads": 262}], "mhaps_target_id": 165}, {"mhaps": [{"mhap_id": 2, "reads": 93}, {"mhap_id": 0, "reads": 66}, {"mhap_id": 1, "reads": 21}, {"mhap_id": 6, "reads": 11}], "mhaps_target_id": 166}, {"mhaps": [{"mhap_id": 0, "reads": 275}, {"mhap_id": 3, "reads": 102}, {"mhap_id": 1, "reads": 96}], "mhaps_target_id": 167}, {"mhaps": [{"mhap_id": 1, "reads": 190}, {"mhap_id": 0, "reads": 123}], "mhaps_target_id": 168}, {"mhaps": [{"mhap_id": 26, "reads": 442}, {"mhap_id": 0, "reads": 115}, {"mhap_id": 9, "reads": 79}, {"mhap_id": 11, "reads": 63}, {"mhap_id": 14, "reads": 48}], "mhaps_target_id": 169}, {"mhaps": [{"mhap_id": 0, "reads": 199}, {"mhap_id": 1, "reads": 77}], "mhaps_target_id": 170}, {"mhaps": [{"mhap_id": 0, "reads": 135}, {"mhap_id": 3, "reads": 98}], "mhaps_target_id": 171}, {"mhaps": [{"mhap_id": 0, "reads": 41}, {"mhap_id": 1, "reads": 20}], "mhaps_target_id": 172}, {"mhaps": [{"mhap_id": 1, "reads": 93}, {"mhap_id": 0, "reads": 36}, {"mhap_id": 3, "reads": 21}], "mhaps_target_id": 173}, {"mhaps": [{"mhap_id": 0, "reads": 218}], "mhaps_target_id": 174}, {"mhaps": [{"mhap_id": 1, "reads": 320}, {"mhap_id": 0, "reads": 48}], "mhaps_target_id": 175}, {"mhaps": [{"mhap_id": 0, "reads": 183}], "mhaps_target_id": 176}, {"mhaps": [{"mhap_id": 2, "reads": 122}, {"mhap_id": 0, "reads": 43}, {"mhap_id": 1, "reads": 23}], "mhaps_target_id": 177}, {"mhaps": [{"mhap_id": 0, "reads": 167}], "mhaps_target_id": 178}, {"mhaps": [{"mhap_id": 0, "reads": 373}], "mhaps_target_id": 179}, {"mhaps": [{"mhap_id": 0, "reads": 763}], "mhaps_target_id": 180}, {"mhaps": [{"mhap_id": 0, "reads": 121}], "mhaps_target_id": 181}, {"mhaps": [{"mhap_id": 0, "reads": 590}], "mhaps_target_id": 182}, {"mhaps": [{"mhap_id": 0, "reads": 201}], "mhaps_target_id": 183}, {"mhaps": [{"mhap_id": 0, "reads": 80}, {"mhap_id": 2, "reads": 34}, {"mhap_id": 3, "reads": 22}], "mhaps_target_id": 184}, {"mhaps": [{"mhap_id": 9, "reads": 213}, {"mhap_id": 5, "reads": 132}, {"mhap_id": 6, "reads": 131}, {"mhap_id": 1, "reads": 24}], "mhaps_target_id": 185}, {"mhaps": [{"mhap_id": 1, "reads": 201}, {"mhap_id": 0, "reads": 99}], "mhaps_target_id": 186}, {"mhaps": [{"mhap_id": 1, "reads": 335}, {"mhap_id": 2, "reads": 185}, {"mhap_id": 0, "reads": 70}, {"mhap_id": 4, "reads": 31}, {"mhap_id": 5, "reads": 22}], "mhaps_target_id": 187}, {"mhaps": [{"mhap_id": 2, "reads": 72}, {"mhap_id": 0, "reads": 35}, {"mhap_id": 1, "reads": 23}, {"mhap_id": 3, "reads": 20}], "mhaps_target_id": 188}, {"mhaps": [{"mhap_id": 1, "reads": 220}, {"mhap_id": 0, "reads": 177}, {"mhap_id": 3, "reads": 95}], "mhaps_target_id": 189}, {"mhaps": [{"mhap_id": 1, "reads": 152}, {"mhap_id": 0, "reads": 50}], "mhaps_target_id": 190}, {"mhaps": [{"mhap_id": 1, "reads": 261}, {"mhap_id": 7, "reads": 70}, {"mhap_id": 0, "reads": 20}, {"mhap_id": 4, "reads": 17}], "mhaps_target_id": 191}, {"mhaps": [{"mhap_id": 0, "reads": 421}], "mhaps_target_id": 192}, {"mhaps": [{"mhap_id": 0, "reads": 198}, {"mhap_id": 1, "reads": 37}], "mhaps_target_id": 193}, {"mhaps": [{"mhap_id": 0, "reads": 326}], "mhaps_target_id": 194}, {"mhaps": [{"mhap_id": 0, "reads": 252}], "mhaps_target_id": 195}, {"mhaps": [{"mhap_id": 1, "reads": 93}, {"mhap_id": 0, "reads": 83}], "mhaps_target_id": 196}, {"mhaps": [{"mhap_id": 1, "reads": 119}, {"mhap_id": 0, "reads": 82}, {"mhap_id": 4, "reads": 78}, {"mhap_id": 2, "reads": 16}], "mhaps_target_id": 197}, {"mhaps": [{"mhap_id": 1, "reads": 427}, {"mhap_id": 0, "reads": 246}], "mhaps_target_id": 198}, {"mhaps": [{"mhap_id": 0, "reads": 502}, {"mhap_id": 2, "reads": 341}, {"mhap_id": 5, "reads": 179}, {"mhap_id": 1, "reads": 67}], "mhaps_target_id": 199}, {"mhaps": [{"mhap_id": 1, "reads": 271}, {"mhap_id": 0, "reads": 158}, {"mhap_id": 2, "reads": 61}], "mhaps_target_id": 200}, {"mhaps": [{"mhap_id": 0, "reads": 330}, {"mhap_id": 1, "reads": 191}], "mhaps_target_id": 201}, {"mhaps": [{"mhap_id": 0, "reads": 303}, {"mhap_id": 1, "reads": 61}], "mhaps_target_id": 202}, {"mhaps": [{"mhap_id": 0, "reads": 429}, {"mhap_id": 2, "reads": 68}, {"mhap_id": 1, "reads": 22}], "mhaps_target_id": 203}, {"mhaps": [{"mhap_id": 1, "reads": 221}, {"mhap_id": 0, "reads": 31}], "mhaps_target_id": 204}, {"mhaps": [{"mhap_id": 0, "reads": 830}, {"mhap_id": 1, "reads": 122}, {"mhap_id": 4, "reads": 79}, {"mhap_id": 17, "reads": 53}], "mhaps_target_id": 205}, {"mhaps": [{"mhap_id": 0, "reads": 66}, {"mhap_id": 1, "reads": 48}], "mhaps_target_id": 206}, {"mhaps": [{"mhap_id": 0, "reads": 532}], "mhaps_target_id": 207}]}, {"library_sample_id": 1, "target_results": [{"mhaps": [{"mhap_id": 0, "reads": 44}, {"mhap_id": 1, "reads": 26}, {"mhap_id": 2, "reads": 13}], "mhaps_target_id": 0}, {"mhaps": [{"mhap_id": 3, "reads": 398}, {"mhap_id": 0, "reads": 71}], "mhaps_target_id": 1}, {"mhaps": [{"mhap_id": 2, "reads": 168}, {"mhap_id": 0, "reads": 28}], "mhaps_target_id": 2}, {"mhaps": [{"mhap_id": 1, "reads": 83}, {"mhap_id": 0, "reads": 25}], "mhaps_target_id": 3}, {"mhaps": [{"mhap_id": 0, "reads": 918}, {"mhap_id": 3, "reads": 158}], "mhaps_target_id": 4}, {"mhaps": [{"mhap_id": 2, "reads": 130}, {"mhap_id": 1, "reads": 22}, {"mhap_id": 0, "reads": 20}], "mhaps_target_id": 5}, {"mhaps": [{"mhap_id": 0, "reads": 315}, {"mhap_id": 1, "reads": 281}], "mhaps_target_id": 6}, {"mhaps": [{"mhap_id": 0, "reads": 163}, {"mhap_id": 1, "reads": 124}], "mhaps_target_id": 7}, {"mhaps": [{"mhap_id": 0, "reads": 94}, {"mhap_id": 1, "reads": 57}], "mhaps_target_id": 8}, {"mhaps": [{"mhap_id": 0, "reads": 336}, {"mhap_id": 1, "reads": 258}], "mhaps_target_id": 9}, {"mhaps": [{"mhap_id": 0, "reads": 260}, {"mhap_id": 3, "reads": 207}], "mhaps_target_id": 10}, {"mhaps": [{"mhap_id": 1, "reads": 209}, {"mhap_id": 4, "reads": 152}], "mhaps_target_id": 11}, {"mhaps": [{"mhap_id": 0, "reads": 175}], "mhaps_target_id": 12}, {"mhaps": [{"mhap_id": 0, "reads": 774}, {"mhap_id": 3, "reads": 519}], "mhaps_target_id": 13}, {"mhaps": [{"mhap_id": 0, "reads": 194}, {"mhap_id": 1, "reads": 126}], "mhaps_target_id": 14}, {"mhaps": [{"mhap_id": 0, "reads": 118}, {"mhap_id": 1, "reads": 58}], "mhaps_target_id": 15}, {"mhaps": [{"mhap_id": 2, "reads": 73}, {"mhap_id": 5, "reads": 37}, {"mhap_id": 4, "reads": 32}, {"mhap_id": 0, "reads": 22}], "mhaps_target_id": 16}, {"mhaps": [{"mhap_id": 2, "reads": 211}, {"mhap_id": 3, "reads": 115}, {"mhap_id": 0, "reads": 93}, {"mhap_id": 1, "reads": 40}], "mhaps_target_id": 17}, {"mhaps": [{"mhap_id": 13, "reads": 296}, {"mhap_id": 0, "reads": 189}, {"mhap_id": 15, "reads": 139}, {"mhap_id": 1, "reads": 73}], "mhaps_target_id": 18}, {"mhaps": [{"mhap_id": 0, "reads": 131}], "mhaps_target_id": 19}, {"mhaps": [{"mhap_id": 1, "reads": 460}, {"mhap_id": 0, "reads": 315}], "mhaps_target_id": 20}, {"mhaps": [{"mhap_id": 0, "reads": 614}, {"mhap_id": 1, "reads": 462}], "mhaps_target_id": 21}, {"mhaps": [{"mhap_id": 0, "reads": 484}, {"mhap_id": 1, "reads": 376}], "mhaps_target_id": 22}, {"mhaps": [{"mhap_id": 0, "reads": 199}, {"mhap_id": 2, "reads": 121}, {"mhap_id": 5, "reads": 121}], "mhaps_target_id": 23}, {"mhaps": [{"mhap_id": 0, "reads": 239}, {"mhap_id": 1, "reads": 28}], "mhaps_target_id": 24}, {"mhaps": [{"mhap_id": 1, "reads": 152}, {"mhap_id": 0, "reads": 132}], "mhaps_target_id": 25}, {"mhaps": [{"mhap_id": 0, "reads": 55}, {"mhap_id": 1, "reads": 29}], "mhaps_target_id": 26}, {"mhaps": [{"mhap_id": 0, "reads": 197}, {"mhap_id": 2, "reads": 36}], "mhaps_target_id": 27}, {"mhaps": [{"mhap_id": 0, "reads": 644}], "mhaps_target_id": 28}, {"mhaps": [{"mhap_id": 0, "reads": 177}], "mhaps_target_id": 29}, {"mhaps": [{"mhap_id": 0, "reads": 795}], "mhaps_target_id": 30}, {"mhaps": [{"mhap_id": 0, "reads": 113}, {"mhap_id": 3, "reads": 86}, {"mhap_id": 7, "reads": 75}], "mhaps_target_id": 31}, {"mhaps": [{"mhap_id": 1, "reads": 304}, {"mhap_id": 0, "reads": 273}], "mhaps_target_id": 32}, {"mhaps": [{"mhap_id": 0, "reads": 846}], "mhaps_target_id": 33}, {"mhaps": [{"mhap_id": 0, "reads": 408}, {"mhap_id": 4, "reads": 292}], "mhaps_target_id": 34}, {"mhaps": [{"mhap_id": 0, "reads": 261}, {"mhap_id": 1, "reads": 235}], "mhaps_target_id": 35}, {"mhaps": [{"mhap_id": 0, "reads": 95}, {"mhap_id": 2, "reads": 43}], "mhaps_target_id": 36}, {"mhaps": [{"mhap_id": 2, "reads": 103}, {"mhap_id": 1, "reads": 84}, {"mhap_id": 0, "reads": 48}], "mhaps_target_id": 37}, {"mhaps": [{"mhap_id": 1, "reads": 88}, {"mhap_id": 0, "reads": 52}], "mhaps_target_id": 38}, {"mhaps": [{"mhap_id": 0, "reads": 142}], "mhaps_target_id": 39}, {"mhaps": [{"mhap_id": 3, "reads": 295}, {"mhap_id": 1, "reads": 214}, {"mhap_id": 2, "reads": 185}], "mhaps_target_id": 40}, {"mhaps": [{"mhap_id": 0, "reads": 456}, {"mhap_id": 2, "reads": 47}], "mhaps_target_id": 41}, {"mhaps": [{"mhap_id": 0, "reads": 109}], "mhaps_target_id": 42}, {"mhaps": [{"mhap_id": 1, "reads": 246}, {"mhap_id": 0, "reads": 211}], "mhaps_target_id": 43}, {"mhaps": [{"mhap_id": 0, "reads": 256}], "mhaps_target_id": 44}, {"mhaps": [{"mhap_id": 0, "reads": 592}], "mhaps_target_id": 45}, {"mhaps": [{"mhap_id": 0, "reads": 642}], "mhaps_target_id": 46}, {"mhaps": [{"mhap_id": 3, "reads": 351}, {"mhap_id": 0, "reads": 201}, {"mhap_id": 1, "reads": 146}], "mhaps_target_id": 47}, {"mhaps": [{"mhap_id": 3, "reads": 38}, {"mhap_id": 5, "reads": 37}, {"mhap_id": 2, "reads": 30}, {"mhap_id": 6, "reads": 14}], "mhaps_target_id": 48}, {"mhaps": [{"mhap_id": 0, "reads": 694}], "mhaps_target_id": 49}, {"mhaps": [{"mhap_id": 0, "reads": 605}, {"mhap_id": 1, "reads": 182}], "mhaps_target_id": 50}, {"mhaps": [{"mhap_id": 0, "reads": 254}, {"mhap_id": 1, "reads": 51}], "mhaps_target_id": 51}, {"mhaps": [{"mhap_id": 4, "reads": 988}, {"mhap_id": 6, "reads": 454}, {"mhap_id": 1, "reads": 289}], "mhaps_target_id": 52}, {"mhaps": [{"mhap_id": 0, "reads": 290}, {"mhap_id": 2, "reads": 94}], "mhaps_target_id": 53}, {"mhaps": [{"mhap_id": 0, "reads": 132}, {"mhap_id": 2, "reads": 62}, {"mhap_id": 1, "reads": 41}], "mhaps_target_id": 54}, {"mhaps": [{"mhap_id": 0, "reads": 381}, {"mhap_id": 1, "reads": 135}], "mhaps_target_id": 55}, {"mhaps": [{"mhap_id": 0, "reads": 230}, {"mhap_id": 1, "reads": 99}], "mhaps_target_id": 56}, {"mhaps": [{"mhap_id": 0, "reads": 301}, {"mhap_id": 1, "reads": 98}], "mhaps_target_id": 57}, {"mhaps": [{"mhap_id": 0, "reads": 190}, {"mhap_id": 1, "reads": 87}], "mhaps_target_id": 58}, {"mhaps": [{"mhap_id": 0, "reads": 549}], "mhaps_target_id": 59}, {"mhaps": [{"mhap_id": 0, "reads": 219}, {"mhap_id": 1, "reads": 99}], "mhaps_target_id": 60}, {"mhaps": [{"mhap_id": 0, "reads": 782}], "mhaps_target_id": 61}, {"mhaps": [{"mhap_id": 0, "reads": 848}], "mhaps_target_id": 62}, {"mhaps": [{"mhap_id": 0, "reads": 861}], "mhaps_target_id": 63}, {"mhaps": [{"mhap_id": 0, "reads": 78}, {"mhap_id": 1, "reads": 11}], "mhaps_target_id": 64}, {"mhaps": [{"mhap_id": 2, "reads": 101}, {"mhap_id": 0, "reads": 38}, {"mhap_id": 1, "reads": 26}], "mhaps_target_id": 65}, {"mhaps": [{"mhap_id": 0, "reads": 197}, {"mhap_id": 1, "reads": 89}], "mhaps_target_id": 66}, {"mhaps": [{"mhap_id": 0, "reads": 449}], "mhaps_target_id": 67}, {"mhaps": [{"mhap_id": 0, "reads": 209}], "mhaps_target_id": 68}, {"mhaps": [{"mhap_id": 1, "reads": 304}, {"mhap_id": 0, "reads": 210}], "mhaps_target_id": 69}, {"mhaps": [{"mhap_id": 0, "reads": 290}, {"mhap_id": 1, "reads": 142}], "mhaps_target_id": 70}, {"mhaps": [{"mhap_id": 1, "reads": 129}, {"mhap_id": 2, "reads": 80}], "mhaps_target_id": 71}, {"mhaps": [{"mhap_id": 1, "reads": 284}, {"mhap_id": 2, "reads": 258}, {"mhap_id": 0, "reads": 248}], "mhaps_target_id": 72}, {"mhaps": [{"mhap_id": 0, "reads": 245}], "mhaps_target_id": 73}, {"mhaps": [{"mhap_id": 0, "reads": 245}], "mhaps_target_id": 74}, {"mhaps": [{"mhap_id": 0, "reads": 150}, {"mhap_id": 2, "reads": 68}], "mhaps_target_id": 75}, {"mhaps": [{"mhap_id": 0, "reads": 411}, {"mhap_id": 1, "reads": 336}], "mhaps_target_id": 76}, {"mhaps": [{"mhap_id": 0, "reads": 291}, {"mhap_id": 2, "reads": 271}, {"mhap_id": 1, "reads": 203}], "mhaps_target_id": 77}, {"mhaps": [{"mhap_id": 0, "reads": 992}], "mhaps_target_id": 78}, {"mhaps": [{"mhap_id": 0, "reads": 253}, {"mhap_id": 4, "reads": 141}, {"mhap_id": 2, "reads": 130}], "mhaps_target_id": 79}, {"mhaps": [{"mhap_id": 3, "reads": 351}, {"mhap_id": 2, "reads": 156}, {"mhap_id": 0, "reads": 124}], "mhaps_target_id": 80}, {"mhaps": [{"mhap_id": 0, "reads": 192}, {"mhap_id": 3, "reads": 153}], "mhaps_target_id": 81}, {"mhaps": [{"mhap_id": 0, "reads": 54}, {"mhap_id": 1, "reads": 17}], "mhaps_target_id": 82}, {"mhaps": [{"mhap_id": 1, "reads": 308}, {"mhap_id": 0, "reads": 146}], "mhaps_target_id": 83}, {"mhaps": [{"mhap_id": 0, "reads": 513}, {"mhap_id": 1, "reads": 368}], "mhaps_target_id": 84}, {"mhaps": [{"mhap_id": 0, "reads": 371}], "mhaps_target_id": 85}, {"mhaps": [{"mhap_id": 0, "reads": 438}], "mhaps_target_id": 86}, {"mhaps": [{"mhap_id": 2, "reads": 145}, {"mhap_id": 0, "reads": 104}], "mhaps_target_id": 87}, {"mhaps": [{"mhap_id": 0, "reads": 470}], "mhaps_target_id": 88}, {"mhaps": [{"mhap_id": 0, "reads": 266}], "mhaps_target_id": 89}, {"mhaps": [{"mhap_id": 0, "reads": 2345}], "mhaps_target_id": 90}, {"mhaps": [{"mhap_id": 2, "reads": 128}, {"mhap_id": 0, "reads": 41}], "mhaps_target_id": 91}, {"mhaps": [{"mhap_id": 2, "reads": 360}, {"mhap_id": 5, "reads": 263}, {"mhap_id": 1, "reads": 230}], "mhaps_target_id": 92}, {"mhaps": [{"mhap_id": 1, "reads": 224}, {"mhap_id": 0, "reads": 89}], "mhaps_target_id": 93}, {"mhaps": [{"mhap_id": 2, "reads": 65}, {"mhap_id": 0, "reads": 38}], "mhaps_target_id": 94}, {"mhaps": [{"mhap_id": 0, "reads": 805}], "mhaps_target_id": 95}, {"mhaps": [{"mhap_id": 3, "reads": 371}, {"mhap_id": 7, "reads": 341}, {"mhap_id": 13, "reads": 302}, {"mhap_id": 0, "reads": 215}], "mhaps_target_id": 96}, {"mhaps": [{"mhap_id": 0, "reads": 459}], "mhaps_target_id": 97}, {"mhaps": [{"mhap_id": 0, "reads": 419}], "mhaps_target_id": 98}, {"mhaps": [{"mhap_id": 0, "reads": 219}, {"mhap_id": 4, "reads": 179}], "mhaps_target_id": 99}, {"mhaps": [{"mhap_id": 0, "reads": 528}, {"mhap_id": 1, "reads": 406}], "mhaps_target_id": 100}, {"mhaps": [{"mhap_id": 0, "reads": 255}], "mhaps_target_id": 101}, {"mhaps": [{"mhap_id": 0, "reads": 265}], "mhaps_target_id": 102}, {"mhaps": [{"mhap_id": 2, "reads": 43}, {"mhap_id": 3, "reads": 36}, {"mhap_id": 0, "reads": 23}, {"mhap_id": 4, "reads": 17}], "mhaps_target_id": 103}, {"mhaps": [{"mhap_id": 0, "reads": 359}], "mhaps_target_id": 104}, {"mhaps": [{"mhap_id": 1, "reads": 76}, {"mhap_id": 2, "reads": 73}, {"mhap_id": 0, "reads": 26}], "mhaps_target_id": 105}, {"mhaps": [{"mhap_id": 0, "reads": 376}, {"mhap_id": 3, "reads": 97}], "mhaps_target_id": 107}, {"mhaps": [{"mhap_id": 1, "reads": 155}, {"mhap_id": 2, "reads": 85}, {"mhap_id": 0, "reads": 51}], "mhaps_target_id": 108}, {"mhaps": [{"mhap_id": 0, "reads": 87}, {"mhap_id": 2, "reads": 76}, {"mhap_id": 3, "reads": 59}, {"mhap_id": 1, "reads": 33}], "mhaps_target_id": 109}, {"mhaps": [{"mhap_id": 0, "reads": 941}, {"mhap_id": 1, "reads": 169}], "mhaps_target_id": 110}, {"mhaps": [{"mhap_id": 2, "reads": 266}, {"mhap_id": 3, "reads": 49}], "mhaps_target_id": 112}, {"mhaps": [{"mhap_id": 0, "reads": 275}, {"mhap_id": 2, "reads": 37}], "mhaps_target_id": 113}, {"mhaps": [{"mhap_id": 0, "reads": 398}, {"mhap_id": 1, "reads": 55}], "mhaps_target_id": 114}, {"mhaps": [{"mhap_id": 1, "reads": 62}, {"mhap_id": 0, "reads": 61}, {"mhap_id": 2, "reads": 44}], "mhaps_target_id": 115}, {"mhaps": [{"mhap_id": 0, "reads": 856}], "mhaps_target_id": 116}, {"mhaps": [{"mhap_id": 0, "reads": 70}, {"mhap_id": 1, "reads": 11}], "mhaps_target_id": 117}, {"mhaps": [{"mhap_id": 0, "reads": 81}], "mhaps_target_id": 118}, {"mhaps": [{"mhap_id": 0, "reads": 334}, {"mhap_id": 1, "reads": 334}], "mhaps_target_id": 119}, {"mhaps": [{"mhap_id": 11, "reads": 132}, {"mhap_id": 0, "reads": 118}, {"mhap_id": 6, "reads": 50}, {"mhap_id": 9, "reads": 50}], "mhaps_target_id": 120}, {"mhaps": [{"mhap_id": 0, "reads": 570}, {"mhap_id": 6, "reads": 129}, {"mhap_id": 2, "reads": 104}], "mhaps_target_id": 121}, {"mhaps": [{"mhap_id": 3, "reads": 470}, {"mhap_id": 2, "reads": 325}, {"mhap_id": 0, "reads": 120}], "mhaps_target_id": 122}, {"mhaps": [{"mhap_id": 0, "reads": 732}, {"mhap_id": 1, "reads": 615}], "mhaps_target_id": 123}, {"mhaps": [{"mhap_id": 0, "reads": 551}], "mhaps_target_id": 124}, {"mhaps": [{"mhap_id": 0, "reads": 195}], "mhaps_target_id": 125}, {"mhaps": [{"mhap_id": 0, "reads": 459}], "mhaps_target_id": 126}, {"mhaps": [{"mhap_id": 0, "reads": 710}, {"mhap_id": 2, "reads": 326}, {"mhap_id": 1, "reads": 147}], "mhaps_target_id": 127}, {"mhaps": [{"mhap_id": 0, "reads": 101}], "mhaps_target_id": 128}, {"mhaps": [{"mhap_id": 0, "reads": 286}, {"mhap_id": 1, "reads": 177}, {"mhap_id": 3, "reads": 102}], "mhaps_target_id": 129}, {"mhaps": [{"mhap_id": 0, "reads": 270}, {"mhap_id": 6, "reads": 123}, {"mhap_id": 3, "reads": 37}], "mhaps_target_id": 130}, {"mhaps": [{"mhap_id": 2, "reads": 170}, {"mhap_id": 1, "reads": 77}, {"mhap_id": 0, "reads": 47}], "mhaps_target_id": 131}, {"mhaps": [{"mhap_id": 4, "reads": 205}, {"mhap_id": 8, "reads": 170}, {"mhap_id": 18, "reads": 156}], "mhaps_target_id": 132}, {"mhaps": [{"mhap_id": 0, "reads": 469}, {"mhap_id": 6, "reads": 323}], "mhaps_target_id": 133}, {"mhaps": [{"mhap_id": 0, "reads": 152}], "mhaps_target_id": 134}, {"mhaps": [{"mhap_id": 2, "reads": 221}, {"mhap_id": 1, "reads": 202}, {"mhap_id": 3, "reads": 65}], "mhaps_target_id": 135}, {"mhaps": [{"mhap_id": 0, "reads": 394}], "mhaps_target_id": 136}, {"mhaps": [{"mhap_id": 0, "reads": 1299}], "mhaps_target_id": 137}, {"mhaps": [{"mhap_id": 0, "reads": 367}, {"mhap_id": 1, "reads": 288}, {"mhap_id": 3, "reads": 173}], "mhaps_target_id": 138}, {"mhaps": [{"mhap_id": 1, "reads": 163}, {"mhap_id": 0, "reads": 81}], "mhaps_target_id": 139}, {"mhaps": [{"mhap_id": 1, "reads": 176}, {"mhap_id": 0, "reads": 49}], "mhaps_target_id": 140}, {"mhaps": [{"mhap_id": 0, "reads": 333}], "mhaps_target_id": 141}, {"mhaps": [{"mhap_id": 0, "reads": 448}], "mhaps_target_id": 142}, {"mhaps": [{"mhap_id": 2, "reads": 213}, {"mhap_id": 0, "reads": 114}], "mhaps_target_id": 143}, {"mhaps": [{"mhap_id": 0, "reads": 141}, {"mhap_id": 2, "reads": 85}], "mhaps_target_id": 144}, {"mhaps": [{"mhap_id": 0, "reads": 490}, {"mhap_id": 1, "reads": 264}], "mhaps_target_id": 145}, {"mhaps": [{"mhap_id": 2, "reads": 164}, {"mhap_id": 0, "reads": 99}], "mhaps_target_id": 146}, {"mhaps": [{"mhap_id": 0, "reads": 519}], "mhaps_target_id": 148}, {"mhaps": [{"mhap_id": 1, "reads": 415}, {"mhap_id": 0, "reads": 222}], "mhaps_target_id": 149}, {"mhaps": [{"mhap_id": 4, "reads": 332}, {"mhap_id": 2, "reads": 258}, {"mhap_id": 0, "reads": 250}, {"mhap_id": 5, "reads": 114}], "mhaps_target_id": 150}, {"mhaps": [{"mhap_id": 0, "reads": 556}, {"mhap_id": 1, "reads": 103}], "mhaps_target_id": 151}, {"mhaps": [{"mhap_id": 0, "reads": 125}, {"mhap_id": 1, "reads": 57}], "mhaps_target_id": 152}, {"mhaps": [{"mhap_id": 0, "reads": 98}, {"mhap_id": 3, "reads": 14}], "mhaps_target_id": 153}, {"mhaps": [{"mhap_id": 0, "reads": 191}, {"mhap_id": 5, "reads": 166}, {"mhap_id": 10, "reads": 159}], "mhaps_target_id": 154}, {"mhaps": [{"mhap_id": 1, "reads": 527}], "mhaps_target_id": 155}, {"mhaps": [{"mhap_id": 0, "reads": 199}], "mhaps_target_id": 156}, {"mhaps": [{"mhap_id": 0, "reads": 1385}], "mhaps_target_id": 157}, {"mhaps": [{"mhap_id": 0, "reads": 426}], "mhaps_target_id": 158}, {"mhaps": [{"mhap_id": 0, "reads": 255}], "mhaps_target_id": 159}, {"mhaps": [{"mhap_id": 0, "reads": 326}], "mhaps_target_id": 160}, {"mhaps": [{"mhap_id": 0, "reads": 263}], "mhaps_target_id": 161}, {"mhaps": [{"mhap_id": 0, "reads": 430}], "mhaps_target_id": 162}, {"mhaps": [{"mhap_id": 0, "reads": 373}], "mhaps_target_id": 163}, {"mhaps": [{"mhap_id": 0, "reads": 638}], "mhaps_target_id": 164}, {"mhaps": [{"mhap_id": 0, "reads": 288}], "mhaps_target_id": 165}, {"mhaps": [{"mhap_id": 1, "reads": 202}], "mhaps_target_id": 166}, {"mhaps": [{"mhap_id": 0, "reads": 595}], "mhaps_target_id": 167}, {"mhaps": [{"mhap_id": 0, "reads": 227}], "mhaps_target_id": 168}, {"mhaps": [{"mhap_id": 0, "reads": 943}, {"mhap_id": 2, "reads": 307}], "mhaps_target_id": 169}, {"mhaps": [{"mhap_id": 0, "reads": 214}, {"mhap_id": 1, "reads": 31}], "mhaps_target_id": 170}, {"mhaps": [{"mhap_id": 0, "reads": 167}, {"mhap_id": 1, "reads": 21}], "mhaps_target_id": 171}, {"mhaps": [{"mhap_id": 1, "reads": 53}, {"mhap_id": 0, "reads": 20}], "mhaps_target_id": 172}, {"mhaps": [{"mhap_id": 0, "reads": 219}], "mhaps_target_id": 173}, {"mhaps": [{"mhap_id": 0, "reads": 257}], "mhaps_target_id": 174}, {"mhaps": [{"mhap_id": 0, "reads": 442}], "mhaps_target_id": 175}, {"mhaps": [{"mhap_id": 0, "reads": 278}], "mhaps_target_id": 176}, {"mhaps": [{"mhap_id": 0, "reads": 308}, {"mhap_id": 1, "reads": 40}], "mhaps_target_id": 177}, {"mhaps": [{"mhap_id": 0, "reads": 124}], "mhaps_target_id": 178}, {"mhaps": [{"mhap_id": 0, "reads": 452}], "mhaps_target_id": 179}, {"mhaps": [{"mhap_id": 0, "reads": 705}], "mhaps_target_id": 180}, {"mhaps": [{"mhap_id": 0, "reads": 180}], "mhaps_target_id": 181}, {"mhaps": [{"mhap_id": 0, "reads": 219}], "mhaps_target_id": 182}, {"mhaps": [{"mhap_id": 0, "reads": 174}], "mhaps_target_id": 183}, {"mhaps": [{"mhap_id": 1, "reads": 59}, {"mhap_id": 2, "reads": 53}, {"mhap_id": 0, "reads": 51}, {"mhap_id": 6, "reads": 30}], "mhaps_target_id": 184}, {"mhaps": [{"mhap_id": 4, "reads": 359}, {"mhap_id": 1, "reads": 204}, {"mhap_id": 0, "reads": 79}], "mhaps_target_id": 185}, {"mhaps": [{"mhap_id": 0, "reads": 384}, {"mhap_id": 1, "reads": 137}], "mhaps_target_id": 186}, {"mhaps": [{"mhap_id": 1, "reads": 666}, {"mhap_id": 0, "reads": 536}], "mhaps_target_id": 187}, {"mhaps": [{"mhap_id": 0, "reads": 109}, {"mhap_id": 2, "reads": 45}], "mhaps_target_id": 188}, {"mhaps": [{"mhap_id": 0, "reads": 712}], "mhaps_target_id": 189}, {"mhaps": [{"mhap_id": 0, "reads": 199}, {"mhap_id": 1, "reads": 38}], "mhaps_target_id": 190}, {"mhaps": [{"mhap_id": 1, "reads": 301}, {"mhap_id": 0, "reads": 77}, {"mhap_id": 2, "reads": 62}], "mhaps_target_id": 191}, {"mhaps": [{"mhap_id": 0, "reads": 533}], "mhaps_target_id": 192}, {"mhaps": [{"mhap_id": 0, "reads": 79}, {"mhap_id": 1, "reads": 77}], "mhaps_target_id": 193}, {"mhaps": [{"mhap_id": 0, "reads": 282}], "mhaps_target_id": 194}, {"mhaps": [{"mhap_id": 0, "reads": 278}], "mhaps_target_id": 195}, {"mhaps": [{"mhap_id": 1, "reads": 132}, {"mhap_id": 0, "reads": 24}], "mhaps_target_id": 196}, {"mhaps": [{"mhap_id": 0, "reads": 100}, {"mhap_id": 4, "reads": 63}, {"mhap_id": 2, "reads": 20}], "mhaps_target_id": 197}, {"mhaps": [{"mhap_id": 0, "reads": 497}, {"mhap_id": 2, "reads": 63}], "mhaps_target_id": 198}, {"mhaps": [{"mhap_id": 1, "reads": 856}, {"mhap_id": 0, "reads": 418}], "mhaps_target_id": 199}, {"mhaps": [{"mhap_id": 0, "reads": 426}, {"mhap_id": 2, "reads": 43}], "mhaps_target_id": 200}, {"mhaps": [{"mhap_id": 0, "reads": 469}], "mhaps_target_id": 201}, {"mhaps": [{"mhap_id": 3, "reads": 288}, {"mhap_id": 0, "reads": 106}], "mhaps_target_id": 202}, {"mhaps": [{"mhap_id": 0, "reads": 503}], "mhaps_target_id": 203}, {"mhaps": [{"mhap_id": 1, "reads": 188}, {"mhap_id": 0, "reads": 70}], "mhaps_target_id": 204}, {"mhaps": [{"mhap_id": 0, "reads": 1013}, {"mhap_id": 2, "reads": 121}], "mhaps_target_id": 205}, {"mhaps": [{"mhap_id": 1, "reads": 68}, {"mhap_id": 0, "reads": 45}], "mhaps_target_id": 206}, {"mhaps": [{"mhap_id": 0, "reads": 305}, {"mhap_id": 1, "reads": 74}, {"mhap_id": 2, "reads": 37}], "mhaps_target_id": 207}]}, {"library_sample_id": 2, "target_results": [{"mhaps": [{"mhap_id": 0, "reads": 65}], "mhaps_target_id": 0}, {"mhaps": [{"mhap_id": 0, "reads": 129}, {"mhap_id": 2, "reads": 125}], "mhaps_target_id": 1}, {"mhaps": [{"mhap_id": 1, "reads": 219}, {"mhap_id": 2, "reads": 166}], "mhaps_target_id": 2}, {"mhaps": [{"mhap_id": 1, "reads": 80}, {"mhap_id": 0, "reads": 11}], "mhaps_target_id": 3}, {"mhaps": [{"mhap_id": 5, "reads": 1345}, {"mhap_id": 1, "reads": 166}, {"mhap_id": 0, "reads": 96}], "mhaps_target_id": 4}, {"mhaps": [{"mhap_id": 1, "reads": 161}, {"mhap_id": 0, "reads": 25}, {"mhap_id": 4, "reads": 13}], "mhaps_target_id": 5}, {"mhaps": [{"mhap_id": 1, "reads": 303}, {"mhap_id": 0, "reads": 220}], "mhaps_target_id": 6}, {"mhaps": [{"mhap_id": 0, "reads": 350}], "mhaps_target_id": 7}, {"mhaps": [{"mhap_id": 2, "reads": 115}, {"mhap_id": 0, "reads": 69}], "mhaps_target_id": 8}, {"mhaps": [{"mhap_id": 1, "reads": 280}, {"mhap_id": 0, "reads": 174}], "mhaps_target_id": 9}, {"mhaps": [{"mhap_id": 1, "reads": 200}, {"mhap_id": 0, "reads": 160}, {"mhap_id": 2, "reads": 37}], "mhaps_target_id": 10}, {"mhaps": [{"mhap_id": 2, "reads": 182}, {"mhap_id": 0, "reads": 98}, {"mhap_id": 1, "reads": 30}], "mhaps_target_id": 11}, {"mhaps": [{"mhap_id": 1, "reads": 100}, {"mhap_id": 0, "reads": 50}], "mhaps_target_id": 12}, {"mhaps": [{"mhap_id": 1, "reads": 656}, {"mhap_id": 0, "reads": 298}], "mhaps_target_id": 13}, {"mhaps": [{"mhap_id": 1, "reads": 133}, {"mhap_id": 0, "reads": 76}], "mhaps_target_id": 14}, {"mhaps": [{"mhap_id": 0, "reads": 75}, {"mhap_id": 1, "reads": 59}], "mhaps_target_id": 15}, {"mhaps": [{"mhap_id": 5, "reads": 73}, {"mhap_id": 15, "reads": 33}, {"mhap_id": 4, "reads": 17}], "mhaps_target_id": 16}, {"mhaps": [{"mhap_id": 3, "reads": 209}, {"mhap_id": 5, "reads": 30}, {"mhap_id": 2, "reads": 30}], "mhaps_target_id": 17}, {"mhaps": [{"mhap_id": 0, "reads": 606}, {"mhap_id": 13, "reads": 61}, {"mhap_id": 5, "reads": 44}, {"mhap_id": 4, "reads": 37}], "mhaps_target_id": 18}, {"mhaps": [{"mhap_id": 0, "reads": 95}], "mhaps_target_id": 19}, {"mhaps": [{"mhap_id": 0, "reads": 678}, {"mhap_id": 1, "reads": 66}], "mhaps_target_id": 20}, {"mhaps": [{"mhap_id": 1, "reads": 570}, {"mhap_id": 0, "reads": 34}], "mhaps_target_id": 21}, {"mhaps": [{"mhap_id": 1, "reads": 701}, {"mhap_id": 7, "reads": 34}], "mhaps_target_id": 22}, {"mhaps": [{"mhap_id": 1, "reads": 177}, {"mhap_id": 3, "reads": 81}, {"mhap_id": 0, "reads": 31}], "mhaps_target_id": 23}, {"mhaps": [{"mhap_id": 0, "reads": 337}], "mhaps_target_id": 24}, {"mhaps": [{"mhap_id": 3, "reads": 176}, {"mhap_id": 7, "reads": 90}], "mhaps_target_id": 25}, {"mhaps": [{"mhap_id": 0, "reads": 91}, {"mhap_id": 1, "reads": 45}], "mhaps_target_id": 26}, {"mhaps": [{"mhap_id": 0, "reads": 298}], "mhaps_target_id": 27}, {"mhaps": [{"mhap_id": 0, "reads": 681}], "mhaps_target_id": 28}, {"mhaps": [{"mhap_id": 0, "reads": 167}], "mhaps_target_id": 29}, {"mhaps": [{"mhap_id": 4, "reads": 334}, {"mhap_id": 1, "reads": 153}], "mhaps_target_id": 30}, {"mhaps": [{"mhap_id": 1, "reads": 106}, {"mhap_id": 0, "reads": 48}], "mhaps_target_id": 31}, {"mhaps": [{"mhap_id": 1, "reads": 287}, {"mhap_id": 0, "reads": 148}], "mhaps_target_id": 32}, {"mhaps": [{"mhap_id": 0, "reads": 584}, {"mhap_id": 1, "reads": 47}], "mhaps_target_id": 33}, {"mhaps": [{"mhap_id": 0, "reads": 347}, {"mhap_id": 1, "reads": 229}, {"mhap_id": 8, "reads": 53}], "mhaps_target_id": 34}, {"mhaps": [{"mhap_id": 1, "reads": 357}, {"mhap_id": 0, "reads": 44}], "mhaps_target_id": 35}, {"mhaps": [{"mhap_id": 0, "reads": 90}], "mhaps_target_id": 36}, {"mhaps": [{"mhap_id": 3, "reads": 106}, {"mhap_id": 6, "reads": 56}, {"mhap_id": 2, "reads": 22}], "mhaps_target_id": 37}, {"mhaps": [{"mhap_id": 2, "reads": 95}, {"mhap_id": 1, "reads": 73}], "mhaps_target_id": 38}, {"mhaps": [{"mhap_id": 0, "reads": 52}, {"mhap_id": 4, "reads": 21}], "mhaps_target_id": 39}, {"mhaps": [{"mhap_id": 2, "reads": 511}, {"mhap_id": 1, "reads": 178}], "mhaps_target_id": 40}, {"mhaps": [{"mhap_id": 3, "reads": 274}, {"mhap_id": 0, "reads": 34}, {"mhap_id": 1, "reads": 29}, {"mhap_id": 2, "reads": 19}], "mhaps_target_id": 41}, {"mhaps": [{"mhap_id": 0, "reads": 99}], "mhaps_target_id": 42}, {"mhaps": [{"mhap_id": 0, "reads": 546}, {"mhap_id": 1, "reads": 221}], "mhaps_target_id": 43}, {"mhaps": [{"mhap_id": 0, "reads": 332}], "mhaps_target_id": 44}, {"mhaps": [{"mhap_id": 0, "reads": 624}], "mhaps_target_id": 45}, {"mhaps": [{"mhap_id": 0, "reads": 397}], "mhaps_target_id": 46}, {"mhaps": [{"mhap_id": 1, "reads": 217}, {"mhap_id": 2, "reads": 112}, {"mhap_id": 0, "reads": 35}], "mhaps_target_id": 47}, {"mhaps": [{"mhap_id": 3, "reads": 209}, {"mhap_id": 4, "reads": 12}], "mhaps_target_id": 48}, {"mhaps": [{"mhap_id": 1, "reads": 391}, {"mhap_id": 0, "reads": 175}], "mhaps_target_id": 49}, {"mhaps": [{"mhap_id": 10, "reads": 152}, {"mhap_id": 2, "reads": 93}, {"mhap_id": 0, "reads": 21}], "mhaps_target_id": 50}, {"mhaps": [{"mhap_id": 0, "reads": 179}, {"mhap_id": 1, "reads": 150}], "mhaps_target_id": 51}, {"mhaps": [{"mhap_id": 0, "reads": 836}, {"mhap_id": 2, "reads": 751}], "mhaps_target_id": 52}, {"mhaps": [{"mhap_id": 0, "reads": 280}], "mhaps_target_id": 53}, {"mhaps": [{"mhap_id": 0, "reads": 138}, {"mhap_id": 2, "reads": 19}, {"mhap_id": 1, "reads": 14}], "mhaps_target_id": 54}, {"mhaps": [{"mhap_id": 0, "reads": 512}, {"mhap_id": 1, "reads": 45}], "mhaps_target_id": 55}, {"mhaps": [{"mhap_id": 0, "reads": 306}, {"mhap_id": 1, "reads": 23}], "mhaps_target_id": 56}, {"mhaps": [{"mhap_id": 0, "reads": 175}], "mhaps_target_id": 58}, {"mhaps": [{"mhap_id": 0, "reads": 246}, {"mhap_id": 1, "reads": 46}], "mhaps_target_id": 59}, {"mhaps": [{"mhap_id": 0, "reads": 190}, {"mhap_id": 1, "reads": 30}], "mhaps_target_id": 60}, {"mhaps": [{"mhap_id": 0, "reads": 655}], "mhaps_target_id": 61}, {"mhaps": [{"mhap_id": 0, "reads": 705}], "mhaps_target_id": 62}, {"mhaps": [{"mhap_id": 0, "reads": 994}], "mhaps_target_id": 63}, {"mhaps": [{"mhap_id": 0, "reads": 116}], "mhaps_target_id": 65}, {"mhaps": [{"mhap_id": 0, "reads": 228}], "mhaps_target_id": 66}, {"mhaps": [{"mhap_id": 1, "reads": 185}, {"mhap_id": 0, "reads": 67}], "mhaps_target_id": 67}, {"mhaps": [{"mhap_id": 0, "reads": 272}, {"mhap_id": 3, "reads": 107}], "mhaps_target_id": 69}, {"mhaps": [{"mhap_id": 1, "reads": 223}, {"mhap_id": 0, "reads": 174}], "mhaps_target_id": 70}, {"mhaps": [{"mhap_id": 2, "reads": 125}, {"mhap_id": 0, "reads": 35}], "mhaps_target_id": 71}, {"mhaps": [{"mhap_id": 1, "reads": 578}, {"mhap_id": 0, "reads": 107}], "mhaps_target_id": 72}, {"mhaps": [{"mhap_id": 0, "reads": 146}, {"mhap_id": 1, "reads": 93}, {"mhap_id": 3, "reads": 40}], "mhaps_target_id": 73}, {"mhaps": [{"mhap_id": 0, "reads": 221}], "mhaps_target_id": 74}, {"mhaps": [{"mhap_id": 0, "reads": 92}, {"mhap_id": 1, "reads": 90}], "mhaps_target_id": 75}, {"mhaps": [{"mhap_id": 0, "reads": 561}], "mhaps_target_id": 76}, {"mhaps": [{"mhap_id": 0, "reads": 615}, {"mhap_id": 1, "reads": 73}], "mhaps_target_id": 77}, {"mhaps": [{"mhap_id": 0, "reads": 689}, {"mhap_id": 1, "reads": 81}], "mhaps_target_id": 78}, {"mhaps": [{"mhap_id": 0, "reads": 302}, {"mhap_id": 2, "reads": 176}, {"mhap_id": 1, "reads": 70}], "mhaps_target_id": 79}, {"mhaps": [{"mhap_id": 0, "reads": 332}, {"mhap_id": 1, "reads": 200}], "mhaps_target_id": 80}, {"mhaps": [{"mhap_id": 2, "reads": 177}, {"mhap_id": 1, "reads": 71}], "mhaps_target_id": 81}, {"mhaps": [{"mhap_id": 0, "reads": 54}, {"mhap_id": 2, "reads": 20}], "mhaps_target_id": 82}, {"mhaps": [{"mhap_id": 0, "reads": 235}, {"mhap_id": 1, "reads": 121}, {"mhap_id": 2, "reads": 17}], "mhaps_target_id": 83}, {"mhaps": [{"mhap_id": 0, "reads": 599}], "mhaps_target_id": 84}, {"mhaps": [{"mhap_id": 0, "reads": 242}, {"mhap_id": 1, "reads": 28}], "mhaps_target_id": 85}, {"mhaps": [{"mhap_id": 0, "reads": 420}], "mhaps_target_id": 86}, {"mhaps": [{"mhap_id": 0, "reads": 485}], "mhaps_target_id": 87}, {"mhaps": [{"mhap_id": 0, "reads": 366}], "mhaps_target_id": 88}, {"mhaps": [{"mhap_id": 0, "reads": 212}], "mhaps_target_id": 89}, {"mhaps": [{"mhap_id": 0, "reads": 2532}, {"mhap_id": 1, "reads": 142}], "mhaps_target_id": 90}, {"mhaps": [{"mhap_id": 2, "reads": 154}, {"mhap_id": 1, "reads": 27}], "mhaps_target_id": 91}, {"mhaps": [{"mhap_id": 2, "reads": 534}, {"mhap_id": 0, "reads": 119}], "mhaps_target_id": 92}, {"mhaps": [{"mhap_id": 1, "reads": 134}, {"mhap_id": 0, "reads": 130}], "mhaps_target_id": 93}, {"mhaps": [{"mhap_id": 1, "reads": 71}, {"mhap_id": 0, "reads": 44}, {"mhap_id": 2, "reads": 18}], "mhaps_target_id": 94}, {"mhaps": [{"mhap_id": 0, "reads": 380}, {"mhap_id": 1, "reads": 120}], "mhaps_target_id": 95}, {"mhaps": [{"mhap_id": 4, "reads": 398}, {"mhap_id": 20, "reads": 264}], "mhaps_target_id": 96}, {"mhaps": [{"mhap_id": 1, "reads": 198}, {"mhap_id": 0, "reads": 165}], "mhaps_target_id": 97}, {"mhaps": [{"mhap_id": 0, "reads": 415}], "mhaps_target_id": 98}, {"mhaps": [{"mhap_id": 0, "reads": 206}, {"mhap_id": 1, "reads": 107}], "mhaps_target_id": 99}, {"mhaps": [{"mhap_id": 0, "reads": 575}], "mhaps_target_id": 100}, {"mhaps": [{"mhap_id": 0, "reads": 283}], "mhaps_target_id": 101}, {"mhaps": [{"mhap_id": 2, "reads": 180}, {"mhap_id": 1, "reads": 20}], "mhaps_target_id": 102}, {"mhaps": [{"mhap_id": 0, "reads": 128}, {"mhap_id": 4, "reads": 17}], "mhaps_target_id": 103}, {"mhaps": [{"mhap_id": 0, "reads": 314}, {"mhap_id": 1, "reads": 172}], "mhaps_target_id": 104}, {"mhaps": [{"mhap_id": 2, "reads": 54}, {"mhap_id": 1, "reads": 22}], "mhaps_target_id": 105}, {"mhaps": [{"mhap_id": 8, "reads": 222}, {"mhap_id": 0, "reads": 192}], "mhaps_target_id": 107}, {"mhaps": [{"mhap_id": 0, "reads": 348}], "mhaps_target_id": 108}, {"mhaps": [{"mhap_id": 0, "reads": 166}, {"mhap_id": 3, "reads": 19}], "mhaps_target_id": 109}, {"mhaps": [{"mhap_id": 0, "reads": 839}], "mhaps_target_id": 110}, {"mhaps": [{"mhap_id": 2, "reads": 91}, {"mhap_id": 3, "reads": 16}], "mhaps_target_id": 111}, {"mhaps": [{"mhap_id": 0, "reads": 188}, {"mhap_id": 3, "reads": 31}], "mhaps_target_id": 112}, {"mhaps": [{"mhap_id": 0, "reads": 205}, {"mhap_id": 1, "reads": 113}], "mhaps_target_id": 113}, {"mhaps": [{"mhap_id": 0, "reads": 628}, {"mhap_id": 1, "reads": 71}], "mhaps_target_id": 114}, {"mhaps": [{"mhap_id": 1, "reads": 62}, {"mhap_id": 2, "reads": 45}], "mhaps_target_id": 115}, {"mhaps": [{"mhap_id": 0, "reads": 579}], "mhaps_target_id": 116}, {"mhaps": [{"mhap_id": 1, "reads": 60}, {"mhap_id": 0, "reads": 20}], "mhaps_target_id": 117}, {"mhaps": [{"mhap_id": 1, "reads": 471}, {"mhap_id": 10, "reads": 60}], "mhaps_target_id": 119}, {"mhaps": [{"mhap_id": 11, "reads": 321}, {"mhap_id": 1, "reads": 132}, {"mhap_id": 3, "reads": 48}, {"mhap_id": 4, "reads": 35}], "mhaps_target_id": 120}, {"mhaps": [{"mhap_id": 0, "reads": 844}], "mhaps_target_id": 121}, {"mhaps": [{"mhap_id": 3, "reads": 358}, {"mhap_id": 1, "reads": 248}], "mhaps_target_id": 122}, {"mhaps": [{"mhap_id": 0, "reads": 683}, {"mhap_id": 1, "reads": 345}], "mhaps_target_id": 123}, {"mhaps": [{"mhap_id": 0, "reads": 591}], "mhaps_target_id": 124}, {"mhaps": [{"mhap_id": 0, "reads": 198}], "mhaps_target_id": 125}, {"mhaps": [{"mhap_id": 0, "reads": 353}], "mhaps_target_id": 126}, {"mhaps": [{"mhap_id": 0, "reads": 1143}, {"mhap_id": 2, "reads": 116}], "mhaps_target_id": 127}, {"mhaps": [{"mhap_id": 0, "reads": 82}], "mhaps_target_id": 128}, {"mhaps": [{"mhap_id": 0, "reads": 285}, {"mhap_id": 2, "reads": 149}, {"mhap_id": 8, "reads": 72}], "mhaps_target_id": 129}, {"mhaps": [{"mhap_id": 0, "reads": 356}], "mhaps_target_id": 130}, {"mhaps": [{"mhap_id": 0, "reads": 246}, {"mhap_id": 1, "reads": 27}], "mhaps_target_id": 131}, {"mhaps": [{"mhap_id": 0, "reads": 392}, {"mhap_id": 6, "reads": 25}], "mhaps_target_id": 132}, {"mhaps": [{"mhap_id": 2, "reads": 369}, {"mhap_id": 0, "reads": 240}], "mhaps_target_id": 133}, {"mhaps": [{"mhap_id": 1, "reads": 111}, {"mhap_id": 0, "reads": 44}], "mhaps_target_id": 134}, {"mhaps": [{"mhap_id": 4, "reads": 241}, {"mhap_id": 1, "reads": 93}, {"mhap_id": 2, "reads": 44}], "mhaps_target_id": 135}, {"mhaps": [{"mhap_id": 0, "reads": 326}, {"mhap_id": 1, "reads": 37}], "mhaps_target_id": 136}, {"mhaps": [{"mhap_id": 0, "reads": 1312}], "mhaps_target_id": 137}, {"mhaps": [{"mhap_id": 2, "reads": 702}, {"mhap_id": 0, "reads": 93}], "mhaps_target_id": 138}, {"mhaps": [{"mhap_id": 0, "reads": 215}], "mhaps_target_id": 139}, {"mhaps": [{"mhap_id": 2, "reads": 168}, {"mhap_id": 0, "reads": 13}], "mhaps_target_id": 140}, {"mhaps": [{"mhap_id": 0, "reads": 402}], "mhaps_target_id": 141}, {"mhaps": [{"mhap_id": 2, "reads": 191}, {"mhap_id": 0, "reads": 185}], "mhaps_target_id": 142}, {"mhaps": [{"mhap_id": 1, "reads": 256}, {"mhap_id": 0, "reads": 124}], "mhaps_target_id": 143}, {"mhaps": [{"mhap_id": 0, "reads": 138}, {"mhap_id": 1, "reads": 20}], "mhaps_target_id": 144}, {"mhaps": [{"mhap_id": 0, "reads": 509}, {"mhap_id": 1, "reads": 312}], "mhaps_target_id": 145}, {"mhaps": [{"mhap_id": 0, "reads": 142}, {"mhap_id": 1, "reads": 70}], "mhaps_target_id": 146}, {"mhaps": [{"mhap_id": 0, "reads": 621}], "mhaps_target_id": 148}, {"mhaps": [{"mhap_id": 1, "reads": 432}, {"mhap_id": 0, "reads": 66}], "mhaps_target_id": 149}, {"mhaps": [{"mhap_id": 2, "reads": 477}, {"mhap_id": 4, "reads": 302}, {"mhap_id": 0, "reads": 111}, {"mhap_id": 1, "reads": 70}], "mhaps_target_id": 150}, {"mhaps": [{"mhap_id": 1, "reads": 321}, {"mhap_id": 0, "reads": 278}], "mhaps_target_id": 151}, {"mhaps": [{"mhap_id": 0, "reads": 198}, {"mhap_id": 1, "reads": 101}], "mhaps_target_id": 152}, {"mhaps": [{"mhap_id": 3, "reads": 41}, {"mhap_id": 1, "reads": 25}, {"mhap_id": 2, "reads": 12}], "mhaps_target_id": 153}, {"mhaps": [{"mhap_id": 10, "reads": 293}, {"mhap_id": 19, "reads": 131}, {"mhap_id": 0, "reads": 33}, {"mhap_id": 5, "reads": 32}], "mhaps_target_id": 154}, {"mhaps": [{"mhap_id": 1, "reads": 413}, {"mhap_id": 2, "reads": 64}, {"mhap_id": 0, "reads": 32}], "mhaps_target_id": 155}, {"mhaps": [{"mhap_id": 0, "reads": 103}], "mhaps_target_id": 156}, {"mhaps": [{"mhap_id": 0, "reads": 1528}], "mhaps_target_id": 157}, {"mhaps": [{"mhap_id": 0, "reads": 302}], "mhaps_target_id": 158}, {"mhaps": [{"mhap_id": 0, "reads": 254}], "mhaps_target_id": 159}, {"mhaps": [{"mhap_id": 0, "reads": 265}], "mhaps_target_id": 160}, {"mhaps": [{"mhap_id": 0, "reads": 360}], "mhaps_target_id": 161}, {"mhaps": [{"mhap_id": 0, "reads": 438}], "mhaps_target_id": 162}, {"mhaps": [{"mhap_id": 0, "reads": 233}], "mhaps_target_id": 163}, {"mhaps": [{"mhap_id": 0, "reads": 355}], "mhaps_target_id": 164}, {"mhaps": [{"mhap_id": 0, "reads": 221}], "mhaps_target_id": 165}, {"mhaps": [{"mhap_id": 0, "reads": 116}, {"mhap_id": 2, "reads": 64}], "mhaps_target_id": 166}, {"mhaps": [{"mhap_id": 0, "reads": 276}, {"mhap_id": 2, "reads": 114}], "mhaps_target_id": 167}, {"mhaps": [{"mhap_id": 0, "reads": 271}, {"mhap_id": 2, "reads": 98}, {"mhap_id": 1, "reads": 31}], "mhaps_target_id": 168}, {"mhaps": [{"mhap_id": 3, "reads": 510}, {"mhap_id": 21, "reads": 54}, {"mhap_id": 0, "reads": 33}, {"mhap_id": 16, "reads": 27}], "mhaps_target_id": 169}, {"mhaps": [{"mhap_id": 0, "reads": 201}], "mhaps_target_id": 170}, {"mhaps": [{"mhap_id": 0, "reads": 189}], "mhaps_target_id": 171}, {"mhaps": [{"mhap_id": 1, "reads": 72}], "mhaps_target_id": 172}, {"mhaps": [{"mhap_id": 0, "reads": 157}], "mhaps_target_id": 173}, {"mhaps": [{"mhap_id": 0, "reads": 395}], "mhaps_target_id": 174}, {"mhaps": [{"mhap_id": 1, "reads": 301}, {"mhap_id": 0, "reads": 33}], "mhaps_target_id": 175}, {"mhaps": [{"mhap_id": 0, "reads": 265}], "mhaps_target_id": 176}, {"mhaps": [{"mhap_id": 0, "reads": 193}], "mhaps_target_id": 178}, {"mhaps": [{"mhap_id": 0, "reads": 339}, {"mhap_id": 2, "reads": 34}], "mhaps_target_id": 179}, {"mhaps": [{"mhap_id": 0, "reads": 831}, {"mhap_id": 2, "reads": 52}], "mhaps_target_id": 180}, {"mhaps": [{"mhap_id": 0, "reads": 136}], "mhaps_target_id": 181}, {"mhaps": [{"mhap_id": 0, "reads": 414}], "mhaps_target_id": 182}, {"mhaps": [{"mhap_id": 0, "reads": 160}], "mhaps_target_id": 183}, {"mhaps": [{"mhap_id": 3, "reads": 85}, {"mhap_id": 0, "reads": 58}], "mhaps_target_id": 184}, {"mhaps": [{"mhap_id": 0, "reads": 223}, {"mhap_id": 1, "reads": 137}, {"mhap_id": 3, "reads": 38}, {"mhap_id": 6, "reads": 23}], "mhaps_target_id": 185}, {"mhaps": [{"mhap_id": 0, "reads": 302}], "mhaps_target_id": 186}, {"mhaps": [{"mhap_id": 1, "reads": 709}, {"mhap_id": 2, "reads": 430}, {"mhap_id": 0, "reads": 172}], "mhaps_target_id": 187}, {"mhaps": [{"mhap_id": 1, "reads": 126}, {"mhap_id": 0, "reads": 112}], "mhaps_target_id": 188}, {"mhaps": [{"mhap_id": 1, "reads": 453}, {"mhap_id": 0, "reads": 168}], "mhaps_target_id": 189}, {"mhaps": [{"mhap_id": 5, "reads": 46}, {"mhap_id": 3, "reads": 37}], "mhaps_target_id": 190}, {"mhaps": [{"mhap_id": 2, "reads": 252}, {"mhap_id": 1, "reads": 185}], "mhaps_target_id": 191}, {"mhaps": [{"mhap_id": 0, "reads": 481}], "mhaps_target_id": 192}, {"mhaps": [{"mhap_id": 1, "reads": 157}, {"mhap_id": 0, "reads": 12}], "mhaps_target_id": 193}, {"mhaps": [{"mhap_id": 0, "reads": 386}, {"mhap_id": 1, "reads": 28}], "mhaps_target_id": 194}, {"mhaps": [{"mhap_id": 0, "reads": 247}], "mhaps_target_id": 195}, {"mhaps": [{"mhap_id": 1, "reads": 64}, {"mhap_id": 0, "reads": 58}], "mhaps_target_id": 196}, {"mhaps": [{"mhap_id": 4, "reads": 99}, {"mhap_id": 0, "reads": 68}], "mhaps_target_id": 197}, {"mhaps": [{"mhap_id": 2, "reads": 398}, {"mhap_id": 0, "reads": 34}], "mhaps_target_id": 198}, {"mhaps": [{"mhap_id": 2, "reads": 440}, {"mhap_id": 4, "reads": 278}], "mhaps_target_id": 199}, {"mhaps": [{"mhap_id": 1, "reads": 482}], "mhaps_target_id": 200}, {"mhaps": [{"mhap_id": 1, "reads": 296}, {"mhap_id": 0, "reads": 71}], "mhaps_target_id": 201}, {"mhaps": [{"mhap_id": 0, "reads": 308}, {"mhap_id": 2, "reads": 24}], "mhaps_target_id": 202}, {"mhaps": [{"mhap_id": 0, "reads": 404}, {"mhap_id": 1, "reads": 32}], "mhaps_target_id": 203}, {"mhaps": [{"mhap_id": 1, "reads": 110}, {"mhap_id": 0, "reads": 110}], "mhaps_target_id": 204}, {"mhaps": [{"mhap_id": 0, "reads": 879}, {"mhap_id": 2, "reads": 440}], "mhaps_target_id": 205}, {"mhaps": [{"mhap_id": 0, "reads": 61}, {"mhap_id": 1, "reads": 47}], "mhaps_target_id": 206}, {"mhaps": [{"mhap_id": 3, "reads": 285}, {"mhap_id": 2, "reads": 200}, {"mhap_id": 0, "reads": 40}], "mhaps_target_id": 207}]}]}, {"library_samples": [{"library_sample_id": 6, "target_results": [{"mhaps": [{"mhap_id": 0, "reads": 105}], "mhaps_target_id": 0}, {"mhaps": [{"mhap_id": 5, "reads": 526}], "mhaps_target_id": 1}, {"mhaps": [{"mhap_id": 3, "reads": 759}], "mhaps_target_id": 2}, {"mhaps": [{"mhap_id": 0, "reads": 132}, {"mhap_id": 2, "reads": 14}], "mhaps_target_id": 3}, {"mhaps": [{"mhap_id": 2, "reads": 1694}], "mhaps_target_id": 4}, {"mhaps": [{"mhap_id": 3, "reads": 224}], "mhaps_target_id": 5}, {"mhaps": [{"mhap_id": 1, "reads": 648}], "mhaps_target_id": 6}, {"mhaps": [{"mhap_id": 1, "reads": 320}], "mhaps_target_id": 7}, {"mhaps": [{"mhap_id": 3, "reads": 160}], "mhaps_target_id": 8}, {"mhaps": [{"mhap_id": 1, "reads": 586}], "mhaps_target_id": 9}, {"mhaps": [{"mhap_id": 0, "reads": 662}], "mhaps_target_id": 10}, {"mhaps": [{"mhap_id": 0, "reads": 422}, {"mhap_id": 5, "reads": 41}], "mhaps_target_id": 11}, {"mhaps": [{"mhap_id": 1, "reads": 332}], "mhaps_target_id": 12}, {"mhaps": [{"mhap_id": 1, "reads": 1585}, {"mhap_id": 3, "reads": 105}], "mhaps_target_id": 13}, {"mhaps": [{"mhap_id": 0, "reads": 234}, {"mhap_id": 1, "reads": 54}], "mhaps_target_id": 14}, {"mhaps": [{"mhap_id": 2, "reads": 174}, {"mhap_id": 0, "reads": 43}], "mhaps_target_id": 15}, {"mhaps": [{"mhap_id": 0, "reads": 128}], "mhaps_target_id": 16}, {"mhaps": [{"mhap_id": 2, "reads": 348}], "mhaps_target_id": 17}, {"mhaps": [{"mhap_id": 1, "reads": 920}], "mhaps_target_id": 18}, {"mhaps": [{"mhap_id": 0, "reads": 136}], "mhaps_target_id": 19}, {"mhaps": [{"mhap_id": 1, "reads": 824}], "mhaps_target_id": 20}, {"mhaps": [{"mhap_id": 0, "reads": 1498}, {"mhap_id": 4, "reads": 24}], "mhaps_target_id": 21}, {"mhaps": [{"mhap_id": 1, "reads": 848}], "mhaps_target_id": 22}, {"mhaps": [{"mhap_id": 0, "reads": 576}], "mhaps_target_id": 23}, {"mhaps": [{"mhap_id": 0, "reads": 308}], "mhaps_target_id": 24}, {"mhaps": [{"mhap_id": 4, "reads": 284}, {"mhap_id": 1, "reads": 29}], "mhaps_target_id": 25}, {"mhaps": [{"mhap_id": 1, "reads": 103}], "mhaps_target_id": 26}, {"mhaps": [{"mhap_id": 0, "reads": 279}], "mhaps_target_id": 27}, {"mhaps": [{"mhap_id": 0, "reads": 1110}], "mhaps_target_id": 28}, {"mhaps": [{"mhap_id": 0, "reads": 81}], "mhaps_target_id": 29}, {"mhaps": [{"mhap_id": 1, "reads": 882}, {"mhap_id": 0, "reads": 236}], "mhaps_target_id": 30}, {"mhaps": [{"mhap_id": 1, "reads": 281}, {"mhap_id": 0, "reads": 135}], "mhaps_target_id": 31}, {"mhaps": [{"mhap_id": 1, "reads": 467}, {"mhap_id": 0, "reads": 129}], "mhaps_target_id": 32}, {"mhaps": [{"mhap_id": 0, "reads": 741}, {"mhap_id": 1, "reads": 271}], "mhaps_target_id": 33}, {"mhaps": [{"mhap_id": 0, "reads": 745}, {"mhap_id": 7, "reads": 53}], "mhaps_target_id": 34}, {"mhaps": [{"mhap_id": 4, "reads": 473}, {"mhap_id": 2, "reads": 129}, {"mhap_id": 0, "reads": 42}], "mhaps_target_id": 35}, {"mhaps": [{"mhap_id": 0, "reads": 129}, {"mhap_id": 1, "reads": 30}, {"mhap_id": 2, "reads": 12}], "mhaps_target_id": 36}, {"mhaps": [{"mhap_id": 0, "reads": 239}, {"mhap_id": 5, "reads": 65}, {"mhap_id": 4, "reads": 17}], "mhaps_target_id": 37}, {"mhaps": [{"mhap_id": 0, "reads": 224}], "mhaps_target_id": 38}, {"mhaps": [{"mhap_id": 4, "reads": 89}, {"mhap_id": 0, "reads": 25}], "mhaps_target_id": 39}, {"mhaps": [{"mhap_id": 0, "reads": 1426}], "mhaps_target_id": 40}, {"mhaps": [{"mhap_id": 1, "reads": 357}, {"mhap_id": 2, "reads": 115}], "mhaps_target_id": 41}, {"mhaps": [{"mhap_id": 0, "reads": 70}], "mhaps_target_id": 42}, {"mhaps": [{"mhap_id": 0, "reads": 697}], "mhaps_target_id": 43}, {"mhaps": [{"mhap_id": 0, "reads": 451}], "mhaps_target_id": 44}, {"mhaps": [{"mhap_id": 0, "reads": 746}], "mhaps_target_id": 45}, {"mhaps": [{"mhap_id": 0, "reads": 637}], "mhaps_target_id": 46}, {"mhaps": [{"mhap_id": 1, "reads": 293}, {"mhap_id": 0, "reads": 127}], "mhaps_target_id": 47}, {"mhaps": [{"mhap_id": 7, "reads": 111}, {"mhap_id": 2, "reads": 33}], "mhaps_target_id": 48}, {"mhaps": [{"mhap_id": 3, "reads": 544}, {"mhap_id": 0, "reads": 218}], "mhaps_target_id": 49}, {"mhaps": [{"mhap_id": 0, "reads": 819}, {"mhap_id": 2, "reads": 52}], "mhaps_target_id": 50}, {"mhaps": [{"mhap_id": 0, "reads": 484}, {"mhap_id": 1, "reads": 36}], "mhaps_target_id": 51}, {"mhaps": [{"mhap_id": 1, "reads": 2691}, {"mhap_id": 0, "reads": 215}], "mhaps_target_id": 52}, {"mhaps": [{"mhap_id": 0, "reads": 610}, {"mhap_id": 2, "reads": 170}], "mhaps_target_id": 53}, {"mhaps": [{"mhap_id": 0, "reads": 269}], "mhaps_target_id": 54}, {"mhaps": [{"mhap_id": 0, "reads": 592}], "mhaps_target_id": 55}, {"mhaps": [{"mhap_id": 0, "reads": 458}], "mhaps_target_id": 56}, {"mhaps": [{"mhap_id": 0, "reads": 337}], "mhaps_target_id": 58}, {"mhaps": [{"mhap_id": 1, "reads": 386}, {"mhap_id": 0, "reads": 136}], "mhaps_target_id": 59}, {"mhaps": [{"mhap_id": 1, "reads": 355}, {"mhap_id": 0, "reads": 106}], "mhaps_target_id": 60}, {"mhaps": [{"mhap_id": 0, "reads": 844}], "mhaps_target_id": 61}, {"mhaps": [{"mhap_id": 0, "reads": 1316}], "mhaps_target_id": 62}, {"mhaps": [{"mhap_id": 0, "reads": 804}], "mhaps_target_id": 63}, {"mhaps": [{"mhap_id": 1, "reads": 148}], "mhaps_target_id": 64}, {"mhaps": [{"mhap_id": 1, "reads": 157}, {"mhap_id": 0, "reads": 51}], "mhaps_target_id": 65}, {"mhaps": [{"mhap_id": 0, "reads": 297}], "mhaps_target_id": 66}, {"mhaps": [{"mhap_id": 0, "reads": 818}], "mhaps_target_id": 67}, {"mhaps": [{"mhap_id": 0, "reads": 447}], "mhaps_target_id": 68}, {"mhaps": [{"mhap_id": 2, "reads": 458}, {"mhap_id": 0, "reads": 182}], "mhaps_target_id": 69}, {"mhaps": [{"mhap_id": 0, "reads": 515}, {"mhap_id": 1, "reads": 33}], "mhaps_target_id": 70}, {"mhaps": [{"mhap_id": 3, "reads": 73}, {"mhap_id": 0, "reads": 15}], "mhaps_target_id": 71}, {"mhaps": [{"mhap_id": 0, "reads": 621}, {"mhap_id": 1, "reads": 207}, {"mhap_id": 3, "reads": 54}], "mhaps_target_id": 72}, {"mhaps": [{"mhap_id": 0, "reads": 313}], "mhaps_target_id": 73}, {"mhaps": [{"mhap_id": 0, "reads": 309}], "mhaps_target_id": 74}, {"mhaps": [{"mhap_id": 0, "reads": 86}, {"mhap_id": 4, "reads": 20}], "mhaps_target_id": 75}, {"mhaps": [{"mhap_id": 1, "reads": 689}, {"mhap_id": 0, "reads": 159}], "mhaps_target_id": 76}, {"mhaps": [{"mhap_id": 0, "reads": 787}, {"mhap_id": 1, "reads": 193}], "mhaps_target_id": 77}, {"mhaps": [{"mhap_id": 0, "reads": 959}, {"mhap_id": 1, "reads": 67}], "mhaps_target_id": 78}, {"mhaps": [{"mhap_id": 0, "reads": 1069}, {"mhap_id": 1, "reads": 17}], "mhaps_target_id": 79}, {"mhaps": [{"mhap_id": 5, "reads": 686}, {"mhap_id": 2, "reads": 181}, {"mhap_id": 0, "reads": 15}], "mhaps_target_id": 80}, {"mhaps": [{"mhap_id": 0, "reads": 515}, {"mhap_id": 1, "reads": 12}], "mhaps_target_id": 81}, {"mhaps": [{"mhap_id": 2, "reads": 63}, {"mhap_id": 5, "reads": 22}], "mhaps_target_id": 82}, {"mhaps": [{"mhap_id": 1, "reads": 456}, {"mhap_id": 0, "reads": 53}], "mhaps_target_id": 83}, {"mhaps": [{"mhap_id": 0, "reads": 1336}, {"mhap_id": 4, "reads": 88}], "mhaps_target_id": 84}, {"mhaps": [{"mhap_id": 0, "reads": 262}], "mhaps_target_id": 85}, {"mhaps": [{"mhap_id": 0, "reads": 689}], "mhaps_target_id": 86}, {"mhaps": [{"mhap_id": 1, "reads": 335}, {"mhap_id": 0, "reads": 21}], "mhaps_target_id": 87}, {"mhaps": [{"mhap_id": 0, "reads": 643}], "mhaps_target_id": 88}, {"mhaps": [{"mhap_id": 0, "reads": 438}], "mhaps_target_id": 89}, {"mhaps": [{"mhap_id": 0, "reads": 3359}, {"mhap_id": 2, "reads": 254}, {"mhap_id": 1, "reads": 85}], "mhaps_target_id": 90}, {"mhaps": [{"mhap_id": 3, "reads": 244}, {"mhap_id": 1, "reads": 77}], "mhaps_target_id": 91}, {"mhaps": [{"mhap_id": 0, "reads": 928}, {"mhap_id": 4, "reads": 15}, {"mhap_id": 1, "reads": 15}], "mhaps_target_id": 92}, {"mhaps": [{"mhap_id": 2, "reads": 281}, {"mhap_id": 0, "reads": 81}, {"mhap_id": 1, "reads": 21}], "mhaps_target_id": 93}, {"mhaps": [{"mhap_id": 0, "reads": 117}, {"mhap_id": 1, "reads": 40}, {"mhap_id": 2, "reads": 11}], "mhaps_target_id": 94}, {"mhaps": [{"mhap_id": 0, "reads": 875}, {"mhap_id": 1, "reads": 51}], "mhaps_target_id": 95}, {"mhaps": [{"mhap_id": 6, "reads": 1339}, {"mhap_id": 0, "reads": 402}, {"mhap_id": 10, "reads": 135}], "mhaps_target_id": 96}, {"mhaps": [{"mhap_id": 0, "reads": 360}, {"mhap_id": 1, "reads": 115}], "mhaps_target_id": 97}, {"mhaps": [{"mhap_id": 2, "reads": 330}, {"mhap_id": 0, "reads": 133}], "mhaps_target_id": 98}, {"mhaps": [{"mhap_id": 0, "reads": 338}, {"mhap_id": 2, "reads": 117}, {"mhap_id": 3, "reads": 17}], "mhaps_target_id": 99}, {"mhaps": [{"mhap_id": 4, "reads": 796}, {"mhap_id": 0, "reads": 292}], "mhaps_target_id": 100}, {"mhaps": [{"mhap_id": 0, "reads": 175}], "mhaps_target_id": 101}, {"mhaps": [{"mhap_id": 0, "reads": 222}, {"mhap_id": 5, "reads": 130}], "mhaps_target_id": 102}, {"mhaps": [{"mhap_id": 1, "reads": 149}, {"mhap_id": 0, "reads": 51}], "mhaps_target_id": 103}, {"mhaps": [{"mhap_id": 0, "reads": 470}], "mhaps_target_id": 104}, {"mhaps": [{"mhap_id": 1, "reads": 146}, {"mhap_id": 0, "reads": 30}, {"mhap_id": 2, "reads": 16}], "mhaps_target_id": 105}, {"mhaps": [{"mhap_id": 5, "reads": 279}, {"mhap_id": 6, "reads": 98}, {"mhap_id": 0, "reads": 28}], "mhaps_target_id": 107}, {"mhaps": [{"mhap_id": 0, "reads": 445}, {"mhap_id": 1, "reads": 110}], "mhaps_target_id": 108}, {"mhaps": [{"mhap_id": 0, "reads": 444}], "mhaps_target_id": 109}, {"mhaps": [{"mhap_id": 0, "reads": 1079}], "mhaps_target_id": 110}, {"mhaps": [{"mhap_id": 1, "reads": 89}], "mhaps_target_id": 111}, {"mhaps": [{"mhap_id": 0, "reads": 293}], "mhaps_target_id": 112}, {"mhaps": [{"mhap_id": 0, "reads": 283}, {"mhap_id": 1, "reads": 15}], "mhaps_target_id": 113}, {"mhaps": [{"mhap_id": 0, "reads": 456}], "mhaps_target_id": 114}, {"mhaps": [{"mhap_id": 0, "reads": 197}], "mhaps_target_id": 115}, {"mhaps": [{"mhap_id": 0, "reads": 445}], "mhaps_target_id": 116}, {"mhaps": [{"mhap_id": 2, "reads": 123}, {"mhap_id": 1, "reads": 43}], "mhaps_target_id": 117}, {"mhaps": [{"mhap_id": 0, "reads": 92}, {"mhap_id": 1, "reads": 30}], "mhaps_target_id": 118}, {"mhaps": [{"mhap_id": 0, "reads": 668}, {"mhap_id": 1, "reads": 166}], "mhaps_target_id": 119}, {"mhaps": [{"mhap_id": 0, "reads": 631}, {"mhap_id": 1, "reads": 151}], "mhaps_target_id": 120}, {"mhaps": [{"mhap_id": 7, "reads": 851}, {"mhap_id": 0, "reads": 278}, {"mhap_id": 1, "reads": 25}], "mhaps_target_id": 121}, {"mhaps": [{"mhap_id": 2, "reads": 823}, {"mhap_id": 0, "reads": 271}], "mhaps_target_id": 122}, {"mhaps": [{"mhap_id": 1, "reads": 1986}, {"mhap_id": 0, "reads": 52}], "mhaps_target_id": 123}, {"mhaps": [{"mhap_id": 0, "reads": 751}, {"mhap_id": 1, "reads": 13}], "mhaps_target_id": 124}, {"mhaps": [{"mhap_id": 0, "reads": 199}, {"mhap_id": 1, "reads": 14}], "mhaps_target_id": 125}, {"mhaps": [{"mhap_id": 0, "reads": 475}], "mhaps_target_id": 126}, {"mhaps": [{"mhap_id": 2, "reads": 1840}, {"mhap_id": 1, "reads": 142}], "mhaps_target_id": 127}, {"mhaps": [{"mhap_id": 0, "reads": 91}], "mhaps_target_id": 128}, {"mhaps": [{"mhap_id": 2, "reads": 423}, {"mhap_id": 0, "reads": 157}], "mhaps_target_id": 129}, {"mhaps": [{"mhap_id": 5, "reads": 392}, {"mhap_id": 1, "reads": 95}, {"mhap_id": 2, "reads": 46}], "mhaps_target_id": 130}, {"mhaps": [{"mhap_id": 0, "reads": 331}, {"mhap_id": 1, "reads": 161}], "mhaps_target_id": 131}, {"mhaps": [{"mhap_id": 1, "reads": 878}, {"mhap_id": 0, "reads": 66}, {"mhap_id": 17, "reads": 27}], "mhaps_target_id": 132}, {"mhaps": [{"mhap_id": 0, "reads": 521}, {"mhap_id": 1, "reads": 174}, {"mhap_id": 2, "reads": 23}], "mhaps_target_id": 133}, {"mhaps": [{"mhap_id": 0, "reads": 203}], "mhaps_target_id": 134}, {"mhaps": [{"mhap_id": 3, "reads": 413}, {"mhap_id": 1, "reads": 141}, {"mhap_id": 2, "reads": 27}], "mhaps_target_id": 135}, {"mhaps": [{"mhap_id": 0, "reads": 593}], "mhaps_target_id": 136}, {"mhaps": [{"mhap_id": 0, "reads": 2304}], "mhaps_target_id": 137}, {"mhaps": [{"mhap_id": 1, "reads": 855}, {"mhap_id": 2, "reads": 265}], "mhaps_target_id": 138}, {"mhaps": [{"mhap_id": 0, "reads": 249}, {"mhap_id": 1, "reads": 18}], "mhaps_target_id": 139}, {"mhaps": [{"mhap_id": 1, "reads": 157}, {"mhap_id": 0, "reads": 26}], "mhaps_target_id": 140}, {"mhaps": [{"mhap_id": 0, "reads": 352}], "mhaps_target_id": 141}, {"mhaps": [{"mhap_id": 0, "reads": 676}], "mhaps_target_id": 142}, {"mhaps": [{"mhap_id": 0, "reads": 391}, {"mhap_id": 1, "reads": 105}], "mhaps_target_id": 143}, {"mhaps": [{"mhap_id": 3, "reads": 197}, {"mhap_id": 17, "reads": 45}, {"mhap_id": 5, "reads": 18}], "mhaps_target_id": 144}, {"mhaps": [{"mhap_id": 1, "reads": 746}], "mhaps_target_id": 145}, {"mhaps": [{"mhap_id": 0, "reads": 524}, {"mhap_id": 1, "reads": 28}], "mhaps_target_id": 146}, {"mhaps": [{"mhap_id": 0, "reads": 56}], "mhaps_target_id": 147}, {"mhaps": [{"mhap_id": 0, "reads": 838}], "mhaps_target_id": 148}, {"mhaps": [{"mhap_id": 0, "reads": 972}, {"mhap_id": 1, "reads": 91}], "mhaps_target_id": 149}, {"mhaps": [{"mhap_id": 1, "reads": 768}, {"mhap_id": 0, "reads": 205}, {"mhap_id": 2, "reads": 64}], "mhaps_target_id": 150}, {"mhaps": [{"mhap_id": 0, "reads": 575}, {"mhap_id": 1, "reads": 54}], "mhaps_target_id": 151}, {"mhaps": [{"mhap_id": 4, "reads": 282}, {"mhap_id": 0, "reads": 104}, {"mhap_id": 1, "reads": 28}], "mhaps_target_id": 152}, {"mhaps": [{"mhap_id": 2, "reads": 137}, {"mhap_id": 32, "reads": 11}], "mhaps_target_id": 153}, {"mhaps": [{"mhap_id": 1, "reads": 430}, {"mhap_id": 0, "reads": 186}, {"mhap_id": 29, "reads": 68}], "mhaps_target_id": 154}, {"mhaps": [{"mhap_id": 4, "reads": 368}, {"mhap_id": 0, "reads": 104}, {"mhap_id": 7, "reads": 51}], "mhaps_target_id": 155}, {"mhaps": [{"mhap_id": 0, "reads": 165}], "mhaps_target_id": 156}, {"mhaps": [{"mhap_id": 0, "reads": 1848}, {"mhap_id": 1, "reads": 83}], "mhaps_target_id": 157}, {"mhaps": [{"mhap_id": 0, "reads": 214}, {"mhap_id": 1, "reads": 15}], "mhaps_target_id": 158}, {"mhaps": [{"mhap_id": 0, "reads": 176}], "mhaps_target_id": 159}, {"mhaps": [{"mhap_id": 0, "reads": 172}], "mhaps_target_id": 160}, {"mhaps": [{"mhap_id": 0, "reads": 360}], "mhaps_target_id": 161}, {"mhaps": [{"mhap_id": 0, "reads": 283}], "mhaps_target_id": 162}, {"mhaps": [{"mhap_id": 0, "reads": 297}], "mhaps_target_id": 163}, {"mhaps": [{"mhap_id": 0, "reads": 1512}], "mhaps_target_id": 164}, {"mhaps": [{"mhap_id": 0, "reads": 348}], "mhaps_target_id": 165}, {"mhaps": [{"mhap_id": 0, "reads": 285}, {"mhap_id": 2, "reads": 51}], "mhaps_target_id": 166}, {"mhaps": [{"mhap_id": 0, "reads": 420}, {"mhap_id": 1, "reads": 138}], "mhaps_target_id": 167}, {"mhaps": [{"mhap_id": 0, "reads": 294}, {"mhap_id": 1, "reads": 82}], "mhaps_target_id": 168}, {"mhaps": [{"mhap_id": 4, "reads": 1708}, {"mhap_id": 0, "reads": 33}], "mhaps_target_id": 169}, {"mhaps": [{"mhap_id": 0, "reads": 293}, {"mhap_id": 1, "reads": 58}], "mhaps_target_id": 170}, {"mhaps": [{"mhap_id": 1, "reads": 245}, {"mhap_id": 0, "reads": 19}], "mhaps_target_id": 171}, {"mhaps": [{"mhap_id": 1, "reads": 183}, {"mhap_id": 3, "reads": 15}], "mhaps_target_id": 173}, {"mhaps": [{"mhap_id": 0, "reads": 481}], "mhaps_target_id": 174}, {"mhaps": [{"mhap_id": 1, "reads": 368}, {"mhap_id": 0, "reads": 38}], "mhaps_target_id": 175}, {"mhaps": [{"mhap_id": 0, "reads": 204}], "mhaps_target_id": 176}, {"mhaps": [{"mhap_id": 1, "reads": 322}, {"mhap_id": 0, "reads": 35}], "mhaps_target_id": 177}, {"mhaps": [{"mhap_id": 0, "reads": 165}], "mhaps_target_id": 178}, {"mhaps": [{"mhap_id": 0, "reads": 279}], "mhaps_target_id": 179}, {"mhaps": [{"mhap_id": 0, "reads": 980}], "mhaps_target_id": 180}, {"mhaps": [{"mhap_id": 0, "reads": 136}], "mhaps_target_id": 181}, {"mhaps": [{"mhap_id": 0, "reads": 303}], "mhaps_target_id": 182}, {"mhaps": [{"mhap_id": 0, "reads": 182}], "mhaps_target_id": 183}, {"mhaps": [{"mhap_id": 6, "reads": 200}, {"mhap_id": 0, "reads": 11}], "mhaps_target_id": 184}, {"mhaps": [{"mhap_id": 0, "reads": 877}], "mhaps_target_id": 185}, {"mhaps": [{"mhap_id": 0, "reads": 589}], "mhaps_target_id": 186}, {"mhaps": [{"mhap_id": 0, "reads": 1418}, {"mhap_id": 1, "reads": 119}], "mhaps_target_id": 187}, {"mhaps": [{"mhap_id": 5, "reads": 166}, {"mhap_id": 2, "reads": 49}, {"mhap_id": 1, "reads": 21}], "mhaps_target_id": 188}, {"mhaps": [{"mhap_id": 1, "reads": 444}, {"mhap_id": 0, "reads": 121}], "mhaps_target_id": 189}, {"mhaps": [{"mhap_id": 1, "reads": 193}, {"mhap_id": 0, "reads": 49}], "mhaps_target_id": 190}, {"mhaps": [{"mhap_id": 1, "reads": 423}, {"mhap_id": 0, "reads": 108}, {"mhap_id": 2, "reads": 41}], "mhaps_target_id": 191}, {"mhaps": [{"mhap_id": 0, "reads": 492}], "mhaps_target_id": 192}, {"mhaps": [{"mhap_id": 0, "reads": 175}, {"mhap_id": 1, "reads": 56}], "mhaps_target_id": 193}, {"mhaps": [{"mhap_id": 0, "reads": 442}, {"mhap_id": 1, "reads": 33}], "mhaps_target_id": 194}, {"mhaps": [{"mhap_id": 0, "reads": 410}], "mhaps_target_id": 195}, {"mhaps": [{"mhap_id": 1, "reads": 165}, {"mhap_id": 0, "reads": 56}], "mhaps_target_id": 196}, {"mhaps": [{"mhap_id": 0, "reads": 308}], "mhaps_target_id": 197}, {"mhaps": [{"mhap_id": 5, "reads": 496}, {"mhap_id": 0, "reads": 178}], "mhaps_target_id": 198}, {"mhaps": [{"mhap_id": 1, "reads": 2072}, {"mhap_id": 3, "reads": 113}], "mhaps_target_id": 199}, {"mhaps": [{"mhap_id": 2, "reads": 629}], "mhaps_target_id": 200}, {"mhaps": [{"mhap_id": 1, "reads": 286}, {"mhap_id": 2, "reads": 117}], "mhaps_target_id": 201}, {"mhaps": [{"mhap_id": 2, "reads": 432}], "mhaps_target_id": 202}, {"mhaps": [{"mhap_id": 1, "reads": 828}, {"mhap_id": 0, "reads": 12}], "mhaps_target_id": 203}, {"mhaps": [{"mhap_id": 1, "reads": 322}], "mhaps_target_id": 204}, {"mhaps": [{"mhap_id": 0, "reads": 1366}], "mhaps_target_id": 205}, {"mhaps": [{"mhap_id": 0, "reads": 122}], "mhaps_target_id": 206}, {"mhaps": [{"mhap_id": 0, "reads": 579}], "mhaps_target_id": 207}]}, {"library_sample_id": 5, "target_results": [{"mhaps": [{"mhap_id": 0, "reads": 441}, {"mhap_id": 3, "reads": 109}], "mhaps_target_id": 1}, {"mhaps": [{"mhap_id": 3, "reads": 742}, {"mhap_id": 0, "reads": 192}], "mhaps_target_id": 2}, {"mhaps": [{"mhap_id": 0, "reads": 156}], "mhaps_target_id": 3}, {"mhaps": [{"mhap_id": 0, "reads": 1580}], "mhaps_target_id": 4}, {"mhaps": [{"mhap_id": 5, "reads": 248}], "mhaps_target_id": 5}, {"mhaps": [{"mhap_id": 4, "reads": 276}, {"mhap_id": 0, "reads": 247}], "mhaps_target_id": 6}, {"mhaps": [{"mhap_id": 0, "reads": 180}, {"mhap_id": 1, "reads": 127}], "mhaps_target_id": 7}, {"mhaps": [{"mhap_id": 0, "reads": 57}, {"mhap_id": 2, "reads": 52}], "mhaps_target_id": 8}, {"mhaps": [{"mhap_id": 0, "reads": 843}], "mhaps_target_id": 9}, {"mhaps": [{"mhap_id": 0, "reads": 404}], "mhaps_target_id": 10}, {"mhaps": [{"mhap_id": 1, "reads": 231}], "mhaps_target_id": 11}, {"mhaps": [{"mhap_id": 0, "reads": 174}], "mhaps_target_id": 12}, {"mhaps": [{"mhap_id": 0, "reads": 1265}], "mhaps_target_id": 13}, {"mhaps": [{"mhap_id": 1, "reads": 298}], "mhaps_target_id": 14}, {"mhaps": [{"mhap_id": 1, "reads": 176}, {"mhap_id": 0, "reads": 53}], "mhaps_target_id": 15}, {"mhaps": [{"mhap_id": 4, "reads": 153}, {"mhap_id": 0, "reads": 39}], "mhaps_target_id": 16}, {"mhaps": [{"mhap_id": 1, "reads": 228}, {"mhap_id": 3, "reads": 82}], "mhaps_target_id": 17}, {"mhaps": [{"mhap_id": 3, "reads": 1001}], "mhaps_target_id": 18}, {"mhaps": [{"mhap_id": 0, "reads": 145}], "mhaps_target_id": 19}, {"mhaps": [{"mhap_id": 0, "reads": 667}, {"mhap_id": 1, "reads": 207}], "mhaps_target_id": 20}, {"mhaps": [{"mhap_id": 1, "reads": 1263}], "mhaps_target_id": 21}, {"mhaps": [{"mhap_id": 1, "reads": 945}], "mhaps_target_id": 22}, {"mhaps": [{"mhap_id": 0, "reads": 355}], "mhaps_target_id": 23}, {"mhaps": [{"mhap_id": 0, "reads": 326}], "mhaps_target_id": 24}, {"mhaps": [{"mhap_id": 1, "reads": 233}, {"mhap_id": 0, "reads": 57}], "mhaps_target_id": 25}, {"mhaps": [{"mhap_id": 1, "reads": 127}, {"mhap_id": 0, "reads": 33}], "mhaps_target_id": 26}, {"mhaps": [{"mhap_id": 0, "reads": 290}], "mhaps_target_id": 27}, {"mhaps": [{"mhap_id": 0, "reads": 336}], "mhaps_target_id": 28}, {"mhaps": [{"mhap_id": 0, "reads": 395}], "mhaps_target_id": 29}, {"mhaps": [{"mhap_id": 1, "reads": 467}, {"mhap_id": 0, "reads": 190}], "mhaps_target_id": 30}, {"mhaps": [{"mhap_id": 0, "reads": 306}], "mhaps_target_id": 31}, {"mhaps": [{"mhap_id": 0, "reads": 663}], "mhaps_target_id": 32}, {"mhaps": [{"mhap_id": 0, "reads": 464}, {"mhap_id": 1, "reads": 398}], "mhaps_target_id": 33}, {"mhaps": [{"mhap_id": 0, "reads": 643}, {"mhap_id": 10, "reads": 228}], "mhaps_target_id": 34}, {"mhaps": [{"mhap_id": 1, "reads": 164}, {"mhap_id": 2, "reads": 144}], "mhaps_target_id": 35}, {"mhaps": [{"mhap_id": 0, "reads": 159}], "mhaps_target_id": 36}, {"mhaps": [{"mhap_id": 5, "reads": 140}, {"mhap_id": 4, "reads": 113}], "mhaps_target_id": 37}, {"mhaps": [{"mhap_id": 2, "reads": 184}, {"mhap_id": 0, "reads": 65}], "mhaps_target_id": 38}, {"mhaps": [{"mhap_id": 0, "reads": 92}], "mhaps_target_id": 39}, {"mhaps": [{"mhap_id": 4, "reads": 762}, {"mhap_id": 0, "reads": 363}], "mhaps_target_id": 40}, {"mhaps": [{"mhap_id": 2, "reads": 477}], "mhaps_target_id": 41}, {"mhaps": [{"mhap_id": 0, "reads": 95}], "mhaps_target_id": 42}, {"mhaps": [{"mhap_id": 0, "reads": 629}], "mhaps_target_id": 43}, {"mhaps": [{"mhap_id": 0, "reads": 396}], "mhaps_target_id": 44}, {"mhaps": [{"mhap_id": 0, "reads": 605}], "mhaps_target_id": 45}, {"mhaps": [{"mhap_id": 0, "reads": 510}], "mhaps_target_id": 46}, {"mhaps": [{"mhap_id": 1, "reads": 286}, {"mhap_id": 5, "reads": 222}], "mhaps_target_id": 47}, {"mhaps": [{"mhap_id": 2, "reads": 133}, {"mhap_id": 3, "reads": 37}], "mhaps_target_id": 48}, {"mhaps": [{"mhap_id": 0, "reads": 572}, {"mhap_id": 1, "reads": 206}], "mhaps_target_id": 49}, {"mhaps": [{"mhap_id": 3, "reads": 407}, {"mhap_id": 0, "reads": 173}], "mhaps_target_id": 50}, {"mhaps": [{"mhap_id": 0, "reads": 463}], "mhaps_target_id": 51}, {"mhaps": [{"mhap_id": 0, "reads": 781}, {"mhap_id": 7, "reads": 663}], "mhaps_target_id": 52}, {"mhaps": [{"mhap_id": 0, "reads": 398}], "mhaps_target_id": 53}, {"mhaps": [{"mhap_id": 0, "reads": 265}], "mhaps_target_id": 54}, {"mhaps": [{"mhap_id": 0, "reads": 526}], "mhaps_target_id": 55}, {"mhaps": [{"mhap_id": 0, "reads": 374}], "mhaps_target_id": 56}, {"mhaps": [{"mhap_id": 0, "reads": 208}], "mhaps_target_id": 57}, {"mhaps": [{"mhap_id": 0, "reads": 163}], "mhaps_target_id": 58}, {"mhaps": [{"mhap_id": 1, "reads": 279}, {"mhap_id": 0, "reads": 252}], "mhaps_target_id": 59}, {"mhaps": [{"mhap_id": 1, "reads": 262}, {"mhap_id": 0, "reads": 221}], "mhaps_target_id": 60}, {"mhaps": [{"mhap_id": 0, "reads": 1209}], "mhaps_target_id": 61}, {"mhaps": [{"mhap_id": 0, "reads": 833}], "mhaps_target_id": 62}, {"mhaps": [{"mhap_id": 0, "reads": 696}], "mhaps_target_id": 63}, {"mhaps": [{"mhap_id": 3, "reads": 156}, {"mhap_id": 1, "reads": 44}], "mhaps_target_id": 64}, {"mhaps": [{"mhap_id": 1, "reads": 195}, {"mhap_id": 0, "reads": 44}], "mhaps_target_id": 65}, {"mhaps": [{"mhap_id": 0, "reads": 242}], "mhaps_target_id": 66}, {"mhaps": [{"mhap_id": 0, "reads": 358}], "mhaps_target_id": 67}, {"mhaps": [{"mhap_id": 0, "reads": 325}], "mhaps_target_id": 68}, {"mhaps": [{"mhap_id": 0, "reads": 755}], "mhaps_target_id": 69}, {"mhaps": [{"mhap_id": 0, "reads": 364}, {"mhap_id": 1, "reads": 107}], "mhaps_target_id": 70}, {"mhaps": [{"mhap_id": 6, "reads": 128}, {"mhap_id": 0, "reads": 44}], "mhaps_target_id": 71}, {"mhaps": [{"mhap_id": 1, "reads": 885}], "mhaps_target_id": 72}, {"mhaps": [{"mhap_id": 0, "reads": 176}], "mhaps_target_id": 73}, {"mhaps": [{"mhap_id": 0, "reads": 263}], "mhaps_target_id": 74}, {"mhaps": [{"mhap_id": 1, "reads": 202}, {"mhap_id": 0, "reads": 76}], "mhaps_target_id": 75}, {"mhaps": [{"mhap_id": 1, "reads": 491}, {"mhap_id": 0, "reads": 162}], "mhaps_target_id": 76}, {"mhaps": [{"mhap_id": 1, "reads": 764}, {"mhap_id": 0, "reads": 228}], "mhaps_target_id": 77}, {"mhaps": [{"mhap_id": 8, "reads": 664}, {"mhap_id": 0, "reads": 210}], "mhaps_target_id": 78}, {"mhaps": [{"mhap_id": 0, "reads": 790}], "mhaps_target_id": 79}, {"mhaps": [{"mhap_id": 0, "reads": 506}, {"mhap_id": 6, "reads": 114}], "mhaps_target_id": 80}, {"mhaps": [{"mhap_id": 0, "reads": 372}], "mhaps_target_id": 81}, {"mhaps": [{"mhap_id": 1, "reads": 92}], "mhaps_target_id": 82}, {"mhaps": [{"mhap_id": 1, "reads": 458}], "mhaps_target_id": 83}, {"mhaps": [{"mhap_id": 1, "reads": 900}, {"mhap_id": 0, "reads": 197}], "mhaps_target_id": 84}, {"mhaps": [{"mhap_id": 0, "reads": 162}], "mhaps_target_id": 85}, {"mhaps": [{"mhap_id": 0, "reads": 589}], "mhaps_target_id": 86}, {"mhaps": [{"mhap_id": 0, "reads": 262}, {"mhap_id": 1, "reads": 89}], "mhaps_target_id": 87}, {"mhaps": [{"mhap_id": 0, "reads": 431}], "mhaps_target_id": 88}, {"mhaps": [{"mhap_id": 0, "reads": 235}], "mhaps_target_id": 89}, {"mhaps": [{"mhap_id": 0, "reads": 2330}], "mhaps_target_id": 90}, {"mhaps": [{"mhap_id": 0, "reads": 127}, {"mhap_id": 2, "reads": 111}], "mhaps_target_id": 91}, {"mhaps": [{"mhap_id": 0, "reads": 539}, {"mhap_id": 1, "reads": 404}], "mhaps_target_id": 92}, {"mhaps": [{"mhap_id": 0, "reads": 318}], "mhaps_target_id": 93}, {"mhaps": [{"mhap_id": 0, "reads": 62}, {"mhap_id": 2, "reads": 46}], "mhaps_target_id": 94}, {"mhaps": [{"mhap_id": 0, "reads": 731}], "mhaps_target_id": 95}, {"mhaps": [{"mhap_id": 3, "reads": 1191}, {"mhap_id": 8, "reads": 372}], "mhaps_target_id": 96}, {"mhaps": [{"mhap_id": 0, "reads": 386}], "mhaps_target_id": 97}, {"mhaps": [{"mhap_id": 0, "reads": 352}, {"mhap_id": 2, "reads": 122}], "mhaps_target_id": 98}, {"mhaps": [{"mhap_id": 6, "reads": 370}, {"mhap_id": 7, "reads": 97}], "mhaps_target_id": 99}, {"mhaps": [{"mhap_id": 4, "reads": 1026}], "mhaps_target_id": 100}, {"mhaps": [{"mhap_id": 0, "reads": 174}], "mhaps_target_id": 101}, {"mhaps": [{"mhap_id": 1, "reads": 254}], "mhaps_target_id": 102}, {"mhaps": [{"mhap_id": 0, "reads": 219}], "mhaps_target_id": 103}, {"mhaps": [{"mhap_id": 0, "reads": 424}], "mhaps_target_id": 104}, {"mhaps": [{"mhap_id": 0, "reads": 264}], "mhaps_target_id": 105}, {"mhaps": [{"mhap_id": 0, "reads": 52}], "mhaps_target_id": 106}, {"mhaps": [{"mhap_id": 1, "reads": 398}, {"mhap_id": 0, "reads": 105}], "mhaps_target_id": 107}, {"mhaps": [{"mhap_id": 1, "reads": 316}, {"mhap_id": 0, "reads": 127}], "mhaps_target_id": 108}, {"mhaps": [{"mhap_id": 3, "reads": 159}, {"mhap_id": 0, "reads": 71}], "mhaps_target_id": 109}, {"mhaps": [{"mhap_id": 0, "reads": 1391}], "mhaps_target_id": 110}, {"mhaps": [{"mhap_id": 2, "reads": 51}, {"mhap_id": 1, "reads": 49}], "mhaps_target_id": 111}, {"mhaps": [{"mhap_id": 0, "reads": 133}, {"mhap_id": 3, "reads": 124}], "mhaps_target_id": 112}, {"mhaps": [{"mhap_id": 0, "reads": 374}], "mhaps_target_id": 113}, {"mhaps": [{"mhap_id": 0, "reads": 293}, {"mhap_id": 1, "reads": 88}], "mhaps_target_id": 114}, {"mhaps": [{"mhap_id": 0, "reads": 150}], "mhaps_target_id": 115}, {"mhaps": [{"mhap_id": 0, "reads": 764}], "mhaps_target_id": 116}, {"mhaps": [{"mhap_id": 0, "reads": 98}], "mhaps_target_id": 117}, {"mhaps": [{"mhap_id": 0, "reads": 62}], "mhaps_target_id": 118}, {"mhaps": [{"mhap_id": 0, "reads": 588}], "mhaps_target_id": 119}, {"mhaps": [{"mhap_id": 0, "reads": 499}, {"mhap_id": 23, "reads": 187}], "mhaps_target_id": 120}, {"mhaps": [{"mhap_id": 3, "reads": 804}, {"mhap_id": 17, "reads": 259}], "mhaps_target_id": 121}, {"mhaps": [{"mhap_id": 2, "reads": 850}], "mhaps_target_id": 122}, {"mhaps": [{"mhap_id": 0, "reads": 1379}], "mhaps_target_id": 123}, {"mhaps": [{"mhap_id": 0, "reads": 562}], "mhaps_target_id": 124}, {"mhaps": [{"mhap_id": 0, "reads": 178}], "mhaps_target_id": 125}, {"mhaps": [{"mhap_id": 0, "reads": 596}], "mhaps_target_id": 126}, {"mhaps": [{"mhap_id": 2, "reads": 724}, {"mhap_id": 6, "reads": 615}], "mhaps_target_id": 127}, {"mhaps": [{"mhap_id": 0, "reads": 55}], "mhaps_target_id": 128}, {"mhaps": [{"mhap_id": 1, "reads": 642}], "mhaps_target_id": 129}, {"mhaps": [{"mhap_id": 3, "reads": 343}, {"mhap_id": 0, "reads": 122}], "mhaps_target_id": 130}, {"mhaps": [{"mhap_id": 0, "reads": 151}, {"mhap_id": 1, "reads": 142}], "mhaps_target_id": 131}, {"mhaps": [{"mhap_id": 41, "reads": 317}, {"mhap_id": 4, "reads": 279}], "mhaps_target_id": 132}, {"mhaps": [{"mhap_id": 0, "reads": 804}], "mhaps_target_id": 133}, {"mhaps": [{"mhap_id": 1, "reads": 120}, {"mhap_id": 0, "reads": 115}], "mhaps_target_id": 134}, {"mhaps": [{"mhap_id": 2, "reads": 303}, {"mhap_id": 3, "reads": 232}], "mhaps_target_id": 135}, {"mhaps": [{"mhap_id": 1, "reads": 155}, {"mhap_id": 0, "reads": 116}], "mhaps_target_id": 136}, {"mhaps": [{"mhap_id": 0, "reads": 2610}], "mhaps_target_id": 137}, {"mhaps": [{"mhap_id": 0, "reads": 1451}], "mhaps_target_id": 138}, {"mhaps": [{"mhap_id": 0, "reads": 253}], "mhaps_target_id": 139}, {"mhaps": [{"mhap_id": 2, "reads": 102}, {"mhap_id": 1, "reads": 27}], "mhaps_target_id": 140}, {"mhaps": [{"mhap_id": 1, "reads": 409}], "mhaps_target_id": 141}, {"mhaps": [{"mhap_id": 0, "reads": 490}], "mhaps_target_id": 142}, {"mhaps": [{"mhap_id": 0, "reads": 412}], "mhaps_target_id": 143}, {"mhaps": [{"mhap_id": 2, "reads": 65}, {"mhap_id": 1, "reads": 55}], "mhaps_target_id": 144}, {"mhaps": [{"mhap_id": 1, "reads": 714}], "mhaps_target_id": 145}, {"mhaps": [{"mhap_id": 1, "reads": 173}, {"mhap_id": 0, "reads": 167}], "mhaps_target_id": 146}, {"mhaps": [{"mhap_id": 0, "reads": 862}], "mhaps_target_id": 148}, {"mhaps": [{"mhap_id": 1, "reads": 821}], "mhaps_target_id": 149}, {"mhaps": [{"mhap_id": 3, "reads": 857}, {"mhap_id": 0, "reads": 175}], "mhaps_target_id": 150}, {"mhaps": [{"mhap_id": 0, "reads": 400}, {"mhap_id": 1, "reads": 333}], "mhaps_target_id": 151}, {"mhaps": [{"mhap_id": 1, "reads": 300}, {"mhap_id": 0, "reads": 84}], "mhaps_target_id": 152}, {"mhaps": [{"mhap_id": 30, "reads": 139}, {"mhap_id": 1, "reads": 53}], "mhaps_target_id": 153}, {"mhaps": [{"mhap_id": 41, "reads": 383}, {"mhap_id": 0, "reads": 118}], "mhaps_target_id": 154}, {"mhaps": [{"mhap_id": 4, "reads": 452}, {"mhap_id": 0, "reads": 158}], "mhaps_target_id": 155}, {"mhaps": [{"mhap_id": 0, "reads": 165}], "mhaps_target_id": 156}, {"mhaps": [{"mhap_id": 0, "reads": 2163}], "mhaps_target_id": 157}, {"mhaps": [{"mhap_id": 0, "reads": 392}], "mhaps_target_id": 158}, {"mhaps": [{"mhap_id": 0, "reads": 245}], "mhaps_target_id": 159}, {"mhaps": [{"mhap_id": 0, "reads": 295}], "mhaps_target_id": 160}, {"mhaps": [{"mhap_id": 0, "reads": 188}], "mhaps_target_id": 161}, {"mhaps": [{"mhap_id": 0, "reads": 383}], "mhaps_target_id": 162}, {"mhaps": [{"mhap_id": 0, "reads": 271}], "mhaps_target_id": 163}, {"mhaps": [{"mhap_id": 0, "reads": 689}], "mhaps_target_id": 164}, {"mhaps": [{"mhap_id": 0, "reads": 246}], "mhaps_target_id": 165}, {"mhaps": [{"mhap_id": 1, "reads": 378}], "mhaps_target_id": 166}, {"mhaps": [{"mhap_id": 2, "reads": 663}], "mhaps_target_id": 167}, {"mhaps": [{"mhap_id": 1, "reads": 377}], "mhaps_target_id": 168}, {"mhaps": [{"mhap_id": 4, "reads": 715}, {"mhap_id": 3, "reads": 223}], "mhaps_target_id": 169}, {"mhaps": [{"mhap_id": 0, "reads": 125}, {"mhap_id": 1, "reads": 125}], "mhaps_target_id": 170}, {"mhaps": [{"mhap_id": 1, "reads": 129}, {"mhap_id": 0, "reads": 116}], "mhaps_target_id": 171}, {"mhaps": [{"mhap_id": 0, "reads": 108}], "mhaps_target_id": 172}, {"mhaps": [{"mhap_id": 0, "reads": 296}], "mhaps_target_id": 173}, {"mhaps": [{"mhap_id": 0, "reads": 520}], "mhaps_target_id": 174}, {"mhaps": [{"mhap_id": 0, "reads": 286}, {"mhap_id": 1, "reads": 84}], "mhaps_target_id": 175}, {"mhaps": [{"mhap_id": 0, "reads": 235}], "mhaps_target_id": 176}, {"mhaps": [{"mhap_id": 4, "reads": 236}, {"mhap_id": 0, "reads": 73}], "mhaps_target_id": 177}, {"mhaps": [{"mhap_id": 0, "reads": 141}], "mhaps_target_id": 178}, {"mhaps": [{"mhap_id": 0, "reads": 468}], "mhaps_target_id": 179}, {"mhaps": [{"mhap_id": 0, "reads": 876}], "mhaps_target_id": 180}, {"mhaps": [{"mhap_id": 0, "reads": 119}], "mhaps_target_id": 181}, {"mhaps": [{"mhap_id": 0, "reads": 778}], "mhaps_target_id": 182}, {"mhaps": [{"mhap_id": 0, "reads": 252}], "mhaps_target_id": 183}, {"mhaps": [{"mhap_id": 3, "reads": 149}, {"mhap_id": 1, "reads": 74}], "mhaps_target_id": 184}, {"mhaps": [{"mhap_id": 0, "reads": 525}, {"mhap_id": 3, "reads": 159}], "mhaps_target_id": 185}, {"mhaps": [{"mhap_id": 1, "reads": 521}], "mhaps_target_id": 186}, {"mhaps": [{"mhap_id": 3, "reads": 1072}, {"mhap_id": 2, "reads": 346}], "mhaps_target_id": 187}, {"mhaps": [{"mhap_id": 0, "reads": 135}, {"mhap_id": 5, "reads": 52}], "mhaps_target_id": 188}, {"mhaps": [{"mhap_id": 2, "reads": 613}, {"mhap_id": 0, "reads": 195}], "mhaps_target_id": 189}, {"mhaps": [{"mhap_id": 2, "reads": 136}, {"mhap_id": 1, "reads": 33}], "mhaps_target_id": 190}, {"mhaps": [{"mhap_id": 0, "reads": 384}, {"mhap_id": 2, "reads": 120}], "mhaps_target_id": 191}, {"mhaps": [{"mhap_id": 0, "reads": 530}], "mhaps_target_id": 192}, {"mhaps": [{"mhap_id": 1, "reads": 105}, {"mhap_id": 0, "reads": 87}], "mhaps_target_id": 193}, {"mhaps": [{"mhap_id": 0, "reads": 176}, {"mhap_id": 1, "reads": 150}], "mhaps_target_id": 194}, {"mhaps": [{"mhap_id": 0, "reads": 176}], "mhaps_target_id": 195}, {"mhaps": [{"mhap_id": 2, "reads": 117}, {"mhap_id": 0, "reads": 108}], "mhaps_target_id": 196}, {"mhaps": [{"mhap_id": 0, "reads": 152}, {"mhap_id": 1, "reads": 144}], "mhaps_target_id": 197}, {"mhaps": [{"mhap_id": 0, "reads": 646}], "mhaps_target_id": 198}, {"mhaps": [{"mhap_id": 1, "reads": 1192}, {"mhap_id": 2, "reads": 426}], "mhaps_target_id": 199}, {"mhaps": [{"mhap_id": 3, "reads": 287}, {"mhap_id": 1, "reads": 83}], "mhaps_target_id": 200}, {"mhaps": [{"mhap_id": 1, "reads": 246}], "mhaps_target_id": 201}, {"mhaps": [{"mhap_id": 1, "reads": 221}, {"mhap_id": 2, "reads": 172}], "mhaps_target_id": 202}, {"mhaps": [{"mhap_id": 0, "reads": 559}], "mhaps_target_id": 203}, {"mhaps": [{"mhap_id": 0, "reads": 302}], "mhaps_target_id": 204}, {"mhaps": [{"mhap_id": 14, "reads": 1125}, {"mhap_id": 0, "reads": 240}], "mhaps_target_id": 205}, {"mhaps": [{"mhap_id": 0, "reads": 149}, {"mhap_id": 2, "reads": 29}], "mhaps_target_id": 206}, {"mhaps": [{"mhap_id": 0, "reads": 472}], "mhaps_target_id": 207}]}, {"library_sample_id": 4, "target_results": [{"mhaps": [{"mhap_id": 0, "reads": 58}, {"mhap_id": 3, "reads": 25}], "mhaps_target_id": 0}, {"mhaps": [{"mhap_id": 0, "reads": 203}, {"mhap_id": 4, "reads": 59}, {"mhap_id": 6, "reads": 32}], "mhaps_target_id": 1}, {"mhaps": [{"mhap_id": 1, "reads": 288}, {"mhap_id": 0, "reads": 67}, {"mhap_id": 2, "reads": 53}], "mhaps_target_id": 2}, {"mhaps": [{"mhap_id": 0, "reads": 79}], "mhaps_target_id": 3}, {"mhaps": [{"mhap_id": 0, "reads": 329}, {"mhap_id": 10, "reads": 192}, {"mhap_id": 7, "reads": 92}, {"mhap_id": 11, "reads": 76}, {"mhap_id": 15, "reads": 71}, {"mhap_id": 2, "reads": 53}], "mhaps_target_id": 4}, {"mhaps": [{"mhap_id": 4, "reads": 51}, {"mhap_id": 2, "reads": 30}, {"mhap_id": 0, "reads": 16}, {"mhap_id": 12, "reads": 12}, {"mhap_id": 7, "reads": 11}], "mhaps_target_id": 5}, {"mhaps": [{"mhap_id": 2, "reads": 297}, {"mhap_id": 0, "reads": 157}], "mhaps_target_id": 6}, {"mhaps": [{"mhap_id": 0, "reads": 206}, {"mhap_id": 1, "reads": 38}], "mhaps_target_id": 7}, {"mhaps": [{"mhap_id": 0, "reads": 55}, {"mhap_id": 1, "reads": 36}], "mhaps_target_id": 8}, {"mhaps": [{"mhap_id": 1, "reads": 313}, {"mhap_id": 0, "reads": 224}], "mhaps_target_id": 9}, {"mhaps": [{"mhap_id": 0, "reads": 184}, {"mhap_id": 1, "reads": 117}], "mhaps_target_id": 10}, {"mhaps": [{"mhap_id": 2, "reads": 114}, {"mhap_id": 1, "reads": 67}, {"mhap_id": 0, "reads": 17}], "mhaps_target_id": 11}, {"mhaps": [{"mhap_id": 2, "reads": 87}, {"mhap_id": 0, "reads": 61}, {"mhap_id": 4, "reads": 19}], "mhaps_target_id": 12}, {"mhaps": [{"mhap_id": 1, "reads": 598}, {"mhap_id": 0, "reads": 227}], "mhaps_target_id": 13}, {"mhaps": [{"mhap_id": 1, "reads": 206}, {"mhap_id": 0, "reads": 61}], "mhaps_target_id": 14}, {"mhaps": [{"mhap_id": 0, "reads": 129}, {"mhap_id": 1, "reads": 34}], "mhaps_target_id": 15}, {"mhaps": [{"mhap_id": 0, "reads": 54}, {"mhap_id": 10, "reads": 35}, {"mhap_id": 2, "reads": 28}], "mhaps_target_id": 16}, {"mhaps": [{"mhap_id": 5, "reads": 89}, {"mhap_id": 2, "reads": 48}, {"mhap_id": 4, "reads": 39}, {"mhap_id": 3, "reads": 30}, {"mhap_id": 0, "reads": 28}], "mhaps_target_id": 17}, {"mhaps": [{"mhap_id": 0, "reads": 366}, {"mhap_id": 1, "reads": 134}, {"mhap_id": 2, "reads": 47}], "mhaps_target_id": 18}, {"mhaps": [{"mhap_id": 0, "reads": 80}, {"mhap_id": 16, "reads": 15}], "mhaps_target_id": 19}, {"mhaps": [{"mhap_id": 0, "reads": 485}, {"mhap_id": 1, "reads": 74}], "mhaps_target_id": 20}, {"mhaps": [{"mhap_id": 0, "reads": 542}, {"mhap_id": 1, "reads": 142}], "mhaps_target_id": 21}, {"mhaps": [{"mhap_id": 0, "reads": 320}, {"mhap_id": 2, "reads": 157}, {"mhap_id": 1, "reads": 150}], "mhaps_target_id": 22}, {"mhaps": [{"mhap_id": 0, "reads": 135}, {"mhap_id": 2, "reads": 91}, {"mhap_id": 3, "reads": 34}], "mhaps_target_id": 23}, {"mhaps": [{"mhap_id": 0, "reads": 200}], "mhaps_target_id": 24}, {"mhaps": [{"mhap_id": 1, "reads": 140}, {"mhap_id": 2, "reads": 44}, {"mhap_id": 0, "reads": 19}], "mhaps_target_id": 25}, {"mhaps": [{"mhap_id": 0, "reads": 43}, {"mhap_id": 1, "reads": 11}], "mhaps_target_id": 26}, {"mhaps": [{"mhap_id": 0, "reads": 149}, {"mhap_id": 2, "reads": 81}, {"mhap_id": 1, "reads": 36}], "mhaps_target_id": 27}, {"mhaps": [{"mhap_id": 0, "reads": 274}, {"mhap_id": 1, "reads": 47}], "mhaps_target_id": 28}, {"mhaps": [{"mhap_id": 0, "reads": 91}], "mhaps_target_id": 29}, {"mhaps": [{"mhap_id": 0, "reads": 287}, {"mhap_id": 1, "reads": 276}], "mhaps_target_id": 30}, {"mhaps": [{"mhap_id": 0, "reads": 68}, {"mhap_id": 1, "reads": 58}, {"mhap_id": 4, "reads": 37}], "mhaps_target_id": 31}, {"mhaps": [{"mhap_id": 0, "reads": 281}, {"mhap_id": 1, "reads": 141}], "mhaps_target_id": 32}, {"mhaps": [{"mhap_id": 0, "reads": 725}], "mhaps_target_id": 33}, {"mhaps": [{"mhap_id": 0, "reads": 332}, {"mhap_id": 1, "reads": 122}, {"mhap_id": 2, "reads": 107}, {"mhap_id": 6, "reads": 73}], "mhaps_target_id": 34}, {"mhaps": [{"mhap_id": 2, "reads": 99}, {"mhap_id": 0, "reads": 89}, {"mhap_id": 1, "reads": 84}], "mhaps_target_id": 35}, {"mhaps": [{"mhap_id": 0, "reads": 41}, {"mhap_id": 3, "reads": 27}, {"mhap_id": 1, "reads": 14}], "mhaps_target_id": 36}, {"mhaps": [{"mhap_id": 3, "reads": 70}, {"mhap_id": 1, "reads": 56}, {"mhap_id": 4, "reads": 34}, {"mhap_id": 5, "reads": 16}], "mhaps_target_id": 37}, {"mhaps": [{"mhap_id": 0, "reads": 55}, {"mhap_id": 3, "reads": 41}, {"mhap_id": 1, "reads": 25}], "mhaps_target_id": 38}, {"mhaps": [{"mhap_id": 0, "reads": 67}, {"mhap_id": 1, "reads": 27}], "mhaps_target_id": 39}, {"mhaps": [{"mhap_id": 1, "reads": 118}, {"mhap_id": 4, "reads": 116}, {"mhap_id": 3, "reads": 91}, {"mhap_id": 11, "reads": 88}, {"mhap_id": 0, "reads": 80}], "mhaps_target_id": 40}, {"mhaps": [{"mhap_id": 1, "reads": 262}, {"mhap_id": 0, "reads": 58}], "mhaps_target_id": 41}, {"mhaps": [{"mhap_id": 0, "reads": 61}], "mhaps_target_id": 42}, {"mhaps": [{"mhap_id": 0, "reads": 246}, {"mhap_id": 1, "reads": 220}], "mhaps_target_id": 43}, {"mhaps": [{"mhap_id": 0, "reads": 320}], "mhaps_target_id": 44}, {"mhaps": [{"mhap_id": 0, "reads": 316}], "mhaps_target_id": 45}, {"mhaps": [{"mhap_id": 0, "reads": 406}], "mhaps_target_id": 46}, {"mhaps": [{"mhap_id": 2, "reads": 149}, {"mhap_id": 1, "reads": 71}, {"mhap_id": 0, "reads": 59}, {"mhap_id": 3, "reads": 37}], "mhaps_target_id": 47}, {"mhaps": [{"mhap_id": 0, "reads": 50}, {"mhap_id": 3, "reads": 17}, {"mhap_id": 5, "reads": 14}, {"mhap_id": 1, "reads": 12}], "mhaps_target_id": 48}, {"mhaps": [{"mhap_id": 0, "reads": 523}, {"mhap_id": 1, "reads": 64}], "mhaps_target_id": 49}, {"mhaps": [{"mhap_id": 1, "reads": 105}, {"mhap_id": 0, "reads": 87}, {"mhap_id": 3, "reads": 50}, {"mhap_id": 15, "reads": 37}, {"mhap_id": 2, "reads": 37}, {"mhap_id": 8, "reads": 27}], "mhaps_target_id": 50}, {"mhaps": [{"mhap_id": 0, "reads": 164}, {"mhap_id": 1, "reads": 16}], "mhaps_target_id": 51}, {"mhaps": [{"mhap_id": 2, "reads": 683}, {"mhap_id": 3, "reads": 221}, {"mhap_id": 0, "reads": 145}, {"mhap_id": 1, "reads": 95}], "mhaps_target_id": 52}, {"mhaps": [{"mhap_id": 0, "reads": 263}, {"mhap_id": 1, "reads": 49}], "mhaps_target_id": 53}, {"mhaps": [{"mhap_id": 0, "reads": 144}, {"mhap_id": 1, "reads": 23}], "mhaps_target_id": 54}, {"mhaps": [{"mhap_id": 0, "reads": 370}], "mhaps_target_id": 55}, {"mhaps": [{"mhap_id": 0, "reads": 299}], "mhaps_target_id": 56}, {"mhaps": [{"mhap_id": 0, "reads": 279}], "mhaps_target_id": 57}, {"mhaps": [{"mhap_id": 0, "reads": 241}], "mhaps_target_id": 58}, {"mhaps": [{"mhap_id": 0, "reads": 419}], "mhaps_target_id": 59}, {"mhaps": [{"mhap_id": 0, "reads": 230}], "mhaps_target_id": 60}, {"mhaps": [{"mhap_id": 0, "reads": 809}], "mhaps_target_id": 61}, {"mhaps": [{"mhap_id": 0, "reads": 632}], "mhaps_target_id": 62}, {"mhaps": [{"mhap_id": 0, "reads": 932}], "mhaps_target_id": 63}, {"mhaps": [{"mhap_id": 0, "reads": 98}], "mhaps_target_id": 64}, {"mhaps": [{"mhap_id": 0, "reads": 70}, {"mhap_id": 1, "reads": 44}, {"mhap_id": 2, "reads": 42}], "mhaps_target_id": 65}, {"mhaps": [{"mhap_id": 0, "reads": 174}, {"mhap_id": 1, "reads": 50}], "mhaps_target_id": 66}, {"mhaps": [{"mhap_id": 0, "reads": 377}], "mhaps_target_id": 67}, {"mhaps": [{"mhap_id": 0, "reads": 231}], "mhaps_target_id": 68}, {"mhaps": [{"mhap_id": 1, "reads": 277}, {"mhap_id": 4, "reads": 52}, {"mhap_id": 3, "reads": 43}], "mhaps_target_id": 69}, {"mhaps": [{"mhap_id": 0, "reads": 243}, {"mhap_id": 1, "reads": 181}], "mhaps_target_id": 70}, {"mhaps": [{"mhap_id": 2, "reads": 22}, {"mhap_id": 1, "reads": 19}, {"mhap_id": 4, "reads": 19}, {"mhap_id": 8, "reads": 11}], "mhaps_target_id": 71}, {"mhaps": [{"mhap_id": 0, "reads": 293}, {"mhap_id": 1, "reads": 220}, {"mhap_id": 3, "reads": 84}], "mhaps_target_id": 72}, {"mhaps": [{"mhap_id": 0, "reads": 129}, {"mhap_id": 7, "reads": 14}], "mhaps_target_id": 73}, {"mhaps": [{"mhap_id": 0, "reads": 171}], "mhaps_target_id": 74}, {"mhaps": [{"mhap_id": 0, "reads": 78}, {"mhap_id": 1, "reads": 43}, {"mhap_id": 10, "reads": 16}], "mhaps_target_id": 75}, {"mhaps": [{"mhap_id": 0, "reads": 547}], "mhaps_target_id": 76}, {"mhaps": [{"mhap_id": 0, "reads": 591}, {"mhap_id": 2, "reads": 108}], "mhaps_target_id": 77}, {"mhaps": [{"mhap_id": 0, "reads": 591}, {"mhap_id": 1, "reads": 61}], "mhaps_target_id": 78}, {"mhaps": [{"mhap_id": 0, "reads": 454}, {"mhap_id": 3, "reads": 63}], "mhaps_target_id": 79}, {"mhaps": [{"mhap_id": 0, "reads": 249}, {"mhap_id": 2, "reads": 95}, {"mhap_id": 5, "reads": 59}, {"mhap_id": 3, "reads": 42}], "mhaps_target_id": 80}, {"mhaps": [{"mhap_id": 0, "reads": 143}, {"mhap_id": 1, "reads": 64}, {"mhap_id": 2, "reads": 21}], "mhaps_target_id": 81}, {"mhaps": [{"mhap_id": 0, "reads": 290}, {"mhap_id": 1, "reads": 50}], "mhaps_target_id": 83}, {"mhaps": [{"mhap_id": 1, "reads": 702}, {"mhap_id": 0, "reads": 91}], "mhaps_target_id": 84}, {"mhaps": [{"mhap_id": 0, "reads": 186}], "mhaps_target_id": 85}, {"mhaps": [{"mhap_id": 0, "reads": 284}, {"mhap_id": 1, "reads": 220}], "mhaps_target_id": 86}, {"mhaps": [{"mhap_id": 0, "reads": 235}], "mhaps_target_id": 87}, {"mhaps": [{"mhap_id": 0, "reads": 349}], "mhaps_target_id": 88}, {"mhaps": [{"mhap_id": 0, "reads": 169}], "mhaps_target_id": 89}, {"mhaps": [{"mhap_id": 0, "reads": 1783}], "mhaps_target_id": 90}, {"mhaps": [{"mhap_id": 0, "reads": 152}], "mhaps_target_id": 91}, {"mhaps": [{"mhap_id": 0, "reads": 238}, {"mhap_id": 1, "reads": 156}, {"mhap_id": 5, "reads": 146}], "mhaps_target_id": 92}, {"mhaps": [{"mhap_id": 0, "reads": 113}, {"mhap_id": 1, "reads": 41}], "mhaps_target_id": 93}, {"mhaps": [{"mhap_id": 0, "reads": 80}, {"mhap_id": 1, "reads": 23}], "mhaps_target_id": 94}, {"mhaps": [{"mhap_id": 0, "reads": 427}, {"mhap_id": 1, "reads": 41}], "mhaps_target_id": 95}, {"mhaps": [{"mhap_id": 0, "reads": 532}, {"mhap_id": 6, "reads": 201}, {"mhap_id": 16, "reads": 101}], "mhaps_target_id": 96}, {"mhaps": [{"mhap_id": 1, "reads": 232}, {"mhap_id": 0, "reads": 67}], "mhaps_target_id": 97}, {"mhaps": [{"mhap_id": 0, "reads": 241}, {"mhap_id": 1, "reads": 37}], "mhaps_target_id": 98}, {"mhaps": [{"mhap_id": 0, "reads": 271}, {"mhap_id": 2, "reads": 68}], "mhaps_target_id": 99}, {"mhaps": [{"mhap_id": 0, "reads": 353}, {"mhap_id": 2, "reads": 304}], "mhaps_target_id": 100}, {"mhaps": [{"mhap_id": 0, "reads": 102}, {"mhap_id": 1, "reads": 59}], "mhaps_target_id": 101}, {"mhaps": [{"mhap_id": 11, "reads": 39}, {"mhap_id": 13, "reads": 20}, {"mhap_id": 0, "reads": 19}, {"mhap_id": 16, "reads": 17}, {"mhap_id": 1, "reads": 11}], "mhaps_target_id": 102}, {"mhaps": [{"mhap_id": 0, "reads": 87}, {"mhap_id": 6, "reads": 18}], "mhaps_target_id": 103}, {"mhaps": [{"mhap_id": 0, "reads": 209}, {"mhap_id": 2, "reads": 19}], "mhaps_target_id": 104}, {"mhaps": [{"mhap_id": 1, "reads": 61}, {"mhap_id": 0, "reads": 21}], "mhaps_target_id": 105}, {"mhaps": [{"mhap_id": 1, "reads": 178}, {"mhap_id": 0, "reads": 103}, {"mhap_id": 4, "reads": 29}], "mhaps_target_id": 107}, {"mhaps": [{"mhap_id": 0, "reads": 148}, {"mhap_id": 1, "reads": 97}], "mhaps_target_id": 108}, {"mhaps": [{"mhap_id": 3, "reads": 139}, {"mhap_id": 0, "reads": 77}], "mhaps_target_id": 109}, {"mhaps": [{"mhap_id": 0, "reads": 851}], "mhaps_target_id": 110}, {"mhaps": [{"mhap_id": 0, "reads": 144}, {"mhap_id": 2, "reads": 47}], "mhaps_target_id": 112}, {"mhaps": [{"mhap_id": 0, "reads": 180}, {"mhap_id": 1, "reads": 50}, {"mhap_id": 2, "reads": 31}], "mhaps_target_id": 113}, {"mhaps": [{"mhap_id": 0, "reads": 293}, {"mhap_id": 1, "reads": 167}], "mhaps_target_id": 114}, {"mhaps": [{"mhap_id": 0, "reads": 63}, {"mhap_id": 5, "reads": 29}], "mhaps_target_id": 115}, {"mhaps": [{"mhap_id": 0, "reads": 543}], "mhaps_target_id": 116}, {"mhaps": [{"mhap_id": 3, "reads": 36}, {"mhap_id": 2, "reads": 22}], "mhaps_target_id": 117}, {"mhaps": [{"mhap_id": 1, "reads": 261}, {"mhap_id": 0, "reads": 237}, {"mhap_id": 13, "reads": 55}], "mhaps_target_id": 119}, {"mhaps": [{"mhap_id": 13, "reads": 238}, {"mhap_id": 7, "reads": 114}, {"mhap_id": 4, "reads": 72}, {"mhap_id": 6, "reads": 50}], "mhaps_target_id": 120}, {"mhaps": [{"mhap_id": 3, "reads": 364}, {"mhap_id": 1, "reads": 167}, {"mhap_id": 5, "reads": 57}], "mhaps_target_id": 121}, {"mhaps": [{"mhap_id": 2, "reads": 417}, {"mhap_id": 0, "reads": 135}], "mhaps_target_id": 122}, {"mhaps": [{"mhap_id": 0, "reads": 892}, {"mhap_id": 1, "reads": 118}], "mhaps_target_id": 123}, {"mhaps": [{"mhap_id": 0, "reads": 512}, {"mhap_id": 1, "reads": 43}], "mhaps_target_id": 124}, {"mhaps": [{"mhap_id": 0, "reads": 102}], "mhaps_target_id": 125}, {"mhaps": [{"mhap_id": 0, "reads": 307}], "mhaps_target_id": 126}, {"mhaps": [{"mhap_id": 1, "reads": 497}, {"mhap_id": 2, "reads": 327}, {"mhap_id": 0, "reads": 243}, {"mhap_id": 5, "reads": 146}], "mhaps_target_id": 127}, {"mhaps": [{"mhap_id": 0, "reads": 96}, {"mhap_id": 2, "reads": 14}], "mhaps_target_id": 128}, {"mhaps": [{"mhap_id": 1, "reads": 271}, {"mhap_id": 2, "reads": 92}, {"mhap_id": 0, "reads": 79}], "mhaps_target_id": 129}, {"mhaps": [{"mhap_id": 1, "reads": 139}, {"mhap_id": 4, "reads": 123}], "mhaps_target_id": 130}, {"mhaps": [{"mhap_id": 0, "reads": 248}, {"mhap_id": 1, "reads": 30}], "mhaps_target_id": 131}, {"mhaps": [{"mhap_id": 5, "reads": 132}, {"mhap_id": 7, "reads": 94}, {"mhap_id": 11, "reads": 76}, {"mhap_id": 2, "reads": 48}, {"mhap_id": 6, "reads": 41}], "mhaps_target_id": 132}, {"mhaps": [{"mhap_id": 0, "reads": 295}, {"mhap_id": 4, "reads": 204}, {"mhap_id": 2, "reads": 58}], "mhaps_target_id": 133}, {"mhaps": [{"mhap_id": 0, "reads": 115}, {"mhap_id": 1, "reads": 17}], "mhaps_target_id": 134}, {"mhaps": [{"mhap_id": 0, "reads": 209}, {"mhap_id": 1, "reads": 52}, {"mhap_id": 2, "reads": 17}], "mhaps_target_id": 135}, {"mhaps": [{"mhap_id": 0, "reads": 155}, {"mhap_id": 1, "reads": 32}, {"mhap_id": 3, "reads": 19}], "mhaps_target_id": 136}, {"mhaps": [{"mhap_id": 0, "reads": 1227}], "mhaps_target_id": 137}, {"mhaps": [{"mhap_id": 0, "reads": 389}, {"mhap_id": 1, "reads": 331}], "mhaps_target_id": 138}, {"mhaps": [{"mhap_id": 0, "reads": 87}, {"mhap_id": 1, "reads": 72}], "mhaps_target_id": 139}, {"mhaps": [{"mhap_id": 1, "reads": 67}, {"mhap_id": 0, "reads": 53}], "mhaps_target_id": 140}, {"mhaps": [{"mhap_id": 0, "reads": 207}], "mhaps_target_id": 141}, {"mhaps": [{"mhap_id": 0, "reads": 420}], "mhaps_target_id": 142}, {"mhaps": [{"mhap_id": 1, "reads": 161}, {"mhap_id": 0, "reads": 52}], "mhaps_target_id": 143}, {"mhaps": [{"mhap_id": 0, "reads": 138}, {"mhap_id": 1, "reads": 35}, {"mhap_id": 2, "reads": 17}], "mhaps_target_id": 144}, {"mhaps": [{"mhap_id": 0, "reads": 464}, {"mhap_id": 1, "reads": 128}], "mhaps_target_id": 145}, {"mhaps": [{"mhap_id": 1, "reads": 131}, {"mhap_id": 0, "reads": 23}], "mhaps_target_id": 146}, {"mhaps": [{"mhap_id": 0, "reads": 377}, {"mhap_id": 1, "reads": 234}], "mhaps_target_id": 148}, {"mhaps": [{"mhap_id": 0, "reads": 481}], "mhaps_target_id": 149}, {"mhaps": [{"mhap_id": 5, "reads": 239}, {"mhap_id": 0, "reads": 217}, {"mhap_id": 1, "reads": 139}, {"mhap_id": 7, "reads": 75}], "mhaps_target_id": 150}, {"mhaps": [{"mhap_id": 0, "reads": 424}], "mhaps_target_id": 151}, {"mhaps": [{"mhap_id": 0, "reads": 181}, {"mhap_id": 6, "reads": 23}, {"mhap_id": 1, "reads": 21}], "mhaps_target_id": 152}, {"mhaps": [{"mhap_id": 1, "reads": 70}, {"mhap_id": 0, "reads": 25}, {"mhap_id": 2, "reads": 14}], "mhaps_target_id": 153}, {"mhaps": [{"mhap_id": 12, "reads": 97}, {"mhap_id": 3, "reads": 64}, {"mhap_id": 0, "reads": 61}, {"mhap_id": 28, "reads": 46}, {"mhap_id": 8, "reads": 42}], "mhaps_target_id": 154}, {"mhaps": [{"mhap_id": 0, "reads": 281}, {"mhap_id": 2, "reads": 88}, {"mhap_id": 1, "reads": 66}], "mhaps_target_id": 155}, {"mhaps": [{"mhap_id": 0, "reads": 164}], "mhaps_target_id": 156}, {"mhaps": [{"mhap_id": 0, "reads": 863}], "mhaps_target_id": 157}, {"mhaps": [{"mhap_id": 0, "reads": 167}], "mhaps_target_id": 158}, {"mhaps": [{"mhap_id": 0, "reads": 179}], "mhaps_target_id": 159}, {"mhaps": [{"mhap_id": 0, "reads": 169}], "mhaps_target_id": 160}, {"mhaps": [{"mhap_id": 0, "reads": 232}], "mhaps_target_id": 161}, {"mhaps": [{"mhap_id": 0, "reads": 307}], "mhaps_target_id": 162}, {"mhaps": [{"mhap_id": 0, "reads": 247}, {"mhap_id": 2, "reads": 40}], "mhaps_target_id": 163}, {"mhaps": [{"mhap_id": 0, "reads": 952}, {"mhap_id": 2, "reads": 113}], "mhaps_target_id": 164}, {"mhaps": [{"mhap_id": 0, "reads": 314}], "mhaps_target_id": 165}, {"mhaps": [{"mhap_id": 1, "reads": 107}, {"mhap_id": 2, "reads": 60}, {"mhap_id": 0, "reads": 34}], "mhaps_target_id": 166}, {"mhaps": [{"mhap_id": 0, "reads": 208}, {"mhap_id": 2, "reads": 84}, {"mhap_id": 1, "reads": 30}], "mhaps_target_id": 167}, {"mhaps": [{"mhap_id": 1, "reads": 144}, {"mhap_id": 0, "reads": 135}], "mhaps_target_id": 168}, {"mhaps": [{"mhap_id": 1, "reads": 384}, {"mhap_id": 0, "reads": 204}, {"mhap_id": 3, "reads": 159}, {"mhap_id": 5, "reads": 89}], "mhaps_target_id": 169}, {"mhaps": [{"mhap_id": 0, "reads": 186}, {"mhap_id": 1, "reads": 54}], "mhaps_target_id": 170}, {"mhaps": [{"mhap_id": 0, "reads": 80}, {"mhap_id": 2, "reads": 52}], "mhaps_target_id": 171}, {"mhaps": [{"mhap_id": 0, "reads": 115}], "mhaps_target_id": 173}, {"mhaps": [{"mhap_id": 0, "reads": 312}], "mhaps_target_id": 174}, {"mhaps": [{"mhap_id": 1, "reads": 190}, {"mhap_id": 0, "reads": 84}], "mhaps_target_id": 175}, {"mhaps": [{"mhap_id": 0, "reads": 206}], "mhaps_target_id": 176}, {"mhaps": [{"mhap_id": 0, "reads": 111}, {"mhap_id": 1, "reads": 28}], "mhaps_target_id": 177}, {"mhaps": [{"mhap_id": 0, "reads": 136}], "mhaps_target_id": 178}, {"mhaps": [{"mhap_id": 0, "reads": 256}], "mhaps_target_id": 179}, {"mhaps": [{"mhap_id": 0, "reads": 570}], "mhaps_target_id": 180}, {"mhaps": [{"mhap_id": 0, "reads": 69}], "mhaps_target_id": 181}, {"mhaps": [{"mhap_id": 0, "reads": 265}], "mhaps_target_id": 182}, {"mhaps": [{"mhap_id": 0, "reads": 163}], "mhaps_target_id": 183}, {"mhaps": [{"mhap_id": 0, "reads": 73}, {"mhap_id": 5, "reads": 42}, {"mhap_id": 2, "reads": 19}], "mhaps_target_id": 184}, {"mhaps": [{"mhap_id": 1, "reads": 152}, {"mhap_id": 10, "reads": 124}, {"mhap_id": 5, "reads": 114}, {"mhap_id": 2, "reads": 51}], "mhaps_target_id": 185}, {"mhaps": [{"mhap_id": 0, "reads": 185}, {"mhap_id": 1, "reads": 182}], "mhaps_target_id": 186}, {"mhaps": [{"mhap_id": 0, "reads": 452}, {"mhap_id": 1, "reads": 347}], "mhaps_target_id": 187}, {"mhaps": [{"mhap_id": 0, "reads": 62}, {"mhap_id": 2, "reads": 26}, {"mhap_id": 1, "reads": 23}], "mhaps_target_id": 188}, {"mhaps": [{"mhap_id": 0, "reads": 268}, {"mhap_id": 1, "reads": 121}], "mhaps_target_id": 189}, {"mhaps": [{"mhap_id": 0, "reads": 91}, {"mhap_id": 1, "reads": 56}], "mhaps_target_id": 190}, {"mhaps": [{"mhap_id": 2, "reads": 207}, {"mhap_id": 0, "reads": 54}, {"mhap_id": 3, "reads": 44}, {"mhap_id": 1, "reads": 28}], "mhaps_target_id": 191}, {"mhaps": [{"mhap_id": 0, "reads": 428}], "mhaps_target_id": 192}, {"mhaps": [{"mhap_id": 1, "reads": 158}, {"mhap_id": 0, "reads": 40}], "mhaps_target_id": 193}, {"mhaps": [{"mhap_id": 0, "reads": 218}, {"mhap_id": 1, "reads": 38}], "mhaps_target_id": 194}, {"mhaps": [{"mhap_id": 0, "reads": 234}], "mhaps_target_id": 195}, {"mhaps": [{"mhap_id": 0, "reads": 122}, {"mhap_id": 2, "reads": 11}], "mhaps_target_id": 196}, {"mhaps": [{"mhap_id": 3, "reads": 85}, {"mhap_id": 1, "reads": 77}, {"mhap_id": 0, "reads": 44}], "mhaps_target_id": 197}, {"mhaps": [{"mhap_id": 1, "reads": 340}, {"mhap_id": 4, "reads": 77}], "mhaps_target_id": 198}, {"mhaps": [{"mhap_id": 1, "reads": 446}, {"mhap_id": 2, "reads": 361}], "mhaps_target_id": 199}, {"mhaps": [{"mhap_id": 1, "reads": 152}, {"mhap_id": 0, "reads": 102}, {"mhap_id": 3, "reads": 98}], "mhaps_target_id": 200}, {"mhaps": [{"mhap_id": 1, "reads": 192}, {"mhap_id": 0, "reads": 108}, {"mhap_id": 4, "reads": 30}], "mhaps_target_id": 201}, {"mhaps": [{"mhap_id": 0, "reads": 152}, {"mhap_id": 1, "reads": 85}, {"mhap_id": 3, "reads": 16}], "mhaps_target_id": 202}, {"mhaps": [{"mhap_id": 0, "reads": 387}], "mhaps_target_id": 203}, {"mhaps": [{"mhap_id": 0, "reads": 96}, {"mhap_id": 1, "reads": 67}], "mhaps_target_id": 204}, {"mhaps": [{"mhap_id": 0, "reads": 625}, {"mhap_id": 1, "reads": 86}, {"mhap_id": 6, "reads": 67}], "mhaps_target_id": 205}, {"mhaps": [{"mhap_id": 0, "reads": 60}, {"mhap_id": 7, "reads": 14}], "mhaps_target_id": 206}, {"mhaps": [{"mhap_id": 0, "reads": 306}, {"mhap_id": 1, "reads": 57}], "mhaps_target_id": 207}]}, {"library_sample_id": 7, "target_results": [{"mhaps": [{"mhap_id": 1, "reads": 38}, {"mhap_id": 0, "reads": 27}], "mhaps_target_id": 0}, {"mhaps": [{"mhap_id": 0, "reads": 378}, {"mhap_id": 2, "reads": 48}], "mhaps_target_id": 1}, {"mhaps": [{"mhap_id": 1, "reads": 186}, {"mhap_id": 0, "reads": 146}], "mhaps_target_id": 2}, {"mhaps": [{"mhap_id": 0, "reads": 103}], "mhaps_target_id": 3}, {"mhaps": [{"mhap_id": 0, "reads": 920}, {"mhap_id": 1, "reads": 314}], "mhaps_target_id": 4}, {"mhaps": [{"mhap_id": 1, "reads": 92}, {"mhap_id": 3, "reads": 77}], "mhaps_target_id": 5}, {"mhaps": [{"mhap_id": 1, "reads": 305}, {"mhap_id": 0, "reads": 159}, {"mhap_id": 3, "reads": 79}], "mhaps_target_id": 6}, {"mhaps": [{"mhap_id": 1, "reads": 192}, {"mhap_id": 0, "reads": 157}], "mhaps_target_id": 7}, {"mhaps": [{"mhap_id": 0, "reads": 154}, {"mhap_id": 1, "reads": 107}], "mhaps_target_id": 8}, {"mhaps": [{"mhap_id": 1, "reads": 437}, {"mhap_id": 0, "reads": 184}], "mhaps_target_id": 9}, {"mhaps": [{"mhap_id": 0, "reads": 388}], "mhaps_target_id": 10}, {"mhaps": [{"mhap_id": 0, "reads": 202}, {"mhap_id": 4, "reads": 35}], "mhaps_target_id": 11}, {"mhaps": [{"mhap_id": 0, "reads": 114}, {"mhap_id": 2, "reads": 50}], "mhaps_target_id": 12}, {"mhaps": [{"mhap_id": 0, "reads": 827}, {"mhap_id": 1, "reads": 327}], "mhaps_target_id": 13}, {"mhaps": [{"mhap_id": 0, "reads": 239}, {"mhap_id": 1, "reads": 105}], "mhaps_target_id": 14}, {"mhaps": [{"mhap_id": 0, "reads": 118}, {"mhap_id": 2, "reads": 45}, {"mhap_id": 1, "reads": 28}], "mhaps_target_id": 15}, {"mhaps": [{"mhap_id": 10, "reads": 81}, {"mhap_id": 3, "reads": 59}, {"mhap_id": 0, "reads": 54}], "mhaps_target_id": 16}, {"mhaps": [{"mhap_id": 3, "reads": 253}, {"mhap_id": 1, "reads": 135}, {"mhap_id": 0, "reads": 60}], "mhaps_target_id": 17}, {"mhaps": [{"mhap_id": 0, "reads": 408}, {"mhap_id": 20, "reads": 118}, {"mhap_id": 1, "reads": 86}], "mhaps_target_id": 18}, {"mhaps": [{"mhap_id": 0, "reads": 111}, {"mhap_id": 7, "reads": 23}], "mhaps_target_id": 19}, {"mhaps": [{"mhap_id": 0, "reads": 504}, {"mhap_id": 1, "reads": 199}], "mhaps_target_id": 20}, {"mhaps": [{"mhap_id": 1, "reads": 521}, {"mhap_id": 0, "reads": 389}], "mhaps_target_id": 21}, {"mhaps": [{"mhap_id": 1, "reads": 376}, {"mhap_id": 0, "reads": 318}], "mhaps_target_id": 22}, {"mhaps": [{"mhap_id": 3, "reads": 208}, {"mhap_id": 1, "reads": 83}, {"mhap_id": 12, "reads": 64}, {"mhap_id": 0, "reads": 42}], "mhaps_target_id": 23}, {"mhaps": [{"mhap_id": 0, "reads": 294}], "mhaps_target_id": 24}, {"mhaps": [{"mhap_id": 4, "reads": 83}, {"mhap_id": 0, "reads": 66}, {"mhap_id": 8, "reads": 64}, {"mhap_id": 1, "reads": 39}], "mhaps_target_id": 25}, {"mhaps": [{"mhap_id": 0, "reads": 68}, {"mhap_id": 1, "reads": 62}], "mhaps_target_id": 26}, {"mhaps": [{"mhap_id": 0, "reads": 344}], "mhaps_target_id": 27}, {"mhaps": [{"mhap_id": 0, "reads": 491}], "mhaps_target_id": 28}, {"mhaps": [{"mhap_id": 0, "reads": 278}], "mhaps_target_id": 29}, {"mhaps": [{"mhap_id": 1, "reads": 413}, {"mhap_id": 0, "reads": 308}], "mhaps_target_id": 30}, {"mhaps": [{"mhap_id": 1, "reads": 223}, {"mhap_id": 0, "reads": 33}], "mhaps_target_id": 31}, {"mhaps": [{"mhap_id": 0, "reads": 386}, {"mhap_id": 1, "reads": 261}], "mhaps_target_id": 32}, {"mhaps": [{"mhap_id": 0, "reads": 518}, {"mhap_id": 1, "reads": 342}], "mhaps_target_id": 33}, {"mhaps": [{"mhap_id": 0, "reads": 887}], "mhaps_target_id": 34}, {"mhaps": [{"mhap_id": 1, "reads": 127}, {"mhap_id": 0, "reads": 90}, {"mhap_id": 10, "reads": 53}], "mhaps_target_id": 35}, {"mhaps": [{"mhap_id": 0, "reads": 75}, {"mhap_id": 2, "reads": 32}], "mhaps_target_id": 36}, {"mhaps": [{"mhap_id": 1, "reads": 87}, {"mhap_id": 0, "reads": 59}, {"mhap_id": 3, "reads": 57}], "mhaps_target_id": 37}, {"mhaps": [{"mhap_id": 0, "reads": 57}, {"mhap_id": 2, "reads": 46}, {"mhap_id": 1, "reads": 32}], "mhaps_target_id": 38}, {"mhaps": [{"mhap_id": 0, "reads": 72}, {"mhap_id": 4, "reads": 12}], "mhaps_target_id": 39}, {"mhaps": [{"mhap_id": 0, "reads": 272}, {"mhap_id": 6, "reads": 184}, {"mhap_id": 2, "reads": 177}], "mhaps_target_id": 40}, {"mhaps": [{"mhap_id": 1, "reads": 213}, {"mhap_id": 2, "reads": 200}], "mhaps_target_id": 41}, {"mhaps": [{"mhap_id": 0, "reads": 70}, {"mhap_id": 2, "reads": 14}], "mhaps_target_id": 42}, {"mhaps": [{"mhap_id": 0, "reads": 453}, {"mhap_id": 1, "reads": 239}], "mhaps_target_id": 43}, {"mhaps": [{"mhap_id": 0, "reads": 381}], "mhaps_target_id": 44}, {"mhaps": [{"mhap_id": 0, "reads": 503}], "mhaps_target_id": 45}, {"mhaps": [{"mhap_id": 0, "reads": 710}], "mhaps_target_id": 46}, {"mhaps": [{"mhap_id": 0, "reads": 314}, {"mhap_id": 2, "reads": 115}, {"mhap_id": 4, "reads": 114}], "mhaps_target_id": 47}, {"mhaps": [{"mhap_id": 0, "reads": 180}, {"mhap_id": 2, "reads": 27}], "mhaps_target_id": 48}, {"mhaps": [{"mhap_id": 0, "reads": 1009}], "mhaps_target_id": 49}, {"mhaps": [{"mhap_id": 1, "reads": 279}, {"mhap_id": 2, "reads": 194}, {"mhap_id": 11, "reads": 176}], "mhaps_target_id": 50}, {"mhaps": [{"mhap_id": 0, "reads": 286}, {"mhap_id": 1, "reads": 51}], "mhaps_target_id": 51}, {"mhaps": [{"mhap_id": 0, "reads": 691}, {"mhap_id": 1, "reads": 345}, {"mhap_id": 4, "reads": 193}], "mhaps_target_id": 52}, {"mhaps": [{"mhap_id": 0, "reads": 542}], "mhaps_target_id": 53}, {"mhaps": [{"mhap_id": 0, "reads": 110}, {"mhap_id": 1, "reads": 57}], "mhaps_target_id": 54}, {"mhaps": [{"mhap_id": 0, "reads": 428}], "mhaps_target_id": 55}, {"mhaps": [{"mhap_id": 0, "reads": 325}], "mhaps_target_id": 56}, {"mhaps": [{"mhap_id": 0, "reads": 107}], "mhaps_target_id": 57}, {"mhaps": [{"mhap_id": 0, "reads": 189}, {"mhap_id": 1, "reads": 41}], "mhaps_target_id": 58}, {"mhaps": [{"mhap_id": 1, "reads": 348}, {"mhap_id": 0, "reads": 191}], "mhaps_target_id": 59}, {"mhaps": [{"mhap_id": 1, "reads": 175}, {"mhap_id": 0, "reads": 126}], "mhaps_target_id": 60}, {"mhaps": [{"mhap_id": 0, "reads": 693}], "mhaps_target_id": 61}, {"mhaps": [{"mhap_id": 0, "reads": 907}], "mhaps_target_id": 62}, {"mhaps": [{"mhap_id": 0, "reads": 935}], "mhaps_target_id": 63}, {"mhaps": [{"mhap_id": 0, "reads": 97}, {"mhap_id": 1, "reads": 50}], "mhaps_target_id": 64}, {"mhaps": [{"mhap_id": 1, "reads": 97}, {"mhap_id": 0, "reads": 33}], "mhaps_target_id": 65}, {"mhaps": [{"mhap_id": 0, "reads": 312}], "mhaps_target_id": 66}, {"mhaps": [{"mhap_id": 0, "reads": 717}], "mhaps_target_id": 67}, {"mhaps": [{"mhap_id": 0, "reads": 192}], "mhaps_target_id": 68}, {"mhaps": [{"mhap_id": 0, "reads": 362}, {"mhap_id": 4, "reads": 192}, {"mhap_id": 3, "reads": 79}], "mhaps_target_id": 69}, {"mhaps": [{"mhap_id": 1, "reads": 302}, {"mhap_id": 0, "reads": 115}], "mhaps_target_id": 70}, {"mhaps": [{"mhap_id": 0, "reads": 169}, {"mhap_id": 3, "reads": 48}], "mhaps_target_id": 71}, {"mhaps": [{"mhap_id": 0, "reads": 263}, {"mhap_id": 1, "reads": 222}, {"mhap_id": 2, "reads": 216}], "mhaps_target_id": 72}, {"mhaps": [{"mhap_id": 0, "reads": 156}, {"mhap_id": 3, "reads": 97}], "mhaps_target_id": 73}, {"mhaps": [{"mhap_id": 0, "reads": 233}], "mhaps_target_id": 74}, {"mhaps": [{"mhap_id": 0, "reads": 135}, {"mhap_id": 2, "reads": 96}], "mhaps_target_id": 75}, {"mhaps": [{"mhap_id": 0, "reads": 384}, {"mhap_id": 1, "reads": 306}], "mhaps_target_id": 76}, {"mhaps": [{"mhap_id": 0, "reads": 493}, {"mhap_id": 2, "reads": 434}, {"mhap_id": 1, "reads": 137}], "mhaps_target_id": 77}, {"mhaps": [{"mhap_id": 0, "reads": 850}, {"mhap_id": 1, "reads": 128}], "mhaps_target_id": 78}, {"mhaps": [{"mhap_id": 2, "reads": 653}, {"mhap_id": 0, "reads": 151}, {"mhap_id": 4, "reads": 133}], "mhaps_target_id": 79}, {"mhaps": [{"mhap_id": 1, "reads": 412}, {"mhap_id": 0, "reads": 138}], "mhaps_target_id": 80}, {"mhaps": [{"mhap_id": 0, "reads": 189}, {"mhap_id": 1, "reads": 57}], "mhaps_target_id": 81}, {"mhaps": [{"mhap_id": 0, "reads": 91}, {"mhap_id": 1, "reads": 16}], "mhaps_target_id": 82}, {"mhaps": [{"mhap_id": 0, "reads": 225}, {"mhap_id": 1, "reads": 188}, {"mhap_id": 2, "reads": 86}], "mhaps_target_id": 83}, {"mhaps": [{"mhap_id": 0, "reads": 449}, {"mhap_id": 1, "reads": 248}], "mhaps_target_id": 84}, {"mhaps": [{"mhap_id": 0, "reads": 222}], "mhaps_target_id": 85}, {"mhaps": [{"mhap_id": 0, "reads": 343}, {"mhap_id": 1, "reads": 108}], "mhaps_target_id": 86}, {"mhaps": [{"mhap_id": 0, "reads": 383}, {"mhap_id": 1, "reads": 67}], "mhaps_target_id": 87}, {"mhaps": [{"mhap_id": 0, "reads": 476}], "mhaps_target_id": 88}, {"mhaps": [{"mhap_id": 0, "reads": 294}], "mhaps_target_id": 89}, {"mhaps": [{"mhap_id": 2, "reads": 1669}, {"mhap_id": 0, "reads": 273}], "mhaps_target_id": 90}, {"mhaps": [{"mhap_id": 0, "reads": 193}, {"mhap_id": 3, "reads": 23}], "mhaps_target_id": 91}, {"mhaps": [{"mhap_id": 0, "reads": 395}, {"mhap_id": 1, "reads": 326}], "mhaps_target_id": 92}, {"mhaps": [{"mhap_id": 0, "reads": 297}], "mhaps_target_id": 93}, {"mhaps": [{"mhap_id": 0, "reads": 83}, {"mhap_id": 2, "reads": 75}], "mhaps_target_id": 94}, {"mhaps": [{"mhap_id": 0, "reads": 744}], "mhaps_target_id": 95}, {"mhaps": [{"mhap_id": 27, "reads": 795}, {"mhap_id": 21, "reads": 256}, {"mhap_id": 16, "reads": 208}, {"mhap_id": 10, "reads": 191}], "mhaps_target_id": 96}, {"mhaps": [{"mhap_id": 1, "reads": 332}, {"mhap_id": 0, "reads": 117}], "mhaps_target_id": 97}, {"mhaps": [{"mhap_id": 0, "reads": 399}], "mhaps_target_id": 98}, {"mhaps": [{"mhap_id": 0, "reads": 269}, {"mhap_id": 3, "reads": 64}, {"mhap_id": 1, "reads": 57}], "mhaps_target_id": 99}, {"mhaps": [{"mhap_id": 0, "reads": 905}], "mhaps_target_id": 100}, {"mhaps": [{"mhap_id": 0, "reads": 238}], "mhaps_target_id": 101}, {"mhaps": [{"mhap_id": 0, "reads": 113}, {"mhap_id": 5, "reads": 99}], "mhaps_target_id": 102}, {"mhaps": [{"mhap_id": 0, "reads": 123}, {"mhap_id": 2, "reads": 57}, {"mhap_id": 1, "reads": 49}], "mhaps_target_id": 103}, {"mhaps": [{"mhap_id": 0, "reads": 525}], "mhaps_target_id": 104}, {"mhaps": [{"mhap_id": 1, "reads": 109}, {"mhap_id": 0, "reads": 66}], "mhaps_target_id": 105}, {"mhaps": [{"mhap_id": 0, "reads": 451}], "mhaps_target_id": 107}, {"mhaps": [{"mhap_id": 0, "reads": 187}, {"mhap_id": 1, "reads": 162}, {"mhap_id": 2, "reads": 44}], "mhaps_target_id": 108}, {"mhaps": [{"mhap_id": 1, "reads": 161}, {"mhap_id": 0, "reads": 151}], "mhaps_target_id": 109}, {"mhaps": [{"mhap_id": 0, "reads": 1300}], "mhaps_target_id": 110}, {"mhaps": [{"mhap_id": 0, "reads": 78}, {"mhap_id": 2, "reads": 44}, {"mhap_id": 1, "reads": 42}], "mhaps_target_id": 111}, {"mhaps": [{"mhap_id": 0, "reads": 193}, {"mhap_id": 7, "reads": 64}, {"mhap_id": 1, "reads": 39}], "mhaps_target_id": 112}, {"mhaps": [{"mhap_id": 0, "reads": 304}], "mhaps_target_id": 113}, {"mhaps": [{"mhap_id": 4, "reads": 459}, {"mhap_id": 0, "reads": 265}], "mhaps_target_id": 114}, {"mhaps": [{"mhap_id": 0, "reads": 74}, {"mhap_id": 2, "reads": 37}], "mhaps_target_id": 115}, {"mhaps": [{"mhap_id": 0, "reads": 873}], "mhaps_target_id": 116}, {"mhaps": [{"mhap_id": 2, "reads": 35}, {"mhap_id": 0, "reads": 17}], "mhaps_target_id": 117}, {"mhaps": [{"mhap_id": 1, "reads": 36}, {"mhap_id": 0, "reads": 19}], "mhaps_target_id": 118}, {"mhaps": [{"mhap_id": 0, "reads": 589}], "mhaps_target_id": 119}, {"mhaps": [{"mhap_id": 1, "reads": 390}, {"mhap_id": 9, "reads": 225}, {"mhap_id": 7, "reads": 76}], "mhaps_target_id": 120}, {"mhaps": [{"mhap_id": 1, "reads": 330}, {"mhap_id": 0, "reads": 175}, {"mhap_id": 5, "reads": 59}], "mhaps_target_id": 121}, {"mhaps": [{"mhap_id": 2, "reads": 478}, {"mhap_id": 1, "reads": 261}], "mhaps_target_id": 122}, {"mhaps": [{"mhap_id": 0, "reads": 888}, {"mhap_id": 1, "reads": 651}], "mhaps_target_id": 123}, {"mhaps": [{"mhap_id": 0, "reads": 508}, {"mhap_id": 1, "reads": 179}], "mhaps_target_id": 124}, {"mhaps": [{"mhap_id": 0, "reads": 176}], "mhaps_target_id": 125}, {"mhaps": [{"mhap_id": 0, "reads": 431}], "mhaps_target_id": 126}, {"mhaps": [{"mhap_id": 0, "reads": 1205}, {"mhap_id": 1, "reads": 818}], "mhaps_target_id": 127}, {"mhaps": [{"mhap_id": 0, "reads": 85}], "mhaps_target_id": 128}, {"mhaps": [{"mhap_id": 1, "reads": 406}, {"mhap_id": 0, "reads": 88}, {"mhap_id": 2, "reads": 77}], "mhaps_target_id": 129}, {"mhaps": [{"mhap_id": 1, "reads": 278}, {"mhap_id": 0, "reads": 80}, {"mhap_id": 8, "reads": 70}], "mhaps_target_id": 130}, {"mhaps": [{"mhap_id": 0, "reads": 285}, {"mhap_id": 7, "reads": 45}], "mhaps_target_id": 131}, {"mhaps": [{"mhap_id": 32, "reads": 223}, {"mhap_id": 2, "reads": 142}, {"mhap_id": 3, "reads": 91}, {"mhap_id": 6, "reads": 70}], "mhaps_target_id": 132}, {"mhaps": [{"mhap_id": 0, "reads": 656}, {"mhap_id": 2, "reads": 450}], "mhaps_target_id": 133}, {"mhaps": [{"mhap_id": 0, "reads": 139}, {"mhap_id": 1, "reads": 43}], "mhaps_target_id": 134}, {"mhaps": [{"mhap_id": 1, "reads": 415}, {"mhap_id": 0, "reads": 166}], "mhaps_target_id": 135}, {"mhaps": [{"mhap_id": 0, "reads": 326}], "mhaps_target_id": 136}, {"mhaps": [{"mhap_id": 0, "reads": 1416}], "mhaps_target_id": 137}, {"mhaps": [{"mhap_id": 0, "reads": 413}, {"mhap_id": 3, "reads": 396}], "mhaps_target_id": 138}, {"mhaps": [{"mhap_id": 0, "reads": 164}], "mhaps_target_id": 139}, {"mhaps": [{"mhap_id": 0, "reads": 114}, {"mhap_id": 6, "reads": 28}], "mhaps_target_id": 140}, {"mhaps": [{"mhap_id": 0, "reads": 300}], "mhaps_target_id": 141}, {"mhaps": [{"mhap_id": 0, "reads": 491}, {"mhap_id": 3, "reads": 73}], "mhaps_target_id": 142}, {"mhaps": [{"mhap_id": 2, "reads": 309}, {"mhap_id": 0, "reads": 122}, {"mhap_id": 1, "reads": 67}], "mhaps_target_id": 143}, {"mhaps": [{"mhap_id": 8, "reads": 108}, {"mhap_id": 1, "reads": 37}, {"mhap_id": 2, "reads": 24}], "mhaps_target_id": 144}, {"mhaps": [{"mhap_id": 0, "reads": 499}, {"mhap_id": 4, "reads": 195}], "mhaps_target_id": 145}, {"mhaps": [{"mhap_id": 0, "reads": 318}], "mhaps_target_id": 146}, {"mhaps": [{"mhap_id": 0, "reads": 405}, {"mhap_id": 5, "reads": 162}, {"mhap_id": 1, "reads": 76}], "mhaps_target_id": 148}, {"mhaps": [{"mhap_id": 0, "reads": 328}, {"mhap_id": 1, "reads": 320}], "mhaps_target_id": 149}, {"mhaps": [{"mhap_id": 2, "reads": 440}, {"mhap_id": 0, "reads": 265}, {"mhap_id": 4, "reads": 160}, {"mhap_id": 3, "reads": 126}], "mhaps_target_id": 150}, {"mhaps": [{"mhap_id": 0, "reads": 605}, {"mhap_id": 1, "reads": 102}], "mhaps_target_id": 151}, {"mhaps": [{"mhap_id": 1, "reads": 166}, {"mhap_id": 0, "reads": 115}], "mhaps_target_id": 152}, {"mhaps": [{"mhap_id": 3, "reads": 72}, {"mhap_id": 20, "reads": 46}, {"mhap_id": 1, "reads": 21}], "mhaps_target_id": 153}, {"mhaps": [{"mhap_id": 9, "reads": 191}, {"mhap_id": 6, "reads": 124}, {"mhap_id": 0, "reads": 63}, {"mhap_id": 4, "reads": 54}], "mhaps_target_id": 154}, {"mhaps": [{"mhap_id": 2, "reads": 202}, {"mhap_id": 0, "reads": 119}, {"mhap_id": 1, "reads": 119}], "mhaps_target_id": 155}, {"mhaps": [{"mhap_id": 0, "reads": 177}], "mhaps_target_id": 156}, {"mhaps": [{"mhap_id": 0, "reads": 1268}], "mhaps_target_id": 157}, {"mhaps": [{"mhap_id": 0, "reads": 372}], "mhaps_target_id": 158}, {"mhaps": [{"mhap_id": 0, "reads": 205}, {"mhap_id": 1, "reads": 25}], "mhaps_target_id": 159}, {"mhaps": [{"mhap_id": 0, "reads": 250}], "mhaps_target_id": 160}, {"mhaps": [{"mhap_id": 0, "reads": 237}], "mhaps_target_id": 161}, {"mhaps": [{"mhap_id": 0, "reads": 775}], "mhaps_target_id": 162}, {"mhaps": [{"mhap_id": 0, "reads": 265}], "mhaps_target_id": 163}, {"mhaps": [{"mhap_id": 0, "reads": 730}, {"mhap_id": 3, "reads": 333}], "mhaps_target_id": 164}, {"mhaps": [{"mhap_id": 0, "reads": 291}], "mhaps_target_id": 165}, {"mhaps": [{"mhap_id": 1, "reads": 231}, {"mhap_id": 0, "reads": 91}], "mhaps_target_id": 166}, {"mhaps": [{"mhap_id": 2, "reads": 335}, {"mhap_id": 0, "reads": 190}, {"mhap_id": 5, "reads": 59}], "mhaps_target_id": 167}, {"mhaps": [{"mhap_id": 1, "reads": 89}, {"mhap_id": 2, "reads": 89}, {"mhap_id": 5, "reads": 69}], "mhaps_target_id": 168}, {"mhaps": [{"mhap_id": 0, "reads": 683}, {"mhap_id": 3, "reads": 248}], "mhaps_target_id": 169}, {"mhaps": [{"mhap_id": 0, "reads": 289}], "mhaps_target_id": 170}, {"mhaps": [{"mhap_id": 0, "reads": 167}], "mhaps_target_id": 171}, {"mhaps": [{"mhap_id": 1, "reads": 55}], "mhaps_target_id": 172}, {"mhaps": [{"mhap_id": 0, "reads": 213}], "mhaps_target_id": 173}, {"mhaps": [{"mhap_id": 0, "reads": 273}], "mhaps_target_id": 174}, {"mhaps": [{"mhap_id": 0, "reads": 257}, {"mhap_id": 1, "reads": 210}], "mhaps_target_id": 175}, {"mhaps": [{"mhap_id": 0, "reads": 179}], "mhaps_target_id": 176}, {"mhaps": [{"mhap_id": 0, "reads": 94}], "mhaps_target_id": 177}, {"mhaps": [{"mhap_id": 0, "reads": 216}], "mhaps_target_id": 178}, {"mhaps": [{"mhap_id": 0, "reads": 445}], "mhaps_target_id": 179}, {"mhaps": [{"mhap_id": 0, "reads": 691}], "mhaps_target_id": 180}, {"mhaps": [{"mhap_id": 0, "reads": 106}], "mhaps_target_id": 181}, {"mhaps": [{"mhap_id": 0, "reads": 351}], "mhaps_target_id": 182}, {"mhaps": [{"mhap_id": 0, "reads": 213}], "mhaps_target_id": 183}, {"mhaps": [{"mhap_id": 0, "reads": 73}, {"mhap_id": 3, "reads": 47}], "mhaps_target_id": 184}, {"mhaps": [{"mhap_id": 0, "reads": 250}, {"mhap_id": 3, "reads": 232}, {"mhap_id": 4, "reads": 110}], "mhaps_target_id": 185}, {"mhaps": [{"mhap_id": 1, "reads": 345}, {"mhap_id": 0, "reads": 134}], "mhaps_target_id": 186}, {"mhaps": [{"mhap_id": 1, "reads": 585}, {"mhap_id": 0, "reads": 240}], "mhaps_target_id": 187}, {"mhaps": [{"mhap_id": 3, "reads": 83}, {"mhap_id": 0, "reads": 51}], "mhaps_target_id": 188}, {"mhaps": [{"mhap_id": 0, "reads": 557}], "mhaps_target_id": 189}, {"mhaps": [{"mhap_id": 0, "reads": 104}, {"mhap_id": 1, "reads": 34}], "mhaps_target_id": 190}, {"mhaps": [{"mhap_id": 2, "reads": 204}, {"mhap_id": 1, "reads": 166}], "mhaps_target_id": 191}, {"mhaps": [{"mhap_id": 0, "reads": 527}], "mhaps_target_id": 192}, {"mhaps": [{"mhap_id": 1, "reads": 107}, {"mhap_id": 0, "reads": 63}], "mhaps_target_id": 193}, {"mhaps": [{"mhap_id": 0, "reads": 248}, {"mhap_id": 1, "reads": 157}], "mhaps_target_id": 194}, {"mhaps": [{"mhap_id": 0, "reads": 267}], "mhaps_target_id": 195}, {"mhaps": [{"mhap_id": 1, "reads": 76}, {"mhap_id": 0, "reads": 71}], "mhaps_target_id": 196}, {"mhaps": [{"mhap_id": 3, "reads": 170}, {"mhap_id": 2, "reads": 85}, {"mhap_id": 1, "reads": 68}], "mhaps_target_id": 197}, {"mhaps": [{"mhap_id": 0, "reads": 499}, {"mhap_id": 4, "reads": 94}], "mhaps_target_id": 198}, {"mhaps": [{"mhap_id": 1, "reads": 542}, {"mhap_id": 0, "reads": 512}, {"mhap_id": 2, "reads": 222}], "mhaps_target_id": 199}, {"mhaps": [{"mhap_id": 0, "reads": 598}], "mhaps_target_id": 200}, {"mhaps": [{"mhap_id": 0, "reads": 336}, {"mhap_id": 2, "reads": 50}], "mhaps_target_id": 201}, {"mhaps": [{"mhap_id": 0, "reads": 192}, {"mhap_id": 2, "reads": 161}], "mhaps_target_id": 202}, {"mhaps": [{"mhap_id": 0, "reads": 598}], "mhaps_target_id": 203}, {"mhaps": [{"mhap_id": 1, "reads": 231}, {"mhap_id": 0, "reads": 38}], "mhaps_target_id": 204}, {"mhaps": [{"mhap_id": 0, "reads": 1144}, {"mhap_id": 15, "reads": 241}], "mhaps_target_id": 205}, {"mhaps": [{"mhap_id": 2, "reads": 43}, {"mhap_id": 0, "reads": 39}, {"mhap_id": 6, "reads": 25}], "mhaps_target_id": 206}, {"mhaps": [{"mhap_id": 0, "reads": 574}], "mhaps_target_id": 207}]}]}], "read_counts_by_stage": []} diff --git a/tests/data/minimum_fields_pmo_example1.json.gz b/tests/data/minimum_fields_pmo_example1.json.gz new file mode 100644 index 0000000..b7f0596 Binary files /dev/null and b/tests/data/minimum_fields_pmo_example1.json.gz differ diff --git a/tests/data/minimum_fields_pmo_example2.json.gz b/tests/data/minimum_fields_pmo_example2.json.gz new file mode 100644 index 0000000..5b8267e Binary files /dev/null and b/tests/data/minimum_fields_pmo_example2.json.gz differ diff --git a/tests/test_pmo_builder/test_merge_to_pmo.py b/tests/test_pmo_builder/test_merge_to_pmo.py index 7f8b981..c653cba 100644 --- a/tests/test_pmo_builder/test_merge_to_pmo.py +++ b/tests/test_pmo_builder/test_merge_to_pmo.py @@ -15,7 +15,7 @@ class TestMergeToPMO(unittest.TestCase): def setUp(self): self.ref_list = [{"name": "name1"}, {"name": "name2"}, {"name": "name3"}] - self.pmo_header = { + self.pmo_header_v1_0_0 = { "pmo_version": "1.0.0", "creation_date": "2025-07-22", "generation_method": { @@ -23,6 +23,43 @@ def setUp(self): "program_version": "1.0.0", }, } + self.pmo_header_v1_1_0 = { + "pmo_version": "1.1.0", + "creation_date": "2025-07-22", + "generation_method": { + "program_name": "pmotools-python", + "program_version": "1.1.0", + }, + } + self.for_merging_spec_info_panel_info = { + "panel_info": [{"panel_name": "panel1"}], + "target_info": [{"target_name": "target1"}], + } + self.for_merging_spec_info_mhap_info = { + "representative_microhaplotypes": { + "targets": [{"target_name": "target1", "microhaplotypes": []}] + }, + "detected_microhaplotypes": [ + { + "library_samples": [ + {"library_sample_name": "samp_A", "target_results": []}, + {"library_sample_name": "samp_B", "target_results": []}, + ] + } + ], + } + self.for_merging_spec_info_specimen_info = [ + { + "specimen_name": "samp_A", + "collection_country": "Mozambique", + "collection_date": "2022-01-01", + }, + { + "specimen_name": "samp_B", + "collection_country": "Kenya", + "collection_date": "2022-02-01", + }, + ] def test_report_missing_IDs_passes(self): _report_missing_IDs( @@ -109,7 +146,7 @@ def test_merge_to_pmo_with_read_counts_by_stage(self): specimen_info=specimen_info, library_sample_info=library_sample_info, sequencing_info=sequencing_info, - panel_info=panel_info, + panel_target_info=panel_info, mhap_info=mhap_info, bioinfo_method_info=bioinfo_method_info, bioinfo_run_info=bioinfo_run_info, @@ -131,14 +168,141 @@ def test_merge_to_pmo_with_read_counts_by_stage(self): self.assertIn("library_sample_id", library_sample) self.assertNotIn("library_sample_name", library_sample) + # need to test raise on not giving spec or libr and giving more than 1 panel + + def test_merge_to_pmo_minimum_info(self): + """Test merge_to_pmo with only target and panel info and mhaps detected.""" + + panel_info = { + "panel_info": [{"panel_name": "panel1"}], + "target_info": [{"target_name": "target1"}], + } + mhap_info = { + "representative_microhaplotypes": { + "targets": [{"target_name": "target1", "microhaplotypes": []}] + }, + "detected_microhaplotypes": [ + { + "library_samples": [ + {"library_sample_name": "samp_A", "target_results": []}, + {"library_sample_name": "samp_B", "target_results": []}, + ] + } + ], + } + + result = merge_to_pmo( + panel_target_info=panel_info, + mhap_info=mhap_info, + ) + + # test that library_sample_info and specimen_info are created and contain the library_sample names from detected_microhaplotypes + self.assertIn("library_sample_info", result) + self.assertIn("specimen_info", result) + self.assertEqual( + sorted( + [ + result["library_sample_info"][0]["library_sample_name"], + result["library_sample_info"][1]["library_sample_name"], + ] + ), + sorted(["samp_A", "samp_B"]), + ) + self.assertEqual( + sorted( + [ + result["specimen_info"][0]["specimen_name"], + result["specimen_info"][1]["specimen_name"], + ] + ), + sorted(["samp_A", "samp_B"]), + ) + + def test_merge_to_pmo_minimum_info_plus_library_sample(self): + """Test merge_to_pmo with only target and panel info and mhaps detected.""" + + panel_info = { + "panel_info": [{"panel_name": "panel1"}, {"panel_name": "panel2"}], + "target_info": [{"target_name": "target1"}], + } + library_sample_info = [ + {"library_sample_name": "samp_A", "panel_name": "panel1"}, + {"library_sample_name": "samp_B", "panel_name": "panel2"}, + ] + mhap_info = { + "representative_microhaplotypes": { + "targets": [{"target_name": "target1", "microhaplotypes": []}] + }, + "detected_microhaplotypes": [ + { + "library_samples": [ + {"library_sample_name": "samp_A", "target_results": []}, + {"library_sample_name": "samp_B", "target_results": []}, + ] + } + ], + } + + result = merge_to_pmo( + panel_target_info=panel_info, + mhap_info=mhap_info, + library_sample_info=library_sample_info, + ) + + # test that specimen_info was created and contain the library_sample names from library_sample_info + self.assertIn("specimen_info", result) + self.assertEqual( + sorted( + [ + result["library_sample_info"][0]["library_sample_name"], + result["library_sample_info"][1]["library_sample_name"], + ] + ), + sorted(["samp_A", "samp_B"]), + ) + self.assertEqual( + sorted( + [ + result["specimen_info"][0]["specimen_name"], + result["specimen_info"][1]["specimen_name"], + ] + ), + sorted(["samp_A", "samp_B"]), + ) + + def test_merge_to_pmo_minimum_info_raise_multi_panel_no_lib(self): + panel_info = { + "panel_info": [{"panel_name": "panel1"}, {"panel_name": "panel2"}], + "target_info": [{"target_name": "target1"}], + } + mhap_info = { + "representative_microhaplotypes": { + "targets": [{"target_name": "target1", "microhaplotypes": []}] + }, + "detected_microhaplotypes": [ + { + "library_samples": [ + {"library_sample_name": "samp_A", "target_results": []}, + {"library_sample_name": "samp_B", "target_results": []}, + ] + } + ], + } + with self.assertRaises(Exception) as context: + merge_to_pmo(panel_target_info=panel_info, mhap_info=mhap_info) + self.assertIn( + "If multiple panels are included in the panel information,specimen_info and library_sample_info", + str(context.exception), + ) + @patch("pmotools.pmo_builder.merge_to_pmo.date") def test_generate_pmo_header(self, mock_date): mock_date.today.return_value = date(2025, 7, 22) mock_date.side_effect = lambda *args, **kwargs: date(*args, **kwargs) - actual = _generate_pmo_header() + actual = _generate_pmo_header("1.0.0") # expected = {'pmo_version': '1.0.0', 'creation_date': '2025-07-22', 'generation_method': { # 'program_name': 'pmotools-python', 'program_version': '1.0.0'}} - self.assertEqual(actual, self.pmo_header) + self.assertEqual(actual, self.pmo_header_v1_0_0) def test_replace_key_with_id(self): test_target_list = [ @@ -193,23 +357,26 @@ def test_make_lookup(self): @patch("pmotools.pmo_builder.merge_to_pmo._replace_names_with_IDs") @patch("pmotools.pmo_builder.merge_to_pmo._generate_pmo_header") def test_merge_to_pmo(self, mock_generate_pmo_header, _): - mock_generate_pmo_header.return_value = self.pmo_header + mock_generate_pmo_header.return_value = self.pmo_header_v1_0_0 actual = merge_to_pmo( - [{"specimens": "specinfo"}], - [{"library_samples": "library_samples"}], - [{"sequencing": "sequencing"}], - {"panel_info": ["panels"], "target_info": ["targets"]}, - { + specimen_info=[{"specimens": "specinfo"}], + library_sample_info=[{"library_samples": "library_samples"}], + sequencing_info=[{"sequencing": "sequencing"}], + panel_target_info={ + "panel_info": ["panels"], + "target_info": ["targets"], + }, + mhap_info={ "representative_microhaplotypes": ["mhap_seqs"], "detected_microhaplotypes": ["mhaps for sample"], }, - [{"bioinfo_methods": "bioinfo_methods"}], - [{"bioinfo_runs": "bioinfo_runs"}], - [{"projects": "projects"}], + bioinfo_method_info=[{"bioinfo_methods": "bioinfo_methods"}], + bioinfo_run_info=[{"bioinfo_runs": "bioinfo_runs"}], + project_info=[{"projects": "projects"}], ) expected = { - "pmo_header": self.pmo_header, + "pmo_header": self.pmo_header_v1_0_0, "library_sample_info": [{"library_samples": "library_samples"}], "specimen_info": [{"specimens": "specinfo"}], "sequencing_info": [{"sequencing": "sequencing"}], @@ -223,6 +390,79 @@ def test_merge_to_pmo(self, mock_generate_pmo_header, _): } self.assertEqual(expected, actual) + def test_merge_to_pmo_specimen_info_matching_names_passes(self): + """merge_to_pmo succeeds and output library_sample_info names match provided specimen names.""" + result = merge_to_pmo( + panel_target_info=self.for_merging_spec_info_panel_info, + mhap_info=self.for_merging_spec_info_mhap_info, + specimen_info=self.for_merging_spec_info_specimen_info, + ) + expected_names = { + s["specimen_name"] for s in self.for_merging_spec_info_specimen_info + } + output_names = {s["library_sample_name"] for s in result["library_sample_info"]} + assert output_names == expected_names + + def test_merge_to_pmo_specimen_info_missing_names_warns(self): + """Warns (does not raise) when specimen_info is missing names that exist in detected_microhaplotypes.""" + incomplete_specimen_info = [ + { + "specimen_name": "samp_A", + "collection_country": "Mozambique", + "collection_date": "2022-01-01", + }, + # samp_B is missing + ] + with self.assertWarns(UserWarning) as context: + result = merge_to_pmo( + panel_target_info=self.for_merging_spec_info_panel_info, + mhap_info=self.for_merging_spec_info_mhap_info, + specimen_info=incomplete_specimen_info, + ) + + warning_message = str(context.warning) + self.assertIn("samp_B", warning_message) + self.assertIn( + "library_sample_names found in the detected_microhaplotypes that don't have corresponding supplied specimen_names", + warning_message, + ) + # merge should still succeed and produce a result + self.assertIsNotNone(result) + + def test_merge_to_pmo_specimen_info_extra_names_warns(self): + """Warns (does not raise) when specimen_info has names not present in detected_microhaplotypes.""" + excess_specimen_info = [ + { + "specimen_name": "samp_A", + "collection_country": "Mozambique", + "collection_date": "2022-01-01", + }, + { + "specimen_name": "samp_B", + "collection_country": "Kenya", + "collection_date": "2022-02-01", + }, + { + "specimen_name": "samp_C", + "collection_country": "Ghana", + "collection_date": "2022-03-01", + }, + ] + with self.assertWarns(UserWarning) as context: + result = merge_to_pmo( + panel_target_info=self.for_merging_spec_info_panel_info, + mhap_info=self.for_merging_spec_info_mhap_info, + specimen_info=excess_specimen_info, + ) + warning_message = str(context.warning) + self.assertIn("samp_C", warning_message) + self.assertIn( + "specimen_name were supplied that don't have corresponding library_sample_names", + warning_message, + ) + # merge should still succeed and produce a result + self.assertIsNotNone(result) + if __name__ == "__main__": unittest.main() diff --git a/tests/test_pmo_builder/test_metatable_to_pmo.py b/tests/test_pmo_builder/test_metatable_to_pmo.py index 39d5b6e..38d59bc 100644 --- a/tests/test_pmo_builder/test_metatable_to_pmo.py +++ b/tests/test_pmo_builder/test_metatable_to_pmo.py @@ -385,12 +385,20 @@ def test_specimen_info_table_to_pmo_default(self): } ) - result = specimen_info_table_to_pmo(df) + result = specimen_info_table_to_pmo( + df, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", + ) self.assertEqual( [ { "specimen_name": "sample1", - "specimen_taxon_id": 5833, + "specimen_taxon_id": [5833], "host_taxon_id": 9606, "collection_date": "01/02/2023", "collection_country": "Mozambique", @@ -398,7 +406,7 @@ def test_specimen_info_table_to_pmo_default(self): }, { "specimen_name": "sample2", - "specimen_taxon_id": 5833, + "specimen_taxon_id": [5833], "host_taxon_id": 9606, "collection_date": "01/02/2023", "collection_country": "Ghana", @@ -425,6 +433,12 @@ def test_specimen_info_table_to_pmo_with_plate_info(self): result = specimen_info_table_to_pmo( df, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", storage_plate_col_col="storage_plate_col", storage_plate_name_col="storage_plate_name", storage_plate_row_col="storage_plate_row", @@ -433,7 +447,7 @@ def test_specimen_info_table_to_pmo_with_plate_info(self): [ { "specimen_name": "sample1", - "specimen_taxon_id": 5833, + "specimen_taxon_id": [5833], "host_taxon_id": 9606, "collection_date": "01/02/2023", "collection_country": "Mozambique", @@ -446,7 +460,7 @@ def test_specimen_info_table_to_pmo_with_plate_info(self): }, { "specimen_name": "sample2", - "specimen_taxon_id": 5833, + "specimen_taxon_id": [5833], "host_taxon_id": 9606, "collection_date": "01/02/2023", "collection_country": "Ghana", @@ -477,6 +491,12 @@ def test_specimen_info_table_to_pmo_with_parasitemia(self): result = specimen_info_table_to_pmo( df, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", parasite_density_col="parasite_density", parasite_density_method_col="parasite_density_method", ) @@ -484,7 +504,7 @@ def test_specimen_info_table_to_pmo_with_parasitemia(self): [ { "specimen_name": "sample1", - "specimen_taxon_id": 5833, + "specimen_taxon_id": [5833], "host_taxon_id": 9606, "collection_date": "01/02/2023", "collection_country": "Mozambique", @@ -495,7 +515,7 @@ def test_specimen_info_table_to_pmo_with_parasitemia(self): }, { "specimen_name": "sample2", - "specimen_taxon_id": 5833, + "specimen_taxon_id": [5833], "host_taxon_id": 9606, "collection_date": "01/02/2023", "collection_country": "Ghana", @@ -526,13 +546,20 @@ def test_specimen_info_table_to_pmo_with_additional_columns(self): ) result = specimen_info_table_to_pmo( - df, additional_specimen_cols=["special_field_1", "special_field_2"] + df, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", + additional_specimen_cols=["special_field_1", "special_field_2"], ) self.assertEqual( [ { "specimen_name": "sample1", - "specimen_taxon_id": 5833, + "specimen_taxon_id": [5833], "host_taxon_id": 9606, "collection_date": "01/02/2023", "collection_country": "Mozambique", @@ -542,7 +569,7 @@ def test_specimen_info_table_to_pmo_with_additional_columns(self): }, { "specimen_name": "sample2", - "specimen_taxon_id": 5833, + "specimen_taxon_id": [5833], "host_taxon_id": 9606, "collection_date": "01/02/2023", "collection_country": "Ghana", @@ -566,7 +593,16 @@ def test_specimen_info_table_to_pmo_fails_with_col_duplicate(self): } ) with self.assertRaises(ValueError) as context: - specimen_info_table_to_pmo(df, drug_usage_col="specimen_name") + specimen_info_table_to_pmo( + df, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", + drug_usage_col="specimen_name", + ) self.assertEqual("Selected columns must be unique.", str(context.exception)) def test_specimen_info_table_to_pmo_fails_with_missing_col(self): @@ -581,7 +617,16 @@ def test_specimen_info_table_to_pmo_fails_with_missing_col(self): } ) with self.assertRaises(ValueError) as context: - specimen_info_table_to_pmo(df, drug_usage_col="drug_usage") + specimen_info_table_to_pmo( + df, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", + drug_usage_col="drug_usage", + ) self.assertEqual( "The following columns are not in the DataFrame: ['drug_usage']", str(context.exception), @@ -589,7 +634,15 @@ def test_specimen_info_table_to_pmo_fails_with_missing_col(self): def test_specimen_info_table_to_pmo_fails_without_df(self): with self.assertRaises(ValueError) as context: - specimen_info_table_to_pmo("test") + specimen_info_table_to_pmo( + "test", + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", + ) self.assertEqual("contents must be a pandas DataFrame.", str(context.exception)) def test_specimen_info_table_to_pmo_fails_with_null_in_required_columns(self): @@ -606,7 +659,15 @@ def test_specimen_info_table_to_pmo_fails_with_null_in_required_columns(self): } ) with self.assertRaises(ValueError) as context: - specimen_info_table_to_pmo(df1) + specimen_info_table_to_pmo( + df1, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", + ) self.assertIn( "The following columns contain null values", str(context.exception), @@ -625,7 +686,15 @@ def test_specimen_info_table_to_pmo_fails_with_null_in_required_columns(self): } ) with self.assertRaises(ValueError) as context: - specimen_info_table_to_pmo(df2) + specimen_info_table_to_pmo( + df2, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", + ) self.assertIn( "The following columns contain null values", str(context.exception), @@ -644,7 +713,15 @@ def test_specimen_info_table_to_pmo_fails_with_null_in_required_columns(self): } ) with self.assertRaises(ValueError) as context: - specimen_info_table_to_pmo(df3) + specimen_info_table_to_pmo( + df3, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", + ) self.assertIn( "The following columns contain null values", str(context.exception), @@ -663,7 +740,15 @@ def test_specimen_info_table_to_pmo_fails_with_null_in_required_columns(self): } ) with self.assertRaises(ValueError) as context: - specimen_info_table_to_pmo(df4) + specimen_info_table_to_pmo( + df4, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", + ) self.assertIn( "The following columns contain null values", str(context.exception), @@ -682,7 +767,15 @@ def test_specimen_info_table_to_pmo_fails_with_null_in_required_columns(self): } ) with self.assertRaises(ValueError) as context: - specimen_info_table_to_pmo(df5) + specimen_info_table_to_pmo( + df5, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", + ) self.assertIn( "The following columns contain null values", str(context.exception), @@ -701,7 +794,15 @@ def test_specimen_info_table_to_pmo_fails_with_null_in_required_columns(self): } ) with self.assertRaises(ValueError) as context: - specimen_info_table_to_pmo(df6) + specimen_info_table_to_pmo( + df6, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", + ) self.assertIn( "The following columns contain null values", str(context.exception), @@ -720,7 +821,15 @@ def test_specimen_info_table_to_pmo_fails_with_null_in_required_columns(self): } ) with self.assertRaises(ValueError) as context: - specimen_info_table_to_pmo(df7) + specimen_info_table_to_pmo( + df7, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", + ) self.assertIn( "The following columns contain null values", str(context.exception), @@ -755,6 +864,12 @@ def test_specimen_info_table_to_pmo_removes_empty_optional_fields(self): result = specimen_info_table_to_pmo( df, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", lat_lon_col="lat_lon", host_age_col="host_age", host_sex_col="host_sex", @@ -813,6 +928,12 @@ def test_specimen_info_table_to_pmo_with_geo_fields(self): result = specimen_info_table_to_pmo( df, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", geo_admin1_col="geo_admin1", geo_admin2_col="geo_admin2", geo_admin3_col="geo_admin3", @@ -849,6 +970,12 @@ def test_specimen_info_table_to_pmo_removes_empty_dict_list(self): result_with_empty_info = specimen_info_table_to_pmo( df, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", storage_plate_col_col=None, storage_plate_name_col=None, storage_plate_row_col=None, @@ -876,6 +1003,12 @@ def test_specimen_info_table_to_pmo_removes_empty_dict_list(self): result2 = specimen_info_table_to_pmo( df2, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", parasite_density_col="parasite_density", parasite_density_method_col=None, ) @@ -903,6 +1036,12 @@ def test_specimen_info_table_to_pmo_with_host_fields(self): result = specimen_info_table_to_pmo( df, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", host_age_col="host_age", host_sex_col="host_sex", host_subject_id="host_subject_id", @@ -955,6 +1094,12 @@ def test_specimen_info_table_to_pmo_with_specimen_fields(self): result = specimen_info_table_to_pmo( df, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", specimen_accession_col="specimen_accession", specimen_type_col="specimen_type", specimen_collect_device_col="specimen_collect_device", @@ -969,7 +1114,7 @@ def test_specimen_info_table_to_pmo_with_specimen_fields(self): self.assertEqual(result[0]["specimen_type"], "field_sample") self.assertEqual(result[0]["specimen_collect_device"], "needle") self.assertNotIn("specimen_store_loc", result[0]) - self.assertNotIn("specimen_comments", result[0]) + self.assertNotIn("specimen_comments", [result[0]]) # sample2: specimen_accession is empty string, specimen_type is None, specimen_collect_device is empty string # specimen_store_loc has value, specimen_comments has value @@ -978,7 +1123,7 @@ def test_specimen_info_table_to_pmo_with_specimen_fields(self): self.assertNotIn("specimen_type", result[1]) self.assertNotIn("specimen_collect_device", result[1]) self.assertEqual(result[1]["specimen_store_loc"], "freezer1") - self.assertEqual(result[1]["specimen_comments"], "Some comment") + self.assertEqual(result[1]["specimen_comments"], ["Some comment"]) def test_specimen_info_table_to_pmo_with_environment_fields(self): """Test environment-related optional fields""" @@ -998,6 +1143,12 @@ def test_specimen_info_table_to_pmo_with_environment_fields(self): result = specimen_info_table_to_pmo( df, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", env_broad_scale_col="env_broad_scale", env_local_scale_col="env_local_scale", env_medium_col="env_medium", @@ -1032,6 +1183,12 @@ def test_specimen_info_table_to_pmo_with_other_optional_fields(self): result = specimen_info_table_to_pmo( df, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", blood_meal_col="blood_meal", has_travel_out_six_month_col="has_travel_out_six_month", treatment_status_col="treatment_status", @@ -1041,19 +1198,19 @@ def test_specimen_info_table_to_pmo_with_other_optional_fields(self): # sample1: blood_meal has value (True), has_travel_out_six_month is None, treatment_status has value, specimen_accession has value self.assertEqual(result[0]["blood_meal"], True) self.assertNotIn("has_travel_out_six_month", result[0]) - self.assertEqual(result[0]["treatment_status"], "cured") + self.assertEqual(result[0]["treatment_status"], ["cured"]) self.assertEqual(result[0]["specimen_accession"], "ACC001") # sample2: blood_meal is None, has_travel_out_six_month has value (True), treatment_status is empty string, specimen_accession is None self.assertNotIn("blood_meal", result[1]) self.assertEqual(result[1]["has_travel_out_six_month"], True) - self.assertNotIn("treatment_status", result[1]) + self.assertNotIn("treatment_status", [result[1]]) self.assertNotIn("specimen_accession", result[1]) # sample3: blood_meal has value (False), has_travel_out_six_month is empty string, treatment_status is None, specimen_accession has value self.assertEqual(result[2]["blood_meal"], False) self.assertNotIn("has_travel_out_six_month", result[2]) - self.assertNotIn("treatment_status", result[2]) + self.assertNotIn("treatment_status", [result[2]]) self.assertEqual(result[2]["specimen_accession"], "ACC003") def test_library_sample_info_table_to_pmo_default(self): @@ -1066,7 +1223,13 @@ def test_library_sample_info_table_to_pmo_default(self): } ) - result = library_sample_info_table_to_pmo(df) + result = library_sample_info_table_to_pmo( + df, + library_sample_name_col="library_sample_name", + sequencing_info_name_col="sequencing_info_name", + specimen_name_col="specimen_name", + panel_name_col="panel_name", + ) self.assertEqual( [ { @@ -1095,18 +1258,28 @@ def test_library_sample_info_table_to_pmo_with_plate(self): "library_prep_plate_col": [1, 2], "library_prep_plate_name": ["plate1", "plate1"], "library_prep_plate_row": ["A", "B"], + "alternate_identifiers": [ + "positive_control,3D7", + "sample2_MH_run1_repooled", + ], } ) result = library_sample_info_table_to_pmo( df, + library_sample_name_col="library_sample_name", + sequencing_info_name_col="sequencing_info_name", + specimen_name_col="specimen_name", + panel_name_col="panel_name", library_prep_plate_name_col="library_prep_plate_name", library_prep_plate_col_col="library_prep_plate_col", library_prep_plate_row_col="library_prep_plate_row", + alternate_identifiers_col="alternate_identifiers", ) self.assertEqual( [ { + "alternate_identifiers": ["positive_control", "3D7"], "library_sample_name": "sample1_MH_run1", "sequencing_info_name": "run1", "specimen_name": "sample1", @@ -1118,6 +1291,7 @@ def test_library_sample_info_table_to_pmo_with_plate(self): }, }, { + "alternate_identifiers": ["sample2_MH_run1_repooled"], "library_sample_name": "sample2_MH_run1", "sequencing_info_name": "run1", "specimen_name": "sample2", @@ -1145,7 +1319,12 @@ def test_library_sample_info_table_to_pmo_with_additional_columns(self): ) result = library_sample_info_table_to_pmo( - df, additional_library_sample_info_cols=["new_col1", "new_col2"] + df, + library_sample_name_col="library_sample_name", + sequencing_info_name_col="sequencing_info_name", + specimen_name_col="specimen_name", + panel_name_col="panel_name", + additional_library_sample_info_cols=["new_col1", "new_col2"], ) self.assertEqual( [ @@ -1180,7 +1359,13 @@ def test_library_sample_info_table_to_pmo_fails_with_duplicate_cols(self): ) with self.assertRaises(ValueError) as context: - library_sample_info_table_to_pmo(df, specimen_name_col="panel_name") + library_sample_info_table_to_pmo( + df, + library_sample_name_col="library_sample_name", + sequencing_info_name_col="sequencing_info_name", + panel_name_col="panel_name", + specimen_name_col="panel_name", + ) self.assertEqual("Selected columns must be unique.", str(context.exception)) def test_library_sample_info_table_to_pmo_fails_with_missing_cols(self): @@ -1192,7 +1377,13 @@ def test_library_sample_info_table_to_pmo_fails_with_missing_cols(self): ) with self.assertRaises(ValueError) as context: - library_sample_info_table_to_pmo(df) + library_sample_info_table_to_pmo( + df, + library_sample_name_col="library_sample_name", + sequencing_info_name_col="sequencing_info_name", + specimen_name_col="specimen_name", + panel_name_col="panel_name", + ) self.assertEqual( "The following columns are not in the DataFrame: ['specimen_name', 'panel_name']", str(context.exception), @@ -1200,7 +1391,13 @@ def test_library_sample_info_table_to_pmo_fails_with_missing_cols(self): def test_library_sample_info_table_to_pmo_fails_without_df(self): with self.assertRaises(ValueError) as context: - library_sample_info_table_to_pmo("test") + library_sample_info_table_to_pmo( + "test", + library_sample_name_col="library_sample_name", + sequencing_info_name_col="sequencing_info_name", + specimen_name_col="specimen_name", + panel_name_col="panel_name", + ) self.assertEqual("contents must be a pandas DataFrame.", str(context.exception)) def test_library_sample_info_table_to_pmo_fails_with_null_in_required_columns(self): @@ -1215,30 +1412,19 @@ def test_library_sample_info_table_to_pmo_fails_with_null_in_required_columns(se } ) with self.assertRaises(ValueError) as context: - library_sample_info_table_to_pmo(df1) + library_sample_info_table_to_pmo( + df1, + library_sample_name_col="library_sample_name", + sequencing_info_name_col="sequencing_info_name", + specimen_name_col="specimen_name", + panel_name_col="panel_name", + ) self.assertIn( "The following columns contain null values", str(context.exception), ) self.assertIn("library_sample_name", str(context.exception)) - # Test with null in sequencing_info_name - df2 = pd.DataFrame( - { - "library_sample_name": ["sample1_MH_run1", "sample2_MH_run1"], - "sequencing_info_name": [None, "run1"], - "specimen_name": ["sample1", "sample2"], - "panel_name": ["MH", "MH"], - } - ) - with self.assertRaises(ValueError) as context: - library_sample_info_table_to_pmo(df2) - self.assertIn( - "The following columns contain null values", - str(context.exception), - ) - self.assertIn("sequencing_info_name", str(context.exception)) - # Test with null in specimen_name df3 = pd.DataFrame( { @@ -1249,7 +1435,13 @@ def test_library_sample_info_table_to_pmo_fails_with_null_in_required_columns(se } ) with self.assertRaises(ValueError) as context: - library_sample_info_table_to_pmo(df3) + library_sample_info_table_to_pmo( + df3, + library_sample_name_col="library_sample_name", + sequencing_info_name_col="sequencing_info_name", + specimen_name_col="specimen_name", + panel_name_col="panel_name", + ) self.assertIn( "The following columns contain null values", str(context.exception), @@ -1266,7 +1458,13 @@ def test_library_sample_info_table_to_pmo_fails_with_null_in_required_columns(se } ) with self.assertRaises(ValueError) as context: - library_sample_info_table_to_pmo(df4) + library_sample_info_table_to_pmo( + df4, + library_sample_name_col="library_sample_name", + sequencing_info_name_col="sequencing_info_name", + specimen_name_col="specimen_name", + panel_name_col="panel_name", + ) self.assertIn( "The following columns contain null values", str(context.exception), @@ -1277,20 +1475,24 @@ def test_library_sample_info_table_to_pmo_fails_with_null_in_required_columns(se df5 = pd.DataFrame( { "library_sample_name": ["sample1_MH_run1", None], - "sequencing_info_name": [None, "run1"], - "specimen_name": ["sample1", "sample2"], + "specimen_name": [None, "sample2"], "panel_name": ["MH", "MH"], } ) with self.assertRaises(ValueError) as context: - library_sample_info_table_to_pmo(df5) + library_sample_info_table_to_pmo( + df5, + library_sample_name_col="library_sample_name", + specimen_name_col="specimen_name", + panel_name_col="panel_name", + ) self.assertIn( "The following columns contain null values", str(context.exception), ) error_msg = str(context.exception) self.assertTrue( - "library_sample_name" in error_msg and "sequencing_info_name" in error_msg + "library_sample_name" in error_msg and "specimen_name" in error_msg ) def test_library_sample_info_table_to_pmo_with_new_optional_fields(self): @@ -1310,6 +1512,10 @@ def test_library_sample_info_table_to_pmo_with_new_optional_fields(self): result = library_sample_info_table_to_pmo( df, + library_sample_name_col="library_sample_name", + sequencing_info_name_col="sequencing_info_name", + specimen_name_col="specimen_name", + panel_name_col="panel_name", alternate_identifiers_col="alternate_identifiers", experiment_accession_col="experiment_accession", fastqs_loc_col="fastqs_loc", @@ -1318,14 +1524,14 @@ def test_library_sample_info_table_to_pmo_with_new_optional_fields(self): # sample1: alternate_identifiers has value, experiment_accession has value, fastqs_loc is None, run_accession has value # Should remove: fastqs_loc - self.assertEqual(result[0]["alternate_identifiers"], "ID1,ID2") + self.assertEqual(result[0]["alternate_identifiers"], ["ID1", "ID2"]) self.assertEqual(result[0]["experiment_accession"], "EXP001") self.assertNotIn("fastqs_loc", result[0]) self.assertEqual(result[0]["run_accession"], "RUN001") # sample2: alternate_identifiers is empty string, experiment_accession is None, fastqs_loc has value, run_accession is empty string # Should remove: alternate_identifiers, experiment_accession, run_accession - self.assertNotIn("alternate_identifiers", result[1]) + self.assertNotIn("alternate_identifiers", [result[1]]) self.assertNotIn("experiment_accession", result[1]) self.assertEqual(result[1]["fastqs_loc"], "/path/to/fastqs") self.assertNotIn("run_accession", result[1]) @@ -1350,23 +1556,27 @@ def test_library_sample_info_table_to_pmo_removes_empty_optional_fields(self): result = library_sample_info_table_to_pmo( df, + library_sample_name_col="library_sample_name", + sequencing_info_name_col="sequencing_info_name", + specimen_name_col="specimen_name", + panel_name_col="panel_name", alternate_identifiers_col="alternate_identifiers", experiment_accession_col="experiment_accession", fastqs_loc_col="fastqs_loc", ) # sample1: all optional fields have values - self.assertEqual(result[0]["alternate_identifiers"], "ID1") + self.assertEqual(result[0]["alternate_identifiers"], ["ID1"]) self.assertEqual(result[0]["experiment_accession"], "EXP001") self.assertNotIn("fastqs_loc", result[0]) # None should be removed # sample2: alternate_identifiers is empty string, experiment_accession is None, fastqs_loc has value - self.assertNotIn("alternate_identifiers", result[1]) + self.assertNotIn("alternate_identifiers", [result[1]]) self.assertNotIn("experiment_accession", result[1]) self.assertEqual(result[1]["fastqs_loc"], "/path/to/fastqs") # sample3: alternate_identifiers is None, experiment_accession has value, fastqs_loc is empty string - self.assertNotIn("alternate_identifiers", result[2]) + self.assertNotIn("alternate_identifiers", [result[2]]) self.assertEqual(result[2]["experiment_accession"], "EXP003") self.assertNotIn("fastqs_loc", result[2]) @@ -1385,6 +1595,10 @@ def test_library_sample_info_table_to_pmo_with_parasite_density(self): result = library_sample_info_table_to_pmo( df, + library_sample_name_col="library_sample_name", + sequencing_info_name_col="sequencing_info_name", + specimen_name_col="specimen_name", + panel_name_col="panel_name", parasite_density_col="parasite_density", parasite_density_method_col="parasite_density_method", ) @@ -1416,6 +1630,10 @@ def test_library_sample_info_table_to_pmo_with_parasite_density_multiple(self): result = library_sample_info_table_to_pmo( df, + library_sample_name_col="library_sample_name", + sequencing_info_name_col="sequencing_info_name", + specimen_name_col="specimen_name", + panel_name_col="panel_name", parasite_density_col=["density1", "density2"], parasite_density_method_col=["method1", "method2"], ) @@ -1447,6 +1665,10 @@ def test_library_sample_info_table_to_pmo_with_all_new_fields(self): result = library_sample_info_table_to_pmo( df, + library_sample_name_col="library_sample_name", + sequencing_info_name_col="sequencing_info_name", + specimen_name_col="specimen_name", + panel_name_col="panel_name", alternate_identifiers_col="alternate_identifiers", experiment_accession_col="experiment_accession", fastqs_loc_col="fastqs_loc", @@ -1459,7 +1681,7 @@ def test_library_sample_info_table_to_pmo_with_all_new_fields(self): ) # Check all fields are present - self.assertEqual(result[0]["alternate_identifiers"], "ID1") + self.assertEqual(result[0]["alternate_identifiers"], ["ID1"]) self.assertEqual(result[0]["experiment_accession"], "EXP001") self.assertEqual(result[0]["fastqs_loc"], "/path/to/fastqs1") self.assertEqual(result[0]["run_accession"], "RUN001") @@ -1467,7 +1689,7 @@ def test_library_sample_info_table_to_pmo_with_all_new_fields(self): self.assertIn("library_prep_plate_info", result[0]) self.assertEqual(result[0]["library_prep_plate_info"]["plate_col"], 1) - self.assertEqual(result[1]["alternate_identifiers"], "ID2") + self.assertEqual(result[1]["alternate_identifiers"], ["ID2"]) self.assertEqual(result[1]["experiment_accession"], "EXP002") self.assertEqual(result[1]["fastqs_loc"], "/path/to/fastqs2") self.assertEqual(result[1]["run_accession"], "RUN002") diff --git a/tests/test_pmo_builder/test_mhap_table_to_pmo.py b/tests/test_pmo_builder/test_mhap_table_to_pmo.py index 671eebf..fad711b 100644 --- a/tests/test_pmo_builder/test_mhap_table_to_pmo.py +++ b/tests/test_pmo_builder/test_mhap_table_to_pmo.py @@ -10,6 +10,7 @@ create_detected_microhaplotype_dict, get_target_id_in_representative_mhaps, get_mhap_index_in_representative_mhaps, + create_minimum_library_specimen_dict_from_mhap_table, ) @@ -155,6 +156,22 @@ def setUp(self): "run3", ], } + self.small_detected_dict_for_sample_testing = { + "detected_microhaplotypes": [ + { + "library_samples": [ + {"library_sample_name": "pop1_samp_0", "target_results": []}, + {"library_sample_name": "pop1_samp_1", "target_results": []}, + ] + }, + { + "library_samples": [ + {"library_sample_name": "pop2_samp_0", "target_results": []}, + {"library_sample_name": "pop2_samp_1", "target_results": []}, + ] + }, + ] + } self.small_mhap_table = pd.DataFrame(data=small_mhap_data) self.small_df_mhaps_target_id_values = [0, 1, 2, 0, 1, 1, 2, 0, 1, 0, 0, 0, 2] self.small_df_mhap_id_values = [0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 2, 0] @@ -792,6 +809,495 @@ def test_mhap_table_to_pmo_multi_bioinf_run_name( }, ) + # tests for create_minimum_library_specimen_dict_from_mhap_table + def test_create_minimum_library_specimen_no_specimen_key_specimen_name_equals_library_sample_name( + self, + ): + result = create_minimum_library_specimen_dict_from_mhap_table( + self.small_detected_dict_for_sample_testing["detected_microhaplotypes"], + panel_name="panel_A", + ) + for entry in result["library_sample_info"]: + self.assertEqual(entry["specimen_name"], entry["library_sample_name"]) + + def test_create_minimum_library_specimen_no_specimen_key_correct_library_sample_names( + self, + ): + result = create_minimum_library_specimen_dict_from_mhap_table( + self.small_detected_dict_for_sample_testing["detected_microhaplotypes"], + panel_name="panel_A", + ) + names = [e["library_sample_name"] for e in result["library_sample_info"]] + self.assertListEqual( + names, ["pop1_samp_0", "pop1_samp_1", "pop2_samp_0", "pop2_samp_1"] + ) + + def test_create_minimum_library_specimen_no_specimen_key_output_keys(self): + result = create_minimum_library_specimen_dict_from_mhap_table( + self.small_detected_dict_for_sample_testing["detected_microhaplotypes"], + panel_name="panel_A", + ) + self.assertEqual(set(result.keys()), {"library_sample_info", "specimen_info"}) + for entry in result["library_sample_info"]: + self.assertEqual( + set(entry.keys()), + {"library_sample_name", "panel_name", "specimen_name"}, + ) + for entry in result["specimen_info"]: + self.assertEqual(set(entry.keys()), {"specimen_name"}) + + def test_create_minimum_library_specimen_no_specimen_key_specimen_info_unique(self): + result = create_minimum_library_specimen_dict_from_mhap_table( + self.small_detected_dict_for_sample_testing["detected_microhaplotypes"], + panel_name="panel_A", + ) + specimen_names = [e["specimen_name"] for e in result["specimen_info"]] + self.assertEqual(len(specimen_names), len(set(specimen_names))) + + # create_minimum_library_specimen_dict_from_mhap_table testing with library_sample_specimen_key + def test_create_minimum_library_specimen_with_specimen_key_maps_correctly(self): + key_map = { + "pop1_samp_0": "specimen_X", + "pop1_samp_1": "specimen_X", + "pop2_samp_0": "specimen_Y", + "pop2_samp_1": "specimen_Z", + } + result = create_minimum_library_specimen_dict_from_mhap_table( + self.small_detected_dict_for_sample_testing["detected_microhaplotypes"], + panel_name="panel_A", + library_sample_specimen_key=key_map, + ) + name_to_specimen = { + e["library_sample_name"]: e["specimen_name"] + for e in result["library_sample_info"] + } + self.assertEqual(name_to_specimen["pop1_samp_0"], "specimen_X") + self.assertEqual(name_to_specimen["pop1_samp_1"], "specimen_X") + self.assertEqual(name_to_specimen["pop2_samp_0"], "specimen_Y") + self.assertEqual(name_to_specimen["pop2_samp_1"], "specimen_Z") + + def test_create_minimum_library_specimen_multiple_library_samples_collapse_to_one_specimen( + self, + ): + # Two library samples mapping to the same specimen create only one specimen_info entry + key_map = { + "pop1_samp_0": "specimen_X", + "pop1_samp_1": "specimen_X", + "pop2_samp_0": "specimen_Y", + "pop2_samp_1": "specimen_Z", + } + result = create_minimum_library_specimen_dict_from_mhap_table( + self.small_detected_dict_for_sample_testing["detected_microhaplotypes"], + panel_name="panel_A", + library_sample_specimen_key=key_map, + ) + specimen_names = [e["specimen_name"] for e in result["specimen_info"]] + self.assertListEqual( + sorted(specimen_names), ["specimen_X", "specimen_Y", "specimen_Z"] + ) + self.assertEqual(len(specimen_names), len(set(specimen_names))) + + # using create_minimum_library_specimen_dict_from_mhap_table with a library_sample_key + + def test_create_minimum_library_specimen_custom_library_sample_key(self): + detected = [ + { + "library_samples": [ + {"custom_key": "samp_A", "target_results": []}, + {"custom_key": "samp_B", "target_results": []}, + ] + } + ] + result = create_minimum_library_specimen_dict_from_mhap_table( + detected, panel_name="panel_A", library_sample_field_name="custom_key" + ) + names = [e["library_sample_name"] for e in result["library_sample_info"]] + self.assertListEqual(names, ["samp_A", "samp_B"]) + + def test_create_minimum_library_specimen_custom_key_output_uses_canonical_key_name( + self, + ): + # Regardless of the input key name, output always uses 'library_sample_name' + detected = [ + {"library_samples": [{"custom_key": "samp_A", "target_results": []}]} + ] + result = create_minimum_library_specimen_dict_from_mhap_table( + detected, panel_name="panel_A", library_sample_field_name="custom_key" + ) + self.assertIn("library_sample_name", result["library_sample_info"][0]) + self.assertNotIn("custom_key", result["library_sample_info"][0]) + + # testing create_minimum_library_specimen_dict_from_mhap_table, test that missing_library_sample_becomes_specimen_name raises + + def test_create_minimum_library_specimen_missing_specimen_key_entry_raises_by_default( + self, + ): + # If a library_sample_name is absent from the key map and flag is False, raise KeyError + partial_key_map = {"pop1_samp_0": "specimen_X"} + with self.assertRaises(KeyError) as context: + create_minimum_library_specimen_dict_from_mhap_table( + self.small_detected_dict_for_sample_testing["detected_microhaplotypes"], + panel_name="panel_A", + library_sample_specimen_key=partial_key_map, + missing_library_sample_becomes_specimen_name=False, + ) + self.assertIn("pop1_samp_1", str(context.exception)) + + def test_create_minimum_library_specimen_missing_specimen_key_falls_back_when_flag_true( + self, + ): + # Missing entries fall back to library_sample_name as specimen_name when flag is True + partial_key_map = {"pop1_samp_0": "specimen_X"} + result = create_minimum_library_specimen_dict_from_mhap_table( + self.small_detected_dict_for_sample_testing["detected_microhaplotypes"], + panel_name="panel_A", + library_sample_specimen_key=partial_key_map, + missing_library_sample_becomes_specimen_name=True, + ) + name_to_specimen = { + e["library_sample_name"]: e["specimen_name"] + for e in result["library_sample_info"] + } + self.assertEqual(name_to_specimen["pop1_samp_0"], "specimen_X") + self.assertEqual(name_to_specimen["pop1_samp_1"], "pop1_samp_1") + self.assertEqual(name_to_specimen["pop2_samp_0"], "pop2_samp_0") + self.assertEqual(name_to_specimen["pop2_samp_1"], "pop2_samp_1") + + # create_minimum_library_specimen_dict_from_mhap_table, testing raising for expected errors for + def test_create_minimum_library_specimen_missing_library_sample_field_name_raises( + self, + ): + detected = [ + { + "library_samples": [ + {"library_sample_name": "samp_A", "target_results": []}, + {"WRONG_KEY": "samp_B", "target_results": []}, + ] + } + ] + with self.assertRaises(KeyError): + create_minimum_library_specimen_dict_from_mhap_table( + detected, panel_name="panel_A" + ) + + def test_create_minimum_library_specimen_all_missing_library_sample_field_names_raise( + self, + ): + detected = [ + {"library_samples": [{"WRONG_KEY": "samp_A"}, {"WRONG_KEY": "samp_B"}]} + ] + with self.assertRaises(KeyError): + create_minimum_library_specimen_dict_from_mhap_table( + detected, panel_name="panel_A" + ) + + # testing create_minimum_library_specimen_dict_from_mhap_table for failing duplicate library_sample_names + + def test_create_minimum_library_specimen_duplicate_names_raises(self): + detected = [ + { + "library_samples": [ + {"library_sample_name": "samp_A", "target_results": []}, + {"library_sample_name": "samp_A", "target_results": []}, + ] + } + ] + with self.assertRaises(ValueError) as context: + create_minimum_library_specimen_dict_from_mhap_table( + detected, panel_name="panel_A" + ) + self.assertIn("samp_A", str(context.exception)) + + def test_create_minimum_library_specimen_duplicate_names_across_entries_raises( + self, + ): + """Duplicates that span separate list entries should also be caught.""" + detected = [ + { + "library_samples": [ + {"library_sample_name": "samp_A", "target_results": []} + ] + }, + { + "library_samples": [ + {"library_sample_name": "samp_A", "target_results": []} + ] + }, + ] + with self.assertRaises(ValueError) as context: + create_minimum_library_specimen_dict_from_mhap_table( + detected, panel_name="panel_A" + ) + self.assertIn("samp_A", str(context.exception)) + + # testing create_minimum_library_specimen_dict_from_mhap_table - various edge cases + + def test_create_minimum_library_specimen_empty_detected_microhaps(self): + result = create_minimum_library_specimen_dict_from_mhap_table( + [], panel_name="panel_A" + ) + self.assertDictEqual(result, {"library_sample_info": [], "specimen_info": []}) + + def test_create_minimum_library_specimen_single_sample(self): + detected = [ + { + "library_samples": [ + {"library_sample_name": "only_samp", "target_results": []} + ] + } + ] + result = create_minimum_library_specimen_dict_from_mhap_table( + detected, panel_name="panel_A" + ) + self.assertEqual(len(result["library_sample_info"]), 1) + self.assertEqual(len(result["specimen_info"]), 1) + self.assertEqual(result["library_sample_info"][0]["specimen_name"], "only_samp") + + def test_create_minimum_library_specimen_specimen_info_preserves_insertion_order( + self, + ): + # specimen_info order should match first-seen order of specimen_names + key_map = { + "pop1_samp_0": "specimen_Z", + "pop1_samp_1": "specimen_A", + "pop2_samp_0": "specimen_M", + "pop2_samp_1": "specimen_Z", # already seen; should not re-appear + } + result = create_minimum_library_specimen_dict_from_mhap_table( + self.small_detected_dict_for_sample_testing["detected_microhaplotypes"], + panel_name="panel_A", + library_sample_specimen_key=key_map, + ) + specimen_names = [e["specimen_name"] for e in result["specimen_info"]] + self.assertListEqual(specimen_names, ["specimen_Z", "specimen_A", "specimen_M"]) + + # library_sample_specimen_key as DataFrame + + def test_create_minimum_library_specimen_dataframe_key_maps_correctly(self): + key_df = pd.DataFrame( + { + "library_sample_name": [ + "pop1_samp_0", + "pop1_samp_1", + "pop2_samp_0", + "pop2_samp_1", + ], + "specimen_name": [ + "specimen_X", + "specimen_X", + "specimen_Y", + "specimen_Z", + ], + } + ) + result = create_minimum_library_specimen_dict_from_mhap_table( + self.small_detected_dict_for_sample_testing["detected_microhaplotypes"], + panel_name="panel_A", + library_sample_specimen_key=key_df, + ) + name_to_specimen = { + e["library_sample_name"]: e["specimen_name"] + for e in result["library_sample_info"] + } + self.assertEqual(name_to_specimen["pop1_samp_0"], "specimen_X") + self.assertEqual(name_to_specimen["pop1_samp_1"], "specimen_X") + self.assertEqual(name_to_specimen["pop2_samp_0"], "specimen_Y") + self.assertEqual(name_to_specimen["pop2_samp_1"], "specimen_Z") + + def test_create_minimum_library_specimen_dataframe_key_collapses_specimen_info( + self, + ): + """Two library samples mapping to same specimen -> only one specimen_info entry.""" + key_df = pd.DataFrame( + { + "library_sample_name": [ + "pop1_samp_0", + "pop1_samp_1", + "pop2_samp_0", + "pop2_samp_1", + ], + "specimen_name": [ + "specimen_X", + "specimen_X", + "specimen_Y", + "specimen_Z", + ], + } + ) + result = create_minimum_library_specimen_dict_from_mhap_table( + self.small_detected_dict_for_sample_testing["detected_microhaplotypes"], + panel_name="panel_A", + library_sample_specimen_key=key_df, + ) + specimen_names = [e["specimen_name"] for e in result["specimen_info"]] + self.assertListEqual( + sorted(specimen_names), ["specimen_X", "specimen_Y", "specimen_Z"] + ) + self.assertEqual(len(specimen_names), len(set(specimen_names))) + + def test_create_minimum_library_specimen_dataframe_key_custom_col_names(self): + """DataFrame with non-default column names, using library_sample_name_col and specimen_name_col.""" + key_df = pd.DataFrame( + { + "lib_samp": [ + "pop1_samp_0", + "pop1_samp_1", + "pop2_samp_0", + "pop2_samp_1", + ], + "spec": ["specimen_X", "specimen_Y", "specimen_Y", "specimen_Z"], + } + ) + result = create_minimum_library_specimen_dict_from_mhap_table( + self.small_detected_dict_for_sample_testing["detected_microhaplotypes"], + panel_name="panel_A", + library_sample_specimen_key=key_df, + library_sample_name_col="lib_samp", + specimen_name_col="spec", + ) + name_to_specimen = { + e["library_sample_name"]: e["specimen_name"] + for e in result["library_sample_info"] + } + self.assertEqual(name_to_specimen["pop1_samp_0"], "specimen_X") + self.assertEqual(name_to_specimen["pop1_samp_1"], "specimen_Y") + self.assertEqual(name_to_specimen["pop2_samp_0"], "specimen_Y") + self.assertEqual(name_to_specimen["pop2_samp_1"], "specimen_Z") + + def test_create_minimum_library_specimen_dataframe_key_output_keys(self): + """Output structure is unchanged when a DataFrame key is provided.""" + key_df = pd.DataFrame( + { + "library_sample_name": [ + "pop1_samp_0", + "pop1_samp_1", + "pop2_samp_0", + "pop2_samp_1", + ], + "specimen_name": [ + "specimen_A", + "specimen_B", + "specimen_C", + "specimen_D", + ], + } + ) + result = create_minimum_library_specimen_dict_from_mhap_table( + self.small_detected_dict_for_sample_testing["detected_microhaplotypes"], + panel_name="panel_A", + library_sample_specimen_key=key_df, + ) + self.assertEqual(set(result.keys()), {"library_sample_info", "specimen_info"}) + for entry in result["library_sample_info"]: + self.assertEqual( + set(entry.keys()), + {"library_sample_name", "panel_name", "specimen_name"}, + ) + for entry in result["specimen_info"]: + self.assertEqual(set(entry.keys()), {"specimen_name"}) + + def test_create_minimum_library_specimen_dataframe_key_does_not_mutate_dataframe( + self, + ): + """The input DataFrame should not be modified (e.g. no set_index side-effects on original).""" + key_df = pd.DataFrame( + { + "library_sample_name": [ + "pop1_samp_0", + "pop1_samp_1", + "pop2_samp_0", + "pop2_samp_1", + ], + "specimen_name": [ + "specimen_X", + "specimen_X", + "specimen_Y", + "specimen_Z", + ], + } + ) + original_columns = key_df.columns.tolist() + original_index = key_df.index.tolist() + create_minimum_library_specimen_dict_from_mhap_table( + self.small_detected_dict_for_sample_testing["detected_microhaplotypes"], + panel_name="panel_A", + library_sample_specimen_key=key_df, + ) + self.assertListEqual(key_df.columns.tolist(), original_columns) + self.assertListEqual(key_df.index.tolist(), original_index) + + # --- Happy path: partial DataFrame key with fallback --- + + def test_create_minimum_library_specimen_dataframe_partial_key_falls_back_when_flag_true( + self, + ): + """Library samples absent from the DataFrame fall back to library_sample_name when flag is True.""" + key_df = pd.DataFrame( + { + "library_sample_name": ["pop1_samp_0"], + "specimen_name": ["specimen_X"], + } + ) + result = create_minimum_library_specimen_dict_from_mhap_table( + self.small_detected_dict_for_sample_testing["detected_microhaplotypes"], + panel_name="panel_A", + library_sample_specimen_key=key_df, + missing_library_sample_becomes_specimen_name=True, + ) + name_to_specimen = { + e["library_sample_name"]: e["specimen_name"] + for e in result["library_sample_info"] + } + self.assertEqual(name_to_specimen["pop1_samp_0"], "specimen_X") + self.assertEqual(name_to_specimen["pop1_samp_1"], "pop1_samp_1") + self.assertEqual(name_to_specimen["pop2_samp_0"], "pop2_samp_0") + self.assertEqual(name_to_specimen["pop2_samp_1"], "pop2_samp_1") + + def test_create_minimum_library_specimen_dataframe_partial_key_raises_when_flag_false( + self, + ): + """Library samples absent from the DataFrame raise KeyError when flag is False.""" + key_df = pd.DataFrame( + { + "library_sample_name": ["pop1_samp_0"], + "specimen_name": ["specimen_X"], + } + ) + with self.assertRaises(KeyError) as context: + create_minimum_library_specimen_dict_from_mhap_table( + self.small_detected_dict_for_sample_testing["detected_microhaplotypes"], + panel_name="panel_A", + library_sample_specimen_key=key_df, + missing_library_sample_becomes_specimen_name=False, + ) + self.assertIn("pop1_samp_1", str(context.exception)) + + def test_create_minimum_library_specimen_dataframe_and_dict_key_equivalent(self): + """Passing a DataFrame and an equivalent dict should produce identical output.""" + key_dict = { + "pop1_samp_0": "specimen_X", + "pop1_samp_1": "specimen_Y", + "pop2_samp_0": "specimen_Y", + "pop2_samp_1": "specimen_Z", + } + key_df = pd.DataFrame( + { + "library_sample_name": list(key_dict.keys()), + "specimen_name": list(key_dict.values()), + } + ) + result_dict = create_minimum_library_specimen_dict_from_mhap_table( + self.small_detected_dict_for_sample_testing["detected_microhaplotypes"], + panel_name="panel_A", + library_sample_specimen_key=key_dict, + ) + result_df = create_minimum_library_specimen_dict_from_mhap_table( + self.small_detected_dict_for_sample_testing["detected_microhaplotypes"], + panel_name="panel_A", + library_sample_specimen_key=key_df, + ) + self.assertDictEqual(result_dict, result_df) + if __name__ == "__main__": unittest.main() diff --git a/tests/test_pmo_builder/test_panel_information_to_pmo.py b/tests/test_pmo_builder/test_panel_information_to_pmo.py index 13a85fe..29158a3 100644 --- a/tests/test_pmo_builder/test_panel_information_to_pmo.py +++ b/tests/test_pmo_builder/test_panel_information_to_pmo.py @@ -45,7 +45,6 @@ def setUp(self): self.min_builder = PMOPanelBuilder( self.min_target_table, "test_panel", - self.genome_info, "target_name", "fwd_primer", "rev_primer", @@ -60,7 +59,6 @@ def setUp(self): self.builder_with_locations = PMOPanelBuilder( min_target_table_with_locations, "test_panel", - self.genome_info, "target_name", "fwd_primer", "rev_primer", @@ -83,7 +81,6 @@ def setUp(self): self.builder_with_missing_locations = PMOPanelBuilder( min_target_table_with_locations_missing, "test_panel", - self.genome_info, "target_name", "fwd_primer", "rev_primer", @@ -96,10 +93,15 @@ def setUp(self): chrom_col="chrom", ) - def test_check_targets_are_unique_passes(self): - self.min_builder.check_targets_are_unique() + def test_check_target_names_are_unique_passes(self): + self.min_builder.check_unique_target_info( + [ + self.min_builder.forward_primers_seq_col, + self.min_builder.reverse_primers_seq_col, + ] + ) - def test_check_targets_are_unique_fails(self): + def test_check_target_names_are_unique_fails(self): new_row = pd.DataFrame( {"target_name": ["target1"], "fwd_primer": ["TTT"], "rev_primer": ["GGG"]} ) @@ -107,14 +109,13 @@ def test_check_targets_are_unique_fails(self): builder = PMOPanelBuilder( duplicate_target_table, "test_panel", - self.genome_info, "target_name", "fwd_primer", "rev_primer", ) with self.assertRaises(ValueError) as context: - builder.check_targets_are_unique() + builder.check_target_names_are_unique() self.assertEqual( str(context.exception), "The following target_ids are duplicated: ['target1']", @@ -131,7 +132,6 @@ def test_check_unique_target_info_fails(self): builder = PMOPanelBuilder( duplicate_target_primers_table, "test_panel", - self.genome_info, "target_name", "fwd_primer", "rev_primer", @@ -217,11 +217,11 @@ def test_check_genome_info_fails_with_list_containing_invalid_dict(self): ) self.assertIn("genome_info[1] missing required keys", str(context.exception)) - def test_build_panel_info(self): - panel_info = self.min_builder.build_panel_info(self.min_target_json) + def test_build_panel_info_dict(self): + panel_info = self.min_builder.build_panel_info_dict(self.min_target_json) expected_panel_info = { "panel_name": "test_panel", - "reactions": [{"reaction_name": "1", "panel_targets": [0, 1, 2]}], + "reactions": [{"reaction_name": "full", "panel_targets": [0, 1, 2]}], } self.assertEqual(panel_info, expected_panel_info) @@ -341,7 +341,7 @@ def test_merge_panel_info_dicts_with_overlap(self): self.assertEqual(merged, expected_merged) - def test_build_panel_info_multi_reaction(self): + def test_build_panel_info_dict_multi_reaction(self): target_table_with_reactions = self.min_target_table target_table_with_reactions["reaction"] = [ "reaction1", @@ -351,13 +351,12 @@ def test_build_panel_info_multi_reaction(self): builder = PMOPanelBuilder( target_table_with_reactions, "test_panel", - self.genome_info, "target_name", "fwd_primer", "rev_primer", reaction_name_col="reaction", ) - panel_info = builder.build_panel_info(self.min_target_json) + panel_info = builder.build_panel_info_dict(self.min_target_json) expected_panel_info = { "panel_name": "test_panel", "reactions": [ @@ -368,7 +367,7 @@ def test_build_panel_info_multi_reaction(self): self.assertEqual(panel_info, expected_panel_info) @patch( - "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_targets_are_unique" + "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_target_names_are_unique" ) @patch( "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_unique_target_info" @@ -376,18 +375,18 @@ def test_build_panel_info_multi_reaction(self): @patch( "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.summarise_targets_missing_optional_info" ) - def test_create_targets_dict_min_info( + def test_build_target_info_dict_min_info( self, mock_summarise_targets_missing_optional_info, mock_check_unique_target_info, - mock_check_targets_are_unique, + mock_check_target_names_are_unique, ): mock_summarise_targets_missing_optional_info.return_value = [], [], [] - target_info = self.min_builder.create_targets_dict() + target_info = self.min_builder.build_target_info_dict() self.assertEqual(self.min_target_json, target_info) @patch( - "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_targets_are_unique" + "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_target_names_are_unique" ) @patch( "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_unique_target_info" @@ -395,14 +394,14 @@ def test_create_targets_dict_min_info( @patch( "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.summarise_targets_missing_optional_info" ) - def test_create_targets_dict_full_info( + def test_build_target_info_dict_full_info( self, mock_summarise_targets_missing_optional_info, mock_check_unique_target_info, - mock_check_targets_are_unique, + mock_check_target_names_are_unique, ): mock_summarise_targets_missing_optional_info.return_value = [], [], [] - target_info = self.builder_with_locations.create_targets_dict() + target_info = self.builder_with_locations.build_target_info_dict() expected_json = [ { "target_name": "target1", @@ -489,7 +488,7 @@ def test_create_targets_dict_full_info( self.assertEqual(expected_json, target_info) @patch( - "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_targets_are_unique" + "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_target_names_are_unique" ) @patch( "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_unique_target_info" @@ -497,11 +496,11 @@ def test_create_targets_dict_full_info( @patch( "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.summarise_targets_missing_optional_info" ) - def test_create_targets_dict_missing_info( + def test_build_target_info_dict_missing_info( self, mock_summarise_targets_missing_optional_info, mock_check_unique_target_info, - mock_check_targets_are_unique, + mock_check_target_names_are_unique, ): missing_insert_loc = ["target2", "target3"] missing_fwd_primer_loc = ["target2", "target3"] @@ -512,7 +511,7 @@ def test_create_targets_dict_missing_info( missing_fwd_primer_loc, missing_rev_primer_loc, ) - target_info = self.builder_with_locations.create_targets_dict() + target_info = self.builder_with_locations.build_target_info_dict() expected_json = [ { "target_name": "target1", @@ -547,7 +546,7 @@ def test_create_targets_dict_missing_info( self.assertEqual(expected_json, target_info) @patch( - "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_targets_are_unique" + "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_target_names_are_unique" ) @patch( "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_unique_target_info" @@ -555,11 +554,11 @@ def test_create_targets_dict_missing_info( @patch( "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.summarise_targets_missing_optional_info" ) - def test_create_targets_dict_additional_info( + def test_build_target_info_dict_additional_info( self, mock_summarise_targets_missing_optional_info, mock_check_unique_target_info, - mock_check_targets_are_unique, + mock_check_target_names_are_unique, ): target_table = self.min_target_table.copy() target_table["extra_col"] = "my target description" @@ -567,11 +566,10 @@ def test_create_targets_dict_additional_info( builder = PMOPanelBuilder( target_table, "test_panel", - self.genome_info, additional_target_info_cols=["extra_col", "special_col"], ) mock_summarise_targets_missing_optional_info.return_value = [], [], [] - target_info = builder.create_targets_dict() + target_info = builder.build_target_info_dict() expected_json = [ { "target_name": "target1", @@ -598,7 +596,7 @@ def test_create_targets_dict_additional_info( self.assertEqual(expected_json, target_info) @patch( - "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_targets_are_unique" + "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_target_names_are_unique" ) @patch( "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_unique_target_info" @@ -610,7 +608,7 @@ def test_panel_info_table_to_pmo_with_dict_genome_info( self, mock_summarise_targets_missing_optional_info, mock_check_unique_target_info, - mock_check_targets_are_unique, + mock_check_target_names_are_unique, ): """Test panel_info_table_to_pmo with dict genome_info (should be converted to list)""" mock_summarise_targets_missing_optional_info.return_value = [], [], [] @@ -626,7 +624,7 @@ def test_panel_info_table_to_pmo_with_dict_genome_info( self.assertIn("target_info", result) @patch( - "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_targets_are_unique" + "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_target_names_are_unique" ) @patch( "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_unique_target_info" @@ -638,7 +636,7 @@ def test_panel_info_table_to_pmo_with_list_genome_info( self, mock_summarise_targets_missing_optional_info, mock_check_unique_target_info, - mock_check_targets_are_unique, + mock_check_target_names_are_unique, ): """Test panel_info_table_to_pmo with list genome_info""" mock_summarise_targets_missing_optional_info.return_value = [], [], [] @@ -668,7 +666,7 @@ def test_panel_info_table_to_pmo_with_list_genome_info( self.assertIn("target_info", result) @patch( - "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_targets_are_unique" + "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_target_names_are_unique" ) @patch( "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_unique_target_info" @@ -676,13 +674,13 @@ def test_panel_info_table_to_pmo_with_list_genome_info( @patch( "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.summarise_targets_missing_optional_info" ) - def test_create_targets_dict_with_genome_id_col( + def test_build_target_info_dict_with_genome_id_col( self, mock_summarise_targets_missing_optional_info, mock_check_unique_target_info, - mock_check_targets_are_unique, + mock_check_target_names_are_unique, ): - """Test create_targets_dict with genome_id_col parameter""" + """Test build_target_info_dict with genome_id_col parameter""" mock_summarise_targets_missing_optional_info.return_value = [], [], [] target_table = self.min_target_table.copy() target_table["target_start"] = [1, 2, 3] @@ -699,7 +697,6 @@ def test_create_targets_dict_with_genome_id_col( builder = PMOPanelBuilder( target_table, "test_panel", - self.genome_info, "target_name", "fwd_primer", "rev_primer", @@ -712,7 +709,7 @@ def test_create_targets_dict_with_genome_id_col( chrom_col="chrom", ) - target_info = builder.create_targets_dict(genome_id_col="genome_id") + target_info = builder.build_target_info_dict(genome_id_col="genome_id") # Check that genome_id values come from the column self.assertEqual(target_info[0]["insert_location"]["genome_id"], 0) @@ -728,7 +725,7 @@ def test_create_targets_dict_with_genome_id_col( self.assertEqual(target_info[2]["reverse_primer"]["location"]["genome_id"], 0) @patch( - "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_targets_are_unique" + "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_target_names_are_unique" ) @patch( "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_unique_target_info" @@ -736,13 +733,13 @@ def test_create_targets_dict_with_genome_id_col( @patch( "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.summarise_targets_missing_optional_info" ) - def test_create_targets_dict_without_genome_id_col( + def test_build_target_info_dict_without_genome_id_col( self, mock_summarise_targets_missing_optional_info, mock_check_unique_target_info, - mock_check_targets_are_unique, + mock_check_target_names_are_unique, ): - """Test create_targets_dict without genome_id_col (should default to 0)""" + """Test build_target_info_dict without genome_id_col (should default to 0)""" mock_summarise_targets_missing_optional_info.return_value = [], [], [] target_table = self.min_target_table.copy() target_table["target_start"] = [1, 2, 3] @@ -754,7 +751,6 @@ def test_create_targets_dict_without_genome_id_col( builder = PMOPanelBuilder( target_table, "test_panel", - self.genome_info, "target_name", "fwd_primer", "rev_primer", @@ -767,7 +763,7 @@ def test_create_targets_dict_without_genome_id_col( chrom_col="chrom", ) - target_info = builder.create_targets_dict() + target_info = builder.build_target_info_dict() # Check that genome_id defaults to 0 when genome_id_col is not provided for target in target_info: @@ -776,7 +772,7 @@ def test_create_targets_dict_without_genome_id_col( self.assertEqual(target["reverse_primer"]["location"]["genome_id"], 0) @patch( - "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_targets_are_unique" + "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_target_names_are_unique" ) @patch( "pmotools.pmo_builder.panel_information_to_pmo.PMOPanelBuilder.check_unique_target_info" @@ -788,7 +784,7 @@ def test_panel_info_table_to_pmo_with_genome_id_col( self, mock_summarise_targets_missing_optional_info, mock_check_unique_target_info, - mock_check_targets_are_unique, + mock_check_target_names_are_unique, ): """Test panel_info_table_to_pmo with genome_id_col parameter""" mock_summarise_targets_missing_optional_info.return_value = [], [], [] @@ -803,7 +799,7 @@ def test_panel_info_table_to_pmo_with_genome_id_col( result = panel_info_table_to_pmo( target_table, "test_panel", - self.genome_info, + genome_info=self.genome_info, forward_primers_start_col="target_start", forward_primers_end_col="insert_start", reverse_primers_start_col="insert_end", diff --git a/tests/test_pmo_builder/test_pmo_updater.py b/tests/test_pmo_builder/test_pmo_updater.py index e707187..930fa28 100755 --- a/tests/test_pmo_builder/test_pmo_updater.py +++ b/tests/test_pmo_builder/test_pmo_updater.py @@ -10,13 +10,50 @@ class TestPMOUpdater(unittest.TestCase): def setUp(self): self.working_dir = os.path.dirname(os.path.abspath(__file__)) + self.specimen_main_list = [ + {"specimen_name": "specimen_001"}, + {"specimen_name": "specimen_002"}, + {"specimen_name": "specimen_003"}, + {"specimen_name": "specimen_004"}, + {"specimen_name": "specimen_005"}, + ] + self.specimen_update_list = [ + { + "specimen_name": "specimen_001", + "collection_date": "2024-03-15", + "collection_country": "Uganda", + }, + { + "specimen_name": "specimen_002", + "collection_date": "2024-07-22", + "collection_country": "Kenya", + }, + { + "specimen_name": "specimen_003", + "collection_date": "2025-01-08", + "collection_country": "Ethiopia", + }, + { + "specimen_name": "specimen_004", + "collection_date": "2024-11-30", + "collection_country": "Uganda", + }, + { + "specimen_name": "specimen_005", + "collection_date": "2025-02-14", + "collection_country": "Kenya", + }, + ] + def test_check_if_date_yyyy_mm_or_yyyy_mm_dd(self): - self.assertFalse(PMOUpdater.check_if_date_yyyy_mm_or_yyyy_mm_dd("2023/11/24")) - self.assertFalse(PMOUpdater.check_if_date_yyyy_mm_or_yyyy_mm_dd("11-24-2023")) - self.assertFalse(PMOUpdater.check_if_date_yyyy_mm_or_yyyy_mm_dd("invalid-date")) + self.assertFalse(PMOUpdater._check_if_date_yyyy_mm_or_yyyy_mm_dd("2023/11/24")) + self.assertFalse(PMOUpdater._check_if_date_yyyy_mm_or_yyyy_mm_dd("11-24-2023")) + self.assertFalse( + PMOUpdater._check_if_date_yyyy_mm_or_yyyy_mm_dd("invalid-date") + ) - self.assertTrue(PMOUpdater.check_if_date_yyyy_mm_or_yyyy_mm_dd("2023-11-24")) - self.assertTrue(PMOUpdater.check_if_date_yyyy_mm_or_yyyy_mm_dd("2023-11")) + self.assertTrue(PMOUpdater._check_if_date_yyyy_mm_or_yyyy_mm_dd("2023-11-24")) + self.assertTrue(PMOUpdater._check_if_date_yyyy_mm_or_yyyy_mm_dd("2023-11")) def test_update_specimen_meta_with_traveler_info(self): test_pmo = { @@ -223,6 +260,234 @@ def test_update_specimen_meta_with_traveler_info_with_optional_replace_old(self) } self.assertEqual(test_out_pmo, test_pmo) + # PMOUpdater.merge_dicts_by_key + def test_merge_dicts_by_key_correct_fields_added(self): + result = PMOUpdater.merge_dicts_by_key( + self.specimen_main_list, + self.specimen_update_list, + key_field="specimen_name", + ) + result_map = {r["specimen_name"]: r for r in result} + self.assertEqual(result_map["specimen_001"]["collection_date"], "2024-03-15") + self.assertEqual(result_map["specimen_001"]["collection_country"], "Uganda") + self.assertEqual(result_map["specimen_002"]["collection_date"], "2024-07-22") + self.assertEqual(result_map["specimen_002"]["collection_country"], "Kenya") + self.assertEqual(result_map["specimen_003"]["collection_date"], "2025-01-08") + self.assertEqual(result_map["specimen_003"]["collection_country"], "Ethiopia") + + def test_merge_dicts_by_key_all_specimens_present_in_result(self): + result = PMOUpdater.merge_dicts_by_key( + self.specimen_main_list, + self.specimen_update_list, + key_field="specimen_name", + ) + result_names = {r["specimen_name"] for r in result} + expected_names = {r["specimen_name"] for r in self.specimen_main_list} + self.assertEqual(result_names, expected_names) + + def test_merge_dicts_by_key_does_not_mutate_main_list(self): + import copy + + main_copy = copy.deepcopy(self.specimen_main_list) + PMOUpdater.merge_dicts_by_key( + self.specimen_main_list, + self.specimen_update_list, + key_field="specimen_name", + ) + self.assertEqual(self.specimen_main_list, main_copy) + + def test_merge_dicts_by_key_does_not_mutate_update_list(self): + import copy + + update_copy = copy.deepcopy(self.specimen_update_list) + PMOUpdater.merge_dicts_by_key( + self.specimen_main_list, + self.specimen_update_list, + key_field="specimen_name", + ) + self.assertEqual(self.specimen_update_list, update_copy) + + def test_merge_dicts_by_key_partial_update_only_updates_provided_specimens(self): + # update_list covering only a subset of main_list should leave others untouched.""" + partial_update = [ + { + "specimen_name": "specimen_001", + "collection_date": "2024-03-15", + "collection_country": "Uganda", + }, + { + "specimen_name": "specimen_003", + "collection_date": "2025-01-08", + "collection_country": "Ethiopia", + }, + ] + result = PMOUpdater.merge_dicts_by_key( + self.specimen_main_list, partial_update, key_field="specimen_name" + ) + result_map = {r["specimen_name"]: r for r in result} + self.assertIn("collection_date", result_map["specimen_001"]) + self.assertIn("collection_date", result_map["specimen_003"]) + self.assertNotIn("collection_date", result_map["specimen_002"]) + self.assertNotIn("collection_date", result_map["specimen_004"]) + self.assertNotIn("collection_date", result_map["specimen_005"]) + + # PMOUpdater.merge_dicts_by_key, testing replacement + def test_merge_dicts_by_key_replace_true_overwrites_existing_field(self): + main_with_existing = [ + {"specimen_name": "specimen_001", "collection_country": "Uganda"}, + {"specimen_name": "specimen_002", "collection_country": "Kenya"}, + ] + update = [ + {"specimen_name": "specimen_001", "collection_country": "Ethiopia"}, + {"specimen_name": "specimen_002", "collection_country": "Uganda"}, + ] + result = PMOUpdater.merge_dicts_by_key( + main_with_existing, update, key_field="specimen_name", replace=True + ) + result_map = {r["specimen_name"]: r for r in result} + self.assertEqual(result_map["specimen_001"]["collection_country"], "Ethiopia") + self.assertEqual(result_map["specimen_002"]["collection_country"], "Uganda") + + # PMOUpdater.merge_dicts_by_key test ignoring fields + + def test_merge_dicts_by_key_ignore_fields_not_added(self): + result = PMOUpdater.merge_dicts_by_key( + self.specimen_main_list, + self.specimen_update_list, + key_field="specimen_name", + ignore_fields=["collection_country"], + ) + result_map = {r["specimen_name"]: r for r in result} + self.assertIn("collection_date", result_map["specimen_001"]) + self.assertNotIn("collection_country", result_map["specimen_001"]) + self.assertNotIn("collection_country", result_map["specimen_003"]) + + def test_merge_dicts_by_key_ignore_fields_does_not_affect_other_fields(self): + result = PMOUpdater.merge_dicts_by_key( + self.specimen_main_list, + self.specimen_update_list, + key_field="specimen_name", + ignore_fields=["collection_country"], + ) + result_map = {r["specimen_name"]: r for r in result} + self.assertEqual(result_map["specimen_002"]["collection_date"], "2024-07-22") + + # PMOUpdater.merge_dicts_by_key testing for expected errors + def test_merge_dicts_by_key_replace_false_raises_on_existing_field(self): + # replace=False should raise ValueError when update would overwrite an existing value + main_with_existing = [ + {"specimen_name": "specimen_001", "collection_country": "Uganda"}, + {"specimen_name": "specimen_002"}, + ] + update = [ + {"specimen_name": "specimen_001", "collection_country": "Kenya"}, + ] + with self.assertRaises(ValueError) as context: + PMOUpdater.merge_dicts_by_key( + main_with_existing, update, key_field="specimen_name", replace=False + ) + self.assertIn("collection_country", str(context.exception)) + + def test_merge_dicts_by_key_missing_key_field_in_main_raises(self): + main_missing_key = [ + {"specimen_name": "specimen_001"}, + {"NOT_specimen_name": "specimen_002"}, # missing key + ] + with self.assertRaises(KeyError) as context: + PMOUpdater.merge_dicts_by_key( + main_missing_key, + self.specimen_update_list[:1], + key_field="specimen_name", + ) + self.assertIn("main_list", str(context.exception)) + + def test_merge_dicts_by_key_missing_key_field_in_update_raises(self): + update_missing_key = [ + { + "specimen_name": "specimen_001", + "collection_date": "2024-03-15", + "collection_country": "Uganda", + }, + { + "NOT_specimen_name": "specimen_002", + "collection_date": "2024-07-22", + }, # missing key + ] + with self.assertRaises(KeyError) as context: + PMOUpdater.merge_dicts_by_key( + self.specimen_main_list, update_missing_key, key_field="specimen_name" + ) + self.assertIn("update_list", str(context.exception)) + + def test_merge_dicts_by_key_duplicate_in_main_raises(self): + main_with_dupes = [ + {"specimen_name": "specimen_001"}, + {"specimen_name": "specimen_001"}, # duplicate + {"specimen_name": "specimen_002"}, + ] + with self.assertRaises(ValueError) as context: + PMOUpdater.merge_dicts_by_key( + main_with_dupes, + self.specimen_update_list[:1], + key_field="specimen_name", + ) + self.assertIn("specimen_001", str(context.exception)) + + def test_merge_dicts_by_key_duplicate_in_update_raises(self): + update_with_dupes = [ + { + "specimen_name": "specimen_001", + "collection_date": "2024-03-15", + "collection_country": "Uganda", + }, + { + "specimen_name": "specimen_001", + "collection_date": "2024-05-10", + "collection_country": "Kenya", + }, # duplicate + ] + with self.assertRaises(ValueError) as context: + PMOUpdater.merge_dicts_by_key( + self.specimen_main_list, update_with_dupes, key_field="specimen_name" + ) + self.assertIn("specimen_001", str(context.exception)) + + def test_merge_dicts_by_key_update_key_not_in_main_raises(self): + update_with_unknown = [ + { + "specimen_name": "specimen_001", + "collection_date": "2024-03-15", + "collection_country": "Uganda", + }, + { + "specimen_name": "specimen_UNKNOWN", + "collection_date": "2024-06-01", + "collection_country": "Kenya", + }, + ] + with self.assertRaises(KeyError) as context: + PMOUpdater.merge_dicts_by_key( + self.specimen_main_list, update_with_unknown, key_field="specimen_name" + ) + self.assertIn("specimen_UNKNOWN", str(context.exception)) + + # PMOUpdater.merge_dicts_by_key edge cases + + def test_merge_dicts_by_key_empty_update_list_returns_main_unchanged(self): + result = PMOUpdater.merge_dicts_by_key( + self.specimen_main_list, [], key_field="specimen_name" + ) + result_names = sorted(r["specimen_name"] for r in result) + main_names = sorted(r["specimen_name"] for r in self.specimen_main_list) + self.assertListEqual(result_names, main_names) + for r in result: + self.assertNotIn("collection_date", r) + self.assertNotIn("collection_country", r) + + def test_merge_dicts_by_key_empty_main_and_update_returns_empty(self): + result = PMOUpdater.merge_dicts_by_key([], [], key_field="specimen_name") + self.assertListEqual(result, []) + if __name__ == "__main__": unittest.main() diff --git a/tests/test_pmo_builder/test_schema_validation_integration.py b/tests/test_pmo_builder/test_schema_validation_integration.py index 3ac2627..766bca5 100644 --- a/tests/test_pmo_builder/test_schema_validation_integration.py +++ b/tests/test_pmo_builder/test_schema_validation_integration.py @@ -4,7 +4,6 @@ import pandas as pd -from pmotools import __version__ from pmotools.pmo_builder.metatable_to_pmo import ( library_sample_info_table_to_pmo, specimen_info_table_to_pmo, @@ -18,7 +17,7 @@ from pmotools.pmo_engine.pmo_checker import PMOChecker -def test_toy_pmo_validates_against_schema(): +def test_full_1_0_0_toy_pmo_validates_against_schema(): """Build a toy PMO with builder functions and validate against the schema.""" # Specimen information with optional fields specimen_df = pd.DataFrame( @@ -47,6 +46,12 @@ def test_toy_pmo_validates_against_schema(): ) specimen_info = specimen_info_table_to_pmo( specimen_df, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", alternate_identifiers_col="alternate_ids", drug_usage_col="drug_usage", env_broad_scale_col="env_broad_scale", @@ -97,6 +102,10 @@ def test_toy_pmo_validates_against_schema(): ) library_sample_info = library_sample_info_table_to_pmo( library_df, + library_sample_name_col="library_sample_name", + sequencing_info_name_col="sequencing_info_name", + specimen_name_col="specimen_name", + panel_name_col="panel_name", run_accession_col="accession", library_prep_plate_name_col="prep_plate_name", library_prep_plate_row_col="prep_plate_row", @@ -121,7 +130,7 @@ def test_toy_pmo_validates_against_schema(): "strand": ["+"], "ref_seq": ["ATGCGCTA"], "gene_name": ["geneA"], - "target_attributes": [["marker"]], + "target_attributes": ["marker1,marker2"], "amplicon_length": [250], } ) @@ -267,34 +276,40 @@ def test_toy_pmo_validates_against_schema(): specimen_info=specimen_info, library_sample_info=library_sample_info, sequencing_info=sequencing_info, - panel_info=panel_info, + panel_target_info=panel_info, mhap_info=mhap_info, bioinfo_method_info=bioinfo_methods_info, bioinfo_run_info=bioinfo_run_info, project_info=project_info, read_counts_by_stage_info=read_counts_by_stage_info, ) - # Load the schema and validate using PMOChecker - schemas_dir = Path(__file__).resolve().parents[2] / "src" / "pmotools" / "schemas" - schema_filename = f"portable_microhaplotype_object_v{__version__}.schema.json" - schema_path = schemas_dir / schema_filename - if not schema_path.exists(): - available_schemas = sorted( - schemas_dir.glob("portable_microhaplotype_object_*.schema.json") + # checking against both versions of PMO, the above builds a "full" PMO and want to check if new schema still validates + # this old fromat + for schema_version in ["1.0.0", "1.1.0"]: + schemas_dir = ( + Path(__file__).resolve().parents[2] / "src" / "pmotools" / "schemas" + ) + schema_filename = ( + f"portable_microhaplotype_object_v{schema_version}.schema.json" ) - if not available_schemas: - raise FileNotFoundError( - f"No schema files found in {schemas_dir} matching " - "'portable_microhaplotype_object_*.schema.json'" + schema_path = schemas_dir / schema_filename + if not schema_path.exists(): + available_schemas = sorted( + schemas_dir.glob("portable_microhaplotype_object_*.schema.json") ) - schema_path = available_schemas[-1] - with schema_path.open(encoding="utf-8") as schema_file: - schema = json.load(schema_file) + if not available_schemas: + raise FileNotFoundError( + f"No schema files found in {schemas_dir} matching " + "'portable_microhaplotype_object_*.schema.json'" + ) + schema_path = available_schemas[-1] + with schema_path.open(encoding="utf-8") as schema_file: + schema = json.load(schema_file) - checker = PMOChecker(schema) - checker.check_for_required_base_fields(pmo) - checker.validate_pmo_json(pmo) + checker = PMOChecker(schema) + checker.check_for_required_base_fields(pmo) + checker.validate_pmo_json(pmo) # Validate optional fields propagated through builders specimen_entry = pmo["specimen_info"][0] @@ -348,3 +363,189 @@ def test_toy_pmo_validates_against_schema(): assert stage_entry["coverage_depth"] == 150 assert pmo["project_info"][0]["project_type"] == "Surveillance" + + +def test_slimer_1_1_0_toy_pmo_validates_against_schema(): + """Build a toy PMO with builder functions and validate against the schema.""" + # Specimen information with optional fields + specimen_df = pd.DataFrame( + { + "specimen_name": ["specimen1"], + "specimen_taxon_id": [[5900]], + "host_taxon_id": [9606], + "collection_date": ["2024-01-01"], + "collection_country": ["Wonderland"], + "host_age": [35], + "host_sex": ["female"], + "lat_lon": ["37.77,-122.42"], + "specimen_collect_device": ["venipuncture"], + "specimen_comments": [["no issues"]], + "specimen_store_loc": ["Freezer 1"], + "drug_usage": [["DrugX"]], + "env_broad_scale": ["Urban"], + "env_local_scale": ["Clinic"], + "env_medium": ["Blood"], + "alternate_ids": [["ALT1", "ALT2"]], + "custom_note": ["Important specimen"], + "parasite_density": [1200], + "parasite_density_method": ["microscopy"], + } + ) + specimen_info = specimen_info_table_to_pmo( + specimen_df, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + alternate_identifiers_col="alternate_ids", + drug_usage_col="drug_usage", + env_broad_scale_col="env_broad_scale", + env_local_scale_col="env_local_scale", + env_medium_col="env_medium", + host_age_col="host_age", + host_sex_col="host_sex", + specimen_collect_device_col="specimen_collect_device", + specimen_comments_col="specimen_comments", + specimen_store_loc_col="specimen_store_loc", + lat_lon_col="lat_lon", + parasite_density_col="parasite_density", + parasite_density_method_col="parasite_density_method", + additional_specimen_cols=["custom_note"], + ) + + # Library sample information with optional fields + library_df = pd.DataFrame( + { + "library_sample_name": ["lib1"], + "specimen_name": ["specimen1"], + "panel_name": ["panel1"], + "accession": ["ACC123"], + "prep_plate_name": ["PlateA"], + "prep_plate_row": ["B"], + "prep_plate_col": [3], + "library_note": ["High quality"], + } + ) + library_sample_info = library_sample_info_table_to_pmo( + library_df, + library_sample_name_col="library_sample_name", + specimen_name_col="specimen_name", + panel_name_col="panel_name", + run_accession_col="accession", + library_prep_plate_name_col="prep_plate_name", + library_prep_plate_row_col="prep_plate_row", + library_prep_plate_col_col="prep_plate_col", + additional_library_sample_info_cols=["library_note"], + ) + + # Panel and target information with optional fields + target_df = pd.DataFrame( + { + "target_name": ["target1"], + "fwd_primer": ["ATGCATGC"], + "rev_primer": ["GCATGCAT"], + "reaction": ["rxn1"], + "target_attributes": ["marker1,marker2"], + } + ) + + panel_info = panel_info_table_to_pmo( + target_table=target_df, + panel_name="panel1", + reaction_name_col="reaction", + target_attributes_col="target_attributes", + ) + + # Microhaplotype information with optional details + mhap_df = pd.DataFrame( + { + "library_sample_name": ["lib1"], + "target_name": ["target1"], + "seq": ["ATGCATGC"], + "reads": [42], + "umis": [10], + "microhap_name": ["mh1"], + "pseudocigar": ["8M"], + "quality": ["ABCD"], + "mask_start": ["1"], + "mask_segment": ["2"], + "mask_replacement": ["2"], + "custom_annotation": ["custom"], + "custom_detected": ["det-note"], + } + ) + mhap_info = mhap_table_to_pmo( + microhaplotype_table=mhap_df, + umis_col="umis", + microhaplotype_name_col="microhap_name", + pseudocigar_col="pseudocigar", + quality_col="quality", + masking_seq_start_col="mask_start", + masking_seq_segment_size_col="mask_segment", + masking_replacement_size_col="mask_replacement", + additional_representative_mhap_cols=["custom_annotation"], + additional_mhap_detected_cols=["custom_detected"], + ) + + # Merge into PMO structure + pmo = merge_to_pmo( + specimen_info=specimen_info, + library_sample_info=library_sample_info, + panel_target_info=panel_info, + mhap_info=mhap_info, + ) + # Load the schema and validate using PMOChecker + # checking against slimmer 1.0.0 PMO + for schema_version in ["1.1.0"]: + schemas_dir = ( + Path(__file__).resolve().parents[2] / "src" / "pmotools" / "schemas" + ) + schema_filename = ( + f"portable_microhaplotype_object_v{schema_version}.schema.json" + ) + schema_path = schemas_dir / schema_filename + if not schema_path.exists(): + available_schemas = sorted( + schemas_dir.glob("portable_microhaplotype_object_*.schema.json") + ) + if not available_schemas: + raise FileNotFoundError( + f"No schema files found in {schemas_dir} matching " + "'portable_microhaplotype_object_*.schema.json'" + ) + schema_path = available_schemas[-1] + with schema_path.open(encoding="utf-8") as schema_file: + schema = json.load(schema_file) + + checker = PMOChecker(schema) + checker.check_for_required_base_fields(pmo) + checker.validate_pmo_json(pmo) + + # Validate optional fields propagated through builders + specimen_entry = pmo["specimen_info"][0] + assert specimen_entry["host_age"] == 35 + assert specimen_entry["specimen_store_loc"] == "Freezer 1" + assert specimen_entry["custom_note"] == "Important specimen" + assert specimen_entry["parasite_density_info"][0]["parasite_density"] == 1200 + assert ( + specimen_entry["parasite_density_info"][0]["parasite_density_method"] + == "microscopy" + ) + + library_entry = pmo["library_sample_info"][0] + assert library_entry["run_accession"] == "ACC123" + assert library_entry["library_note"] == "High quality" + + representative_mhap = pmo["representative_microhaplotypes"]["targets"][0][ + "microhaplotypes" + ][0] + assert representative_mhap["microhaplotype_name"] == "mh1" + assert representative_mhap["masking"][0]["seq_segment_size"] == 2 + assert representative_mhap["custom_annotation"] == "custom" + + detected_mhap = pmo["detected_microhaplotypes"][0]["library_samples"][0][ + "target_results" + ][0]["mhaps"][0] + assert detected_mhap["umis"] == 10 + assert detected_mhap["custom_detected"] == "det-note" diff --git a/tests/test_pmo_builder/test_slim_build_pmo.py b/tests/test_pmo_builder/test_slim_build_pmo.py new file mode 100644 index 0000000..5af11de --- /dev/null +++ b/tests/test_pmo_builder/test_slim_build_pmo.py @@ -0,0 +1,171 @@ +#!/usr/bin/env python3 +import json +from pathlib import Path + +import pandas as pd + +from pmotools.pmo_builder.metatable_to_pmo import ( + specimen_info_table_to_pmo, +) +from pmotools.pmo_builder.panel_information_to_pmo import panel_info_table_to_pmo +from pmotools.pmo_builder.mhap_table_to_pmo import ( + mhap_table_to_pmo, + create_minimum_library_specimen_dict_from_mhap_table, +) +from pmotools.pmo_builder.pmo_updater import PMOUpdater +from pmotools.pmo_builder.merge_to_pmo import merge_to_pmo +from pmotools.pmo_engine.pmo_checker import PMOChecker + + +def test_minimal_pmo_creation(): + """Build PMO just from the smallest amount of data from allele table and target/panel info.""" + + # Panel and target information with optional fields + target_df = pd.DataFrame( + { + "target_name": ["target1"], + "fwd_primer": ["ATGCATGC"], + "rev_primer": ["GCATGCAT"], + } + ) + panel_and_target_info = panel_info_table_to_pmo( + target_table=target_df, + panel_name="panel1", + target_name_col="target_name", + forward_primers_seq_col="fwd_primer", + reverse_primers_seq_col="rev_primer", + ) + + # Microhaplotype information with optional details + mhap_df = pd.DataFrame( + { + "library_sample_name": ["lib1"], + "target_name": ["target1"], + "seq": ["ATGCATGC"], + "reads": [42], + } + ) + + mhap_info = mhap_table_to_pmo( + microhaplotype_table=mhap_df, + library_sample_name_col="library_sample_name", + target_name_col="target_name", + seq_col="seq", + reads_col="reads", + ) + + lib_and_spec_infos = create_minimum_library_specimen_dict_from_mhap_table( + mhap_info["detected_microhaplotypes"], + panel_name="panel1", + library_sample_specimen_key={"lib1": "specimen1"}, + ) + # Merge into PMO structure + no_spec_meta_pmo = merge_to_pmo( + specimen_info=lib_and_spec_infos["specimen_info"], + library_sample_info=lib_and_spec_infos["library_sample_info"], + panel_target_info=panel_and_target_info, + mhap_info=mhap_info, + ) + + # Specimen information with optional fields + specimen_df = pd.DataFrame( + { + "specimen_name": ["specimen1"], + "specimen_taxon_id": [[5900]], + "host_taxon_id": [9606], + "collection_date": ["2024-01-01"], + "collection_country": ["Wonderland"], + "project_name": ["Test Project"], + "host_age": [35], + "host_sex": ["female"], + "lat_lon": ["37.77,-122.42"], + "specimen_collect_device": ["venipuncture"], + "specimen_comments": [["no issues"]], + "specimen_store_loc": ["Freezer 1"], + "drug_usage": [["DrugX"]], + "env_broad_scale": ["Urban"], + "env_local_scale": ["Clinic"], + "env_medium": ["Blood"], + "alternate_ids": [["ALT1", "ALT2"]], + "custom_note": ["Important specimen"], + "parasite_density": [1200], + "parasite_density_method": ["microscopy"], + } + ) + + specimen_info = specimen_info_table_to_pmo( + specimen_df, + specimen_name_col="specimen_name", + specimen_taxon_id_col="specimen_taxon_id", + host_taxon_id_col="host_taxon_id", + collection_date_col="collection_date", + collection_country_col="collection_country", + project_name_col="project_name", + alternate_identifiers_col="alternate_ids", + drug_usage_col="drug_usage", + env_broad_scale_col="env_broad_scale", + env_local_scale_col="env_local_scale", + env_medium_col="env_medium", + host_age_col="host_age", + host_sex_col="host_sex", + specimen_collect_device_col="specimen_collect_device", + specimen_comments_col="specimen_comments", + specimen_store_loc_col="specimen_store_loc", + lat_lon_col="lat_lon", + parasite_density_col="parasite_density", + parasite_density_method_col="parasite_density_method", + additional_specimen_cols=["custom_note"], + ) + + # merging in specimen meta and merge into PMO structure + with_spec_meta_pmo = merge_to_pmo( + specimen_info=PMOUpdater.merge_dicts_by_key( + lib_and_spec_infos["specimen_info"], specimen_info, "specimen_name" + ), + library_sample_info=lib_and_spec_infos["library_sample_info"], + panel_target_info=panel_and_target_info, + mhap_info=mhap_info, + ) + + # Load the schema and validate using PMOChecker + # checking against both versions of PMO, the above builds a "full" PMO and want to check if new schema still validates + # this old format + for schema_version in ["1.1.0"]: + schemas_dir = ( + Path(__file__).resolve().parents[2] / "src" / "pmotools" / "schemas" + ) + schema_filename = ( + f"portable_microhaplotype_object_v{schema_version}.schema.json" + ) + schema_path = schemas_dir / schema_filename + if not schema_path.exists(): + available_schemas = sorted( + schemas_dir.glob("portable_microhaplotype_object_*.schema.json") + ) + if not available_schemas: + raise FileNotFoundError( + f"No schema files found in {schemas_dir} matching " + "'portable_microhaplotype_object_*.schema.json'" + ) + schema_path = available_schemas[-1] + with schema_path.open(encoding="utf-8") as schema_file: + schema = json.load(schema_file) + + checker = PMOChecker(schema) + checker.check_for_required_base_fields(no_spec_meta_pmo) + checker.validate_pmo_json(no_spec_meta_pmo) + checker.check_for_required_base_fields(with_spec_meta_pmo) + checker.validate_pmo_json(with_spec_meta_pmo) + + # Validate optional fields propagated through update function + specimen_entry = with_spec_meta_pmo["specimen_info"][0] + assert specimen_entry["collection_country"] == "Wonderland" + assert specimen_entry["collection_date"] == "2024-01-01" + assert specimen_entry["host_age"] == 35 + assert specimen_entry["specimen_store_loc"] == "Freezer 1" + assert specimen_entry["custom_note"] == "Important specimen" + assert specimen_entry["parasite_density_info"][0]["parasite_density"] == 1200 + assert ( + specimen_entry["parasite_density_info"][0]["parasite_density_method"] + == "microscopy" + ) diff --git a/tests/test_pmo_engine/test_pmo_checker.py b/tests/test_pmo_engine/test_pmo_checker.py index 6332167..05bdc5d 100755 --- a/tests/test_pmo_engine/test_pmo_checker.py +++ b/tests/test_pmo_engine/test_pmo_checker.py @@ -1,21 +1,24 @@ #!/usr/bin/env python3 - +import gzip import os import unittest import json from jsonschema import ValidationError -from pmotools.pmo_engine.pmo_checker import PMOChecker -from pmotools.utils.schema_loader import load_schema +from pmotools.pmo_engine.pmo_checker import PMOChecker, load_schema class TestPMOChecker(unittest.TestCase): def setUp(self): self.working_dir = os.path.dirname(os.path.abspath(__file__)) - self.pmo_jsonschema_data = load_schema( + self.pmo_jsonschema_data_v1_0_0 = load_schema( "portable_microhaplotype_object_v1.0.0.schema.json" ) + self.checker_v1_0_0 = PMOChecker(self.pmo_jsonschema_data_v1_0_0) + self.pmo_jsonschema_data_v1_1_0 = load_schema( + "portable_microhaplotype_object_v1.1.0.schema.json" + ) + self.checker_v1_1_0 = PMOChecker(self.pmo_jsonschema_data_v1_1_0) - self.checker = PMOChecker(self.pmo_jsonschema_data) self.pmo_required_base_fields = [ "library_sample_info", "specimen_info", @@ -30,7 +33,7 @@ def setUp(self): "project_info" "pmo_header", ] - self.specimen_required_fields = [ + self.specimen_required_fields_v1_0_0 = [ "specimen_name", "specimen_taxon_id", "host_taxon_id", @@ -40,7 +43,7 @@ def setUp(self): ] def test_pmo_checker_check_for_required_base_fields(self): - pmo_test_object = { + pmo_test_object_v1_0_0 = { "library_sample_info": [], "specimen_info": [], "sequencing_info": [], @@ -54,7 +57,7 @@ def test_pmo_checker_check_for_required_base_fields(self): "project_info": [], "pmo_header": {}, } - self.checker.check_for_required_base_fields(pmo_test_object) + self.checker_v1_0_0.check_for_required_base_fields(pmo_test_object_v1_0_0) def test_pmo_checker_check_for_required_base_fields_fail(self): pmo_test_object = { @@ -71,23 +74,28 @@ def test_pmo_checker_check_for_required_base_fields_fail(self): "pmo_headers": {}, } self.assertRaises( - Exception, self.checker.check_for_required_base_fields, pmo_test_object + Exception, + self.checker_v1_0_0.check_for_required_base_fields, + pmo_test_object, ) def test_pmo_checker_get_required_fields_for_pmo_class(self): self.assertEqual( - self.checker.get_required_fields_for_pmo_class("SpecimenInfo"), - self.specimen_required_fields, + self.checker_v1_0_0.get_required_fields_for_pmo_class("SpecimenInfo"), + self.specimen_required_fields_v1_0_0, ) def test_pmo_checker_validate_pmo_json(self): + # minimum_pmo_example.json and minimum_pmo_example_2.json are version 1.0.0 which required more fields and + # version 1.1.0 requires less fields but still has the same fields defined so should still pass that validation with open( os.path.join( os.path.dirname(self.working_dir), "data/minimum_pmo_example.json" ) ) as f: pmo_data = json.load(f) - self.checker.validate_pmo_json(pmo_data) + self.checker_v1_0_0.validate_pmo_json(pmo_data) + self.checker_v1_1_0.validate_pmo_json(pmo_data) with open( os.path.join( @@ -95,7 +103,28 @@ def test_pmo_checker_validate_pmo_json(self): ) ) as f: pmo_data2 = json.load(f) - self.checker.validate_pmo_json(pmo_data2) + self.checker_v1_0_0.validate_pmo_json(pmo_data2) + self.checker_v1_1_0.validate_pmo_json(pmo_data2) + + with gzip.open( + os.path.join( + os.path.dirname(self.working_dir), + "data/minimum_fields_pmo_example1.json.gz", + ), + "rt", + ) as f: + pmo_data3 = json.load(f) + self.checker_v1_1_0.validate_pmo_json(pmo_data3) + + with gzip.open( + os.path.join( + os.path.dirname(self.working_dir), + "data/minimum_fields_pmo_example2.json.gz", + ), + "rt", + ) as f: + pmo_data4 = json.load(f) + self.checker_v1_1_0.validate_pmo_json(pmo_data4) def test_pmo_checker_validate_pmo_json_fail(self): with open( @@ -105,7 +134,21 @@ def test_pmo_checker_validate_pmo_json_fail(self): ) ) as f: pmo_data = json.load(f) - self.assertRaises(ValidationError, self.checker.validate_pmo_json, pmo_data) + self.assertRaises( + ValidationError, self.checker_v1_0_0.validate_pmo_json, pmo_data + ) + + with gzip.open( + os.path.join( + os.path.dirname(self.working_dir), + "data/minimum_fields_pmo_example2.json.gz", + ), + "rt", + ) as f: + pmo_data4 = json.load(f) + self.assertRaises( + ValidationError, self.checker_v1_0_0.validate_pmo_json, pmo_data4 + ) if __name__ == "__main__": diff --git a/tests/test_pmo_engine/test_pmo_exporter.py b/tests/test_pmo_engine/test_pmo_exporter.py index 84acb43..1984bfa 100755 --- a/tests/test_pmo_engine/test_pmo_exporter.py +++ b/tests/test_pmo_engine/test_pmo_exporter.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import gzip import hashlib import os import tempfile @@ -28,14 +29,22 @@ def setUp(self): os.path.dirname(self.working_dir), "data/minimum_pmo_example.json" ) ) as f: - self.minimum_pmo_data = json.load(f) + self.small_example_pmo_data = json.load(f) + with gzip.open( + os.path.join( + os.path.dirname(self.working_dir), + "data/minimum_fields_pmo_example1.json.gz", + ), + "rt", + ) as f: + self.minimum_fields_v1_1_0_pmo_data = json.load(f) def tearDown(self): self.test_dir.cleanup() def test_list_library_sample_names_per_specimen_name(self): id_counts = PMOExporter.list_library_sample_names_per_specimen_name( - self.minimum_pmo_data + self.small_example_pmo_data ) id_counts_check_data = { "specimen_name": ["8025874217", "8025874266"], @@ -98,7 +107,8 @@ def test_extract_panels_insert_bed_loc(self): def test_extract_alleles_per_sample_table(self): allele_data = PMOExporter.extract_alleles_per_sample_table( - self.combined_pmo_data + self.combined_pmo_data, + additional_microhap_fields=["mhap_id"], ).sort_values( by=[ "bioinformatics_run_name", @@ -111,12 +121,10 @@ def test_extract_alleles_per_sample_table(self): self.test_dir.name, "extracted_alleles_per_sample_table_no_extra_args.csv" ) allele_data.to_csv(output_fnp, index=False) - self.assertEqual("2898d87133e2e381612f3c0dea70122f", md5sum_of_fnp(output_fnp)) + self.assertEqual("0c9df242c0f990682b32e8211bfa198c", md5sum_of_fnp(output_fnp)) allele_data_with_seq_reads = PMOExporter.extract_alleles_per_sample_table( - self.combined_pmo_data, - additional_microhap_fields=["reads"], - additional_representative_info_fields=["seq"], + self.combined_pmo_data, additional_microhap_fields=["reads", "mhap_id"] ).sort_values( by=[ "bioinformatics_run_name", @@ -130,13 +138,12 @@ def test_extract_alleles_per_sample_table(self): "extracted_alleles_per_sample_table_no_extra_args_with_seq_reads.csv", ) allele_data_with_seq_reads.to_csv(output_fnp, index=False) - self.assertEqual("744c1c0233066f030881c8b595b9ad5c", md5sum_of_fnp(output_fnp)) + self.assertEqual("742c2c40546bdb25d1e2d517174120bb", md5sum_of_fnp(output_fnp)) allele_data_with_seq_reads_panel_id_collection_country = ( PMOExporter.extract_alleles_per_sample_table( self.combined_pmo_data, - additional_microhap_fields=["reads"], - additional_representative_info_fields=["seq"], + additional_microhap_fields=["reads", "mhap_id"], additional_library_sample_info_fields=["panel_id"], additional_specimen_info_fields=["collection_country"], ).sort_values( @@ -155,10 +162,47 @@ def test_extract_alleles_per_sample_table(self): allele_data_with_seq_reads_panel_id_collection_country.to_csv( output_fnp, index=False ) - self.assertEqual("c425004244e6af1386b6e7776da76fed", md5sum_of_fnp(output_fnp)) + self.assertEqual("189f1c73418c3cb85fcec2a736ff23b9", md5sum_of_fnp(output_fnp)) + + def test_extract_alleles_per_sample_table_minimum_fields_pmo_input(self): + allele_data = PMOExporter.extract_alleles_per_sample_table( + self.minimum_fields_v1_1_0_pmo_data, + additional_microhap_fields=["mhap_id"], + ).sort_values( + by=[ + "bioinformatics_run_name", + "library_sample_name", + "target_name", + "mhap_id", + ] + ) + output_fnp = os.path.join( + self.test_dir.name, + "extracted_alleles_per_sample_table_no_extra_args_on_minimum_fields_pmo.csv", + ) + allele_data.to_csv(output_fnp, index=False) + self.assertEqual("cd016ab8d619328b32f11506b908e05f", md5sum_of_fnp(output_fnp)) + + allele_data_with_seq_reads = PMOExporter.extract_alleles_per_sample_table( + self.minimum_fields_v1_1_0_pmo_data, + additional_microhap_fields=["reads", "mhap_id"], + ).sort_values( + by=[ + "bioinformatics_run_name", + "library_sample_name", + "target_name", + "mhap_id", + ] + ) + output_fnp = os.path.join( + self.test_dir.name, + "extracted_alleles_per_sample_table_no_extra_args_with_seq_reads_on_minimum_fields_pmo.csv", + ) + allele_data_with_seq_reads.to_csv(output_fnp, index=False) + self.assertEqual("2810b465c005d4c1acbed12856ddfd26", md5sum_of_fnp(output_fnp)) def test_export_specimen_meta_table(self): - spec_table = PMOExporter.export_specimen_meta_table(self.minimum_pmo_data) + spec_table = PMOExporter.export_specimen_meta_table(self.small_example_pmo_data) spec_table.to_csv(os.path.join(self.test_dir.name, "specimen_meta_table.csv")) self.assertEqual( "8f94b8b774696e26c4ff6c8086e616a4", @@ -167,19 +211,19 @@ def test_export_specimen_meta_table(self): def test_export_target_info_meta_table(self): target_info_table = PMOExporter.export_target_info_meta_table( - self.minimum_pmo_data + self.small_example_pmo_data ) target_info_table.to_csv( os.path.join(self.test_dir.name, "target_info_table.csv") ) self.assertEqual( - "cb0319482c9da5f9d8b22fba955ce1c8", + "2397407dcff8be3fdf54d27ba9a9cbff", md5sum_of_fnp(os.path.join(self.test_dir.name, "target_info_table.csv")), ) def test_export_panel_info_meta_table(self): panel_info_table = PMOExporter.export_panel_info_meta_table( - self.minimum_pmo_data + self.small_example_pmo_data ) panel_info_table.to_csv( os.path.join(self.test_dir.name, "panel_info_table.csv") @@ -191,7 +235,7 @@ def test_export_panel_info_meta_table(self): def test_export_library_sample_meta_table(self): library_sample_table = PMOExporter.export_library_sample_meta_table( - self.minimum_pmo_data + self.small_example_pmo_data ) library_sample_table.to_csv( os.path.join(self.test_dir.name, "library_sample_table.csv") @@ -203,7 +247,7 @@ def test_export_library_sample_meta_table(self): def test_export_sequencing_info_meta_table(self): sequencing_info_table = PMOExporter.export_sequencing_info_meta_table( - self.minimum_pmo_data + self.small_example_pmo_data ) sequencing_info_table.to_csv( os.path.join(self.test_dir.name, "sequencing_info_table.csv") @@ -217,12 +261,11 @@ def test_export_sequencing_info_meta_table(self): def test_export_project_info_meta_table(self): project_info_table = PMOExporter.export_project_info_meta_table( - self.minimum_pmo_data + self.small_example_pmo_data ) project_info_table.to_csv( os.path.join(self.test_dir.name, "project_info_table.csv") ) - print(project_info_table) self.assertEqual( "e533098411cbd96de2733668e8475ab8", md5sum_of_fnp(os.path.join(self.test_dir.name, "project_info_table.csv")), @@ -264,7 +307,6 @@ def test_export_specimen_travel_meta_table(self): specimen_trable_info_table.to_csv( os.path.join(self.test_dir.name, "specimen_trable_info_table.csv") ) - print(specimen_trable_info_table) self.assertEqual( "0305350d655184aa385d3d1ddc9b3600", md5sum_of_fnp( @@ -272,6 +314,205 @@ def test_export_specimen_travel_meta_table(self): ), ) + def test_basic_structure_from_minimum_example(self): + """DataFrame has expected columns and one row for the single genome.""" + df = PMOExporter.export_targeted_genomes_meta_table(self.small_example_pmo_data) + assert isinstance(df, pd.DataFrame) + assert len(df) == 1 + assert "genome_id" in df.columns + assert "name" in df.columns + + def test_genome_id_assigned(self): + """genome_id starts at 0 and increments per genome.""" + df = PMOExporter.export_targeted_genomes_meta_table(self.small_example_pmo_data) + assert df["genome_id"].iloc[0] == 0 + + def test_raises_on_missing_targeted_genomes(self): + """Raises ValueError when targeted_genomes key is absent.""" + with self.assertRaises(ValueError) as context: + PMOExporter.export_targeted_genomes_meta_table({"pmo_header": {}}) + self.assertIn( + "no targeted_genomes found", + str(context.exception), + ) + + def test_multiple_genomes_from_combined_example(self): + """One row is produced per genome entry.""" + df = PMOExporter.export_targeted_genomes_meta_table(self.combined_pmo_data) + assert len(df) == len(self.combined_pmo_data["targeted_genomes"]) + assert list(df["genome_id"]) == list(range(len(df))) + + def test_empty_targeted_genomes_list(self): + """Empty targeted_genomes list produces an empty DataFrame.""" + pmodata = {"targeted_genomes": []} + df = PMOExporter.export_targeted_genomes_meta_table(pmodata) + assert isinstance(df, pd.DataFrame) + assert len(df) == 0 + + def test_basic_structure_from_minimum_example_bioinformatics_run_info(self): + """DataFrame has expected columns and correct row count.""" + df = PMOExporter.export_bioinformatics_run_info_meta_table( + self.small_example_pmo_data + ) + assert isinstance(df, pd.DataFrame) + assert len(df) == 1 + + def test_raises_on_missing_bioinformatics_run_info(self): + """Raises ValueError when bioinformatics_run_info key is absent.""" + with self.assertRaises(ValueError) as context: + PMOExporter.export_bioinformatics_run_info_meta_table({"pmo_header": {}}) + self.assertIn( + "no bioinformatics_run_info found", + str(context.exception), + ) + + def test_empty_bioinformatics_run_info_list(self): + """Empty bioinformatics_run_info list produces an empty DataFrame.""" + pmodata = {"bioinformatics_run_info": []} + df = PMOExporter.export_bioinformatics_run_info_meta_table(pmodata) + assert isinstance(df, pd.DataFrame) + assert len(df) == 0 + + def test_multiple_runs_from_combined_example_bioinformatics_run_info(self): + """One row is produced per bioinformatics_run_info entry.""" + df = PMOExporter.export_bioinformatics_run_info_meta_table( + self.combined_pmo_data + ) + assert len(df) == len(self.combined_pmo_data["bioinformatics_run_info"]) + assert list(df["run_id"]) == list(range(len(df))) + + def test_custom_separator_bioinformatics_run_info(self): + """Custom separator is used for any list fields.""" + pmodata = { + "bioinformatics_run_info": [ + { + "bioinformatics_run_name": "test-run", + "run_date": "2024-01-01", + "some_list_field": ["a", "b", "c"], + } + ] + } + df_pipe = PMOExporter.export_bioinformatics_run_info_meta_table( + pmodata, separator="|" + ) + assert df_pipe["some_list_field"].iloc[0] == "a|b|c" + df_comma = PMOExporter.export_bioinformatics_run_info_meta_table( + pmodata, separator="," + ) + assert df_comma["some_list_field"].iloc[0] == "a,b,c" + + def test_basic_structure_from_minimum_example_bioinformatics_methods_info(self): + """DataFrame is a pandas DataFrame with expected columns.""" + df = PMOExporter.export_bioinformatics_methods_info_meta_table( + self.small_example_pmo_data + ) + assert isinstance(df, pd.DataFrame) + assert "bioinformatics_methods_id" in df.columns + assert "method_id" in df.columns + + def test_row_count_matches_total_methods_bioinformatics_methods_info(self): + """Total rows equals the sum of methods across all bioinformatics_methods_info entries.""" + df = PMOExporter.export_bioinformatics_methods_info_meta_table( + self.small_example_pmo_data + ) + expected_row_count = sum( + len(entry["methods"]) + for entry in self.small_example_pmo_data["bioinformatics_methods_info"] + ) + assert len(df) == expected_row_count + + def test_row_count_matches_total_methods_combined_example_bioinformatics_methods_info( + self, + ): + """Row count matches sum of methods in combined example.""" + df = PMOExporter.export_bioinformatics_methods_info_meta_table( + self.combined_pmo_data + ) + expected_row_count = sum( + len(entry["methods"]) + for entry in self.combined_pmo_data["bioinformatics_methods_info"] + ) + assert len(df) == expected_row_count + + def test_raises_on_missing_bioinformatics_methods_info(self): + """Raises ValueError when bioinformatics_methods_info key is absent.""" + with self.assertRaises(ValueError) as context: + PMOExporter.export_bioinformatics_methods_info_meta_table( + {"pmo_header": {}} + ) + self.assertIn( + "no bioinformatics_methods_info found", + str(context.exception), + ) + + def test_empty_bioinformatics_methods_info_list(self): + """Empty bioinformatics_methods_info list produces an empty DataFrame.""" + pmodata = {"bioinformatics_methods_info": []} + df = PMOExporter.export_bioinformatics_methods_info_meta_table(pmodata) + assert isinstance(df, pd.DataFrame) + assert len(df) == 0 + + def test_build_pmo_sheet_configs_required_sheets_always_present(self): + """Required sheets are always included regardless of optional fields.""" + configs = PMOExporter._build_pmo_sheet_configs(self.small_example_pmo_data) + sheet_names = [c.sheet_name for c in configs] + required_sheets = [ + "PMO Header", + "Required Panel Targets", + "Required Panel Info", + "Required Microhaplotype", + ] + for sheet in required_sheets: + self.assertIn(sheet, sheet_names) + + def test_build_pmo_sheet_configs_optional_sheets_excluded_when_absent(self): + """Optional sheets are only included when their key exists in the PMO.""" + configs = PMOExporter._build_pmo_sheet_configs(self.small_example_pmo_data) + sheet_names = [c.sheet_name for c in configs] + optional_key_sheet_pairs = [ + ("targeted_genomes", "Optional GenomeInfo"), + ("project_info", "Optional ProjectInfo"), + ("sequencing_info", "Optional SequencingInfo"), + ("bioinformatics_methods_info", "Optional Bioinformatics Methods"), + ("bioinformatics_run_info", "Optional Bioinformatics Run"), + ] + for pmo_key, sheet_name in optional_key_sheet_pairs: + if pmo_key not in self.small_example_pmo_data: + self.assertNotIn(sheet_name, sheet_names) + else: + self.assertIn(sheet_name, sheet_names) + + def test_build_pmo_sheet_configs_all_optional_sheets_present_in_combined(self): + """All optional sheets appear when the combined (fully-populated) PMO is used.""" + configs = PMOExporter._build_pmo_sheet_configs(self.combined_pmo_data) + sheet_names = [c.sheet_name for c in configs] + optional_sheets = [ + "Optional GenomeInfo", + "Optional ProjectInfo", + "Optional SequencingInfo", + "Optional Bioinformatics Methods", + "Optional Bioinformatics Run", + ] + for sheet in optional_sheets: + self.assertIn(sheet, sheet_names) + + def test_export_to_excel_creates_valid_file_with_expected_sheets(self): + """export_to_excel writes a valid xlsx file containing all expected sheet names.""" + output_fnp = os.path.join(self.test_dir.name, "test_export.xlsx") + PMOExporter.export_to_excel(self.small_example_pmo_data, output_fnp) + self.assertTrue(os.path.exists(output_fnp)) + written_sheets = pd.ExcelFile(output_fnp).sheet_names + expected_sheets = [ + "PMO Header", + "Required Panel Targets", + "Required Panel Info", + "Required Microhaplotype", + "Optional Specimen Level", + "Optional LibrarySampleInfo", + ] + for sheet in expected_sheets: + self.assertIn(sheet, written_sheets) + if __name__ == "__main__": unittest.main() diff --git a/tests/test_pmo_engine/test_pmo_processor.py b/tests/test_pmo_engine/test_pmo_processor.py index 3b4348b..2c4a41b 100755 --- a/tests/test_pmo_engine/test_pmo_processor.py +++ b/tests/test_pmo_engine/test_pmo_processor.py @@ -7,10 +7,9 @@ import pandas as pd -from pmotools.pmo_engine.pmo_checker import PMOChecker from pmotools.pmo_engine.pmo_processor import PMOProcessor import hashlib -from pmotools.utils.schema_loader import load_schema +from pmotools.pmo_engine.pmo_checker import PMOChecker, load_schema def md5sum_of_fnp(filename): @@ -331,7 +330,7 @@ def test_filter_pmo_by_target_ids(self): ) with open(output_fnp, "w") as f: json.dump(pmo_data_select_targets, f) - self.assertEqual("d9525c0a067d8a291af8bf89b80bfb42", md5sum_of_fnp(output_fnp)) + self.assertEqual("bde71758fb2e6562a22ecebb0cf56c0d", md5sum_of_fnp(output_fnp)) # check pmo extracted against PMO schema checker = PMOChecker(self.pmo_jsonschema_data) checker.validate_pmo_json(pmo_data_select_targets) @@ -345,7 +344,7 @@ def test_filter_pmo_by_target_names(self): ) with open(output_fnp, "w") as f: json.dump(pmo_data_select_targets, f) - self.assertEqual("853d0806237d4078abc601f0c7dcdc3c", md5sum_of_fnp(output_fnp)) + self.assertEqual("549871fc518a4d4c106e5960c3477c99", md5sum_of_fnp(output_fnp)) # check pmo extracted against PMO schema checker = PMOChecker(self.pmo_jsonschema_data) checker.validate_pmo_json(pmo_data_select_targets) @@ -359,7 +358,7 @@ def test_filter_pmo_by_library_sample_ids(self): ) with open(output_fnp, "w") as f: json.dump(pmo_data_select_targets, f) - self.assertEqual("b942daeac359bbe063563f8692986d1c", md5sum_of_fnp(output_fnp)) + self.assertEqual("4a2c7b9d84322cc43adf2b9f0c518244", md5sum_of_fnp(output_fnp)) # check pmo extracted against PMO schema checker = PMOChecker(self.pmo_jsonschema_data) checker.validate_pmo_json(pmo_data_select_targets) @@ -375,7 +374,7 @@ def test_filter_pmo_by_library_sample_names(self): ) with open(output_fnp, "w") as f: json.dump(pmo_data_select_library_sample_names, f) - self.assertEqual("99873ba369fa94722969ab9ce6581287", md5sum_of_fnp(output_fnp)) + self.assertEqual("ffdaeb6b57ed9a5c51e56cfaa4621796", md5sum_of_fnp(output_fnp)) # check pmo extracted against PMO schema checker = PMOChecker(self.pmo_jsonschema_data) checker.validate_pmo_json(pmo_data_select_library_sample_names) @@ -389,7 +388,7 @@ def test_filter_pmo_by_specimen_ids(self): ) with open(output_fnp, "w") as f: json.dump(pmo_data_select_targets, f) - self.assertEqual("b5d1d39d508a7c7c1d8ccce65c52bc5d", md5sum_of_fnp(output_fnp)) + self.assertEqual("f3dd2e0aee9afa82336ff48475a3c69c", md5sum_of_fnp(output_fnp)) # check pmo extracted against PMO schema checker = PMOChecker(self.pmo_jsonschema_data) checker.validate_pmo_json(pmo_data_select_targets) @@ -403,7 +402,7 @@ def test_filter_pmo_by_specimen_names(self): ) with open(output_fnp, "w") as f: json.dump(pmo_data_select_targets, f) - self.assertEqual("b5d1d39d508a7c7c1d8ccce65c52bc5d", md5sum_of_fnp(output_fnp)) + self.assertEqual("f3dd2e0aee9afa82336ff48475a3c69c", md5sum_of_fnp(output_fnp)) # check pmo extracted against PMO schema checker = PMOChecker(self.pmo_jsonschema_data) checker.validate_pmo_json(pmo_data_select_targets) @@ -420,7 +419,8 @@ def test_extract_from_pmo_samples_with_meta_groupings(self): ) with open(output_fnp, "w") as f: json.dump(pmo_data_select_meta, f) - self.assertEqual("338e838297d79a8038d8d5392a6ca57e", md5sum_of_fnp(output_fnp)) + + self.assertEqual("f0f67e399885824a7aa318ead8b3d09c", md5sum_of_fnp(output_fnp)) # check pmo extracted against PMO schema checker = PMOChecker(self.pmo_jsonschema_data) checker.validate_pmo_json(pmo_data_select_meta) diff --git a/tests/test_pmo_engine/test_pmo_reader.py b/tests/test_pmo_engine/test_pmo_reader.py index d8d4eb4..b612ae2 100755 --- a/tests/test_pmo_engine/test_pmo_reader.py +++ b/tests/test_pmo_engine/test_pmo_reader.py @@ -3,9 +3,8 @@ import os import unittest -from pmotools.pmo_engine.pmo_checker import PMOChecker from pmotools.pmo_engine.pmo_reader import PMOReader -from pmotools.utils.schema_loader import load_schema +from pmotools.pmo_engine.pmo_checker import PMOChecker, load_schema class TestPMOReader(unittest.TestCase): @@ -102,6 +101,40 @@ def test_combine_multiple_pmos(self): self.assertEqual(expected_pmo, combined_pmo) + def test_combine_multiple_pmos_v1_1_0(self): + pmo_data_list = PMOReader.read_in_pmos( + [ + os.path.join( + os.path.dirname(self.working_dir), + "data/minimum_fields_pmo_example1.json.gz", + ), + os.path.join( + os.path.dirname(self.working_dir), + "data/minimum_fields_pmo_example2.json.gz", + ), + ] + ) + combined_pmo = PMOReader.combine_multiple_pmos(pmo_data_list) + # validate with schema + pmo_jsonschema_data = load_schema( + "portable_microhaplotype_object_v1.1.0.schema.json" + ) + checker = PMOChecker(pmo_jsonschema_data) + checker.validate_pmo_json(combined_pmo) + # check against expected + with open( + os.path.join( + os.path.dirname(self.working_dir), + "data/combined_pmo_minimum_fields_example.json", + ) + ) as f: + expected_pmo = json.load(f) + # remove the pmo_header as the generation date will be new each time it's created + expected_pmo.pop("pmo_header") + combined_pmo.pop("pmo_header") + + self.assertEqual(expected_pmo, combined_pmo) + def test_combine_multiple_pmos_fail_dup_specimen_names(self): # the two files below have same specimen_names but have different meta so will fail when trying to combine pmo_data_list = PMOReader.read_in_pmos( diff --git a/uv.lock b/uv.lock index f33eb44..033c746 100644 --- a/uv.lock +++ b/uv.lock @@ -63,6 +63,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, ] +[[package]] +name = "et-xmlfile" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234, upload-time = "2024-10-25T17:25:40.039Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059, upload-time = "2024-10-25T17:25:39.051Z" }, +] + [[package]] name = "filelock" version = "3.19.1" @@ -207,6 +216,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/af/11/0cc63f9f321ccf63886ac203336777140011fb669e739da36d8db3c53b98/numpy-2.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2e267c7da5bf7309670523896df97f93f6e469fb931161f483cd6882b3b1a5dc", size = 12971844, upload-time = "2025-09-09T15:58:57.359Z" }, ] +[[package]] +name = "openpyxl" +version = "3.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "et-xmlfile" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464, upload-time = "2024-06-28T14:03:44.161Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload-time = "2024-06-28T14:03:41.161Z" }, +] + [[package]] name = "packaging" version = "25.0" @@ -269,6 +290,7 @@ source = { editable = "." } dependencies = [ { name = "biopython" }, { name = "jsonschema" }, + { name = "openpyxl" }, { name = "pandas" }, { name = "pre-commit" }, ] @@ -282,6 +304,7 @@ dev = [ requires-dist = [ { name = "biopython", specifier = ">=1.83" }, { name = "jsonschema", specifier = ">=4.23.0" }, + { name = "openpyxl", specifier = ">=3.1.5" }, { name = "pandas", specifier = ">=2.2.2" }, { name = "pre-commit" }, ]