From e677c2024a23974342da6a8cab0e7bc40787d423 Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Thu, 7 May 2026 12:30:50 -0700 Subject: [PATCH 01/27] updated code for more minimum field requirements; --- src/pmotools/pmo_engine/pmo_exporter.py | 30 ++++-- src/pmotools/pmo_engine/pmo_processor.py | 98 +++++++++++++------ .../export_specimen_travel_meta_table.py | 5 + .../pmo_to_tables/extract_allele_table.py | 23 ++++- 4 files changed, 112 insertions(+), 44 deletions(-) diff --git a/src/pmotools/pmo_engine/pmo_exporter.py b/src/pmotools/pmo_engine/pmo_exporter.py index 1a39282..62632e8 100644 --- a/src/pmotools/pmo_engine/pmo_exporter.py +++ b/src/pmotools/pmo_engine/pmo_exporter.py @@ -134,6 +134,9 @@ def export_sequencing_info_meta_table( :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 = {} @@ -153,6 +156,9 @@ def export_project_info_meta_table(pmodata, separator: str = ",") -> pd.DataFram :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 = {} @@ -540,11 +546,17 @@ 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 + ) 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"] @@ -561,15 +573,19 @@ def extract_alleles_per_sample_table( "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, } + if ( + bioinformatics_run_names is not None + and bioinformatics_run_id is not None + ): + row["bioinformatics_run_name"] = bioinformatics_run_names[ + bioinformatics_run_id + ] if additional_library_sample_info_fields is not None: for field in additional_library_sample_info_fields: row[field] = library_meta.get(field, "NA") diff --git a/src/pmotools/pmo_engine/pmo_processor.py b/src/pmotools/pmo_engine/pmo_processor.py index 7579ac8..c36813e 100644 --- a/src/pmotools/pmo_engine/pmo_processor.py +++ b/src/pmotools/pmo_engine/pmo_processor.py @@ -127,6 +127,10 @@ def get_bioinformatics_run_names(pmodata) -> list[str]: :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"]) @@ -314,8 +318,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"] @@ -351,9 +361,14 @@ def count_library_samples_per_target( 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"]: @@ -582,23 +597,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 +657,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 +679,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( @@ -767,26 +792,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 +840,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 +864,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 +890,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" ]: 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..06cf652 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 @@ -48,6 +48,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/extract_allele_table.py b/src/pmotools/scripts/pmo_to_tables/extract_allele_table.py index 549028c..1ed72d2 100755 --- a/src/pmotools/scripts/pmo_to_tables/extract_allele_table.py +++ b/src/pmotools/scripts/pmo_to_tables/extract_allele_table.py @@ -43,6 +43,9 @@ 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, @@ -80,6 +83,15 @@ def parse_args_extract_for_allele_table(): default="library_sample_name,target_name,mhap_id", help="default base column names, must be length 3", ) + parser.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 --representative_haps_fields seq + %(prog)s --file input.pmo --output output.tsv --specimen_info_meta_fields collection_date,collection_country + """ + parser.formatter_class = argparse.RawDescriptionHelpFormatter return parser.parse_args() @@ -111,11 +123,12 @@ 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) if args.specimen_info_meta_fields is not None: args.specimen_info_meta_fields = Utils.parse_delimited_input_or_file( From 03c26b29ac1efb327f7ad0edeec650e93cdf6f7d Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Thu, 7 May 2026 13:01:53 -0700 Subject: [PATCH 02/27] no message --- tests/test_pmo_engine/test_pmo_exporter.py | 2 +- tests/test_pmo_engine/test_pmo_processor.py | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/tests/test_pmo_engine/test_pmo_exporter.py b/tests/test_pmo_engine/test_pmo_exporter.py index 84acb43..e8ea6cf 100755 --- a/tests/test_pmo_engine/test_pmo_exporter.py +++ b/tests/test_pmo_engine/test_pmo_exporter.py @@ -111,7 +111,7 @@ 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("1a818a371bfc770cdad1c86ec6e681ea", md5sum_of_fnp(output_fnp)) allele_data_with_seq_reads = PMOExporter.extract_alleles_per_sample_table( self.combined_pmo_data, diff --git a/tests/test_pmo_engine/test_pmo_processor.py b/tests/test_pmo_engine/test_pmo_processor.py index 3b4348b..727bb45 100755 --- a/tests/test_pmo_engine/test_pmo_processor.py +++ b/tests/test_pmo_engine/test_pmo_processor.py @@ -331,7 +331,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 +345,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 +359,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 +375,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 +389,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 +403,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 +420,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) From da5f008998fff72c061777f4175b3ec9965a5742 Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Thu, 7 May 2026 13:09:04 -0700 Subject: [PATCH 03/27] updated MD5SUMs; --- tests/test_pmo_engine/test_pmo_exporter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_pmo_engine/test_pmo_exporter.py b/tests/test_pmo_engine/test_pmo_exporter.py index e8ea6cf..cab22c2 100755 --- a/tests/test_pmo_engine/test_pmo_exporter.py +++ b/tests/test_pmo_engine/test_pmo_exporter.py @@ -130,7 +130,7 @@ 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("cb1a2e599bfe728441a8ecfb06da94d9", md5sum_of_fnp(output_fnp)) allele_data_with_seq_reads_panel_id_collection_country = ( PMOExporter.extract_alleles_per_sample_table( @@ -155,7 +155,7 @@ 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("7eba9420a002606d3c0501b8641c8e17", md5sum_of_fnp(output_fnp)) def test_export_specimen_meta_table(self): spec_table = PMOExporter.export_specimen_meta_table(self.minimum_pmo_data) From 06582a1d28e27c2b13f8d5b2e6bc4face24dceda Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Thu, 7 May 2026 15:47:50 -0700 Subject: [PATCH 04/27] added new schema file; added new test data with new minimum fields required; updated combining function to take into account minimum info; updated several tests to test for the newer less required field files; --- src/pmotools/pmo_engine/pmo_exporter.py | 6 + src/pmotools/pmo_engine/pmo_reader.py | 164 +- ...e_microhaplotype_object_v1.1.0.schema.json | 1831 +++++++++++++++++ .../combined_pmo_minimum_fields_example.json | 1 + .../data/minimum_fields_pmo_example1.json.gz | Bin 0 -> 38769 bytes .../data/minimum_fields_pmo_example2.json.gz | Bin 0 -> 38169 bytes tests/test_pmo_engine/test_pmo_checker.py | 68 +- tests/test_pmo_engine/test_pmo_exporter.py | 62 +- tests/test_pmo_engine/test_pmo_reader.py | 34 + 9 files changed, 2081 insertions(+), 85 deletions(-) create mode 100644 src/pmotools/schemas/portable_microhaplotype_object_v1.1.0.schema.json create mode 100644 tests/data/combined_pmo_minimum_fields_example.json create mode 100644 tests/data/minimum_fields_pmo_example1.json.gz create mode 100644 tests/data/minimum_fields_pmo_example2.json.gz diff --git a/src/pmotools/pmo_engine/pmo_exporter.py b/src/pmotools/pmo_engine/pmo_exporter.py index 62632e8..125f7ac 100644 --- a/src/pmotools/pmo_engine/pmo_exporter.py +++ b/src/pmotools/pmo_engine/pmo_exporter.py @@ -551,6 +551,7 @@ def extract_alleles_per_sample_table( 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 = None if "bioinformatics_run_id" in bio_run_for_detected_microhaps: @@ -586,6 +587,10 @@ def extract_alleles_per_sample_table( 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") @@ -599,6 +604,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) diff --git a/src/pmotools/pmo_engine/pmo_reader.py b/src/pmotools/pmo_engine/pmo_reader.py index f31e9e0..36dd3eb 100644 --- a/src/pmotools/pmo_engine/pmo_reader.py +++ b/src/pmotools/pmo_engine/pmo_reader.py @@ -71,28 +71,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 +118,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 +182,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 +202,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 +282,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 +325,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 +354,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 +378,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 +396,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 +425,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 +450,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 +463,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 +544,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 +595,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/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/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 0000000000000000000000000000000000000000..b7f05961b6b6304511422948641df53e0d6876c2 GIT binary patch literal 38769 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 HuGI~?O>PVY{;P`EN!1HyYJPF7Waj50ng}S( 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 literal 0 HcmV?d00001 diff --git a/tests/test_pmo_engine/test_pmo_checker.py b/tests/test_pmo_engine/test_pmo_checker.py index 6332167..4f65dce 100755 --- a/tests/test_pmo_engine/test_pmo_checker.py +++ b/tests/test_pmo_engine/test_pmo_checker.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 - +import gzip import os import unittest import json @@ -11,11 +11,15 @@ 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 +34,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 +44,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 +58,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 +75,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 +104,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 +135,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 cab22c2..dc6f178 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"], @@ -157,8 +166,45 @@ def test_extract_alleles_per_sample_table(self): ) self.assertEqual("7eba9420a002606d3c0501b8641c8e17", 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 + ).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("0f4a023f049a8c0e3544e68daaf9c2c0", 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"], + additional_representative_info_fields=["seq"], + ).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("faab1121588a1a794c4e695da6799532", 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,7 +213,7 @@ 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") @@ -179,7 +225,7 @@ def test_export_target_info_meta_table(self): 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 +237,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 +249,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,7 +263,7 @@ 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") diff --git a/tests/test_pmo_engine/test_pmo_reader.py b/tests/test_pmo_engine/test_pmo_reader.py index d8d4eb4..76d4ebb 100755 --- a/tests/test_pmo_engine/test_pmo_reader.py +++ b/tests/test_pmo_engine/test_pmo_reader.py @@ -102,6 +102,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( From bb7ebf4a36db112803146544ff605cfa4a79294b Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Mon, 11 May 2026 19:46:28 -0700 Subject: [PATCH 05/27] further updates to specimen and library_sample metadata updated; updated tests; updated scripts; --- src/pmotools/pmo_builder/metatable_to_pmo.py | 77 ++-- src/pmotools/pmo_builder/mhap_table_to_pmo.py | 89 ++--- .../pmo_builder/panel_information_to_pmo.py | 332 +++++++++++------- .../microhaplotype_table_to_json_file.py | 31 +- .../test_pmo_builder/test_metatable_to_pmo.py | 297 +++++++++++++--- .../test_panel_information_to_pmo.py | 98 +++--- .../test_schema_validation_integration.py | 13 +- 7 files changed, 628 insertions(+), 309 deletions(-) diff --git a/src/pmotools/pmo_builder/metatable_to_pmo.py b/src/pmotools/pmo_builder/metatable_to_pmo.py index ab1e5ad..39cf3f6 100644 --- a/src/pmotools/pmo_builder/metatable_to_pmo.py +++ b/src/pmotools/pmo_builder/metatable_to_pmo.py @@ -32,10 +32,10 @@ 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", + library_sample_name_col: str = None, + specimen_name_col: str = None, + panel_name_col: str = None, + sequencing_info_name_col: str = None, alternate_identifiers_col: str = None, experiment_accession_col: str = None, fastqs_loc_col: str = None, @@ -53,9 +53,9 @@ def library_sample_info_table_to_pmo( :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 sequencing_info_name_col (Optional[str]): Column name for sequencing information names. Default: sequencing_info_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. @@ -75,15 +75,15 @@ def library_sample_info_table_to_pmo( 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 +112,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()) @@ -149,11 +155,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, @@ -196,11 +202,11 @@ def specimen_info_table_to_pmo( :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 specimen_taxon_id_col (Optional[str]): NCBI taxonomy number of the organism. Default: samp_taxon_id + :param host_taxon_id_col (Optional[str]): NCBI taxonomy number of the host. Default: host_taxon_id + :param collection_date_col (Optional[str]): Date of the sample collection. Default: collection_date + :param collection_country_col (Optional[str]): Name of country collected in (admin level 0). Default : collection_country + :param project_name_col (Optional[str]): 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 @@ -241,16 +247,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,8 +335,14 @@ 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()) diff --git a/src/pmotools/pmo_builder/mhap_table_to_pmo.py b/src/pmotools/pmo_builder/mhap_table_to_pmo.py index df8256f..88de01d 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,19 +27,19 @@ 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 bioinformatics_run_name (Optional[str]) : Unique name for the bioinformatics run that generated the data (column name or individual run name): Default: None :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 genome_id (Optional[int]) : the ID of the genome used as reference. Default: None :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 @@ -61,24 +61,24 @@ def mhap_table_to_pmo( """ 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 +88,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) @@ -299,8 +299,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,8 +312,8 @@ 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: 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. @@ -356,9 +356,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 = [] diff --git a/src/pmotools/pmo_builder/panel_information_to_pmo.py b/src/pmotools/pmo_builder/panel_information_to_pmo.py index 6c462ec..9183fed 100644 --- a/src/pmotools/pmo_builder/panel_information_to_pmo.py +++ b/src/pmotools/pmo_builder/panel_information_to_pmo.py @@ -7,100 +7,6 @@ import warnings 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, -): - """ - 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 - """ - - 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: @@ -108,11 +14,11 @@ 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 +30,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,6 +51,7 @@ 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() @@ -190,7 +98,11 @@ 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 +112,11 @@ 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) @@ -264,10 +181,9 @@ 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, ): @@ -285,7 +201,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 +212,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 +222,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,24 +290,47 @@ def create_targets_dict( return targets_dicts - def build_panel_info(self, targets_dict): + def build_panel_info_dict(self, 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 @@ -459,16 +400,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 +419,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 +458,127 @@ 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 + :param panel_name: the panel ID assigned to the panel + :param genome_info: a dictionary containing reference genome information, needed if the target info contains genome location + :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(Optional): the name of the column containing which reaction the target was part of. By default they will all be put in one reaction. + :param reaction_name_col_delimiter (Optional): the delimiter used to split the reaction name column into multiple reactions. Default is a comma. + :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 target_attributes_col_delimter (Optional): the delimiter used to split the target attributes column into multiple attributes. Default is a comma. + :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 + """ + + 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, } + if genome_info: + panel_info_dict["targeted_genomes"] = genome_info + return panel_info_dict 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..4d7e527 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 @@ -11,25 +11,25 @@ def parse_args_microhaplotype_table_to_json_file(): parser = argparse.ArgumentParser() 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", @@ -60,7 +60,8 @@ def parse_args_microhaplotype_table_to_json_file(): 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 +86,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/tests/test_pmo_builder/test_metatable_to_pmo.py b/tests/test_pmo_builder/test_metatable_to_pmo.py index 39d5b6e..ce8893f 100644 --- a/tests/test_pmo_builder/test_metatable_to_pmo.py +++ b/tests/test_pmo_builder/test_metatable_to_pmo.py @@ -385,7 +385,15 @@ 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( [ { @@ -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", @@ -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", ) @@ -526,7 +546,14 @@ 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( [ @@ -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", @@ -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", @@ -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( [ { @@ -1100,6 +1263,10 @@ def test_library_sample_info_table_to_pmo_with_plate(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", 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", @@ -1145,7 +1312,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 +1352,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 +1370,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 +1384,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 +1405,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 +1428,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 +1451,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 +1468,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 +1505,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", @@ -1350,6 +1549,10 @@ 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", @@ -1385,6 +1588,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 +1623,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 +1658,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", 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_schema_validation_integration.py b/tests/test_pmo_builder/test_schema_validation_integration.py index 3ac2627..ae5092f 100644 --- a/tests/test_pmo_builder/test_schema_validation_integration.py +++ b/tests/test_pmo_builder/test_schema_validation_integration.py @@ -47,6 +47,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 +103,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 +131,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], } ) @@ -274,6 +284,7 @@ def test_toy_pmo_validates_against_schema(): project_info=project_info, read_counts_by_stage_info=read_counts_by_stage_info, ) + print(pmo) # Load the schema and validate using PMOChecker schemas_dir = Path(__file__).resolve().parents[2] / "src" / "pmotools" / "schemas" From 4abbe4b6d3037726ed2d39c17610b925e8713b68 Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Tue, 12 May 2026 12:54:18 -0700 Subject: [PATCH 06/27] make testing of header more explicit; --- src/pmotools/pmo_builder/merge_to_pmo.py | 6 +++--- tests/test_pmo_builder/test_merge_to_pmo.py | 18 +++++++++++++----- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/pmotools/pmo_builder/merge_to_pmo.py b/src/pmotools/pmo_builder/merge_to_pmo.py index c52d7b3..191781e 100644 --- a/src/pmotools/pmo_builder/merge_to_pmo.py +++ b/src/pmotools/pmo_builder/merge_to_pmo.py @@ -118,15 +118,15 @@ 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(version=__pmotools_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": version, "creation_date": today, "generation_method": { "program_name": "pmotools-python", - "program_version": __pmotools_version__, + "program_version": version, }, } return pmo_header diff --git a/tests/test_pmo_builder/test_merge_to_pmo.py b/tests/test_pmo_builder/test_merge_to_pmo.py index 7f8b981..f84b9a0 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,14 @@ 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", + }, + } def test_report_missing_IDs_passes(self): _report_missing_IDs( @@ -135,10 +143,10 @@ def test_merge_to_pmo_with_read_counts_by_stage(self): 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,7 +201,7 @@ 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"}], @@ -209,7 +217,7 @@ def test_merge_to_pmo(self, mock_generate_pmo_header, _): ) 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"}], From 0a8045f9a47fde735933c735f05688ceca9271c4 Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Wed, 13 May 2026 00:02:41 -0700 Subject: [PATCH 07/27] updated merge function to reflect less required fields; added two new utilities to help with building a minimal PMO; --- src/pmotools/pmo_builder/merge_to_pmo.py | 167 +++++++---- src/pmotools/pmo_builder/mhap_table_to_pmo.py | 89 ++++++ src/pmotools/pmo_builder/pmo_updater.py | 108 +++++++ tests/test_pmo_builder/test_merge_to_pmo.py | 21 +- .../test_mhap_table_to_pmo.py | 277 ++++++++++++++++++ tests/test_pmo_builder/test_pmo_updater.py | 263 +++++++++++++++++ .../test_schema_validation_integration.py | 232 +++++++++++++-- 7 files changed, 1065 insertions(+), 92 deletions(-) diff --git a/src/pmotools/pmo_builder/merge_to_pmo.py b/src/pmotools/pmo_builder/merge_to_pmo.py index 191781e..754196a 100644 --- a/src/pmotools/pmo_builder/merge_to_pmo.py +++ b/src/pmotools/pmo_builder/merge_to_pmo.py @@ -18,12 +18,12 @@ def _convert_numpy_scalars(obj): def merge_to_pmo( specimen_info: list, library_sample_info: list, - sequencing_info: list, - panel_info: dict, + panel_and_target_info: dict, mhap_info: dict, - bioinfo_method_info: list, - bioinfo_run_info: list, - project_info: list, + 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, ): """ @@ -32,8 +32,8 @@ def merge_to_pmo( :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 panel_and_target_info (dict) : a dictionary containing the panel and target information for this project, must contain fields target_info and panel_info + :param mhap_info (dict) : a dictionary containing the microhaplotypes within this project, both detected and representative, must contain fields detected_microhaplotypes and representative_microhaplotypes :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 @@ -41,15 +41,42 @@ def merge_to_pmo( :return: a json formatted PMO string. """ + missing_fields = [] + if "panel_info" not in panel_and_target_info: + missing_fields.append("panel_info") + if "target_info" not in panel_and_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_and_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" + ) # 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) + panel_and_target_info = _convert_numpy_scalars(panel_and_target_info) mhap_info = _convert_numpy_scalars(mhap_info) + # optional + if sequencing_info is not None: + sequencing_info = [dict(d) for d in sequencing_info] + sequencing_info = _convert_numpy_scalars(sequencing_info) + if bioinfo_method_info is not None: + bioinfo_method_info = [dict(d) for d in bioinfo_method_info] + bioinfo_method_info = _convert_numpy_scalars(bioinfo_method_info) + if bioinfo_run_info is not None: + bioinfo_run_info = [dict(d) for d in bioinfo_run_info] + bioinfo_run_info = _convert_numpy_scalars(bioinfo_run_info) + if project_info is not None: + project_info = [dict(d) for d in project_info] + project_info = _convert_numpy_scalars(project_info) # Handle read_counts_by_stage_info if provided if read_counts_by_stage_info is not None: @@ -59,20 +86,16 @@ def merge_to_pmo( 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_and_target_info=panel_and_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 +105,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_and_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 @@ -185,53 +213,65 @@ 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_and_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" - ) + if project_info is not None: + missing_projects = _replace_key_with_id( + specimen_info, project_info, "project_name", "project_id" + ) + else: + missing_projects = [] # 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_and_target_info["panel_info"], + "panel_name", + "panel_id", ) + if sequencing_info is not None: + missing_sequencing = _replace_key_with_id( + library_sample_info, + sequencing_info, + "sequencing_info_name", + "sequencing_info_id", + ) + else: + missing_sequencing = [] # REP MHAPS # replace target_name with ID missing_targets = _replace_key_with_id( mhap_info["representative_microhaplotypes"]["targets"], - panel_info["target_info"], + panel_and_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", - ) + if bioinfo_run_info is not None: + missing_bioinfo_runs = _replace_key_with_id( + mhap_info["detected_microhaplotypes"], + bioinfo_run_info, + "bioinformatics_run_name", + "bioinformatics_run_id", + ) + else: + missing_bioinfo_runs = [] lib_sample_lookup = _make_lookup(library_sample_info, "library_sample_name") missing_libs = [] for detected in mhap_info["detected_microhaplotypes"]: @@ -248,15 +288,18 @@ 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_and_target_info["target_info"], "target_name") 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", - ) + 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: diff --git a/src/pmotools/pmo_builder/mhap_table_to_pmo.py b/src/pmotools/pmo_builder/mhap_table_to_pmo.py index 88de01d..43e22a2 100644 --- a/src/pmotools/pmo_builder/mhap_table_to_pmo.py +++ b/src/pmotools/pmo_builder/mhap_table_to_pmo.py @@ -412,3 +412,92 @@ 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_key: str = "library_sample_name", + library_sample_specimen_key: dict[str, str] | None = None, + 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_key: the key to use to extract the library_sample_name from each sample dict + :param library_sample_specimen_key: a dict mapping library_sample_name -> specimen_name; + if None, specimen_name == library_sample_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_key not in s + ] + if missing_key_indices: + raise KeyError( + f"The following sample indices are missing the key '{library_sample_key}': " + f"{missing_key_indices}" + ) + + # check that all library_sample_name values are unique + raw_names: list[str] = [s[library_sample_key] 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)}") + + # now construct library_sample_info + library_sample_info: list[dict] = [] + for sample in all_samples: + lib_name: str = sample[library_sample_key] + # use look up table to get specimen_name if provided, otherwise use library_sample_name as specimen_name + if library_sample_specimen_key is not None: + if lib_name in library_sample_specimen_key: + specimen_name = 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/pmo_updater.py b/src/pmotools/pmo_builder/pmo_updater.py index 7291f09..965c971 100644 --- a/src/pmotools/pmo_builder/pmo_updater.py +++ b/src/pmotools/pmo_builder/pmo_updater.py @@ -3,6 +3,11 @@ 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): @@ -123,3 +128,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/tests/test_pmo_builder/test_merge_to_pmo.py b/tests/test_pmo_builder/test_merge_to_pmo.py index f84b9a0..f46c4ca 100644 --- a/tests/test_pmo_builder/test_merge_to_pmo.py +++ b/tests/test_pmo_builder/test_merge_to_pmo.py @@ -117,7 +117,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_and_target_info=panel_info, mhap_info=mhap_info, bioinfo_method_info=bioinfo_method_info, bioinfo_run_info=bioinfo_run_info, @@ -203,17 +203,20 @@ def test_make_lookup(self): def test_merge_to_pmo(self, mock_generate_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_and_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 = { 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..8714a94 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,266 @@ 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_key="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_key="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_key_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_keys_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"]) + if __name__ == "__main__": unittest.main() diff --git a/tests/test_pmo_builder/test_pmo_updater.py b/tests/test_pmo_builder/test_pmo_updater.py index e707187..15db34a 100755 --- a/tests/test_pmo_builder/test_pmo_updater.py +++ b/tests/test_pmo_builder/test_pmo_updater.py @@ -10,6 +10,41 @@ 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")) @@ -223,6 +258,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 ae5092f..59a547b 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( @@ -277,35 +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_and_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, ) - print(pmo) - # 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] @@ -359,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_and_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" From e56b13b1623c0ffc8fbe6979a2f4628807c3a6af Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Wed, 13 May 2026 00:19:48 -0700 Subject: [PATCH 08/27] added test for building a small pmo and then adding in specimen_meta data; validate both the no meta data and with specimen meta; --- tests/test_pmo_builder/test_slim_build_pmo.py | 171 ++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 tests/test_pmo_builder/test_slim_build_pmo.py 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..2a5a733 --- /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_and_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_and_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" + ) From 09f092cd7cd8341a878f6a671517ca40b9fd7301 Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Mon, 18 May 2026 09:10:15 -0700 Subject: [PATCH 09/27] added several more exporters for meta tables; added creating lib and spec info if not given in the merge_pmo function; --- src/pmotools/cli.py | 21 ++ src/pmotools/pmo_builder/merge_to_pmo.py | 46 +++- src/pmotools/pmo_builder/mhap_table_to_pmo.py | 39 ++- src/pmotools/pmo_engine/pmo_exporter.py | 135 +++++++++- ..._bioinformatics_methods_info_meta_table.py | 60 +++++ ...port_bioinformatics_run_info_meta_table.py | 60 +++++ .../export_targeted_genomes_meta_table.py | 60 +++++ .../scripts/pmo_utils/validate_pmo.py | 29 ++- tests/test_pmo_builder/test_merge_to_pmo.py | 157 ++++++++++++ .../test_mhap_table_to_pmo.py | 237 +++++++++++++++++- tests/test_pmo_engine/test_pmo_exporter.py | 2 +- 11 files changed, 808 insertions(+), 38 deletions(-) create mode 100644 src/pmotools/scripts/pmo_to_tables/export_bioinformatics_methods_info_meta_table.py create mode 100644 src/pmotools/scripts/pmo_to_tables/export_bioinformatics_run_info_meta_table.py create mode 100644 src/pmotools/scripts/pmo_to_tables/export_targeted_genomes_meta_table.py diff --git a/src/pmotools/cli.py b/src/pmotools/cli.py index ce368ac..f992d0c 100644 --- a/src/pmotools/cli.py +++ b/src/pmotools/cli.py @@ -90,6 +90,15 @@ 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, ) @@ -193,6 +202,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 +214,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/merge_to_pmo.py b/src/pmotools/pmo_builder/merge_to_pmo.py index 754196a..48e5fd6 100644 --- a/src/pmotools/pmo_builder/merge_to_pmo.py +++ b/src/pmotools/pmo_builder/merge_to_pmo.py @@ -2,6 +2,9 @@ from datetime import date import numpy as np from pmotools import __version__ as __pmotools_version__ +from pmotools.pmo_builder.mhap_table_to_pmo import ( + create_minimum_library_specimen_dict_from_mhap_table, +) def _convert_numpy_scalars(obj): @@ -16,10 +19,10 @@ def _convert_numpy_scalars(obj): def merge_to_pmo( - specimen_info: list, - library_sample_info: list, - panel_and_target_info: dict, mhap_info: dict, + panel_and_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, @@ -29,11 +32,11 @@ def merge_to_pmo( """ Merge components into PMO, replacing names with indeces. + :param mhap_info (dict) : a dictionary containing the microhaplotypes within this project, both detected and representative, must contain fields detected_microhaplotypes and representative_microhaplotypes + :param panel_and_target_info (dict) : a dictionary containing the panel and target information for this project, must contain fields target_info and panel_info :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_and_target_info (dict) : a dictionary containing the panel and target information for this project, must contain fields target_info and panel_info - :param mhap_info (dict) : a dictionary containing the microhaplotypes within this project, both detected and representative, must contain fields detected_microhaplotypes and representative_microhaplotypes :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 @@ -59,9 +62,36 @@ def merge_to_pmo( raise ValueError( "bioinfo_method_info must be provided if bioinfo_run_info is provided" ) - # 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] + if specimen_info is not None and library_sample_info is None: + raise ValueError( + "library_sample_info must be provided if specimen_info is provided" + ) + if specimen_info is None and library_sample_info is None: + if len(panel_and_target_info["panel_info"]) > 1: + raise Exception( + "If providing only microhaplotypes, but not specimen_info or library_sample_info have to have only 1 panel to default to, found " + + str(len(panel_and_target_info["panel_info"])) + ) + spec_and_lib_info = create_minimum_library_specimen_dict_from_mhap_table( + mhap_info["detected_microhaplotypes"], + panel_and_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"] + else: + # Make copies to avoid editing input + library_sample_info = [dict(d) for d in library_sample_info] + if specimen_info is not None: + specimen_info = [dict(d) for d in specimen_info] + else: + # 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_and_target_info = _convert_numpy_scalars(panel_and_target_info) mhap_info = _convert_numpy_scalars(mhap_info) # optional diff --git a/src/pmotools/pmo_builder/mhap_table_to_pmo.py b/src/pmotools/pmo_builder/mhap_table_to_pmo.py index 43e22a2..6f8d2c9 100644 --- a/src/pmotools/pmo_builder/mhap_table_to_pmo.py +++ b/src/pmotools/pmo_builder/mhap_table_to_pmo.py @@ -417,8 +417,10 @@ def get_mhap_index_in_representative_mhaps(df, representative_dict): def create_minimum_library_specimen_dict_from_mhap_table( detected_microhaps: list[dict], panel_name: str, - library_sample_key: str = "library_sample_name", - library_sample_specimen_key: dict[str, str] | None = None, + 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, ): """ @@ -426,9 +428,12 @@ def create_minimum_library_specimen_dict_from_mhap_table( :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_key: the key to use to extract the library_sample_name from each sample dict - :param library_sample_specimen_key: a dict mapping library_sample_name -> specimen_name; + :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; @@ -442,16 +447,16 @@ def create_minimum_library_specimen_dict_from_mhap_table( # check that every sample has the expected key missing_key_indices = [ - i for i, s in enumerate(all_samples) if library_sample_key not in s + 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 key '{library_sample_key}': " + 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_key] for s in all_samples] + 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: @@ -460,15 +465,25 @@ def create_minimum_library_specimen_dict_from_mhap_table( 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_key] + 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 library_sample_specimen_key is not None: - if lib_name in library_sample_specimen_key: - specimen_name = library_sample_specimen_key[lib_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 diff --git a/src/pmotools/pmo_engine/pmo_exporter.py b/src/pmotools/pmo_engine/pmo_exporter.py index 125f7ac..f4b7404 100644 --- a/src/pmotools/pmo_engine/pmo_exporter.py +++ b/src/pmotools/pmo_engine/pmo_exporter.py @@ -124,6 +124,70 @@ def export_library_sample_meta_table(pmodata, separator: str = ",") -> pd.DataFr 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 + """ + # @todo write pytest export_bioinformatics_run_info_meta_table + 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 = "," @@ -208,23 +272,84 @@ def export_target_info_meta_table(pmodata, separator: str = ",") -> pd.DataFrame :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" ] + 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): 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_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 + """ + # @todo write pytest export_targeted_genomes_meta_table + 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): 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..64aea77 --- /dev/null +++ b/src/pmotools/scripts/pmo_to_tables/export_bioinformatics_methods_info_meta_table.py @@ -0,0 +1,60 @@ +#!/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 parse_args_export_bioinformatics_methods_info_meta_table(): + parser = argparse.ArgumentParser() + 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.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..5b3609d --- /dev/null +++ b/src/pmotools/scripts/pmo_to_tables/export_bioinformatics_run_info_meta_table.py @@ -0,0 +1,60 @@ +#!/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 parse_args_export_bioinformatics_run_info_meta_table(): + parser = argparse.ArgumentParser() + 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.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_targeted_genomes_meta_table.py b/src/pmotools/scripts/pmo_to_tables/export_targeted_genomes_meta_table.py new file mode 100644 index 0000000..95cd36b --- /dev/null +++ b/src/pmotools/scripts/pmo_to_tables/export_targeted_genomes_meta_table.py @@ -0,0 +1,60 @@ +#!/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 parse_args_export_targeted_genomes_meta_table(): + parser = argparse.ArgumentParser() + 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.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_utils/validate_pmo.py b/src/pmotools/scripts/pmo_utils/validate_pmo.py index dbe7723..ccb9248 100755 --- a/src/pmotools/scripts/pmo_utils/validate_pmo.py +++ b/src/pmotools/scripts/pmo_utils/validate_pmo.py @@ -13,21 +13,34 @@ def parse_args_validate_pmo(): parser = argparse.ArgumentParser() 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( + default=None, + type=str, + required=False, + help="explicit jsonschema file path to validate against (overrides --jsonschema_version)", + ) + + args = parser.parse_args() + + # Resolve the schema file path if not explicitly provided + 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{__pmotools_version__}.schema.json", - ), - type=str, - required=False, - help="jsonschema to validate against", - ) + f"portable_microhaplotype_object_v{args.jsonschema_version}.schema.json", + ) - return parser.parse_args() + return args def validate_pmo(): diff --git a/tests/test_pmo_builder/test_merge_to_pmo.py b/tests/test_pmo_builder/test_merge_to_pmo.py index f46c4ca..0a2bf94 100644 --- a/tests/test_pmo_builder/test_merge_to_pmo.py +++ b/tests/test_pmo_builder/test_merge_to_pmo.py @@ -139,6 +139,163 @@ 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_and_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_and_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_spec_but_no_lib(self): + panel_info = { + "panel_info": [{"panel_name": "panel1"}, {"panel_name": "panel2"}], + "target_info": [{"target_name": "target1"}], + } + specimen_info = [{"specimen_name": "samp_A"}, {"specimen_name": "samp_B"}] + 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(ValueError) as context: + merge_to_pmo( + panel_and_target_info=panel_info, + mhap_info=mhap_info, + specimen_info=specimen_info, + ) + self.assertIn( + "library_sample_info must be provided if specimen_info is provided", + str(context.exception), + ) + + 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_and_target_info=panel_info, mhap_info=mhap_info) + self.assertIn( + "If providing only microhaplotypes, but not specimen_info or library_sample_info have to have only 1 panel to default to, found", + 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) 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 8714a94..fad711b 100644 --- a/tests/test_pmo_builder/test_mhap_table_to_pmo.py +++ b/tests/test_pmo_builder/test_mhap_table_to_pmo.py @@ -909,7 +909,7 @@ def test_create_minimum_library_specimen_custom_library_sample_key(self): } ] result = create_minimum_library_specimen_dict_from_mhap_table( - detected, panel_name="panel_A", library_sample_key="custom_key" + 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"]) @@ -922,7 +922,7 @@ def test_create_minimum_library_specimen_custom_key_output_uses_canonical_key_na {"library_samples": [{"custom_key": "samp_A", "target_results": []}]} ] result = create_minimum_library_specimen_dict_from_mhap_table( - detected, panel_name="panel_A", library_sample_key="custom_key" + 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]) @@ -964,7 +964,9 @@ def test_create_minimum_library_specimen_missing_specimen_key_falls_back_when_fl 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_key_raises(self): + def test_create_minimum_library_specimen_missing_library_sample_field_name_raises( + self, + ): detected = [ { "library_samples": [ @@ -978,7 +980,7 @@ def test_create_minimum_library_specimen_missing_library_sample_key_raises(self) detected, panel_name="panel_A" ) - def test_create_minimum_library_specimen_all_missing_library_sample_keys_raise( + def test_create_minimum_library_specimen_all_missing_library_sample_field_names_raise( self, ): detected = [ @@ -1069,6 +1071,233 @@ def test_create_minimum_library_specimen_specimen_info_preserves_insertion_order 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_engine/test_pmo_exporter.py b/tests/test_pmo_engine/test_pmo_exporter.py index dc6f178..6ed11bf 100755 --- a/tests/test_pmo_engine/test_pmo_exporter.py +++ b/tests/test_pmo_engine/test_pmo_exporter.py @@ -219,7 +219,7 @@ def test_export_target_info_meta_table(self): os.path.join(self.test_dir.name, "target_info_table.csv") ) self.assertEqual( - "cb0319482c9da5f9d8b22fba955ce1c8", + "92062a9c7c9311fd28c99debd4b3c02f", md5sum_of_fnp(os.path.join(self.test_dir.name, "target_info_table.csv")), ) From cf39cd4302f0d7f55edaf01a3e2d5c5a2e84a3b2 Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Tue, 19 May 2026 08:44:20 -0700 Subject: [PATCH 10/27] fixed new md5sum for changed output; --- tests/test_pmo_engine/test_pmo_exporter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_pmo_engine/test_pmo_exporter.py b/tests/test_pmo_engine/test_pmo_exporter.py index 6ed11bf..d057096 100755 --- a/tests/test_pmo_engine/test_pmo_exporter.py +++ b/tests/test_pmo_engine/test_pmo_exporter.py @@ -219,7 +219,7 @@ def test_export_target_info_meta_table(self): os.path.join(self.test_dir.name, "target_info_table.csv") ) self.assertEqual( - "92062a9c7c9311fd28c99debd4b3c02f", + "2397407dcff8be3fdf54d27ba9a9cbff", md5sum_of_fnp(os.path.join(self.test_dir.name, "target_info_table.csv")), ) From 704da38f897b18194d1fa3cfb1bd47c087e1e624 Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Tue, 19 May 2026 09:19:27 -0700 Subject: [PATCH 11/27] added last pytests; --- src/pmotools/pmo_engine/pmo_exporter.py | 2 - tests/test_pmo_engine/test_pmo_exporter.py | 140 ++++++++++++++++++++- 2 files changed, 138 insertions(+), 4 deletions(-) diff --git a/src/pmotools/pmo_engine/pmo_exporter.py b/src/pmotools/pmo_engine/pmo_exporter.py index f4b7404..1248183 100644 --- a/src/pmotools/pmo_engine/pmo_exporter.py +++ b/src/pmotools/pmo_engine/pmo_exporter.py @@ -135,7 +135,6 @@ def export_bioinformatics_run_info_meta_table( :param separator: the separator to use for list values :return: a pandas dataframe of the library_sample metadata """ - # @todo write pytest export_bioinformatics_run_info_meta_table rows = [] if "bioinformatics_run_info" not in pmodata.keys(): raise ValueError("no bioinformatics_run_info found in input PMO") @@ -328,7 +327,6 @@ def export_targeted_genomes_meta_table( :param separator: the separator to use for list values :return: a pandas dataframe of the genomes metadata """ - # @todo write pytest export_targeted_genomes_meta_table rows = [] genome_id = 0 if "targeted_genomes" not in pmodata.keys(): diff --git a/tests/test_pmo_engine/test_pmo_exporter.py b/tests/test_pmo_engine/test_pmo_exporter.py index d057096..8988003 100755 --- a/tests/test_pmo_engine/test_pmo_exporter.py +++ b/tests/test_pmo_engine/test_pmo_exporter.py @@ -268,7 +268,6 @@ def test_export_project_info_meta_table(self): 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")), @@ -310,7 +309,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( @@ -318,6 +316,144 @@ 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 + if __name__ == "__main__": unittest.main() From d69766cb570c3b11689055d04aff4002116281a9 Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Wed, 20 May 2026 13:51:02 -0700 Subject: [PATCH 12/27] we have not actually been coverting list values to lists; --- src/pmotools/pmo_builder/metatable_to_pmo.py | 37 +++++++++++++------ .../test_pmo_builder/test_metatable_to_pmo.py | 26 ++++++------- 2 files changed, 38 insertions(+), 25 deletions(-) diff --git a/src/pmotools/pmo_builder/metatable_to_pmo.py b/src/pmotools/pmo_builder/metatable_to_pmo.py index 39cf3f6..9f35432 100644 --- a/src/pmotools/pmo_builder/metatable_to_pmo.py +++ b/src/pmotools/pmo_builder/metatable_to_pmo.py @@ -189,11 +189,12 @@ 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 = ",", ): @@ -236,8 +237,8 @@ def specimen_info_table_to_pmo( :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 + :param list_values_specimen_values (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_values :return: JSON format where keys are `specimen_name_col` and values are corresponding row data. """ @@ -347,6 +348,7 @@ def specimen_info_table_to_pmo( # 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( @@ -369,11 +371,22 @@ 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_columns_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_columns_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/tests/test_pmo_builder/test_metatable_to_pmo.py b/tests/test_pmo_builder/test_metatable_to_pmo.py index ce8893f..8d586b4 100644 --- a/tests/test_pmo_builder/test_metatable_to_pmo.py +++ b/tests/test_pmo_builder/test_metatable_to_pmo.py @@ -398,7 +398,7 @@ def test_specimen_info_table_to_pmo_default(self): [ { "specimen_name": "sample1", - "specimen_taxon_id": 5833, + "specimen_taxon_id": [5833], "host_taxon_id": 9606, "collection_date": "01/02/2023", "collection_country": "Mozambique", @@ -406,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", @@ -447,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", @@ -460,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", @@ -504,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", @@ -515,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", @@ -559,7 +559,7 @@ def test_specimen_info_table_to_pmo_with_additional_columns(self): [ { "specimen_name": "sample1", - "specimen_taxon_id": 5833, + "specimen_taxon_id": [5833], "host_taxon_id": 9606, "collection_date": "01/02/2023", "collection_country": "Mozambique", @@ -569,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", @@ -1114,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 @@ -1123,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""" @@ -1198,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): From 6246038851365c0a3cad312f305967bd840b3430 Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Wed, 20 May 2026 14:03:41 -0700 Subject: [PATCH 13/27] had to update the library_sample_name for the list as well; --- src/pmotools/pmo_builder/metatable_to_pmo.py | 31 +++++++++++++++---- .../test_pmo_builder/test_metatable_to_pmo.py | 21 ++++++++----- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/pmotools/pmo_builder/metatable_to_pmo.py b/src/pmotools/pmo_builder/metatable_to_pmo.py index 9f35432..fbac760 100644 --- a/src/pmotools/pmo_builder/metatable_to_pmo.py +++ b/src/pmotools/pmo_builder/metatable_to_pmo.py @@ -47,6 +47,8 @@ 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. @@ -67,6 +69,8 @@ def library_sample_info_table_to_pmo( :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. + :param list_values_library_values (Optional[List[str], None]): columns that contain values that could be list, are delimited by the argument list_values_library_values_delimiter + :param list_values_library_values_delimiter (','): delimiter between list_values_library_values :return: JSON format where keys are `library_sample_id` and values are corresponding row data. """ @@ -146,6 +150,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()) ) @@ -196,7 +216,7 @@ def specimen_info_table_to_pmo( "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. @@ -237,8 +257,8 @@ def specimen_info_table_to_pmo( :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_values (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_values + :param list_values_specimen_values (Optional[List[str], None]): columns that contain values that could be list, are delimited by the argument list_values_specimen_values_delimiter + :param list_values_specimen_values_delimiter (','): delimiter between list_values_specimen_values :return: JSON format where keys are `specimen_name_col` and values are corresponding row data. """ @@ -371,14 +391,13 @@ def specimen_info_table_to_pmo( entry_name="storage_plate_info", ) - # listify columns that contain values that could be list, are delimited by the argument 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_columns_delimiter) + spec[col] = spec[col].split(list_values_specimen_values_delimiter) elif isinstance(spec[col], list): pass elif isinstance(spec[col], primitives): diff --git a/tests/test_pmo_builder/test_metatable_to_pmo.py b/tests/test_pmo_builder/test_metatable_to_pmo.py index 8d586b4..38d59bc 100644 --- a/tests/test_pmo_builder/test_metatable_to_pmo.py +++ b/tests/test_pmo_builder/test_metatable_to_pmo.py @@ -1258,6 +1258,10 @@ 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", + ], } ) @@ -1270,10 +1274,12 @@ def test_library_sample_info_table_to_pmo_with_plate(self): 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", @@ -1285,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", @@ -1517,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]) @@ -1559,17 +1566,17 @@ def test_library_sample_info_table_to_pmo_removes_empty_optional_fields(self): ) # 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]) @@ -1674,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") @@ -1682,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") From 2e71ff9fe11b359ff49b4755b00dd2e9771c9196 Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Wed, 20 May 2026 21:50:54 -0700 Subject: [PATCH 14/27] add NaN for optional field removal; --- .../pmo_builder/json_convert_utils.py | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) 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] From 14f87afd69f98868009dd1db28797d4831f92e73 Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Thu, 21 May 2026 22:56:23 -0700 Subject: [PATCH 15/27] added exporter for all of PMO into an excel document; --- README.md | 2 +- src/pmotools/cli.py | 6 + src/pmotools/pmo_engine/pmo_exporter.py | 187 ++++++++++++++++++ .../pmo_to_tables/export_pmo_into_xlsx.py | 37 ++++ .../export_target_info_meta_table.py | 2 +- tests/test_pmo_engine/test_pmo_exporter.py | 61 ++++++ 6 files changed, 293 insertions(+), 2 deletions(-) create mode 100644 src/pmotools/scripts/pmo_to_tables/export_pmo_into_xlsx.py diff --git a/README.md b/README.md index c274320..59c7a19 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 . ``` diff --git a/src/pmotools/cli.py b/src/pmotools/cli.py index f992d0c..5f0eebe 100644 --- a/src/pmotools/cli.py +++ b/src/pmotools/cli.py @@ -75,6 +75,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, ) @@ -183,6 +186,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" ), diff --git a/src/pmotools/pmo_engine/pmo_exporter.py b/src/pmotools/pmo_engine/pmo_exporter.py index 1248183..a8e34c0 100644 --- a/src/pmotools/pmo_engine/pmo_exporter.py +++ b/src/pmotools/pmo_engine/pmo_exporter.py @@ -5,6 +5,8 @@ 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 @@ -317,6 +319,37 @@ def export_target_info_meta_table(pmodata, separator: str = ",") -> pd.DataFrame 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 = "," @@ -785,3 +818,157 @@ 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"], + additional_representative_info_fields=["seq"], + ), + 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/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..e2e9963 --- /dev/null +++ b/src/pmotools/scripts/pmo_to_tables/export_pmo_into_xlsx.py @@ -0,0 +1,37 @@ +#!/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 parse_args_export_pmo_into_xlsx(): + parser = argparse.ArgumentParser() + parser.add_argument("--pmo", type=str, required=True, help="PMO file") + parser.add_argument( + "--output", type=str, default="STDOUT", required=True, help="output file" + ) + parser.add_argument( + "--overwrite", action="store_true", help="If output file exists, overwrite it" + ) + 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_target_info_meta_table.py b/src/pmotools/scripts/pmo_to_tables/export_target_info_meta_table.py index 05d6d4f..31487e8 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 @@ -45,7 +45,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/tests/test_pmo_engine/test_pmo_exporter.py b/tests/test_pmo_engine/test_pmo_exporter.py index 8988003..2ae0ece 100755 --- a/tests/test_pmo_engine/test_pmo_exporter.py +++ b/tests/test_pmo_engine/test_pmo_exporter.py @@ -454,6 +454,67 @@ def test_empty_bioinformatics_methods_info_list(self): 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() From 00c1cbc22452d9da72c7edbf925212c278a57c48 Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Fri, 22 May 2026 14:34:56 -0700 Subject: [PATCH 16/27] added removing empty, null values for target_info; --- src/pmotools/pmo_builder/panel_information_to_pmo.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/pmotools/pmo_builder/panel_information_to_pmo.py b/src/pmotools/pmo_builder/panel_information_to_pmo.py index 9183fed..5c5466e 100644 --- a/src/pmotools/pmo_builder/panel_information_to_pmo.py +++ b/src/pmotools/pmo_builder/panel_information_to_pmo.py @@ -6,6 +6,7 @@ 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 @@ -579,6 +580,15 @@ def panel_info_table_to_pmo( "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 From 08e20e0b33487c208e02925a20bdc926954afac5 Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Fri, 22 May 2026 15:53:02 -0700 Subject: [PATCH 17/27] fix openpyxl package missing; --- pyproject.toml | 3 ++- uv.lock | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) 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/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" }, ] From d6ea59612a98ab83ebf30d97c88aebe8af667777 Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Fri, 22 May 2026 17:23:35 -0700 Subject: [PATCH 18/27] various updates to address comments in PR; major changes include default to exporting seq rather than the mhap_id; changed name of the merging function; adding being able to supply specimen_info but not library_sample_info as long as the name match detected_microhaplotypes; --- src/pmotools/pmo_builder/merge_to_pmo.py | 74 +++++++--- src/pmotools/pmo_builder/metatable_to_pmo.py | 18 +-- .../pmo_builder/panel_information_to_pmo.py | 6 +- src/pmotools/pmo_engine/pmo_exporter.py | 13 +- .../pmo_to_tables/extract_allele_table.py | 4 +- tests/test_pmo_builder/test_merge_to_pmo.py | 137 +++++++++++++----- .../test_schema_validation_integration.py | 4 +- tests/test_pmo_builder/test_slim_build_pmo.py | 4 +- tests/test_pmo_engine/test_pmo_exporter.py | 26 ++-- 9 files changed, 189 insertions(+), 97 deletions(-) diff --git a/src/pmotools/pmo_builder/merge_to_pmo.py b/src/pmotools/pmo_builder/merge_to_pmo.py index 48e5fd6..ca3aa9d 100644 --- a/src/pmotools/pmo_builder/merge_to_pmo.py +++ b/src/pmotools/pmo_builder/merge_to_pmo.py @@ -20,7 +20,7 @@ def _convert_numpy_scalars(obj): def merge_to_pmo( mhap_info: dict, - panel_and_target_info: dict, + panel_target_info: dict, specimen_info: list | None = None, library_sample_info: list | None = None, sequencing_info: list | None = None, @@ -32,22 +32,24 @@ def merge_to_pmo( """ Merge components into PMO, replacing names with indeces. + 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. + :param mhap_info (dict) : a dictionary containing the microhaplotypes within this project, both detected and representative, must contain fields detected_microhaplotypes and representative_microhaplotypes - :param panel_and_target_info (dict) : a dictionary containing the panel and target information for this project, must contain fields target_info and panel_info - :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 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 panel_target_info (dict) : a dictionary containing the panel and target information for this project, must contain fields target_info and panel_info + :param specimen_info (Optional[list]): a list of all the specimens within this project + :param library_sample_info ((Optional[list]) : a list of library samples within this project + :param sequencing_info (Optional[list]) : a list of sequencing info for this project + :param bioinfo_method_info (Optional[list]) : the bioinformatics pipeline/methods used to generated the amplicon analysis for this project + :param bioinfo_run_info (Optional[list]) : the runtime info for the bioinformatics pipeline used to generated the amplicon analysis for this project + :param project_info (Optional[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. """ missing_fields = [] - if "panel_info" not in panel_and_target_info: + if "panel_info" not in panel_target_info: missing_fields.append("panel_info") - if "target_info" not in panel_and_target_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") @@ -55,7 +57,7 @@ def merge_to_pmo( missing_fields.append("detected_microhaplotypes") if missing_fields: raise ValueError( - f"Missing required fields for panel_and_target_info or mhap_info: {missing_fields}" + 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: @@ -63,18 +65,42 @@ def merge_to_pmo( "bioinfo_method_info must be provided if bioinfo_run_info is provided" ) if specimen_info is not None and library_sample_info is None: - raise ValueError( - "library_sample_info must be provided if specimen_info is provided" + 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 + missing_in_specimen = library_sample_names - specimen_names + if missing_in_specimen: + raise ValueError( + f"library_sample_names found in the detected_microhaplotypes that don't have corresponding supplied specimen_names: {sorted(missing_in_specimen)}" + ) + + # Check for names in specimen_info that are not in library_sample_info + missing_in_library = specimen_names - library_sample_names + if missing_in_library: + raise ValueError( + 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_and_target_info["panel_info"]) > 1: + if len(panel_target_info["panel_info"]) > 1: raise Exception( - "If providing only microhaplotypes, but not specimen_info or library_sample_info have to have only 1 panel to default to, found " - + str(len(panel_and_target_info["panel_info"])) + "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_and_target_info["panel_info"][0]["panel_name"], + 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"] @@ -92,7 +118,7 @@ def merge_to_pmo( for library_sample in library_sample_info ] - panel_and_target_info = _convert_numpy_scalars(panel_and_target_info) + panel_target_info = _convert_numpy_scalars(panel_target_info) mhap_info = _convert_numpy_scalars(mhap_info) # optional if sequencing_info is not None: @@ -122,7 +148,7 @@ def merge_to_pmo( project_info=project_info, library_sample_info=library_sample_info, sequencing_info=sequencing_info, - panel_and_target_info=panel_and_target_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, @@ -136,7 +162,7 @@ def merge_to_pmo( "library_sample_info": library_sample_info, "specimen_info": specimen_info, } - | panel_and_target_info + | panel_target_info | mhap_info ) @@ -244,7 +270,7 @@ def _report_missing_IDs( def _replace_names_with_IDs( specimen_info: list, - panel_and_target_info: dict, + panel_target_info: dict, mhap_info: dict, project_info: list | None = None, library_sample_info: list | None = None, @@ -268,7 +294,7 @@ def _replace_names_with_IDs( ) missing_panels = _replace_key_with_id( library_sample_info, - panel_and_target_info["panel_info"], + panel_target_info["panel_info"], "panel_name", "panel_id", ) @@ -286,7 +312,7 @@ def _replace_names_with_IDs( # replace target_name with ID missing_targets = _replace_key_with_id( mhap_info["representative_microhaplotypes"]["targets"], - panel_and_target_info["target_info"], + panel_target_info["target_info"], "target_name", "target_id", ) @@ -318,7 +344,7 @@ def _replace_names_with_IDs( missing_read_counts_bioinfo_runs = [] missing_read_counts_libs = [] missing_read_counts_targets = [] - target_lookup = _make_lookup(panel_and_target_info["target_info"], "target_name") + target_lookup = _make_lookup(panel_target_info["target_info"], "target_name") if read_counts_by_stage_info is not None: if bioinfo_run_info is not None: # Replace bioinformatics_run_name with bioinformatics_run_id diff --git a/src/pmotools/pmo_builder/metatable_to_pmo.py b/src/pmotools/pmo_builder/metatable_to_pmo.py index fbac760..b177135 100644 --- a/src/pmotools/pmo_builder/metatable_to_pmo.py +++ b/src/pmotools/pmo_builder/metatable_to_pmo.py @@ -32,9 +32,9 @@ def custom_object_hook(d): def library_sample_info_table_to_pmo( contents: pd.DataFrame, - library_sample_name_col: str = None, - specimen_name_col: str = None, - panel_name_col: str = None, + library_sample_name_col: str = "library_sample_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, @@ -57,7 +57,7 @@ def library_sample_info_table_to_pmo( :param library_sample_name_col (str): Column name for library sample names. Default: library_sample_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 sequencing_info_name_col (Optional[str]): Column name for sequencing information names. Default: sequencing_info_name + :param sequencing_info_name_col (Optional[str]): Column name for sequencing information names :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. @@ -223,11 +223,11 @@ def specimen_info_table_to_pmo( :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 (Optional[str]): NCBI taxonomy number of the organism. Default: samp_taxon_id - :param host_taxon_id_col (Optional[str]): NCBI taxonomy number of the host. Default: host_taxon_id - :param collection_date_col (Optional[str]): Date of the sample collection. Default: collection_date - :param collection_country_col (Optional[str]): Name of country collected in (admin level 0). Default : collection_country - :param project_name_col (Optional[str]): Name of the project. Default : project_name + :param specimen_taxon_id_col (Optional[str]): NCBI taxonomy number of the organism. + :param host_taxon_id_col (Optional[str]): NCBI taxonomy number of the host. + :param collection_date_col (Optional[str]): Date of the sample collection. + :param collection_country_col (Optional[str]): Name of country collected in (admin level 0). + :param project_name_col (Optional[str]): Name of the project. :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 diff --git a/src/pmotools/pmo_builder/panel_information_to_pmo.py b/src/pmotools/pmo_builder/panel_information_to_pmo.py index 5c5466e..bf905da 100644 --- a/src/pmotools/pmo_builder/panel_information_to_pmo.py +++ b/src/pmotools/pmo_builder/panel_information_to_pmo.py @@ -495,9 +495,9 @@ def panel_info_table_to_pmo( :param target_table: The dataframe containing the target information :param panel_name: the panel ID assigned to the panel :param genome_info: a dictionary containing reference genome information, needed if the target info contains genome location - :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 target_name_col: the name of the column containing the target IDs. Default: target_name + :param forward_primers_seq_col: the name of the column containing the sequence of the forward primer. Default: fwd_primer + :param reverse_primers_seq_col: the name of the column containing the sequence of the reverse primer. Default: rev_primer :param reaction_name_col(Optional): the name of the column containing which reaction the target was part of. By default they will all be put in one reaction. :param reaction_name_col_delimiter (Optional): the delimiter used to split the reaction name column into multiple reactions. Default is a comma. :param forward_primers_start_col (Optional): the name of the column containing the 0-based start coordinate of the forward primer diff --git a/src/pmotools/pmo_engine/pmo_exporter.py b/src/pmotools/pmo_engine/pmo_exporter.py index a8e34c0..6faee03 100644 --- a/src/pmotools/pmo_engine/pmo_exporter.py +++ b/src/pmotools/pmo_engine/pmo_exporter.py @@ -574,7 +574,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( @@ -593,7 +593,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 @@ -671,12 +671,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 = ( @@ -729,12 +731,13 @@ def extract_alleles_per_sample_table( rep_hap_meta = rep_haps[target_data["mhaps_target_id"]][ "microhaplotypes" ][allele_id] + row = { 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 @@ -906,9 +909,7 @@ def _build_pmo_sheet_configs(pmo) -> "list[PMOExporter.SheetConfig]": "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"], - additional_representative_info_fields=["seq"], + pmo, additional_microhap_fields=["reads"] ), max_row_check=10, ) 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 1ed72d2..8c7ff75 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 @@ -88,7 +89,7 @@ def parse_args_extract_for_allele_table(): %(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 --representative_haps_fields seq + %(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 """ parser.formatter_class = argparse.RawDescriptionHelpFormatter @@ -129,6 +130,7 @@ def extract_for_allele_table(): 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/tests/test_pmo_builder/test_merge_to_pmo.py b/tests/test_pmo_builder/test_merge_to_pmo.py index 0a2bf94..3cdd093 100644 --- a/tests/test_pmo_builder/test_merge_to_pmo.py +++ b/tests/test_pmo_builder/test_merge_to_pmo.py @@ -31,6 +31,35 @@ def setUp(self): "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( @@ -117,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_and_target_info=panel_info, + panel_target_info=panel_info, mhap_info=mhap_info, bioinfo_method_info=bioinfo_method_info, bioinfo_run_info=bioinfo_run_info, @@ -163,7 +192,7 @@ def test_merge_to_pmo_minimum_info(self): } result = merge_to_pmo( - panel_and_target_info=panel_info, + panel_target_info=panel_info, mhap_info=mhap_info, ) @@ -215,7 +244,7 @@ def test_merge_to_pmo_minimum_info_plus_library_sample(self): } result = merge_to_pmo( - panel_and_target_info=panel_info, + panel_target_info=panel_info, mhap_info=mhap_info, library_sample_info=library_sample_info, ) @@ -241,36 +270,6 @@ def test_merge_to_pmo_minimum_info_plus_library_sample(self): sorted(["samp_A", "samp_B"]), ) - def test_merge_to_pmo_minimum_info_raise_spec_but_no_lib(self): - panel_info = { - "panel_info": [{"panel_name": "panel1"}, {"panel_name": "panel2"}], - "target_info": [{"target_name": "target1"}], - } - specimen_info = [{"specimen_name": "samp_A"}, {"specimen_name": "samp_B"}] - 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(ValueError) as context: - merge_to_pmo( - panel_and_target_info=panel_info, - mhap_info=mhap_info, - specimen_info=specimen_info, - ) - self.assertIn( - "library_sample_info must be provided if specimen_info is provided", - str(context.exception), - ) - def test_merge_to_pmo_minimum_info_raise_multi_panel_no_lib(self): panel_info = { "panel_info": [{"panel_name": "panel1"}, {"panel_name": "panel2"}], @@ -290,9 +289,9 @@ def test_merge_to_pmo_minimum_info_raise_multi_panel_no_lib(self): ], } with self.assertRaises(Exception) as context: - merge_to_pmo(panel_and_target_info=panel_info, mhap_info=mhap_info) + merge_to_pmo(panel_target_info=panel_info, mhap_info=mhap_info) self.assertIn( - "If providing only microhaplotypes, but not specimen_info or library_sample_info have to have only 1 panel to default to, found", + "If multiple panels are included in the panel information,specimen_info and library_sample_info", str(context.exception), ) @@ -363,7 +362,7 @@ def test_merge_to_pmo(self, mock_generate_pmo_header, _): specimen_info=[{"specimens": "specinfo"}], library_sample_info=[{"library_samples": "library_samples"}], sequencing_info=[{"sequencing": "sequencing"}], - panel_and_target_info={ + panel_target_info={ "panel_info": ["panels"], "target_info": ["targets"], }, @@ -391,6 +390,72 @@ 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_raises(self): + """Raises ValueError 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.assertRaises(ValueError) as context: + 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, + ) + self.assertIn("samp_B", str(context.exception)) + self.assertIn( + "library_sample_names found in the detected_microhaplotypes that don't have corresponding supplied specimen_names", + str(context.exception), + ) + + def test_merge_to_pmo_specimen_info_extra_names_raises(self): + """Raises ValueError 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.assertRaises(ValueError) as context: + 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, + ) + self.assertIn("samp_C", str(context.exception)) + self.assertIn( + "specimen_name were supplied that don't have corresponding library_sample_names", + str(context.exception), + ) + 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 59a547b..766bca5 100644 --- a/tests/test_pmo_builder/test_schema_validation_integration.py +++ b/tests/test_pmo_builder/test_schema_validation_integration.py @@ -276,7 +276,7 @@ def test_full_1_0_0_toy_pmo_validates_against_schema(): specimen_info=specimen_info, library_sample_info=library_sample_info, sequencing_info=sequencing_info, - panel_and_target_info=panel_info, + panel_target_info=panel_info, mhap_info=mhap_info, bioinfo_method_info=bioinfo_methods_info, bioinfo_run_info=bioinfo_run_info, @@ -492,7 +492,7 @@ def test_slimer_1_1_0_toy_pmo_validates_against_schema(): pmo = merge_to_pmo( specimen_info=specimen_info, library_sample_info=library_sample_info, - panel_and_target_info=panel_info, + panel_target_info=panel_info, mhap_info=mhap_info, ) # Load the schema and validate using PMOChecker diff --git a/tests/test_pmo_builder/test_slim_build_pmo.py b/tests/test_pmo_builder/test_slim_build_pmo.py index 2a5a733..5af11de 100644 --- a/tests/test_pmo_builder/test_slim_build_pmo.py +++ b/tests/test_pmo_builder/test_slim_build_pmo.py @@ -63,7 +63,7 @@ def test_minimal_pmo_creation(): 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_and_target_info=panel_and_target_info, + panel_target_info=panel_and_target_info, mhap_info=mhap_info, ) @@ -123,7 +123,7 @@ def test_minimal_pmo_creation(): lib_and_spec_infos["specimen_info"], specimen_info, "specimen_name" ), library_sample_info=lib_and_spec_infos["library_sample_info"], - panel_and_target_info=panel_and_target_info, + panel_target_info=panel_and_target_info, mhap_info=mhap_info, ) diff --git a/tests/test_pmo_engine/test_pmo_exporter.py b/tests/test_pmo_engine/test_pmo_exporter.py index 2ae0ece..1984bfa 100755 --- a/tests/test_pmo_engine/test_pmo_exporter.py +++ b/tests/test_pmo_engine/test_pmo_exporter.py @@ -107,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", @@ -120,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("1a818a371bfc770cdad1c86ec6e681ea", 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", @@ -139,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("cb1a2e599bfe728441a8ecfb06da94d9", 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( @@ -164,11 +162,12 @@ 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("7eba9420a002606d3c0501b8641c8e17", 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 + self.minimum_fields_v1_1_0_pmo_data, + additional_microhap_fields=["mhap_id"], ).sort_values( by=[ "bioinformatics_run_name", @@ -182,12 +181,11 @@ def test_extract_alleles_per_sample_table_minimum_fields_pmo_input(self): "extracted_alleles_per_sample_table_no_extra_args_on_minimum_fields_pmo.csv", ) allele_data.to_csv(output_fnp, index=False) - self.assertEqual("0f4a023f049a8c0e3544e68daaf9c2c0", md5sum_of_fnp(output_fnp)) + 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"], - additional_representative_info_fields=["seq"], + additional_microhap_fields=["reads", "mhap_id"], ).sort_values( by=[ "bioinformatics_run_name", @@ -201,7 +199,7 @@ def test_extract_alleles_per_sample_table_minimum_fields_pmo_input(self): "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("faab1121588a1a794c4e695da6799532", md5sum_of_fnp(output_fnp)) + self.assertEqual("2810b465c005d4c1acbed12856ddfd26", md5sum_of_fnp(output_fnp)) def test_export_specimen_meta_table(self): spec_table = PMOExporter.export_specimen_meta_table(self.small_example_pmo_data) From 034522dc357759e483d154e25e778ba7079d18b2 Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Tue, 2 Jun 2026 22:16:06 -0700 Subject: [PATCH 19/27] various updates for making man/ pages; --- README.md | 16 ++ docs/Makefile | 20 -- docs/conf.py | 95 --------- docs/index.rst | 37 ---- docs/scripts/Converting_data_into_PMO.rst | 48 ----- docs/usages/extract_from_pmo.rst | 24 --- docs/usages/json_convertors.rst | 17 -- docs/usages/utils.rst | 27 --- man/Makefile | 35 ++++ man/gen_cli_docs.py | 108 ++++++++++ {docs => man}/make.bat | 4 +- {docs => man}/requirements.txt | 1 + man/source/conf.py | 39 ++++ man/source/index.rst | 22 +++ src/pmotools/cli.py | 13 +- src/pmotools/pmo_builder/merge_to_pmo.py | 36 ++-- src/pmotools/pmo_builder/metatable_to_pmo.py | 184 ++++++++++++------ src/pmotools/pmo_builder/mhap_table_to_pmo.py | 137 ++++++++----- .../pmo_builder/panel_information_to_pmo.py | 152 +++++++++++++-- src/pmotools/pmo_builder/pmo_updater.py | 6 +- .../read_count_by_stage_table_to_pmo.py | 46 +++-- src/pmotools/pmo_engine/pmo_checker.py | 3 + src/pmotools/pmo_engine/pmo_exporter.py | 143 +++++++++----- src/pmotools/pmo_engine/pmo_processor.py | 49 ++++- src/pmotools/pmo_engine/pmo_reader.py | 3 + src/pmotools/pmo_engine/pmo_writer.py | 1 + .../excel_meta_to_json_meta.py | 12 +- .../microhaplotype_table_to_json_file.py | 12 +- .../terra_amp_output_to_json.py | 12 +- .../text_meta_to_json_meta.py | 12 +- .../count_library_samples_per_target.py | 11 +- .../count_specimen_meta.py | 11 +- .../count_targets_per_library_sample.py | 11 +- .../list_bioinformatics_run_names.py | 11 +- ..._library_sample_names_per_specimen_name.py | 11 +- .../list_specimen_meta_fields.py | 11 +- .../extract_pmo_with_read_filter.py | 13 +- ...ct_pmo_with_select_library_sample_names.py | 14 +- .../extract_pmo_with_select_specimen_names.py | 12 +- .../extract_pmo_with_select_targets.py | 14 +- .../extract_pmo_with_selected_meta.py | 12 +- ..._bioinformatics_methods_info_meta_table.py | 13 +- ...port_bioinformatics_run_info_meta_table.py | 11 +- .../export_library_sample_meta_table.py | 11 +- .../export_panel_info_meta_table.py | 11 +- .../pmo_to_tables/export_pmo_into_xlsx.py | 16 +- .../export_project_info_meta_table.py | 11 +- .../export_sequencing_info_meta_table.py | 11 +- .../export_specimen_meta_table.py | 11 +- .../export_specimen_travel_meta_table.py | 11 +- .../export_target_info_meta_table.py | 11 +- .../export_targeted_genomes_meta_table.py | 11 +- .../pmo_to_tables/extract_allele_table.py | 31 +-- .../pmo_to_tables/extract_insert_of_panels.py | 11 +- .../extract_refseq_of_inserts_of_panels.py | 16 +- .../scripts/pmo_utils/combine_pmos.py | 11 +- .../scripts/pmo_utils/validate_pmo.py | 14 +- src/pmotools/utils/color_text.py | 19 +- tests/test_pmo_builder/test_pmo_updater.py | 12 +- 59 files changed, 1097 insertions(+), 590 deletions(-) delete mode 100644 docs/Makefile delete mode 100644 docs/conf.py delete mode 100644 docs/index.rst delete mode 100644 docs/scripts/Converting_data_into_PMO.rst delete mode 100644 docs/usages/extract_from_pmo.rst delete mode 100644 docs/usages/json_convertors.rst delete mode 100644 docs/usages/utils.rst create mode 100644 man/Makefile create mode 100755 man/gen_cli_docs.py rename {docs => man}/make.bat (90%) rename {docs => man}/requirements.txt (94%) create mode 100644 man/source/conf.py create mode 100644 man/source/index.rst diff --git a/README.md b/README.md index 59c7a19..2957376 100644 --- a/README.md +++ b/README.md @@ -124,3 +124,19 @@ git add . git commit -m "Your message" git push origin feature/my-feature ``` + +### Documentation updating + +To update the documentation after changes to code or docstrings, run: + +Do need to install sphinx and its dependencies. In your developmental environment run + +```bash +pip install -r man/requirements.txt +``` + +```bash +cd man +make update_autodocs +make html +``` 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/src/pmotools/cli.py b/src/pmotools/cli.py index 5f0eebe..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 @@ -108,6 +106,9 @@ 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) @@ -143,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" @@ -160,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, @@ -168,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" diff --git a/src/pmotools/pmo_builder/merge_to_pmo.py b/src/pmotools/pmo_builder/merge_to_pmo.py index ca3aa9d..70e20af 100644 --- a/src/pmotools/pmo_builder/merge_to_pmo.py +++ b/src/pmotools/pmo_builder/merge_to_pmo.py @@ -30,22 +30,28 @@ def merge_to_pmo( read_counts_by_stage_info: list | None = None, ): """ - Merge components into PMO, replacing names with indeces. - - 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. - - :param mhap_info (dict) : a dictionary containing the microhaplotypes within this project, both detected and representative, must contain fields detected_microhaplotypes and representative_microhaplotypes - :param panel_target_info (dict) : a dictionary containing the panel and target information for this project, must contain fields target_info and panel_info - :param specimen_info (Optional[list]): a list of all the specimens within this project - :param library_sample_info ((Optional[list]) : a list of library samples within this project - :param sequencing_info (Optional[list]) : a list of sequencing info for this project - :param bioinfo_method_info (Optional[list]) : the bioinformatics pipeline/methods used to generated the amplicon analysis for this project - :param bioinfo_run_info (Optional[list]) : the runtime info for the bioinformatics pipeline used to generated the amplicon analysis for this project - :param project_info (Optional[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. """ + missing_fields = [] if "panel_info" not in panel_target_info: missing_fields.append("panel_info") diff --git a/src/pmotools/pmo_builder/metatable_to_pmo.py b/src/pmotools/pmo_builder/metatable_to_pmo.py index b177135..4162c22 100644 --- a/src/pmotools/pmo_builder/metatable_to_pmo.py +++ b/src/pmotools/pmo_builder/metatable_to_pmo.py @@ -51,28 +51,46 @@ def library_sample_info_table_to_pmo( 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 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 sequencing_info_name_col (Optional[str]): Column name for sequencing information names - :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. - :param list_values_library_values (Optional[List[str], None]): columns that contain values that could be list, are delimited by the argument list_values_library_values_delimiter - :param list_values_library_values_delimiter (','): delimiter between list_values_library_values - - :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): @@ -219,48 +237,86 @@ def specimen_info_table_to_pmo( 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 (Optional[str]): NCBI taxonomy number of the organism. - :param host_taxon_id_col (Optional[str]): NCBI taxonomy number of the host. - :param collection_date_col (Optional[str]): Date of the sample collection. - :param collection_country_col (Optional[str]): Name of country collected in (admin level 0). - :param project_name_col (Optional[str]): Name of the project. - :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_values (Optional[List[str], None]): columns that contain values that could be list, are delimited by the argument list_values_specimen_values_delimiter - :param list_values_specimen_values_delimiter (','): delimiter between list_values_specimen_values - - :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): diff --git a/src/pmotools/pmo_builder/mhap_table_to_pmo.py b/src/pmotools/pmo_builder/mhap_table_to_pmo.py index 6f8d2c9..be0ae34 100644 --- a/src/pmotools/pmo_builder/mhap_table_to_pmo.py +++ b/src/pmotools/pmo_builder/mhap_table_to_pmo.py @@ -31,33 +31,56 @@ def mhap_table_to_pmo( 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 (Optional[str]) : Unique name for the bioinformatics run that generated the data (column name or individual run name): Default: None - :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 (Optional[int]) : the ID of the genome used as reference. Default: None - :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( @@ -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: @@ -313,12 +354,12 @@ def create_detected_microhaplotype_dict( :param microhaplotype_table: Parsed microhaplotype calls table. :param representative_microhaplotype_dict: Dictionary of representative microhaplotypes. - :param bioinformatics_run_name: Unique name for the bioinformatics run that generated the data. + :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. """ diff --git a/src/pmotools/pmo_builder/panel_information_to_pmo.py b/src/pmotools/pmo_builder/panel_information_to_pmo.py index bf905da..949fd8c 100644 --- a/src/pmotools/pmo_builder/panel_information_to_pmo.py +++ b/src/pmotools/pmo_builder/panel_information_to_pmo.py @@ -11,6 +11,39 @@ class PMOPanelBuilder: + """ + 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 + """ + def __init__( self, target_table: pd.DataFrame, @@ -58,6 +91,15 @@ def __init__( 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, @@ -102,6 +144,7 @@ def check_location_columns(self): def check_target_names_are_unique(self): """ Raise an exception if the target names are not unique + :return: Nothing """ duplications = self.target_table[ @@ -115,6 +158,7 @@ def check_target_names_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 """ @@ -137,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 @@ -188,6 +243,17 @@ 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, @@ -292,6 +358,16 @@ def build_target_info_dict( return targets_dicts 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): @@ -336,6 +412,17 @@ def build_panel_info_dict(self, targets_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() @@ -370,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.") @@ -492,28 +586,52 @@ def panel_info_table_to_pmo( """ Convert a dataframe containing panel information into dictionary of targets and reference information - :param target_table: The dataframe containing the target information + :param target_table: the dataframe containing the target information + :type target_table: pd.DataFrame :param panel_name: the panel ID assigned to the panel - :param genome_info: a dictionary containing reference genome information, needed if the target info contains genome location + :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 - :param reaction_name_col(Optional): the name of the column containing which reaction the target was part of. By default they will all be put in one reaction. - :param reaction_name_col_delimiter (Optional): the delimiter used to split the reaction name column into multiple reactions. Default is a comma. - :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 target_attributes_col_delimter (Optional): the delimiter used to split the target attributes column into multiple attributes. Default is a comma. - :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. + :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): diff --git a/src/pmotools/pmo_builder/pmo_updater.py b/src/pmotools/pmo_builder/pmo_updater.py index 965c971..c0f9305 100644 --- a/src/pmotools/pmo_builder/pmo_updater.py +++ b/src/pmotools/pmo_builder/pmo_updater.py @@ -12,9 +12,10 @@ 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: @@ -44,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 @@ -117,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" 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..07b17c1 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 @@ -19,22 +19,36 @@ 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 bioinformatics_run_name: name for the bioinformatics run (column name or individual run name) + :type bioinformatics_run_name: str + :param total_raw_count_table: table with total raw counts per sample + :type total_raw_count_table: pd.DataFrame + :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 diff --git a/src/pmotools/pmo_engine/pmo_checker.py b/src/pmotools/pmo_engine/pmo_checker.py index 46186ba..475ed88 100644 --- a/src/pmotools/pmo_engine/pmo_checker.py +++ b/src/pmotools/pmo_engine/pmo_checker.py @@ -31,6 +31,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 +45,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 6faee03..361ebd7 100644 --- a/src/pmotools/pmo_engine/pmo_exporter.py +++ b/src/pmotools/pmo_engine/pmo_exporter.py @@ -13,19 +13,32 @@ 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): @@ -34,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( @@ -54,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 @@ -64,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) @@ -76,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 @@ -88,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) @@ -99,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 @@ -119,9 +157,9 @@ 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) @@ -146,9 +184,9 @@ def export_bioinformatics_run_info_meta_table( export_row["run_id"] = run_id run_id += 1 for key, value in bioinformatics_run_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) @@ -174,9 +212,9 @@ def export_bioinformatics_methods_info_meta_table( export_row = {} for key, value in bioinformatics_methods_info.items(): export_row["bioinformatics_methods_id"] = bioinformatics_methods_id - 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) method_count = 0 @@ -195,6 +233,7 @@ def export_sequencing_info_meta_table( ) -> 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 @@ -206,9 +245,9 @@ def export_sequencing_info_meta_table( 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) @@ -217,6 +256,7 @@ 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 @@ -228,9 +268,9 @@ def export_project_info_meta_table(pmodata, separator: str = ",") -> pd.DataFram 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) @@ -239,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 @@ -247,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"]: @@ -268,6 +309,7 @@ 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 @@ -305,9 +347,9 @@ def export_target_info_meta_table(pmodata, separator: str = ",") -> pd.DataFrame elif "insert_location" == key: for insert_key in value.keys(): export_row["insert_" + insert_key] = value[insert_key] - 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) @@ -323,6 +365,7 @@ def export_target_info_meta_table(pmodata, separator: str = ",") -> pd.DataFrame 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 @@ -338,9 +381,9 @@ def export_pmo_header_table(pmodata, separator: str = ",") -> pd.DataFrame: "program_version" ] export_row["generation_method.program_name"] = value["program_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) df = pd.DataFrame(rows) @@ -356,6 +399,7 @@ def export_targeted_genomes_meta_table( ) -> 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 @@ -369,9 +413,9 @@ def export_targeted_genomes_meta_table( export_row["genome_id"] = genome_id genome_id += 1 for key, value in genome_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) @@ -383,10 +427,11 @@ def export_targeted_genomes_meta_table( 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 """ @@ -429,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"]))) @@ -468,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"], @@ -489,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: @@ -544,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"], @@ -775,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 diff --git a/src/pmotools/pmo_engine/pmo_processor.py b/src/pmotools/pmo_engine/pmo_processor.py index c36813e..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,6 +134,7 @@ 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 """ @@ -140,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 """ @@ -152,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 """ @@ -164,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 """ @@ -176,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 """ @@ -188,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 """ @@ -208,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 @@ -221,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 @@ -232,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 @@ -243,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 @@ -254,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 @@ -267,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 @@ -282,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 @@ -309,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 @@ -354,9 +377,10 @@ 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"] @@ -423,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 """ @@ -493,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))) @@ -573,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 @@ -705,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 @@ -721,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 @@ -750,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 @@ -765,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 @@ -923,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 @@ -938,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 @@ -1030,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 36dd3eb..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 """ 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/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 4d7e527..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,8 +7,11 @@ 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_name", @@ -54,6 +57,11 @@ 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() 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 index 64aea77..4b71d8b 100644 --- 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 @@ -8,8 +8,13 @@ from pmotools.utils.small_utils import Utils -def parse_args_export_bioinformatics_methods_info_meta_table(): - parser = argparse.ArgumentParser() +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" @@ -24,7 +29,11 @@ def parse_args_export_bioinformatics_methods_info_meta_table(): 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() 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 index 5b3609d..3036e60 100644 --- 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 @@ -8,8 +8,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_export_bioinformatics_run_info_meta_table(): - parser = argparse.ArgumentParser() +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" @@ -24,7 +27,11 @@ def parse_args_export_bioinformatics_run_info_meta_table(): 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() 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 index e2e9963..de1e8ba 100644 --- a/src/pmotools/scripts/pmo_to_tables/export_pmo_into_xlsx.py +++ b/src/pmotools/scripts/pmo_to_tables/export_pmo_into_xlsx.py @@ -6,15 +6,21 @@ from pmotools.utils.small_utils import Utils -def parse_args_export_pmo_into_xlsx(): - parser = argparse.ArgumentParser() - parser.add_argument("--pmo", type=str, required=True, help="PMO file") - parser.add_argument( - "--output", type=str, default="STDOUT", required=True, help="output file" +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() 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 06cf652..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() 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 31487e8..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() 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 index 95cd36b..ae64d9c 100644 --- 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 @@ -8,8 +8,11 @@ from pmotools.utils.small_utils import Utils -def parse_args_export_targeted_genomes_meta_table(): - parser = argparse.ArgumentParser() +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" @@ -24,7 +27,11 @@ def parse_args_export_targeted_genomes_meta_table(): 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() 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 8c7ff75..bfd458b 100755 --- a/src/pmotools/scripts/pmo_to_tables/extract_allele_table.py +++ b/src/pmotools/scripts/pmo_to_tables/extract_allele_table.py @@ -14,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", @@ -30,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", @@ -52,7 +63,6 @@ def parse_args_extract_for_allele_table(): type=str, help="if also writing out allele frequencies, write to this file", ) - parser.add_argument( "--specimen_info_meta_fields", type=str, @@ -84,16 +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", ) - parser.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 - """ - parser.formatter_class = argparse.RawDescriptionHelpFormatter + return parser + +def parse_args_extract_for_allele_table(): + parser = get_parser() return parser.parse_args() 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 ccb9248..744d1aa 100755 --- a/src/pmotools/scripts/pmo_utils/validate_pmo.py +++ b/src/pmotools/scripts/pmo_utils/validate_pmo.py @@ -10,8 +10,11 @@ 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", @@ -27,10 +30,14 @@ def parse_args_validate_pmo(): required=False, 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() - # Resolve the schema file path if not explicitly provided + # post-parse resolution stays here, NOT in get_parser if args.jsonschema_file is None: args.jsonschema_file = os.path.join( os.path.dirname( @@ -39,7 +46,6 @@ def parse_args_validate_pmo(): "schemas/", f"portable_microhaplotype_object_v{args.jsonschema_version}.schema.json", ) - return args 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/tests/test_pmo_builder/test_pmo_updater.py b/tests/test_pmo_builder/test_pmo_updater.py index 15db34a..930fa28 100755 --- a/tests/test_pmo_builder/test_pmo_updater.py +++ b/tests/test_pmo_builder/test_pmo_updater.py @@ -46,12 +46,14 @@ def setUp(self): ] 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 = { From 972099f7e4fcaa9b65680ad72b22f2afec9e4523 Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Tue, 2 Jun 2026 22:30:41 -0700 Subject: [PATCH 20/27] added github workflow action so the io pages is generated; --- .github/workflows/docs.yml | 41 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 .github/workflows/docs.yml 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 From f874cd77637ac778326066e13179b25aaff0fdbc Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Wed, 3 Jun 2026 00:22:40 -0700 Subject: [PATCH 21/27] move load_schema to PMOChecker; added load_schema_by_version; added a global __schema__ so default only has to be changed in 1 place; --- src/pmotools/__init__.py | 41 ++++++++------ src/pmotools/pmo_builder/merge_to_pmo.py | 11 ++-- src/pmotools/pmo_engine/pmo_checker.py | 59 ++++++++++++++++++++- src/pmotools/utils/schema_loader.py | 29 ---------- tests/test_pmo_engine/test_pmo_checker.py | 3 +- tests/test_pmo_engine/test_pmo_processor.py | 3 +- tests/test_pmo_engine/test_pmo_reader.py | 3 +- 7 files changed, 91 insertions(+), 58 deletions(-) delete mode 100644 src/pmotools/utils/schema_loader.py 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/pmo_builder/merge_to_pmo.py b/src/pmotools/pmo_builder/merge_to_pmo.py index ca3aa9d..7d71653 100644 --- a/src/pmotools/pmo_builder/merge_to_pmo.py +++ b/src/pmotools/pmo_builder/merge_to_pmo.py @@ -2,6 +2,8 @@ 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, ) @@ -202,15 +204,16 @@ def _replace_key_with_id(target_list, reference_list, name_key, id_key, lookup=N return missing_items -def _generate_pmo_header(version=__pmotools_version__): +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": version, + "pmo_version": pmo_schema_version, "creation_date": today, "generation_method": { "program_name": "pmotools-python", - "program_version": version, + "program_version": pmotools_version, }, } return pmo_header diff --git a/src/pmotools/pmo_engine/pmo_checker.py b/src/pmotools/pmo_engine/pmo_checker.py index 46186ba..7fb63ad 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 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/test_pmo_engine/test_pmo_checker.py b/tests/test_pmo_engine/test_pmo_checker.py index 4f65dce..05bdc5d 100755 --- a/tests/test_pmo_engine/test_pmo_checker.py +++ b/tests/test_pmo_engine/test_pmo_checker.py @@ -4,8 +4,7 @@ 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): diff --git a/tests/test_pmo_engine/test_pmo_processor.py b/tests/test_pmo_engine/test_pmo_processor.py index 727bb45..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): diff --git a/tests/test_pmo_engine/test_pmo_reader.py b/tests/test_pmo_engine/test_pmo_reader.py index 76d4ebb..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): From e478233898e59df1ed0afa8c2eea36c591ac64e4 Mon Sep 17 00:00:00 2001 From: kathryn1995 Date: Wed, 3 Jun 2026 11:57:13 -0700 Subject: [PATCH 22/27] Correct instructions on building documentation --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2957376..8c08c2b 100644 --- a/README.md +++ b/README.md @@ -127,16 +127,20 @@ git push origin feature/my-feature ### Documentation updating -To update the documentation after changes to code or docstrings, run: +Documentation for pmotools is automatically generated from docstring under `man/`. This is automatically built and deployed through GitHub actions on merging to main. -Do need to install sphinx and its dependencies. In your developmental environment run +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. From 41d2f909e89cddbc43e69101aa25977607cda117 Mon Sep 17 00:00:00 2001 From: kathryn1995 Date: Wed, 3 Jun 2026 13:26:39 -0700 Subject: [PATCH 23/27] Add action to test docs build on every PR --- .github/workflows/test-docs.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/workflows/test-docs.yml 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 From c5f689fc512902f07461e9eae93098e5b8c85fc2 Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Wed, 3 Jun 2026 18:10:48 -0700 Subject: [PATCH 24/27] update for better error message when optional fields are provided by their names are not to link with in the associated data; fixed issue with read counts per stage for allowing missing bio run info; --- src/pmotools/pmo_builder/merge_to_pmo.py | 107 ++++++++++++------ .../read_count_by_stage_table_to_pmo.py | 20 ++-- 2 files changed, 87 insertions(+), 40 deletions(-) diff --git a/src/pmotools/pmo_builder/merge_to_pmo.py b/src/pmotools/pmo_builder/merge_to_pmo.py index 2a83afb..846a9a6 100644 --- a/src/pmotools/pmo_builder/merge_to_pmo.py +++ b/src/pmotools/pmo_builder/merge_to_pmo.py @@ -289,12 +289,17 @@ def _replace_names_with_IDs( ): # SPECIMEN INFO # replace name with project ID + any_missing_project_names = False + missing_projects = [] if project_info is not None: - missing_projects = _replace_key_with_id( - specimen_info, project_info, "project_name", "project_id" - ) - else: - missing_projects = [] + 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 @@ -307,15 +312,20 @@ def _replace_names_with_IDs( "panel_name", "panel_id", ) + any_missing_sequence_info_names = False + missing_sequencing = [] if sequencing_info is not None: - missing_sequencing = _replace_key_with_id( - library_sample_info, - sequencing_info, - "sequencing_info_name", - "sequencing_info_id", - ) - else: - missing_sequencing = [] + 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 @@ -328,15 +338,21 @@ def _replace_names_with_IDs( # DETECTED MHAPS # Replace library_sample_name and bioinformatics_run_name + any_missing_bioinfo_run_names = False + missing_bioinfo_runs = [] if bioinfo_run_info is not None: - missing_bioinfo_runs = _replace_key_with_id( - mhap_info["detected_microhaplotypes"], - bioinfo_run_info, - "bioinformatics_run_name", - "bioinformatics_run_id", - ) - else: - missing_bioinfo_runs = [] + 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"]: @@ -354,17 +370,23 @@ def _replace_names_with_IDs( missing_read_counts_libs = [] missing_read_counts_targets = [] 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: - 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 = [] + 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: @@ -388,7 +410,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/read_count_by_stage_table_to_pmo.py b/src/pmotools/pmo_builder/read_count_by_stage_table_to_pmo.py index 07b17c1..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,10 +19,11 @@ 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: name for the bioinformatics run (column name or individual run name) - :type bioinformatics_run_name: str + :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 @@ -70,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() @@ -292,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 """ @@ -344,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 From b5893e8f04b81b57b902cf69b2c4dc4cbec603c8 Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Thu, 4 Jun 2026 10:40:44 -0700 Subject: [PATCH 25/27] changed missing specimens/library samples into warnings instead of errors; --- src/pmotools/pmo_builder/merge_to_pmo.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/pmotools/pmo_builder/merge_to_pmo.py b/src/pmotools/pmo_builder/merge_to_pmo.py index 846a9a6..4ade850 100644 --- a/src/pmotools/pmo_builder/merge_to_pmo.py +++ b/src/pmotools/pmo_builder/merge_to_pmo.py @@ -7,6 +7,7 @@ from pmotools.pmo_builder.mhap_table_to_pmo import ( create_minimum_library_specimen_dict_from_mhap_table, ) +import warnings def _convert_numpy_scalars(obj): @@ -86,19 +87,19 @@ def merge_to_pmo( 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 if missing_in_specimen: - raise ValueError( - f"library_sample_names found in the detected_microhaplotypes that don't have corresponding supplied specimen_names: {sorted(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" ) - - # Check for names in specimen_info that are not in library_sample_info - missing_in_library = specimen_names - library_sample_names if missing_in_library: - raise ValueError( + warnings.warn( f"specimen_name were supplied that don't have corresponding library_sample_names in detected_microhaplotypes: {sorted(missing_in_library)}" ) - + for missing_lib_name in missing_in_library: + specimen_info.append({"specimen_name": missing_lib_name}) # 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: From 87e9dc6cb43dcbfc08190fc681f545db497edacf Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Thu, 4 Jun 2026 11:39:15 -0700 Subject: [PATCH 26/27] update for pytests for new warnings; --- src/pmotools/pmo_builder/merge_to_pmo.py | 5 ++-- tests/test_pmo_builder/test_merge_to_pmo.py | 31 +++++++++++++-------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/pmotools/pmo_builder/merge_to_pmo.py b/src/pmotools/pmo_builder/merge_to_pmo.py index 4ade850..8bcc91c 100644 --- a/src/pmotools/pmo_builder/merge_to_pmo.py +++ b/src/pmotools/pmo_builder/merge_to_pmo.py @@ -90,6 +90,8 @@ def merge_to_pmo( # 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" @@ -98,8 +100,7 @@ def merge_to_pmo( warnings.warn( f"specimen_name were supplied that don't have corresponding library_sample_names in detected_microhaplotypes: {sorted(missing_in_library)}" ) - for missing_lib_name in missing_in_library: - specimen_info.append({"specimen_name": missing_lib_name}) + # 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: diff --git a/tests/test_pmo_builder/test_merge_to_pmo.py b/tests/test_pmo_builder/test_merge_to_pmo.py index 3cdd093..c653cba 100644 --- a/tests/test_pmo_builder/test_merge_to_pmo.py +++ b/tests/test_pmo_builder/test_merge_to_pmo.py @@ -403,8 +403,8 @@ def test_merge_to_pmo_specimen_info_matching_names_passes(self): 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_raises(self): - """Raises ValueError when specimen_info is missing names that exist in detected_microhaplotypes.""" + 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", @@ -413,20 +413,24 @@ def test_merge_to_pmo_specimen_info_missing_names_raises(self): }, # samp_B is missing ] - with self.assertRaises(ValueError) as context: - merge_to_pmo( + 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, ) - self.assertIn("samp_B", str(context.exception)) + + 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", - str(context.exception), + warning_message, ) + # merge should still succeed and produce a result + self.assertIsNotNone(result) - def test_merge_to_pmo_specimen_info_extra_names_raises(self): - """Raises ValueError when specimen_info has names not present in detected_microhaplotypes.""" + 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", @@ -444,17 +448,20 @@ def test_merge_to_pmo_specimen_info_extra_names_raises(self): "collection_date": "2022-03-01", }, ] - with self.assertRaises(ValueError) as context: - merge_to_pmo( + 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, ) - self.assertIn("samp_C", str(context.exception)) + 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", - str(context.exception), + warning_message, ) + # merge should still succeed and produce a result + self.assertIsNotNone(result) if __name__ == "__main__": From e5c43da4bf19c01fd3a40c5ebd7b2b1c3a43e99b Mon Sep 17 00:00:00 2001 From: Nicholas Hathaway Date: Thu, 4 Jun 2026 12:13:12 -0700 Subject: [PATCH 27/27] update to make deep copies of input to merge_pmo so the original is untouched; --- src/pmotools/pmo_builder/merge_to_pmo.py | 54 ++++++++++++++++-------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/src/pmotools/pmo_builder/merge_to_pmo.py b/src/pmotools/pmo_builder/merge_to_pmo.py index 8bcc91c..3842cbe 100644 --- a/src/pmotools/pmo_builder/merge_to_pmo.py +++ b/src/pmotools/pmo_builder/merge_to_pmo.py @@ -8,6 +8,7 @@ create_minimum_library_specimen_dict_from_mhap_table, ) import warnings +import copy def _convert_numpy_scalars(obj): @@ -55,6 +56,31 @@ def merge_to_pmo( str: a JSON-formatted PMO string. """ + # 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") @@ -114,40 +140,32 @@ def merge_to_pmo( ) specimen_info = spec_and_lib_info["specimen_info"] library_sample_info = spec_and_lib_info["library_sample_info"] - else: - # Make copies to avoid editing input - library_sample_info = [dict(d) for d in library_sample_info] - if specimen_info is not None: - specimen_info = [dict(d) for d in specimen_info] - else: - # 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 - ] + 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 = [dict(d) for d in sequencing_info] sequencing_info = _convert_numpy_scalars(sequencing_info) if bioinfo_method_info is not None: - bioinfo_method_info = [dict(d) for d in bioinfo_method_info] bioinfo_method_info = _convert_numpy_scalars(bioinfo_method_info) if bioinfo_run_info is not None: - bioinfo_run_info = [dict(d) for d in bioinfo_run_info] bioinfo_run_info = _convert_numpy_scalars(bioinfo_run_info) if project_info is not None: - project_info = [dict(d) for d in project_info] 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)